• TCP 헤더 형식

    image.png

    • TCP Header 의 기본 길이 = 20 Byte

    • Port number 라는 개념은 TCP 에서 활용되므로 헤더에 Source port 와 Destination port 가 있음

      • Source port (필드 크기 : 16bit) : 데이터를 보내는 쪽의 포트 번호 (프로세스 식별자)
      • Destination port (필드 크기 : 16bit) : 데이터를 받는 쪽의 포트 번호
    • Sequence number (필드 크기 : 32bit) : 전송 데이터의 시작 바이트 번호

      • 데이터의 순서를 보장하기 위한 번호
      • Segment Data 의 byte 단위 길이만큼 증가한다.
      • 최근 initialize 값이 Random 으로 초기화됨
    • Acknowledgement number (필드 크기 : 32비트) : 정상적으로 받은 마지막 바이트 다음에 기대하는 바이트 번호

      • 받은 데이터에 대한 확인 응답 번호
      • 예시
      클라이언트가 시작 시 Sequence Number = 1000 으로 
      1000~1049까지 총 50바이트 전송했다면,
      
      서버는 Acknowledgement Number = 1050 으로 응답.
      
      즉, "1050번 바이트부터 보내줘" 라는 의미이며,
      이것이 "다음에 기대하는 바이트 번호"
      
    • Data Offset (필드 크기 : 4bit) : TCP 헤더의 길이 (4 byte word 단위)

      • Option 필드의 시작 위치를 알 수 있음
      • 기본 TCP Header 크기도 20 Byte 이므로
        • 실제 “값” 은 TCP Header(20) / 4 byte word = “5”
    • Rev(Reserved) (필드 크기 : 3bit) : 미래 확장에 대비(일반적으로 0 으로 설정됨)

    • Control Flags (6~9개) (필드 크기 : 일반적으로 8bit, NS(Nonce Sum, optional) 플래그 포함 시 9bit) : TCP 상태 제어용 플래그 (ex. SYN, ACK, FIN, RST 등)

    • Window size (필드 크기 : 16bit) : Data 를 수신하는 측의 버퍼 크기

    • Checksum (필드 크기 : 16bit) : 에러 검출을 위한 값

      • TCP 헤더 + 데이터 + 일부 IP 정보까지 포함해 계산됨
    • Urgent Pointer (필드 크기 : 16bit) : 긴급 데이터 위치를 나타냄

      • URG 플래그와 함께 사용
    • Options + Padding (필드 크기 : 32bit)

      • 성능 향상, MSS, 타임스탬프 등 옵션 정보
      • 실제 길이는 가변 길이로 Option 필드가 포함된 길이 + TCP Header 길이
    • Segment Data (Payload) (필드 크기 : 32bit) : TCP 가 실어 나르는 실제 application 데이터

      • MSS(Maximum Segment Size) : 기본 1460 Byte 길이
        • MSS = MTU(1500) - IP Header(20) - TCP Header(20)
      • Segment Data 의 길이 = Total Length (IP) - TCP Header 의 길이
  • TCP 헤더 구조체 정의

    typedef struct TcpHeader {
    	unsigned short srcPort; 
    	unsigned short dstPort;
    	unsigned int seq;
    	unsigned int ack;
    	unsigned char data; // data 필드를 정확히 알아야 
    	// TCP 헤더의 정확한 offset 을 뽑아낼 수 있음
    	unsigned char flags;
    	unsigned short windowSize;
    	unsigned short checksum;
    	unsigned short urgent;
    } TcpHeader;