일상 메모장

TCP header (+ TCP 옵션) 본문

Kernel TCP IP

TCP header (+ TCP 옵션)

핸드오버 2019. 12. 31. 10:00

안녕하세요. 오늘은 TCP header 구조와 TCP 옵션(Options) 들에 대해서 포스팅하도록 하겠습니다.

TCP header

 

TCP header 구조

  • Source Port
    • Source port number
  • Destination Port
    • Destination port number
  • Sequence Number
    • 송신자가 보내는 데이터의 시작 바이트 숫자
  • Acknowledgment Number
    • 송신자에게서 받은 데이터 바이트의 + 1
  • Data Offset (Header length)
    • 4byte 단위로 표시함. 일반적으로 option이 없는경우 20byte.
      • 예를 들어 20byte 일 경우 4byte 단위로 표시되니 header length 는 5가 들어감. (5 * 4bytes == 20 bytes)
    • 4bit 최대 값은 15(2진수 1111)이므로  15 * 4 byte =>최대 60byte
  • TCP flags
    • URG : Urgent pointer 가 정상인지 체크하고 urgent pointer를 찾습니다.
    • ACK : ack number filed를 확인합니다. 첫번째 SYN 일때는 ACK 필드도 셋팅됩니다.
    • PSH : 송신자가 해당 데이터가 가장 먼저 소비되기를 원하는 필드를 의미합니다.
    • RST : 송신자가 공식적인 종료절차 없이 종료하길 원할때 사용합니다.
               비정상적인 세션 연결 끊기에 사용합니다.
    • SYN : 커넥션 초기에 사용되는 필드입니다. 처음에 seq 가 임의 생성되어 보내집니다.
              이 값을 base로 이후 데이터를 전송할때마다 사이즈만큼 증가됩니다.
    • FIN : TCP 가 연결 끊기를 원할때 사용됩니다.
  • Window size
    • 수신가능한 Receive window size 버퍼의 사이즈를 의미합니다.
  • Checksum
    • 이 세크먼트가 정상인걸 증명하는 필드 (p.53)
  • Urgent pointer

TCP Options

 

TCP header는 기본 20byte 입니다. TCP options 을 포함하면 TCP Header의 크기는 최대 60byte 입니다.

TCP header length 의 크기가 20 이상이라면 option 필드를 체크해야 합니다.

 20 Bytes (TCP Header)

 <= 40 Bytes (TCP Options)

 

 kind = 1Byte

 length = 1Byte

 Value = Variable length

 

  • kind : TCP option number
    • kind = 0 : no more options
    • kind = 1 : no operation. memory padding 을 맞추기 위해 사용.
  • Length : TCP Option header length (kind + length + value)
  • Value : TCP Option value
     

MSS Option (Maximum segment size)

TCP 한 패킷으로 전송할수 있는 최대 크기.

이 옵션은 커넥션 초기에 SYN flag 와 함께 전송됩니다.

 kind = 2

 length = 4

 mss = 2 Bytes

 

Window-Scaling Option

Window size는 수신측 TCP 의 수신가능한 버퍼 사이즈를 의미합니다. TCP header에서 window size는 16bit인데 이는 65536 입니다. 하지만 이 값은 최대값이 아니며 window-scaling option 값을 통해서 이 값을 shift 할수 있다. 만약 쉬프트 값이 2라면 새로운 윈도우 사이즈는 2^18 (262144) 가 됩니다. 이 옵션은 SYN flag 와 함께 전송 되어집니다.

 kind = 3

length = 3 

shift count = 1Bytes 

 

Timestamp Option

TCP 는 네트워크 속도의 변화에 대해서 높은 퍼포먼스 및 안정적으로 맞춰야만 합니다. Timestamp 옵션을 통해서 보다 정확한 RTT(Round Trip Time)값을 얻어낼수 있습니다.

송신자는 패킷을 보낼때 자신의 timestamp를 TS value 에 기록하고 수신자는 TS value의

값을 복사하여 TS echo reply field 에 복사합니다. 그래서 오리지날 송신자는 현재 timestamp와 TS echo reply field의 timestamp의 차를 계산하여 RTT를 측정합니다.

Timestamp option을 사용하려면 SYN packet에 이 옵션을 포함해야만 합니다.

 kind = 8

length = 10

TS value = 4 Bytes 

TS echo reply = 4 Bytes 

 

Selective Acknowledgment Option

 일반적으로 TCP 는 out-of-sequence 데이터를 받았을때 정상적으로 받은 마지막 패킷의 sequence number를 ack number로 송신측에 보내게 됩니다. 만약 홀(데이터 스트림중 중간부분에 손실)이 발생했을경우 이미 전송된 데이터도 같이 재전송 하게 되므로 이는 TCP performance를 저하시키게 됩니다. 이를 보완하기 위해서 selective acknowledge 기능을 지원합니다. 수신자는 수신한 세그먼트에서 홀을 찾아내서 selective ack를 보내게 됩니다. 송신자는 selective ack를 수신하면 loss된 패킷들만 다시 재전송한다.

selective ack TCP option은 SYN packets에서 이 옵션의 지원 여부를 교환합니다. 만약 peer가 이 옵션을 지원하지 않으면 SACK-permit option을 전송합니다.

 kind = 4

length = 2 

  

송신자와 수신자가 모두 이 옵션을 지원하면 홀이 생길 경우 SACK를 아래와 같이 전송합니다.

아래 그림은 segments received out-of-order 와 SACK block generated for out-of-orer segments 의 예제입니다.

 S1

S2 

S3 

S4 

S7 

S8 

S11

S12 

 

 kind = 5

length = variable 

 L1 = Left - 7

R1 = Right - 8

 L2 = Left - 11

R2 = Right - 12

위 옵션의 의미는 Acknowledgment number는 정상적으로 받은 마지막 패킷인 S4 번이 기록될 것이고,

Seletive ACK로 Left Edge 7 부터 Right Edge 8 까지 그리고 두번째로 Left Edge 11 부터 Right Edge 12까지

받았다는걸 의미합니다. 그러므로 송신자는 Selective ACK를 기반으로 S5, S6, S9, S10 이렇게 순차적으로 다시 데이터를 전송하게 될것입니다.

 

오늘은 TCP header 와 TCP options들에 대해서 포스팅 해봤습니다.

읽어주셔서 감사합니다.!