TCP(Transmission Control Protocol)란?
- 서버와 클라이언트간에 데이터 전송을 위한 연결을 만드는 연결지향 프로토콜이다.
- 데이터를 여러 개의 패킷으로 나누고 도착지에서는 패킷을 재조립한다.
- 패킷의 분실이나 중복, 순서가 바뀌는 문제를 해결해주기 때문에 신뢰성 있다.
TCP 헤더 구조
Source Port - 2byte
- 송신지 포트번호
Destination Port - 2byte
- 수신지 포트번호
Sequence Number - 4byte
- TCP 세그먼트 안에 데이터의 송신 바이트 흐름의 위치를 가리킨다.
- 세그먼트는 서로 다른 경로를 거치면서 순서가 뒤 바뀔 수가 있다. 이를 수신 측에서 재조립하기 위해 사용되는 번호이다.
Acknowledgment Number - 4byte
- 수신자 입장에서 송신자로부터 앞으로 받아야 할 다음 데이터의 Sequence Number이다.
- 다음 byte 번호이므로 송신자에게 받은 마지막 수신 성공 순서번호의 +1이 값이다.
Offset - 4bit
- TCP 헤더의 길이를 32bit 단위로 표시한다. (최소 크기 : 5워드(20byte) / 최대 크기 : 15워드(60byte))
Reserved - 4bit
- 예약 필드이며, 0으로 채워진다.
TCP Flags - 1byte
- 세그먼트의 용도와 내용을 결정하기 위해서 6개의 flag bit를 사용한다.
1) URG(Urgent) : 긴급 데이터일 경우 1로 설정하고, 순서에 상관없이 먼저 송신된다.
2) ACK(Acknowledgement) : Acknowledgment Number 필드의 값이 유효함을 나타낸다. 최초의 SYN 패킷 이후에 전송되는 모든 패킷은 이 플래그가 설정되어 있어야 한다.
3) PSH(Push) : 버퍼링된 데이터를 가능한 빨리 상위 계층으로 전달한다. (버퍼가 차는 것을 기다리지 않음.)
4) RST(Reset) : 초기화 비트, 연결확립된 회선에 강제로 리셋을 요청한다.
5) SYN(Synchronize) : 동기화 비트, 양쪽이 보낸 최초에 세그먼트에만 이 Flag가 설정된다.
6) FIN(Finish) : 더이상 송신할 데이터가 없음을 의미하며, 연결을 끊을 때 설정된다.
Window - 2byte
- 흐름제어를 위해 사용하며, 기본 단위는 바이트이다.
- 해당 세그먼트의 송신 측이 수신하고자 하는 수신 윈도의 크기를 나타낸다.
Checksum - 2byte
- 헤더 및 데이터의 에러를 확인하기 위해 사용된다.
Urgent Pointer - 2byte
- TCP 세그먼트에 포함된 긴급 데이터의 마지막 바이트에 대한 번호이다.
- 해당 세그먼트의 일련번호에 urgent point 값을 더해 긴급 데이터의 끝을 알 수 있다.
TCP Options
- 최대 40바이트까지 옵션 데이터를 포함할 수 있으며, 길이는 가변적이다.
TCP 헤더 C언어 구조체 구현