TCP 헤더 살펴보기
TCP는 네트워크의 OSI 7계층 중 전송 계층에서 사용되는 연결 지향형 프로토콜로 흐름 제어, 혼잡 제어 등의 기능을 지원하여 신뢰성 있는 데이터 전송을 보장하는 프로토콜이다. 그리고 이러한 기능들은 TCP 헤더에 포함된 정보를 통해 동작한다. TCP 헤더에는 구체적으로 어떤 정보가 담겨 있는지, 어떻게 이용되고 있는지 알아보았다.
TCP 헤더의 구조는 다음과 같다.
TCP 헤더의 크기
- 기본적으로 20bytes
- 옵션을 포함하면 최대 60bytes
Source port / Destination port
- source port는 메시지를 보내는 측에서 통신을 위해 사용하는 port 번호
- destination port는 메시지를 받는 측의 통신 port 번호
- port 번호와 함께 IP 헤더에 있는 source/destination address를 이용하여 유일하게 식별되는 통신연결을 만들 수 있게 됨
- 크기는 각 16bit로, 0~65536 사이의 포트번호를 표시한다.
Sequence number
- 전송하는 데이터의 순서를 의미
- 32bit를 할당받음
- 이 시퀀스 번호 덕분에, 수신자는 쪼개진 세그먼트의 순서를 파악해 순서 및 도착을 보장
- 최초로 데이터를 전송할 때는 랜덤한 수로 초기화. 보낼 데이터의 1byte당 시퀀스 번호를 1씩 증가시키며 데이터의 순서를 표현
- 쵀대 4,294,967,296까지 수를 담을 수 있으며, 넘어갈 경우 다시 0부터 시작
Acknoledgment number
- 다음에 받을 것으로 예상되는 시퀀스 번호를 의미
- 32bit를 할당받음
- 연결 설정과 해제 시 발생하는 핸드쉐이크 과정에는 상대방이 보낸 시퀀스 번호 + 1
- 실제로 데이터를 주고 받을 때는 상대방이 보낸 시퀀스 번호 + 자신이 받은 데이터의 bytes
Data offset
- 전체 세그먼트 중에서 헤더가 아닌 데이터가 시작되는 위치가 어디부터인지를 표시 (옵션 필드의 길이가 고정되어 있지 않기 때문에 필요한 필드)
- 이 오프셋을 표기할 때는 32비트 워드 단위 사용. (1word = 4bytes) 이 필드 값에 4를 곱하면 세그먼트의 헤더를 제외한 실제 데이터의 시작 위치를 알 수 있음
- 4bit를 할당 받음. 0000~1111 범위를 표현할 수 있으므로 0~15 word * 4bytes로 0~60bytes의 오프셋까지 표현할 수 있음. 단, 옵션 필드를 제외한 나머지 필드는 필수로 존재해야하기 때문에 최솟값은 20bytes(5 word)로 고정
Reserved
- 현재는 사용하지 않지만, 나중을 위해 예약된 필드
- 3bit를 할당받음. 000으로 찍힘
Flags (NS ~ FIN)
- 세그먼트의 속성을 나타내는 비트 플래그로 9개가 존재.
- 기존에는 6개만 사용했지만, 혼잡 제어 기능의 향상을 위해 Reserved 필드를 사용하여 NS, CWR, ECE 플래그가 추가되었음
필드 | 의미 |
URG | Urgent Pointer(긴급 포인터) 필드에 값이 채워져 있음을 알리는 플래그. 이 포인터가 가리키는 긴급한 데이터는 먼저 처리됨 |
ACK | Acknowledgment(승인 번호) 필드에 값이 채워져있음을 아리는 플래그. 이 플래그가 0이라면 승인 번호 필드 자체가 무시됨 |
PSH | Push 플래그. 수신 측에게 이 데이터를 최대한 빠르게 응용프로그램에게 전달해달라는 플래그. 이 플래그가 0이라면 수신 측은 자신의 버퍼가 다 채워질 때까지 기다림. 이 플래그가 1이라면 이 세그먼트 이후에 더 이상 연결된 세그먼트가 없음을 의미하기도 함 |
RST | Reset 플래그. 이미 연결이 확립되어 ESTABLISHED 상태인 상대방에게 연결을 강제로 리셋해달라는 요청 |
SYN | Synchronize 플래그. 상대방과 연결을 생성할 때, 시퀀스 번호의 동기화를 맞추기 위한 세그먼트 |
FIN | Finish 플래그. 상대방과 연결을 종료하고 싶다는 요청인 세그먼트 |
- Reserved 필드를 사용하여 추가된 NS, CWR, ECE 플래그는 네트워크의 명시적 혼잡 통보(Explicit Congestion Notification, ECN)을 위한 플래그다.
- ECN을 사용하기 전 기존 네트워크 혼잡 상황 인지 방법은 타임아웃을 이용한 방법
- 대기 시간을 줄여 처리 속도를 높이기 위해 송신자와 수신자에게 혼잡 상황을 명시적으로 알리기 위해 등장한 매커니즘이 ECN이다.
필드 | 의미 |
NS | ECN에서 사용하는 CWR, ECE 필드가 실수나 악의적으로 은폐되는 경우를 방어하기 위해 RFC 3540에서 추가된 필드 |
ECE | ECN Echo 플래그. 해당 필드가 1이면서, SYN 플래그가 1일 때는 ECN을 사용한다고 상대방에게 알리는 의미. SYN 플래그가 0이라면 네트워크가 혼잡하니 세그먼트 윈도우 크기를 줄여달라는 요청의 의미 |
CWR | 이미 ECE 플래그를 받아서, 전송하는 세그먼트 윈도우 크기를 줄였음을 알림 |
Window Size
- 한번에 전송할 수 있는 데이터의 양을 의미하는 값을 담는다.
- 2^16 = 65535만큼의 값을 표현. 단위는 byte이므로, 윈도우 최대 크기는 64KB
- 단, 이 최대 크기를 대용량 고속 통신 환경에 맞춰 키우기 위해, 비트를 왼쪽으로 시프트하는 방식도 사용됨. 몇번 시프트하는지는 옵션 필드의 WSCALE 필드를 사용하여 표기함
Checksum
- 데이터를 송신하는 중에 발생할 수 있는 오류를 검출하기 위한 값
- 송신 측에서 전송할 데이터를 16bit씩 나눠 Warp Around 방식으로 차례로 더한 값의 1의 보수 값을 체크섬 값으로 지정한다.
- 수신 측은 데이터를 받아 동일한 방식으로 값을 더해 1의 보수를 취하지 않은 값과 체크섬을 더하여 모든 비트가 1인지 확인한다. (모든 비트가 1이면 데이터가 정상이라고 판단)
Urgent Pointer
- 일반 데이터 내에서 긴급 데이터가 시작되는 위치 정보
- URG 플래그가 1이라면 수신 측은 이 포인터가 가리키고 있는 데이터를 우선 처리
Options
- TCP의 기능을 확장할 때 사용하는 필드들이며, 이 필드는 크기가 고정된 것이 아니라 가변적
- 옵션을 모두 사용했을 때 옵션 필드의 최대 길이는 40byte다.
- Data offset필드가 옵션 필드의 끝을 가리키는데, 실제 옵션 필드의 끝 < Data offset라면 부족한 부분만큼 0으로 채워야함
- 대표적인 옵션으로는 윈도우 사이즈의 확장을 위한 WSCALE, Selective Repeat 방식을 사용하기 위한 SACK 등이 있음
- 약 30개 정도의 옵션을 사용할 수 있음
[참고]
반응형