TCP(Transmission Control Protocol)

개요


TCP Header Format
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Description
16-bit Source Port (출발지 포트 번호) 16-bit Destination Port (목적지 포트 번호) ↑↓20 bytes ↑↓20~60 bytes
32bit Sequence Number (순번)
32bit Acknowledgment Number (예측 순번)
4-bit Data Offset (TCP Header length) 3-bit Reserved (0 0 0) 1-bit NS 1-bit CWR 1-bit ECE 1-bit URG 1-bit ACK 1-bit PSH 1-bit RST 1-bit SYN 1-bit FIN 16-bit Window
16-bit Checksum 16-bit Urgent Pointer
Variable-size Options Padding ↑↓0~40 bytes
Variable-size Data ↑↓ Total length - Header length(Data Offset)
  • Source Port: 16bits
    • 송신(출발지) 포트 번호
  • Destination Port: 16bits
    • 수신(목적지) 포트 번호
  • Sequence Number: 32bits
    • SYN flag 가 설정(1)된 경우 초기 순번(ISN: Initial Sequence Number)이 됩니다. 실제 Data의 첫번째에서 이 값은 1을 더한 값이 됩니다.
    • SYN flag 가 해제(0)된 경우 현재 Session에서의 현재 Segment data의 누적 순번이 됩니다.
  • Acknowledgment Number: 32 bits
    • ACK flag 가 설정(1)된 경우 수신자가 예상하는 다음 순번을 나타냅니다.
  • Data Offset: 4 bits
    • TCP payload data 의 위치를 의미합니다. 다르게 표현하면 TCP Header의 크기를 의미한다고 할 수도 있습니다.
      • TCP Header의 최소 크기는 20 bytes(워드 단위 값 5) 이며, 최대 크기는 60 bytes(워드 단위 값 15) 입니다. (즉, Options는 최대 40 bytes를 추가할 수 있다는 의미)
      • 32-bit 워드(word) 단위의 값을 사용합니다. (즉, 20 bytes 라면 20 bytes/ 32 bits = 20 bytes / 4 bytes = 5 words)
        • 즉, 1 word 는 4 bytes(32-bits)
        • 나타날 수 있는 값의 범위는 5 ~ 15
      • Options 가 32-bit로 정렬되어야 하는 이유이기도 합니다.
  • Reserved: 3 bits
    • 미래를 위한 예약 영역이며 0으로 채워져야 합니다.
  • Control Bits: 6 bits (from left to right):
  • Window: 16 bits
    • 수신 윈도우의 크기 (해당 Segment의 송신측이 현재 수신하고자 하는 윈도우 크기)
    • Octet(Byte) 단위로 나타냅니다.
    • Acknowledgment Number의 순번보다 큰 값이어야 합니다.
  • Checksum: 16 bits
    • 주어진 checksum 영역 Pseudo header(의사 헤더)에 대한 합을 16bits로 산출하는데 overflow 되는 값은 1의 보수로 합하는 구현을 의미합니다. (Computing the Internet Checksum (RFC1071))
    • Pseudo header(의사 헤더)는 실제로는 존재하지 않지만 checksum 계산시에 IP header의 일부 정보가 병합되어사용되는 가상의 헤더임
      • IPv4의 경우 12 bytes(96-bits) "Pseudo header(의사 헤더)" + "TCP Header" + "Payload Data"에 대한 checksum을 계산한 값입니다.
        • Pseudo header format (IPv4 인 경우, [https]RFC793 Section-3.1[])
          Pseudo header format (IPv4)
          0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Description
          32-bit Source Address ↑↓8 bytes ↑↓12 bytes
          32-bit Destination Address
          8-bit Zero 8-bit PTCL(Protocol) 16-bit TCP Length (TCP Header + Data) ↑↓4 bytes
      • IPv6의 경우 40 bytes(320-bits) "Pseudo header(의사 헤더)" + "TCP Header" + "Payload Data"에 대한 checksum을 계산한 값입니다.
        • Pseudo header format (IPv6 인 경우, [https]RFC2460 Section-8.1[])
          Pseudo header format (IPv6)
          0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Description
          128-bit Source Address ↑↓32 bytes ↑↓40 bytes
          128-bit Destination Address (Final destination address)
          32-bit Upper-Layer Packet Length ↑↓4 bytes
          24-bit Zero 8-bit Next Header ↑↓4 bytes
    • UDP도 동일한 Pseudo header(의사 헤더)를 취하여 checksum을 계산합니다.
  • Urgent Pointer: 16 bits
    • URG flag가 설정(1)된 경우, 순번으로부터의 위치(Offset)을 나타냅니다. 이 위치(Offset)가 마지막 긴급 데이터 바이트를 가리키게 됩니다.
    • URG flag가 해제(0)된 경우, 이 값은 유효하지 않습니다.
  • Options: variable
    • 하나의 Option은 "TYPE(1bytes) + LEN(1bytes) + OPTDATA(n)" 와 같은 형태로 여러개의 Option을 추가할 수 있습니다. (Options의 총 크기는 최대 40 bytes 를 넘을 수 없습니다.)
      • TYPE
        • TCPOPT_EOL(0): End of options
          • TCPOLEN_EOL: 1 byte
        • TCPOPT_NOP(1): Padding
          • TCPOLEN_NOP: 1 byte
        • TCPOPT_MSS(2): Segment size negotiating
          • TCPOLEN_MSS: 4 bytes
          • IPv4에서 MSS option이 주어지지 않는 경우 MSS는 536 octets 으로 간주 하도록 합니다. (최소 MTU를 576으로 간주하고 계산하는 정의, 576 - 20 - 20)
          • IPv4에서 MTU 1500 기준으로 최대 MSS크기는 1460 octets (1500 - 20 - 20) 이 가능합니다.
          • IPv6에서 MSS option이 주어지지 않는 경우 MSS는 1220 octets 으로 간주 하도록 합니다.
          • IPv6에서 MTU 1500 기준으로 최대 MSS크기는 1440 octets (1500 - 40 - 20) 이 가능합니다.
          • IPSecVPN에서 AES-256 with SHA-1 기준)을 기준으로 ESP Header+Trailer size는 73 bytes 이며 IPv4에서 MTU 1500인 경우 최대 MSS크기는 1387 octets가 됩니다. 하지만 실제 최대 MSS크기는 1388 octets가 가능합니다.
            • 확실한 이해를 위해서는 Linux kernel의 esp4_get_mtu() 함수를 반드시 이해하면 도움이 됩니다. (주어진 실제 MTU로부터 ESP Overhead를 계산해서 MTU에 반영해주는 함수) Data는 가변이기 때문에 결국 최대 가능한 padding 크기일때를 기준으로 MSS를 계산해야 합니다.
              • Size of Initialazation Vector for
                • AES: 16 bytes
                • DES: 8 bytes
              • Size of Authentication Data for
                • MD5: 12 bytes
                • SHA-1: 12 bytes
                • SHA-256: 16 bytes
                • SHA-384: 24 bytes
                • SHA-512: 32 bytes
              • Maximum Size of padding for
                • AES:15 bytes
                • DES:7 bytes
              • Size of ESP Header for 16(ESP Header size) = 4(SPI) + 4(Sequence) + 8(IV, RFC3686)
              • Size of ESP Trailer for 14~(ESP Trailer size) = 0~255(4 bytes aligned for) + 1(Padding length) + 1(Next Header) + 12(Authentication data, SHA-1)
              • minimum 72 bytes = 16(ESP Header) + 20(inner IP Header) + 20(TCP Header) + x(Data) + 14~(ESP Trailer)
        • TCPOPT_WINDOW(3): Window scaling
          • TCPOLEN_WINDOW: 3 bytes
        • TCPOPT_SACK_PERM(4): SACK Permitted
          • TCPOLEN_SACK_PERM: 2 bytes
        • TCPOPT_SACK(5): SACK Block
        • TCPOPT_TIMESTAMP(8): Better RTT estimations/PAWS
          • TCPOLEN_TIMESTAMP: 10 bytes
        • TCPOPT_MD5SIG(19): MD5 Signature (RFC2385)
          • TCPOLEN_MD5SIG: 18 bytes
        • TCPOPT_COOKIE(253): Cookie extension (experimental)
          • TCPOLEN_COOKIE_BASE: 2 (Cookie-less header extension)
          • TCPOLEN_COOKIE_PAIR: 3 (Cookie pair header extension)
          • TCPOLEN_COOKIE_MIN: (TCPOLEN_COOKIE_BASE+TCP_COOKIE_MIN)
            • TCP_COOKIE_MIN: 8 bytes (64-bits)
          • TCPOLEN_COOKIE_MAX: (TCPOLEN_COOKIE_BASE+TCP_COOKIE_MAX)
            • TCP_COOKIE_MAX: 16 bytes (128-bits)
        • TCPOPT_EXP(254): Experimental
          • TCPOPT_FASTOPEN_MAGIC(0xF989): Magic number to be after the option value for sharing TCP (experimental options. See draft-ietf-tcpm-experimental-options-00.txt)
            • TCPOLEN_EXP_FASTOPEN_BASE: 4
      • LEN: TYPE + LEN + OPTDATA를 합한 크기 (참고: [https]https://www.freesoft.org/CIE/Course/Section4/8.htm[])
        • TYPE이 TCPOPT_NOP과 TCPOPT_EOL인 경우는 예외적으로 LEN과 OPTDATA가 없으며 그 외의 TYPE은 모두 적어도 LEN은 2 이상의 값이어야 하며 LEN이 2인 경우는 OPTDATA가 없음을 의미합니다.
    • Data offset의 값이 5인 경우는 Options와 Padding이 없음을 의미합니다.
    • Options + Padding 의 크기(bytes)는 (Data offset - 5) * 4 으로 계산할 수 있습니다.
  • Padding: variable
    • TCP Header의 마지막 부분은 32bit로 정렬되어야 하기 위함. (Options의 마지막이 32bit로 정렬하기 위함)
    • Padding에 채워지는 값은 0입니다.

TCP 상태 천이도 (TCP state diagram)

참고자료




/*
[ FrontPage | PrintView | RawView | RSS ]

Copyright ⓒ MINZKN.COM
All Rights Reserved.

MINZKN
*/