본문 바로가기
네트워크2

소켓 이란? (socket) :: TCP vs UDP 차이점 비교

by 로맨틱스터디 2025. 10. 1.
728x90
반응형

이제 socket이 뭔지 설명해드릴게요.


🔑 1. 소켓(socket)이란?

  • **네트워크 통신을 하기 위한 끝점(Endpoint)**을 프로그래밍적으로 표현한 것.
  • 쉽게 말하면, 두 프로그램이 네트워크를 통해 데이터를 주고받으려면 서로 연결될 “문”이 필요한데, 이 문을 열고 다루는 도구가 소켓이에요.

🔑 2. 비유

  • 집(컴퓨터)마다 주소(IP)가 있고, 방(포트 번호)이 있어요.
  • 편지를 주고받으려면 "주소 + 방 번호"가 필요하죠.
  • 소켓 = 그 주소와 방 번호를 실제로 연결해 주는 전화기 같은 역할.
    • 전화기를 들고 상대방 번호(IP+포트)를 누르면 연결됨.
    • 연결이 되면 서로 말을 주고받을 수 있음 → 이게 데이터 송수신.

🔑 3. 소켓의 구성 요소

소켓은 보통 이렇게 식별됩니다:

  • IP 주소 (어느 컴퓨터인지)
  • 포트 번호 (그 컴퓨터의 어떤 프로그램인지)
  • 프로토콜 (TCP인지, UDP인지)

예:
(192.168.0.10 : 8080, TCP) ← 특정 컴퓨터의 웹 서버 소켓


🔑 4. 소켓의 종류 = 프로토콜

  1. 스트림 소켓 (TCP Socket)
    • 연결 지향 (전화처럼 먼저 연결해야 함)
    • 데이터 순서 보장, 신뢰성 있음
    • 예: 웹 브라우징(HTTP), 메일, SSH
  2. 데이터그램 소켓 (UDP Socket)
    • 비연결 지향 (편지 보내듯, 그냥 보내면 됨)
    • 속도 빠르지만, 데이터 유실/순서 꼬일 수 있음
    • 예: 온라인 게임, 화상통화, 스트리밍

🔑 5. 프로그래밍에서 소켓

프로그래머는 소켓을 이용해서 네트워크 통신을 만듭니다. (Python 예시)

import socket

# TCP 소켓 생성
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 서버에 연결
s.connect(("example.com", 80))

