TCP
TCP(Transmission Control Protocol)은 데이터를 통신하는 약속이라고 할 수 있다. 자세한 문서는 아래에 있지만... 다 읽어보기가 너무 겁난다...
TCP 통신 과정
데이터를 통신할 때 데이터를 여러조각으로 쪼개서 통신하게 된다. 데이터를 나눠서 아래와 같이 Header를 넣는다. (TCP 세그먼트 생성) 생성한 TCP 세그먼트를 IP 데이터그램으로 변환하여 보낸다. 아래는 TCP 세그먼트의 모습이다.
- Source Port: 데이터를 보내는 곳의 포트 번호 (16비트)
- Destination Port: 데이터를 받는 곳의 포트 번호 (16비트)
- SYN(Sequence Number): 분할된 데이터의 순서 (32비트)
- ACK(Acknowledgment Number): 데이터를 수신하는 곳에서 받은 데이터의 다음 순서 (32비트)
그렇다면 실제로 어떻게 세그먼트가 갈까? 아래와 같이 간다고 볼 수 있다.
30 39 00 50 00 00 03 E9 00 00 00 00 50 02 10 00 12 34 00 00 68 65 6C 6C 6F 2C 20 73 65 72 76 65 72 21
필드 | 값 | 설명 |
Source Port | 30 39 | 12345 |
Destination Port | 00 50 | 80 |
Sequence Number | 00 00 03 E9 | 1001 |
Acknowledgment Number | 00 00 00 00 | 0 |
Data Offset & Reserved | 5 0 | 5 (20바이트 헤더) |
Flags | 02 | SYN |
Window Size | 10 00 | 4096 수신자가 한 번에 수신할 수 있는 데이터의 최대 크기 |
Checksum | 12 34 | 0x1234 헤더와 데이터를 대상으로 계산된 값 |
Urgent Pointer | 00 00 | 0 긴급으로 처리되어야 하는 경우 |
Options | 없음 | 여러 추가 기능(예: 윈도우 크기 조정, 타임스탬프, 선택적 재전송 요청 등)을 포함할 수 있음 |
Data | 68 65 6C 6C 6F 2C 20 73 65 72 76 65 72 21 | "hello, server!" |
TCP 연결 (3- Way-Handshake)
TCP 연결을 생성할 때는 3-Way Handshake를 이용한다. 3번 악수한다고 생각하면 될 것 같다(?)
아래와 같이 서로 Flag를 주고받으면서 확인을 한다. 아래와 같은 3단계를 거치면 데이터 전송이 가능하게 된다.
순서 | 방향 | Flag | SYN, ACK |
1 | 클라이언트 → 서버 | SYN(0x02) | Sequence Number = 100 |
2 | 서버 → 클라이언트 | SYN + ACK(0x12) | Sequence Number = 300, Acknowledgment Number = 101 |
3 | 클라이언트 → 서버 | ACK(0x10) | Sequence Number = 101, Acknowledgment Number = 301 |
Handshake 이후 데이터 전송
TCP 데이터 전송 중에는 서버와 클라이언트가 ACK 플래그만 설정된 패킷을 주고받으며 데이터를 전송하고 수신을 확인한다. 아래와 같이 hello, server!의 경우 14바이트이기 때문에 아래와 같이 이루어진다.
68 65 6C 6C 6F 2C 20 73 65 72 76 65 72 21
순서 | 방향 | Flag | SYN, ACK |
1 | 클라이언트 → 서버 | ACK(0x10) | Sequence Number = 101, Acknowledgment Number = 301, Data Length = 14 |
2 | 서버 → 클라이언트 | ACK(0x10) | Sequence Number = 301, Acknowledgment Number = 116 |
TCP 연결 종료 (4-Way-Handshake)
아래와 같이 4단계를 거쳐서 연결이 종료되게 된다. FIN, ACK를 통해 서로 메세지를 확인한다.
순서 | 방향 | Flag | SYN, ACK |
1 | 클라이언트 → 서버 | FIN, ACK | Sequence Number = 100, Acknowledgment Number = 300 |
2 | 서버 → 클라이언트 | ACK | Sequence Number = 300, Acknowledgment Number = 101 |
3 | 서버 → 클라이언트 | FIN, ACK | Sequence Number = 300, Acknowledgment Number = 101 |
4 | 클라이언트 → 서버 | ACK | Sequence Number = 101, Acknowledgment Number = 301 |
UDP
UDP(User Datagram Protocol)은 문서도 아주 간단하다. (단 3페이지!)
- Source Port: 패킷을 보낸 송신자의 포트 번호
- Destination Port: 패킷을 수신할 수신자의 포트 번호
- Length: UDP 헤더와 데이터를 포함한 전체 패킷의 길이 (최소 값 8바이트)
- Checksum: 데이터의 무결성을 확인하기 위해 사용
- Data Octets: 전송하려는 실제 데이터
이와 같이 같단하게 Header를 붙여 유저 데이터그램을 만들어 전송한다. 공식 문서에서도 데이터의 전달, 순서를 보장할 수 없으니 이를 보장하려면 TCP를 사용하라고 나와있다.
This protocol provides a procedure for application programs to send messages to other programs with a minimum of protocol mechanism. The protocol is transaction oriented, and delivery and duplicate protection are not guaranteed. Applications requiring ordered reliable delivery of streams of data should use the Transmission Control Protocol (TCP)
'→ Computer Science' 카테고리의 다른 글
[CS] 프로세스와 스레드 딥다이브 - 2. 프로세스의 구조?? (1) | 2025.01.18 |
---|---|
[CS] 프로세스와 스레드 딥다이브 - 1. 딥다이브 전 기초지식 (0) | 2025.01.18 |
[RTMP] RTMP 프로토콜 개요 (7) | 2024.11.08 |
[CS] 소켓을 Swift로 알아보기 (0) | 2024.11.07 |
[CS] 정지문제 (Halting problem) (0) | 2024.04.08 |