[네트워크] 2-2. TCP/UDP

kkado·2023년 4월 9일
0

네트워크

목록 보기
6/49

⚠️ 들어가기 앞서
경북대학교 컴퓨터학부 COMP0414-001 컴퓨터망 과목을 공부하며 정리한 글입니다.


Transport layer (전송 계층)은 송신자와 수신자를 연결하여 데이터를 주고받을 수 있도록 한다고 하였다. 전송 계층에서 사용되는 프로토콜은 TCPUDP가 있는데 여기에 대해서 자세히 알아본다!


TCP

TCP는 연결 기반의 프로토콜이며, 신뢰성 있는 데이터 전송을 지원하며, 흐름 제어와 혼잡 제어 등을 지원한다.

TCP의 특징은 다음과 같은 것들이 있다.

  • 프로세스들 간에 신뢰성 있는 데이터 전송을 제공
  • 연결 기반(connection-oriented) : 데이터를 주고받기 전에 연결을 수립하는 과정이 필요하다. 이 때 handshaking이 사용된다. (나중에 다룸)
  • 흐름 제어 (flow control) : 송신 속도에 비해 수신 속도가 너무 느리지 않도록 송신 속도를 조절함
  • 혼잡 제어(congestion control) : 패킷 수가 너무 많아 queueing delay 또는 packet loss가 생기지 않게 한다.
  • 패킷에 대한 응답을 다시 보내기 때문에 성능이 낮다. (시간 지연, CPU 사용 많음)
  • 전이중 방식(full-duplex), 점대점 방식(point to point)
  • 데이터의 전송 순서를 보장할 수 있고, 데이터의 경계가 없다.

TCP의 암호화 TLS

TCP에는 데이터를 암호화하는 기능을 지원하지 않는다.
이 점을 보완한 것이 Transport Layer Security TLS이다.

TLS는 3가지를 제공한다.

  • 암호화(encryption): 제3자로부터 전송되는 데이터를 숨긴다.
  • 인증(authentication): 정보를 교환하는 당사자가 요청된 당사자임을 보장한다.
  • 무결성(integrity): 데이터가 위조되거나 변조되지 않았는지 확인한다.

예시

TCP의 서버, 클라이언트에서 연결을 수립하고 데이터를 주고받는 과정을 간단히 파이썬 코드로 작성해 보자.

client

from socket import *
serverName = 'serverName'
serverPort = 12000

# TCP 연결을 수립
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName, serverPort))

# 데이터를 보내고 받음
sentence = input("Input lowercase Sentence : ")
clientSocket.send(sentence.encode())
modifiedSentence = clientSocket.recv(1024)
print("From server ", modifiedSentence.decode())

# 연결 종료
clientSocket.close()

server

from socket import *
serverPort = 12000

serverSocket = socket(AF_INET,SOCK_STREAM)
serverSocket.bind((‘’,serverPort))
serverSocket.listen(1)

print ("The server is ready to receive")

while True:
connectionSocket, addr = serverSocket.accept()
sentence = connectionSocket.recv(1024).decode() 
capitalizedSentence = sentence.upper() 
connectionSocket.send(capitalizedSentence.encode())

connectionSocket.close()

UDP

UDP는 비연결형 프로토콜로서, 데이터의 신뢰성을 보장하지 못하는 대신 속도가 빠르다.

  • 연결을 수립하지 않고 바로 전송하는 비연결형 프로토콜
  • checksum을 통한 최소한의 오류 검증만 진행한다.
  • 데이터그램 단위로 전송하며, 그에 따라 크기에 제한이 있다.
  • 오류 제어와 혼잡 제어를 제공하지 않는다. (속도 빠름)
  • 신뢰성 있는 데이터 전송을 제공하지 않는다.
  • 속도가 빠른 대신 패킷 손실이 발생할 수 있다.

데이터의 신뢰성보다는 연속성(성능)이 우선시될 때 UDP를 사용한다.


예시

UDP 서버와 클라이언트가 서로 데이터를 주고받는 과정을 간단히 파이썬 코드로 작성해 보자.

client

from socket import *
serverName = 'hostname'
serverPort = 12000

# UDP 소켓을 만듦
clientSocket = socket(AF_INET, SOCK_DGRAM)
message = input("Input lowercase Sentence : ")

# 서버이름과 포트번호를 이용해 서버에게 데이터를 전송
clientSocket.sendto(message.encode(), serverName, serverPort)

# 데이터를 받아서 출력
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
print(modifiedMessage.decode())

clientSocket.close()

server

from socket import *
serverPort = 12000

# UDP 소켓을 만듦
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind((", serverPort))

print("Ready to receive")

while True:
	message, clientAddress = serverSocket.recvfrom(2048)
    modifiedMessage = message.decode().upper()
    serverSocket.sendto(modifiedMessage.encode(), clientAddress)

함께 보면 좋은 글

소켓프로그래밍#2 : TCP와 UDP

profile
베이비 게임 개발자

0개의 댓글