Network

[ Network ] TCP 헤더 구조

jogaknabi_1023 2024. 3. 24. 17:51

TCP Header 구조

 

TCP는 여러 개의 필드로 나누어진 20 bytes = 160 bits 헤더를 사용하며, 각 필드의 비트를 0 또는 1로 변경하여 전송하고자 하는 세그먼트의 정보를 나타낸다. 여기서 분홍색 부분에서 보이는 20 bytes라는 것은 아무 옵션도 없는 기본적인 헤더일 때의 용량이고 최대 40 bytes가 더해진 60 bytes 까지도 사용할 수 있다.

 

 

Source Port & Destination Port

세그먼트의 출발지와 목적지를 나타내는 필드로 각각 16 bits를 할당받는다. 이 때 출발지와 목적지의 주소를 판별하기 위해 IP 주소와 Port 번호가 필요하다. IP 주소는 네트워크 계층에 있는 IP의 헤더에 담기기 때문에 TCP 헤더에는 IP 주소를 나타내는 필드는 없고 Port를 나타내는 필드만 존재한다.

 

 

Sequence Number

전송하는 데이터의 순서를 의미하며, 32 bits를 할당받는다. 최대 4,294,967,296 까지의 수를 담을 수 있기 때문에 시퀀스 번호가 그리 쉽게 중복되지는 않는다. 이 시퀀스 번호 덕분에 수신자는 쪼개진 세그먼트 순서를 파악해서 올바른 순서로 데이터를 재조립할 수 있다.

송신자가 최초로 데이터를 전송할 때는 이 번호를 랜덤한 수로 초기화 하며, 이후 자신이 보낼 데이터의 1 bytes당 시퀀스 번호를 1씩 증가시키며 데이터의 순서를 표현하다 4,294,967,296를 넘어갈 경우 다시 0부터 시작한다.

 

 

Acknowledgment Number (ACK Number)

승인 번호는 데이터를 받은 수신자가 예상하는 다음 시퀀스 번호를 의미(= 다음에 보내줘야하는 데이터의 시작점)하며, 32 bits를 할당받는다. 연결 설정과 연결 해제 때 발생하는 핸드쉐이크 과정에서는 상대방이 보낸 시퀀스 번호 + 1로 자신의 승인 번호를 만들어내지만, 실제로 데이터를 주고 받을 때는 상대방이 보낸 시퀀스 번호 + 자신이 받은 데이터의 bytes로 승인 번호를 만들어낸다.

 

Sequence Number 와 Acknowledgment Number

 

패킷을 캡처해서 확인해보자. Sequence Number=1449, Next Sequence Number= 2897 인 것을 보면?

해당 패킷은 1449 부터 시작해서 2896 까지의 TCP 세그먼트 데이터를 전송하고 있다는 것을 알 수 있다.

그리고 ACK Number = 2018 인 것을 보면? 2017 번호까지 데이터를 처리 완료하였으니 2018 번호의 TCP 세그먼트를 전송해달라는 것을 확인할 수 있다.

 

 

Data Offset

전체 세그먼트 중에서 헤더가 아닌 데이터가 시작되는 위치가 어디부터인지를 표시한다. 이 오프셋을 표기할 때는 32 bit word 단위를 사용하며, 32 비트 체계에서의 1 Word = 4 bytes를 의미한다. 즉, 이 필드의 값에 4를 곱하면 세그먼트에서 헤더를 제외한 실제 데이터의 시작 위치를 알 수 있는 것이다.

 

 

Reserved (3 bits)

미래를 위해 예약된 필드로, 모두 0으로 채워져야 한다.

 

 

Flags (NS ~ FIN)

9개의 비트 플래그이다. 이 플래그들은 현재 TCP 세그먼트의 속성을 나타낸다. 기존 6개에서 혼잡 제어 기능 향상을 위해 Reserved 필드를 활용하여 NS, CWR, ECE 플래그가 추가되었다.

필드 의미
URG (Urgent) 긴급한 데이터가 포함된 세그먼트
ACK (Acknowledgment) Acknowledgment(승인 번호) 필드에 값이 채워져있음을 알리는 플래그
PSH (Push) 수신 측에게 이 데이터를 최대한 빠르게 응용프로그램에게 전달해달라는 플래그
RST (Reset) 연결 재설정
SYN (Synchronize) 상대방과 연결을 생성할 때, 시퀀스 번호의 동기화를 맞추기 위한 세그먼트
FIN (Finish) 상대방과의 연결 종료 요청
NS (Nonce Sum) TCP 세그먼트의 보안을 강화하는 데 사용
CWR, ECE 필드가 실수나 악의적으로 은폐되는 경우를 방어
CWR (Congestion Window Reduced)
이미 ECE 플래그를 받아서, 전송하는 세그먼트 윈도우의 크기를 줄였다는 의미
ECE (ECN Echo) SYN 플래그가 1일 때는 ECN을 사용한다고 상대방에게 알림.
SYN 플래그가 0이라면 네트워크가 혼잡하니 세그먼트 윈도우의 크기를 줄여달라는 요청의 의미

 

 

Window Size

한번에 전송할 수 있는 데이터의 양을 의미한다.

 만큼의 값을 표현할 수 있고 단위는 바이트이므로, 윈도우의 최대 크기는 64KB이다.

 

 

Checksum

데이터를 송신하는 중에 발생할 수 있는 오류를 검출하기 위한 값이다.

 

 

Urgent Pointer

긴급 포인터이다. URG 플래그가 1이라면 수신 측은 이 포인터가 가르키고 있는 데이터를 우선 처리한다.

 

 

Options

TCP의 기능을 확장할 때 사용하는 필드들이며, 이 필드는 크기가 고정된 것이 아니라 가변적이다.

 

 

참고 자료: (하나씩 읽다보면 혼자서 네트워크 이론 공부하기 좋게 잘 설명해주신다. 물론 이해는 내 머리가 해야하지만 ^^)

https://evan-moon.github.io/2019/11/10/header-of-tcp/