이제 socket이 뭔지 설명해드릴게요.
🔑 1. 소켓(socket)이란?
- **네트워크 통신을 하기 위한 끝점(Endpoint)**을 프로그래밍적으로 표현한 것.
- 쉽게 말하면, 두 프로그램이 네트워크를 통해 데이터를 주고받으려면 서로 연결될 “문”이 필요한데, 이 문을 열고 다루는 도구가 소켓이에요.
🔑 2. 비유
- 집(컴퓨터)마다 주소(IP)가 있고, 방(포트 번호)이 있어요.
- 편지를 주고받으려면 "주소 + 방 번호"가 필요하죠.
- 소켓 = 그 주소와 방 번호를 실제로 연결해 주는 전화기 같은 역할.
- 전화기를 들고 상대방 번호(IP+포트)를 누르면 연결됨.
- 연결이 되면 서로 말을 주고받을 수 있음 → 이게 데이터 송수신.
🔑 3. 소켓의 구성 요소
소켓은 보통 이렇게 식별됩니다:
- IP 주소 (어느 컴퓨터인지)
- 포트 번호 (그 컴퓨터의 어떤 프로그램인지)
- 프로토콜 (TCP인지, UDP인지)
예:
(192.168.0.10 : 8080, TCP) ← 특정 컴퓨터의 웹 서버 소켓
🔑 4. 소켓의 종류 = 프로토콜
- 스트림 소켓 (TCP Socket)
- 연결 지향 (전화처럼 먼저 연결해야 함)
- 데이터 순서 보장, 신뢰성 있음
- 예: 웹 브라우징(HTTP), 메일, SSH
- 데이터그램 소켓 (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에 따라 “전화기(연결형)” 또는 “편지(비연결형)”처럼 동작
소켓을 만들 때 **"이 소켓은 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. 왜 제한을 두는가?
- 메모리 관리
- 무작정 큰 데이터를 한 번에 읽으면 메모리 낭비
- 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)으로 보내지만, 패킷이 이동하는 경로는 라우터, 스위치, 네트워크 혼잡 상태에 따라 다를 수 있어요.
즉, 메시지가 하나의 단위로 전송되긴 하지만:
- 어떤 패킷은 먼저 도착
- 어떤 패킷은 나중에 도착
- 심지어 일부 패킷은 손실될 수도 있음
→ 그래서 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️⃣ 핵심 요약
- UDP 메시지는 애플리케이션 단위에서는 한 덩어리
- IP 레벨에서 MTU보다 크면 강제로 작은 패킷으로 쪼개짐 (Fragmentation)
- UDP는 순서 보장 X, 재전송 X → 패킷 일부 손실 시 메시지 전체 유실 가능
- TCP는 조각을 순서대로 재조립 + 재전송
🔹 비유
- TCP: 큰 책을 여러 장으로 나눠서 보내고, 받는 사람이 순서대로 맞춰 읽음
- UDP: 작은 편지를 한 번에 보내지만, 편지가 너무 크면 우체국(IP)에서 임의로 두 개 봉투로 나눠서 발송
→ 받는 쪽에서 우체국이 다시 합쳐서 가져다 줌 (애플리케이션은 하나로 인식)
이제 UDP에서 나오는 **“데이터그램(datagram)”**이 뭔지 정확히 설명해 드릴게요 😄
1️⃣ 데이터그램(Datagram) 정의
- 데이터그램 = 독립적으로 전송되는 데이터 단위
- UDP 같은 비연결형 프로토콜에서 사용
- 특징:
- 독립적(Independent) → 다른 데이터그램과 연결되지 않음
- 순서 보장 X → 먼저 보낸 순서대로 도착한다는 보장이 없음
- 신뢰성 없음 → 유실되면 재전송 안 함
- 경계 유지(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은 배우기 쉽고 예제가 많아서 학습용으로 자주 쓰이는 것
'네트워크2' 카테고리의 다른 글
| 이더넷 (Ethernet) 이란? :: IEEE 802 / IEEE 802.3 / IEEE 802.11 (0) | 2025.10.02 |
|---|---|
| Gateway (게이트웨이) & Endpoint (엔드포인트) (0) | 2025.10.02 |
| Response Headers :: 캐시 관련 정보 Cache-Control / Etag / X-nextjs-Cache (0) | 2025.10.02 |
| IPv4 주소 CIDR 표기법 :: 서브넷마스크 / 네트워크 주소 / 호스트 주소 / 브로드캐스트 주소 (0) | 2025.10.01 |
| 웹사이트에서 수집 가능한 로그(log) :: SSL/TLS (0) | 2025.10.01 |
| 인터넷 속도 측정에 영향을 주는 요소들 (0) | 2025.09.12 |
| Annealed Bare Copper 란? AWG 란? (0) | 2025.09.12 |
| 단선 vs 연선 차이점 (0) | 2025.09.12 |