[파이썬] TCP 프로토콜과 UDP 프로토콜

인터넷을 사용하는 애플리케이션은 TCP (전송 제어 프로토콜) 또는 UDP (사용자 데이터그램 프로토콜) 중 하나를 사용하여 데이터를 전송합니다. TCP는 신뢰성 있는 연결 지향 프로토콜이고, UDP는 비 연결성 프로토콜입니다. 이 글에서는 파이썬에서 TCP와 UDP를 사용하는 방법을 알아보겠습니다.

TCP 프로토콜

TCP는 인터넷에서 가장 흔히 사용되는 프로토콜 중 하나로, 신뢰성 있는 데이터 전송을 보장합니다. TCP는 연결을 설정하고 데이터를 안정적으로 전달하기 위해 3-way handshake, 순서 제어, 흐름 제어 등의 기능을 제공합니다.

TCP 클라이언트

import socket

def tcp_client():
    # TCP 소켓 생성
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 서버 주소와 포트 설정
    server_address = ('localhost', 8888)
    
    # 서버에 연결
    client_socket.connect(server_address)
    
    try:
        # 데이터 전송
        message = 'Hello, TCP Server!'
        client_socket.sendall(message.encode())
        
        # 데이터 수신
        data = client_socket.recv(1024)
        print('Received:', data.decode())
        
    finally:
        # 소켓 닫기
        client_socket.close()

if __name__ == '__main__':
    tcp_client()

TCP 서버

import socket

def tcp_server():
    # TCP 소켓 생성
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 서버 주소와 포트 설정
    server_address = ('localhost', 8888)
    
    # 서버에 바인딩
    server_socket.bind(server_address)
    
    # 클라이언트 연결 대기
    server_socket.listen(1)
    
    while True:
        print('Waiting for a connection...')
        
        # 클라이언트 연결 수락
        client_socket, client_address = server_socket.accept()
        print('Connected:', client_address)
        
        try:
            # 데이터 수신
            data = client_socket.recv(1024)
            print('Received:', data.decode())
            
            # 데이터 전송
            message = 'Hello, TCP Client!'
            client_socket.sendall(message.encode())
            
        finally:
            # 클라이언트 소켓 닫기
            client_socket.close()

UDP 프로토콜

UDP는 TCP와 달리 연결을 설정하고 확인하는 과정이 없으며, 연결 상태를 유지하지 않습니다. UDP는 데이터 전송 속도가 더 빠르고, 실시간 스트리밍과 같은 신속한 데이터 전송에 적합합니다.

UDP 클라이언트

import socket

def udp_client():
    # UDP 소켓 생성
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    
    # 서버 주소와 포트 설정
    server_address = ('localhost', 8888)
    
    # 데이터 전송
    message = 'Hello, UDP Server!'
    client_socket.sendto(message.encode(), server_address)
    
    # 데이터 수신
    data, server = client_socket.recvfrom(1024)
    print('Received:', data.decode())
    
    # 소켓 닫기
    client_socket.close()

if __name__ == '__main__':
    udp_client()

UDP 서버

import socket

def udp_server():
    # UDP 소켓 생성
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    
    # 서버 주소와 포트 설정
    server_address = ('localhost', 8888)
    
    # 서버에 바인딩
    server_socket.bind(server_address)
    
    print('UDP Server started. Waiting for a connection...')
    
    while True:
        # 데이터 수신
        data, address = server_socket.recvfrom(1024)
        print('Received:', data.decode())
        
        # 데이터 전송
        message = 'Hello, UDP Client!'
        server_socket.sendto(message.encode(), address)

if __name__ == '__main__':
    udp_server()

결론

TCP와 UDP는 각각의 특성을 가지고 있으며, 애플리케이션의 요구 사항에 따라 적절한 프로토콜을 선택해야 합니다. TCP는 신뢰성과 안정성을 위해 사용되고, UDP는 간단하고 빠른 데이터 전송을 위해 사용됩니다. 파이썬에서는 소켓을 사용하여 TCP와 UDP를 구현할 수 있습니다.