# 데이터 전송
s.send(b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")

# 데이터 수신
data = s.recv(1024)
print(data.decode())

s.close()
 

여기서 socket.socket(...)으로 소켓을 열고, 연결(s.connect), 전송(s.send), 수신(s.recv) 과정을 거칩니다.


✅ 정리

  • 소켓 = 네트워크 통신을 위한 프로그래밍 인터페이스
  • IP + 포트 + 프로토콜 조합으로 특정 통신 경로를 지정
  • TCP/UDP에 따라 “전화기(연결형)” 또는 “편지(비연결형)”처럼 동작
728x90

 

소켓을 만들 때 **"이 소켓은 TCP로 할래, UDP로 할래"**를 개발자가 직접 정해야 합니다.


🔑 1. 소켓에서 TCP/UDP 선택 방법

소켓 생성 시 두 가지 인자를 넘겨줍니다:

  • 주소 체계 (Address Family)
    • AF_INET → IPv4
    • AF_INET6 → IPv6
  • 소켓 타입 (Socket Type)
    • SOCK_STREAM → TCP (스트림 기반, 연결형)
    • SOCK_DGRAM → UDP (데이터그램 기반, 비연결형)

🔑 2. Python 예시

(1) TCP 소켓

 
import socket

# IPv4 + TCP
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 서버 연결
tcp_socket.connect(("example.com", 80))  

# 데이터 송신
tcp_socket.send(b"Hello TCP")

# 데이터 수신
print(tcp_socket.recv(1024))

tcp_socket.close()

➡️ 전화기처럼 연결(connect)을 먼저 맺고, 이후 데이터를 주고받음.
순서 보장 + 신뢰성 있음.


(2) UDP 소켓

import socket

# IPv4 + UDP
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 연결 과정 없음, 바로 전송
udp_socket.sendto(b"Hello UDP", ("example.com", 8080))

# 데이터 수신
data, addr = udp_socket.recvfrom(1024)
print("받은 데이터:", data, "보낸 곳:", addr)

udp_socket.close()

➡️ 편지처럼 상대 주소만 적고 바로 보냄(sendto). udp_socket.connet(("example.com", 80)) 없음
빠르지만 순서 보장 X, 유실 가능.


🔑 3. TCP vs UDP 선택 기준

  • TCP (SOCK_STREAM)
    • 연결형 → 신뢰성 중요할 때 (웹, 메일, 파일 전송, SSH)
  • UDP (SOCK_DGRAM)
    • 비연결형 → 속도 중요할 때 (게임, 영상 스트리밍, 음성 통화)

✅ 정리
소켓에서 TCP/UDP를 선택하는 건 소켓을 만들 때 SOCK_STREAM(TCP) / SOCK_DGRAM(UDP) 중 어떤 타입을 고르냐에 달려 있어요.
즉, 개발자가 직접 정해야 하고, 용도에 따라 달라집니다.

 


 

tcp_socket.connect(("example.com", 80)) 에서 80은 **포트 번호(port number)**입니다.


🔑 1. 포트 번호란?

  • 하나의 컴퓨터(서버)여러 개의 네트워크 프로그램을 동시에 실행할 수 있어요.
  • 그런데 IP 주소만으로는 "어떤 프로그램"과 통신할지 알 수 없음.
  • 그래서 포트 번호라는 "방 번호"를 붙여서 구분합니다.
    • IP = 아파트 주소
    • 포트 번호 = 몇 호실인지

즉, (IP 주소 + 포트 번호) 조합이 정확한 "통신 대상"을 지정합니다.


🔑 2. 80번 포트의 의미

  • 포트 번호는 국제적으로 표준이 정해져 있음 (Well-known Ports)
  • 대표적인 것들:
    • 80 → HTTP (웹, 암호화 없는 기본 통신)
    • 443 → HTTPS (TLS를 사용하는 웹)
    • 22 → SSH
    • 25 → SMTP (메일 전송)
    • 3306 → MySQL
    • 53 → DNS

➡️ 80번은 HTTP 기본 포트라서, 웹 브라우저가 http://example.com에 접속하면 내부적으로 :80 포트로 연결하는 거예요.


🔑 3. connect(("example.com", 80)) 동작 원리

  • example.com → DNS를 통해 IP 주소로 변환됨.
  • 80 → 해당 서버의 HTTP 서버 프로세스가 열어둔 포트 번호.
  • 소켓은 (IP, 80)에 연결해서 데이터를 주고받음.

즉, ("example.com", 80)은
👉 "example.com 서버80번 포트에서 대기 중인 HTTP 서버와 연결하라"는 뜻이에요.


✅ 정리
connect(("example.com", 80))에서 80은 포트 번호이고, 이 번호를 통해 같은 IP 안에서도 정확히 어떤 서비스(프로세스)와 통신할지 구분합니다.

 


 

포트 번호가 가리키는 건 **앱(프로그램) 자체가 아니라 네트워크에서 제공하는 “서비스”**입니다.


🔹 1. 앱 vs 네트워크 서비스

  • 앱(Application): 우리가 설치해서 쓰는 프로그램. 예: 웹 브라우저, 메일 클라이언트, 게임 앱
  • 서비스(Service): 네트워크 상에서 외부 요청을 받아서 처리하는 프로그램
    • 예: 웹 서버(Apache, Nginx), SSH 서버, MySQL 서버

포트 번호는 컴퓨터 안에서 어떤 서비스가 네트워크 요청을 처리할지 구분해주는 역할이에요.


🔹 2. 예시

  • 웹 서버: TCP 80번 포트 → HTTP 요청 처리
  • HTTPS 서버: TCP 443번 포트 → 암호화된 HTTPS 요청 처리
  • SSH 서버: TCP 22번 포트 → 원격 접속 요청 처리

즉, 포트 번호 = 서비스 식별자

  • 같은 서버(IP) 안에서도 포트가 다르면 다른 서비스와 통신
  • 같은 서비스는 여러 포트를 열 수도 있음, 보통 표준 포트를 사용

🔹 3. 비유

  • 컴퓨터 = 아파트
  • IP = 아파트 주소
  • 포트 = 호수(방 번호)
  • 서비스 = 방 안에서 운영되는 특정 기능(웹서버, SSH, 메일)
  • 앱 = 사용자가 사용하는 방문자

예:

집(IP 주소) 101호(포트 80) = 웹서버 서비스
집(IP 주소) 102호(포트 22) = SSH 서비스


✅ 정리

  • 포트 번호는 앱이 아니라 네트워크 서비스를 가리킵니다.
  • 같은 IP 안에서도 여러 서비스가 동시에 동작 가능하도록 구분해 주는 장치예요

 

tcp_socket.recv(1024)에서 1024한 번에 받을 수 있는 최대 바이트(byte) 수를 의미합니다.


🔹 1. recv 함수의 의미

  • recv()는 소켓에서 데이터를 읽어오는 함수입니다.
  • 한 번 호출하면 서버가 보낸 데이터 중 일부 또는 전부를 가져옵니다.
  • 이때 얼마나 많이 읽을지 제한을 숫자로 지정해야 합니다.
data = tcp_socket.recv(1024)
  • 1024 = 최대 1024바이트(약 1KB)까지 읽어오기
  • 서버가 그보다 더 많은 데이터를 보내면, 다음 recv 호출에서 나머지를 읽어야

🔹 2. 왜 제한을 두는가?

  1. 메모리 관리
    • 무작정 큰 데이터를 한 번에 읽으면 메모리 낭비
  2. TCP 스트림 특성
    • TCP는 데이터가 조각(segment)으로 전송
    • recv(1024)는 “최대 1024바이트까지 읽을 수 있음”이지, 반드시 1024바이트가 채워져서 오는 건 아님

🔹 3. 예시

서버가 2500바이트를 보냈다고 가정:

 
chunk1 = tcp_socket.recv(1024)  # 최대 1024바이트 읽음 → 실제 1024
chunk2 = tcp_socket.recv(1024)  # 다음 1024바이트 읽음
chunk3 = tcp_socket.recv(1024)  # 남은 452바이트 읽음
  • 총 3번 recv를 호출해야 모든 데이터를 받음
  • 1024는 버퍼 크기라고 생각하면 이해가 쉬워요

✅ 정리

  • recv(1024)에서 1024 = 한 번에 읽어올 최대 바이트 수
  • TCP는 스트림 기반이어서 한 번에 모든 데이터가 오지 않을 수 있음 → 여러 번 recv 필요

1️⃣ b"Hello TCP"에서 b는?

  • b는 바이트(byte) 리터럴이라는 뜻이에요.
  • 파이썬에서는 **문자열(str)**과 **바이트(bytes)**를 구분합니다.
msg = "Hello TCP"   # str, 텍스트
msg_bytes = b"Hello TCP"  # bytes, 네트워크 전송용
  • 네트워크 소켓은 문자열이 아니라 바이트 단위 데이터를 전송해야 하므로, 문자열 앞에 b를 붙여 바이트로 변환합니다.
  • TCP/UDP 모두 바이트 단위 전송이기 때문에 필수입니다.

2️⃣ TCP는 데이터가 조각(segment)으로 전송된다 vs UDP

TCP (스트림 기반)

  • TCP는 연결형, 신뢰성 있는 스트림 프로토콜
  • 보낸 데이터가 **조각(segment)**으로 나뉘어 전송될 수 있음
    • 예: send(b"Hello TCP")라고 해도 네트워크에서는 여러 패킷으로 나눠서 보낼 수 있음
    • 수신 측 recv()에서는 한 번에 들어오는 양이 항상 보낸 양과 일치하지 않음
  • TCP는 조각을 다시 순서대로 재조립해서 응용 프로그램에 전달합니다.

UDP (데이터그램 기반)

  • UDP는 비연결형, 데이터그램 단위 전송
  • 보낸 데이터 그대로 하나의 단위(datagram)로 전달
    • 한 번 sendto()로 보낸 메시지는 하나의 UDP 패킷
    • 수신 측 recvfrom()에서 한 번에 온 전체 메시지를 받을 수 있음
  • 특징: 순서 보장 X, 유실 가능, 하지만 조각 재조립 불필요

1️⃣ UDP는 한 덩어리로 전송되지만, 순서가 보장되지 않는 이유

  • UDP는 비연결형 프로토콜이에요.
  • 네트워크는 실제로 패킷 단위로 데이터를 전송합니다.
  • UDP는 각 메시지를 독립적인 패킷(datagram)으로 보내지만, 패킷이 이동하는 경로라우터, 스위치, 네트워크 혼잡 상태에 따라 다를 수 있어요.

즉, 메시지가 하나의 단위로 전송되긴 하지만:

  1. 어떤 패킷은 먼저 도착
  2. 어떤 패킷은 나중에 도착
  3. 심지어 일부 패킷은 손실될 수도 있음

→ 그래서 UDP는 순서 보장 X, 재전송 X


2️⃣ 왜 유실될 수 있는가?

  • UDP는 오류 검출만 하고 재전송은 하지 않음
  • 네트워크가 혼잡하거나 패킷이 손상되면 해당 패킷은 그냥 사라짐
  • TCP는 이런 패킷 유실을 감지하고 재전송하며, 조각이 순서대로 재조립

3️⃣ 정리하면

특징 TCP UDP
연결 연결형 비연결형
순서 보장 O (조각 재조립) X (독립 패킷)
유실 처리 O (재전송) X (패킷 손실 가능)
데이터 단위 스트림 데이터그램
  • UDP는 한 번에 전체 메시지를 보내지만, 네트워크 특성상 패킷이 늦게 도착하거나 사라질 수 있음 → 순서와 신뢰성이 없다고 보는 것

비유:

  • TCP: 편지 여러 장을 봉투 순서대로 보내고, 안 오면 다시 보내달라고 함
  • UDP: 편지봉투 하나만 던짐, 순서 확인이나 재전송 없음

 

“조각(fragment)”과 “패킷(packet)”은 비슷하게 들리지만 엄밀히 다른 개념입니다.


1️⃣ 패킷(Packet)이란?

  • 네트워크에서 전송되는 데이터의 기본 단위를 의미합니다.
  • 송신자가 데이터를 보내면, 네트워크는 이를 패킷 단위로 쪼개서 전송합니다.
  • 각 패킷에는 **헤더(주소, 포트, 시퀀스 번호 등)**와 **페이로드(실제 데이터)**가 포함돼 있어요.

쉽게 말하면 “편지 봉투 하나” 같은 느낌


2️⃣ 조각(Fragment)란?

  • 조각은 원래 패킷이 네트워크에서 너무 커서 여러 개로 나뉜 상태를 의미합니다.
  • 즉, 조각 = “하나의 큰 패킷을 쪼갠 작은 패킷
  • 수신 측에서 조각들을 모아 원래 데이터로 재조립해야 합니다.

3️⃣ TCP vs UDP에서의 차이

구분 TCP UDP
데이터 단위 스트림 메시지(데이터그램)
조각화 네트워크 레벨에서 IP 조각 가능, TCP 내부적으로도 세그먼트로 나눔 UDP 메시지 하나가 IP 패킷으로 전송됨 (독립적)
순서 재조립 후 순서 보장 순서 보장 X
신뢰성 재전송 O 없음
  • TCP: “Hello TCP”라는 메시지를 보내도, 네트워크에서는 세그먼트(segment)라는 조각으로 나눠 전송될 수 있음.
  • UDP: 한 메시지(데이터그램)는 독립적인 패킷 하나로 전송되며, 다른 메시지와 연결되지 않음.
    • 패킷이 늦게 도착하거나 유실돼도 UDP는 별도로 순서 재조립하지 않음

4️⃣ 비유

  • TCP: 큰 책을 여러 장으로 나눠 보내고, 받는 쪽에서 순서대로 다시 맞춤 → 조각(fragment)
  • UDP: 작은 편지봉투 하나씩 던짐 → 독립 패킷(packet)
    • 순서나 재조립 신경 안 씀

✅ 핵심

  • 패킷 = 네트워크 전송 단위
  • 조각 = 패킷이 너무 커서 쪼갠 작은 단위
  • TCP는 스트림을 세그먼트/조각으로 나눠 보내고 순서 재조립
  • UDP는 메시지 단위로 보내며, 각 패킷은 독립적이고 순서 보장 없음

 

사실 여기서 **UDP(데이터그램) = “한 덩어리 전송”**이라는 말이 약간 오해를 줄 수 있어요. 정리해서 정확히 설명할게요.


1️⃣ UDP 메시지와 IP 패킷

  • UDP는 애플리케이션 단위에서 메시지하나의 데이터그램(datagram)으로 다룸
  • 송신자가 UDP로 5000바이트 메시지를 보내면, UDP는 이 메시지를 하나의 데이터그램으로 취급합니다.
  • 하지만 네트워크 층(IP 레벨)에서는 최대 전송 단위(MTU, Maximum Transmission Unit)보다 크면 자동으로 조각(Fragment)으로 쪼개서 전송합니다.

즉:

UDP 자체는 “한 덩어리”라고 하지만, 실제 네트워크에서는 IP 레벨에서 강제로 쪼개질 수 있음


2️⃣ TCP와 비교

특징 TCP UDP
데이터 단위 스트림 메시지(데이터그램)
조각화 TCP 세그먼트 단위로 쪼개고, 재조립 + 순서 보장 UDP 메시지 단위로 전송, 순서 보장 X, IP에서만 강제 조각 가능
재조립 TCP가 직접 함 UDP는 OS/네트워크가 조각 재조립, 애플리케이션은 원래 메시지 받음
  • TCP는 애플리케이션이 보낸 데이터가 네트워크에서 어떻게 쪼개질지 몰라도 TCP가 세그먼트를 재조립해서 순서대로 전달
  • UDP는 애플리케이션 메시지가 하나면 하나로 처리하지만, IP 레벨에서 MTU보다 크면 조각이 발생 → 수신 측에서 OS가 재조립 후 애플리케이션에 전달

3️⃣ 핵심 요약

  1. UDP 메시지는 애플리케이션 단위에서는 한 덩어리
  2. IP 레벨에서 MTU보다 크면 강제로 작은 패킷으로 쪼개짐 (Fragmentation)
  3. UDP는 순서 보장 X, 재전송 X → 패킷 일부 손실 시 메시지 전체 유실 가능
  4. TCP는 조각을 순서대로 재조립 + 재전송

🔹 비유

  • TCP: 큰 책을 여러 장으로 나눠서 보내고, 받는 사람이 순서대로 맞춰 읽음
  • UDP: 작은 편지를 한 번에 보내지만, 편지가 너무 크면 우체국(IP)에서 임의로 두 개 봉투로 나눠서 발송
    → 받는 쪽에서 우체국이 다시 합쳐서 가져다 줌 (애플리케이션은 하나로 인식)

이제 UDP에서 나오는 **“데이터그램(datagram)”**이 뭔지 정확히 설명해 드릴게요 😄


1️⃣ 데이터그램(Datagram) 정의

  • 데이터그램 = 독립적으로 전송되는 데이터 단위
  • UDP 같은 비연결형 프로토콜에서 사용
  • 특징:
    1. 독립적(Independent)다른 데이터그램과 연결되지 않음
    2. 순서 보장 X → 먼저 보낸 순서대로 도착한다는 보장이 없음
    3. 신뢰성 없음 → 유실되면 재전송 안 함
    4. 경계 유지(Boundary preserved)한 번 보내면, 수신 측에서도 하나의 메시지로 그대로 도착

2️⃣ TCP와 비교

항목 TCP UDP(데이터그램)
데이터 단위 스트림 (연속된 바이트) 데이터그램 (독립 메시지)
순서 보장 보장 X
신뢰성 재전송 + 재조립 없음
경계 유지 없음 (recv 크기대로 잘라서 받음) 있음 (한 번 보낸 메시지 그대로 받음)
  • TCP는 연속 스트림이므로 하나의 메시지가 여러 recv 호출로 나눠서 도착할 수 있음
  • UDP는 하나의 메시지를 데이터그램 단위로 보냄 → 수신 측 recvfrom에서 한 번에 그 메시지 전체를 받음

3️⃣ 비유

  • TCP 스트림: 긴 호수에 물을 계속 흘려보내는 느낌 → 받는 사람은 원하는 만큼 떠서 받음
  • UDP 데이터그램: 작은 병에 담긴 메시지 하나하나를 던져서 보내는 느낌
    • 병은 독립적 → 순서 뒤바뀌거나 일부 사라질 수 있음

4️⃣ 요약

  • 데이터그램 = UDP가 보내는 독립적인 메시지 단위
  • 특징: 순서 X, 신뢰성 X, 경계 유지 O
  • TCP 스트림과 가장 큰 차이는 연속 스트림 vs 독립 메시지라고 보면 됨

 

1️⃣ UDP 메시지는 애플리케이션 관점에서 한 덩어리

  • UDP는 애플리케이션이 보낸 메시지를 하나의 데이터그램 단위로 처리합니다.
  • 즉, 애플리케이션 입장에서 보면 한 번 sendto()로 보낸 메시지는 recvfrom()에서 그대로 하나로 도착합니다.
  • 여기서 “그대로”라는 말은 애플리케이션 수준에서 경계가 유지된다는 뜻이지, 네트워크 내부 전송 방식까지 포함한 얘기는 아니에요.

2️⃣ 네트워크(MTU) 때문에 쪼개지는 경우

  • 네트워크 하위층(IP 레벨)에서는 **MTU(Maximum Transmission Unit)**라는 제한이 있습니다.
  • 만약 UDP 데이터그램이 MTU보다 크면, IP 레이어에서 **자동으로 조각(Fragmentation)**이 발생합니다.
  • 조각들은 네트워크를 통해 전송되고, 수신 측 IP 스택조각을 다시 합쳐서 UDP 레이어에 전달합니다.
  • 즉, 애플리케이션 입장에서는 여전히 “한 덩어리 메시지”로 도착하지만, 실제 전송은 조각으로 나뉠 수 있음

3️⃣ 순서 뒤바뀜과 유실

  • UDP 애플리케이션 메시지는 하나로 도착하지만, 여러 데이터그램을 보냈을 때 순서를 보장하지 않음
    • 메시지 1, 2, 3을 보내도, 네트워크 경로 차이로 3, 1, 2 순서로 도착할 수 있음
  • UDP는 재전송 기능이 없음
    • 네트워크에서 패킷 일부가 손실되면, 애플리케이션은 그냥 놓치게 됨

즉:

  • 단일 UDP 메시지 = 애플리케이션에서는 하나로 도착
  • 여러 메시지/데이터그램 = 순서 뒤바뀌거나 일부 유실 가능

4️⃣ 정리

관점 단일 메시지 여러 메시지
애플리케이션 입장 그대로 도착 (경계 유지) 순서 보장 X, 일부 유실 가능
네트워크(IP) 입장 MTU보다 크면 조각 → 수신 측에서 재조립 각 데이터그램 독립적으로 이동, 순서/유실 가능
  • 한 메시지를 애플리케이션에서 받는 것과, 네트워크 내부에서 패킷이 어떻게 전송되는 것은 다른 층이라는 점이 핵심입니다.

 

1️⃣ “독립적으로 이동”의 의미

  • UDP 데이터그램은 서로 연결되지 않고, 각자 따로 네트워크를 통해 이동합니다.
  • 말 그대로: 각 메시지(데이터그램)가 다른 경로를 통해 목적지로 갈 수 있음
    • 어떤 데이터그램은 가까운 라우터 경로빠르게 도착
    • 어떤 데이터그램은 다른 경로로 느리게 도착
    • 심지어 일부는 도착하지 않을 수도 있음

즉, UDP는 전송 순서나 경로를 관리하지 않는다는 뜻이에요.


2️⃣ 독립적으로 이동하지 않으면?

  • 만약 UDP 데이터그램이 서로 연결되어 순서를 강제로 유지하며 이동한다면,
    • 사실상 TCP처럼 동작하게 됩니다.
    • 연결 관리, 재전송, 순서 보장 기능이 필요해짐 → UDP의 장점인 간단함과 속도 상실
  • 독립적 이동 덕분에:
    • 빠른 전송 가능
    • 헤더/재전송 부담 없음
    • 실시간 서비스(게임, 음성, 스트리밍)에 유리

3️⃣ 예시 비유

  • TCP 스트림: 여러 편지를 택배 기사 한 명이 순서대로 배달
    • 늦은 편지는 재전송, 순서 보장
  • UDP 데이터그램: 여러 편지를 각각 다른 택배사에 맡김
    • 순서 보장 없음, 일부 분실 가능
    • 그러나 각 편지는 독립적으로 목적지까지 도착하면 애플리케이션에서 하나의 메시지로 처리 가능

4️⃣ 정리

  • 독립적 이동 = 각 데이터그램이 서로 영향을 받지 않고 네트워크를 통해 전송됨
  • 장점: 빠르고 단순, 실시간 통신에 유리
  • 단점: 순서 보장 X, 손실 발생 가능 → 애플리케이션에서 직접 처리 필요

TCP/UDP 소켓은 Python 전용이 아니라 거의 모든 프로그래밍 언어에서 만들 수 있어요.
Python 예제가 많이 나오니까 그렇게 오해하기 쉽지만, 실제로는 언어별로 네트워크 소켓 API가 제공됩니다.


1️⃣ TCP/UDP 소켓을 지원하는 대표 언어와 예시

언어 TCP 소켓 생성 UDP 소켓 생성
C / C++ socket(AF_INET, SOCK_STREAM, 0) socket(AF_INET, SOCK_DGRAM, 0)
Java Socket("host", port) DatagramSocket()
Go net.Dial("tcp", "host:port") net.Dial("udp", "host:port")
C#/.NET TcpClient UdpClient
JavaScript(Node.js) net.createConnection() dgram.createSocket("udp4")
Python socket.socket(AF_INET, SOCK_STREAM) socket.socket(AF_INET, SOCK_DGRAM)

2️⃣ 핵심 포인트

  • TCP/UDP 소켓 운영체제 수준에서 제공하는 기능을 언어가 감싸서 API 형태로 제공
  • Python, C, Java, Go 등 언어마다 문법과 라이브러리만 다를 뿐 동작 원리는 동일
  • 따라서 Python만 쓸 수 있는 건 아님
  • 다만 Python은 문법이 간단해서 학습용 예제가 많이 나오는 편

3️⃣ 예시: C에서 TCP 소켓 생성

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main() {
    int sock = socket(AF_INET, SOCK_STREAM, 0); // TCP 소켓 생성
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(80);
    addr.sin_addr.s_addr = inet_addr("93.184.216.34"); // example.com IP

    connect(sock, (struct sockaddr*)&addr, sizeof(addr)); // 서버 연결
}
  • Python 예제와 기능은 동일
  • 다만 문법함수 호출 방식만 다릅니다

✅ 정리

  • TCP/UDP 소켓은 Python 전용이 아님
  • 거의 모든 언어에서 OS 소켓 API를 통해 만들 수 있음
  • Python은 배우기 쉽고 예제가 많아서 학습용으로 자주 쓰이는 것
728x90
반응형