⚠️ 들어가기 앞서
경북대학교 컴퓨터학부 COMP0414-001 컴퓨터망 과목을 공부하며 정리한 글입니다.
Transport layer (전송 계층)은 송신자와 수신자를 연결하여 데이터를 주고받을 수 있도록 한다고 하였다. 전송 계층에서 사용되는 프로토콜은 TCP
와 UDP
가 있는데 여기에 대해서 자세히 알아본다!
TCP는 연결 기반의 프로토콜이며, 신뢰성 있는 데이터 전송을 지원하며, 흐름 제어와 혼잡 제어 등을 지원한다.
TCP의 특징은 다음과 같은 것들이 있다.
connection-oriented
) : 데이터를 주고받기 전에 연결을 수립하는 과정이 필요하다. 이 때 handshaking이 사용된다. (나중에 다룸)flow control
) : 송신 속도에 비해 수신 속도가 너무 느리지 않도록 송신 속도를 조절함congestion control
) : 패킷 수가 너무 많아 queueing delay 또는 packet loss가 생기지 않게 한다.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를 사용한다.
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)