전송 제어 프로토콜
TCP 세그먼트 구조

TCP는 데이터 스트림으로부터 데이터를 받아 들여 이것을 청크 단위로 분할한 뒤 TCP 헤더를 덧붙여 TCP 세그먼트를 생성한다. TCP 세그먼트는 IP 데이터그램에 패킷화되어 상대방과 주고 받게 된다.
TCP 패킷이라는 용어가 종종 사용되지만 이는 정확한 표현이 아니다. 세그먼트가 TCP 프로토콜 데이터 유닛(PDU)을 의미하는 정확한 표현이며 데이터그램 은 IP PDU를, 프레임은 데이터 링크 계층 PDU를 의미한다.
프로세스는 TCP를 통해 데이터 버퍼를 인수로 넘겨 줌으로써 데이터를 전송한다. TCP는 이 버퍼들을 묶어 세그먼트를 생성하여 인터넷 모듈(IP 등)을 통해 목적지의 TCP로 각각의 세그먼트들을 전송한다.
TCP 세그먼트는 세그먼트 헤더와 데이터의 두 섹션으로 구성된다. TCP 헤더는 10개의 필수 필드 및 옵션 확장 필드(표 하단의 주황색 부분)들을 포함한다.
헤더 뒤에는 데이터 섹션이 따라 온다. 그 내용은 애플리케이션의 페이로드 데이터이다. 데이터 섹션의 길이는 TCP 세그먼트 헤더에서 결정되지 않으며, 전체 IP 데이터그램의 길이에서 TCP 헤더와 캡슐화된 IP 헤더의 길이를 뺀 값으로 계산하게 된다. 즉, 데이터 섹션의 길이는 IP 헤더에 의해 결정된다.
| 오프셋> 옥텟 | 옥텟> 비트 | 0 | 0>  1 | 0>  2 | 0>  3 | 0>  4 | 0>  5 | 0>  6 | 0>  7 | 1>  8 | 1>  9 | 1> 10 | 1> 11 | 1> 12 | 1> 13 | 1> 14 | 1> 15 | 2> 16 | 2> 17 | 2> 18 | 2> 19 | 2> 20 | 2> 21 | 2> 22 | 2> 23 | 3> 24 | 3> 25 | 3> 26 | 3> 27 | 3> 28 | 3> 29 | 3> 30 | 3> 31 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 0 |  0 | Source port | Source port | Source port | Source port | Source port | Source port | Source port | Source port | Source port | Source port | Source port | Source port | Source port | Source port | Source port | Source port | Destination port | Destination port | Destination port | Destination port | Destination port | Destination port | Destination port | Destination port | Destination port | Destination port | Destination port | Destination port | Destination port | Destination port | Destination port | Destination port |
| 4 | 32 | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number | Sequence number |
| 8 | 64 | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) | Acknowledgment number (if ACK set) |
| 12 | 96 | Data offset | Data offset | Data offset | Data offset | Reserved 0 0 0 | Reserved 0 0 0 | Reserved 0 0 0 | N S | C W R | E C E | U R G | A C K | P S H | R S T | S Y N | F I N | Window Size | Window Size | Window Size | Window Size | Window Size | Window Size | Window Size | Window Size | Window Size | Window Size | Window Size | Window Size | Window Size | Window Size | Window Size | Window Size |
| 16 | 128 | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Urgent pointer (URG 플래그가 설정된 경우) | Urgent pointer (URG 플래그가 설정된 경우) | Urgent pointer (URG 플래그가 설정된 경우) | Urgent pointer (URG 플래그가 설정된 경우) | Urgent pointer (URG 플래그가 설정된 경우) | Urgent pointer (URG 플래그가 설정된 경우) | Urgent pointer (URG 플래그가 설정된 경우) | Urgent pointer (URG 플래그가 설정된 경우) | Urgent pointer (URG 플래그가 설정된 경우) | Urgent pointer (URG 플래그가 설정된 경우) | Urgent pointer (URG 플래그가 설정된 경우) | Urgent pointer (URG 플래그가 설정된 경우) | Urgent pointer (URG 플래그가 설정된 경우) | Urgent pointer (URG 플래그가 설정된 경우) | Urgent pointer (URG 플래그가 설정된 경우) | Urgent pointer (URG 플래그가 설정된 경우) |
| 20 ... | 160 ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... | Options (data offset > 5인 경우. 필요시 끝부분에 "0" 바이트로 패딩 됨.) ... |
SYN 플래그가 (1)로 설정된 경우, 이것은 초기 시퀀스 번호가 된다. 실제 데이터의 최초 바이트 값과 그에 상응하는 ACK 번호는 이 값에 1을 더한 값이 된다.
SYN 플래그가 (0)으로 해제된 경우, 이것은 현재 세션의 이 세그먼트 데이터의 최초 바이트 값의 누적 시퀀스 번호이다.
NS (1 비트) – ECN-nonce 은폐 보호(RFC 3540에 의해 헤더에 추가).
CWR (1 비트) – 혼잡 윈도 축소(Congestion Window Reduced) 플래그는 송신측 호스트에 의해 설정되는 것으로, 호스트가 ECE 플래그가 포함된 TCP 세그먼트를 수신했으며 혼잡 제어 메커니즘에 의해 응답했음을 알리는 역할을 한다(RFC 3168에 의해 헤더에 추가).
ECE (1 비트) – ECN-Echo는 다음을 나타낸다.
SYN 플래그가 (1)로 설정된 경우, TCP 상대가 명시적 혼잡 통지(Explicit Congestion Notification, ECN)가 가능함을 의미한다.
SYN 플래그가 (0)으로 해제된 경우, IP 헤더 셋에 혼잡 경험(Congestion Experienced) 플래그가 설정된 패킷이 정상적인 전송 중에 수신되었다는 것을 의미한다(RFC 3168에 의해 헤더에 추가).
URG (1 비트) – Urgent pointer 필드의 값이 유효함을 나타낸다.
ACK (1 비트) – Acknowledgment 필드의 값이 유효함을 나타낸다. 클라이언트가 보낸 최초의 SYN 패킷 이후에 전송되는 모든 패킷은 이 플래그가 설정되어 있어야 한다.
PSH (1 비트) – 푸시 기능. 수신 애플리케이션에 버퍼링된 데이터를 푸시해 줄지 여부를 질의하는 역할을 한다.
RST (1 비트) – 커넥션 리셋
SYN (1 비트) – 동기화 시퀀스 번호. 양쪽이 보낸 최초의 패킷에만 이 플래그가 설정되어 있어야 한다. 다른 일부 플래그들의 의미가 이 플래그의 값에 따라 바뀌며, 일부 플래그들은 이 플래그가 설정되어 있을 때만 유효하고, 또 다른 일부 플래그들은 이 플래그가 해제되어 있을 때에만 유효하다.
FIN (1 비트) – 남은 송신측 데이터 없음
0 (8 비트) – End of options list
1 (8 비트) – No operation (NOP, Padding) 이것은 속도 향상을 위해 옵션 필드를 32 비트 길이에 맞추기 위해 사용될 수 있다.
2,4,SS (32 비트) – Maximum segment size (최대 세그먼트 크기 참조) [SYN]
3,3,S (24 비트) – Window scale (윈도 조정 참조) [SYN]
4,2 (16 비트) – Selective Acknowledgement permitted. [SYN] (선택적 확인응답 참조)
5,N,BBBB,EEEE,... (variable bits, N is either 10, 18, 26, or 34)- Selective ACKnowledgement (SACK) 이 첫 2 바이트 뒤에는 선택적 확인응답을 받는 1-4개 블럭의 리스트가 따라오게 되며, 이들은 32 비트 시작/종료 포인터로 구분된다.
8,10,TTTT,EEEE (80 비트)- Timestamp and echo of previous timestamp (see TCP 타임스탬프 참조)
14,3,S (24 비트) – TCP Alternate Checksum Request. [SYN]
15,N,... (가변 비트) – TCP Alternate Checksum Data.