Computer Network #02-3. Application Layer : Socket programming

김서영·2025년 4월 18일
0

컴퓨터네트워크

목록 보기
10/15
post-thumbnail

1. Socket Programming 개요

애플리케이션 프로세스와 종단 간 전송 프로토콜(End-to-End Transport Protocol) 사이의 문 역할 (연결 담당)

  • Application Layer와 Transport layer 사이에 존재

Client-Server 통신 흐름(예시)

1) Client : 키보드로 문자열(예: "abc")을 입력
(→ 서버로 전송)

2) Server : 수신한 문자열을 대문자(Uppercase) 로 변환
(ex. "abc" → "ABC")

3) Server : 변환된 데이터를 다시 클라이언트에게 전송

4) Client : 변환된 데이터를 받아 화면에 출력 (결과: "ABC")

Socket 종류

  • UDP : 비연결형, 신뢰성 없음
  • TCP : 연결형, 신뢰성 보장

2. UDP

UDP는 unreliable(신뢰성 없음) 데이터그램(datatgram) 단위 전송 제공

빠르고 간단하지만, 데이터가 손실되거나 순서가 꼬일 수 있다는 것을 감수해야 함

UDP 특징

  • no connection (연결 없음)
    (데이터를 보낼 때 별도 연결 설정 필요 없음)
  • 핸드쉐이킹 X
    (데이터 보내기 전에 준비 작업 없이 바로 전송)
  • 주소 지정
    (송신자가 IP 주소 + 포트 번호를 명시적으로 붙여서 보냄)
  • 수신 처리
    (수신자가 받은 패킷에서 IP 주소와 포트 번호를 추출해서 확인)

Socket interaction: UDP

1-a) Server : UDP 소켓 생성

serverSocket = socket(AF_INET, SOCK_DGRAM)

1-b) Client : UDP 소켓 생성

clientSocket = socket(AF_INET, SOCK_DGRAM)

2) Client : datagram 보내기
서버의 IP와 Port를 넣어 데이터그램을 clientSocket으로 전송

3) Server : datagram 읽기
serverSocket에서 클라이언트가 보낸 데이터그램(datagram)을 읽음

4) Server : 응답 적고 보내기
클라이언트의 주소(IP, Port)를 보고 serverSocket을 통해 응답 전송

5) Client : 응답 수신
서버로부터 응답을 clientSocket으로 읽음

6) Client : clientSocket 닫기

UDP Client

from socket import *

#1. 서버 주소와 포트 설정
serverName = '<hostname>'
serverPort = 12000

#2. 클라이언트 소켓 생성
clientSocket = socket(AF_INET, SOCK_DGRAM)

#3. 사용자 입력 받기
message = input('Input lowercase sentence:')

#4. 서버로 메시지 전송
clientSocket.sendto(message.encode(), (serverName, serverPort))

#5. 서버로부터 응답 수신
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)

print(modifiedMessage.decode()) #6. 응답 출력
clientSocket.close() #7. 소켓 종료

UDP Server

from socket import *

#1. 포트 번호 설정
serverPort = 12000

#2. 서버 소켓 생성 및 바인딩
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind(('', serverPort))

#3. 준비 메시지 출력
print("The server is ready to receive")

#4. 데이터 처리
while True:
   message, clientAddress = serverSocket.recvfrom(2048)
   modifiedMessage = message.decode().upper()
   serverSocket.sendto(modifiedMessage.encode(), clientAddress)

3. TCP

TCP 동작 흐름

1) Server : 연결 요청 받을 소켓 미리 만들기
(서버 프로세스가 먼저 실행 중이어야 함)

2) Client : 서버에 먼저 접촉
(TCP 소켓 생성, 서버의 IP 주소와 포트 번호를 이용해 연결 요청 보냄)

3) Server : 새로운 소켓 생성
클라이언트 연결이 오면, 서버는 새로운 소켓을 만들어서 각각의 클라이언트와 통신함

TCP 특징

  • Reliable(신뢰성 보장)
  • In-order(순서 보장)
  • Byte-stream 전송 (끊김 없이 연속된 데이터 흐름)

Socket interaction: TCP

1-a) Server : TCP 소켓 생성 및 포트 바인딩
SOCK_STREAM : TCP용 소켓

1-b) Client : TCP 소켓 생성
클라이언트도 TCP용 소켓을 생성

2) Client : 서버에 연결 요청
서버 IP와 포트로 TCP 연결(connect) 요청

3) Server : 연결 요청 수락

4) Client : 데이터 전송
message를 서버로 전송

5) Server : 데이터 수신
클라이언트로부터 데이터 수신

6) Server : 응답 적고, 전송

7) Client : 응답 수신

8) Client : 연결 종료

TCP Client

from socket import *

#1. 서버 이름과 포트 번호 설정
serverName = 'server주소나 IP'
serverPort = 12000

#2. 클라이언트 소켓 생성 및 서버에 연결
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName, serverPort))

#3. 사용자 입력 데이터 전송
sentence = input('Input lowercase sentence: ')
clientSocket.send(sentence.encode())

#4. 서버로부터 응답 받고 출력
modifiedSentence = clientSocket.recv(1024)
print('From Server:', modifiedSentence.decode())

#5. 소켓 닫기
clientSocket.close()

TCP Server

from socket import *

#1. 포트 번호 설정
serverPort = 12000

#2. 서버 소켓 생성 및 바인딩
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.bind(('', serverPort))

#3. 클라이언트 접속 대기 시작
serverSocket.listen(1)
print("The server is ready to receive")

#4. 데이터 처리
while True:
    connectionSocket, addr = serverSocket.accept()
    sentence = connectionSocket.recv(1024).decode()
    capitalizedSentence = sentence.upper()
    connectionSocket.send(capitalizedSentence.encode())
    connectionSocket.close()
profile
안녕하세요 :)

0개의 댓글