tcp header options

TCP Option Numbers

The Transmission Control Protocol (TCP) has provision for optional header fields identified by an option kind field.  Options 0 and 1 are exactly one octet which is their kind field.  All other options have their one octet kind field, followed by a one octet length field, followed by length-2 octets of option data.

Kind   Meaning                               Reference
----   -------------------------------   ---------
  0      End of Option List                 [RFC793]
  1      No-Operation                       [RFC793]
  2      Maximum Segment Size        [RFC793]
  3      WSOPT - Window Scale        [RFC1323]
  4      SACK Permitted                    [RFC2018]
  5      SACK                                     [RFC2018]
  6      Echo (obsoleted by option 8)      [RFC1072]
  7      Echo Reply (obsoleted by option 8)[RFC1072]
  8      TSOPT - Time Stamp Option         [RFC1323]
  9      Partial Order Connection Permitted[RFC1693]
10     Partial Order Service Profile     [RFC1693]
11      CC                                      [RFC1644]
12      CC.NEW                            [RFC1644]
13      CC.ECHO                           [RFC1644]
14      TCP Alternate Checksum Request    [RFC1146]
15       TCP Alternate Checksum Data       [RFC1146]
16       Skeeter                           [Knowles]
17       Bubba                             [Knowles]
18       Trailer Checksum Option    [Subbu & Monroe]
19       MD5 Signature Option              [RFC2385]
20       SCPS Capabilities                   [Scott]
21       Selective Negative Acknowledgements [Scott]
22       Record Boundaries                   [Scott]
23       Corruption experienced              [Scott]
24       SNAP                         [Sukonnik]
25       Unassigned (released 12/18/00)
26       TCP Compression Filter           [Bellovin]

The last options field (options) of the TCP header is variable-length optional information. This part contains at most 40 bytes, since the TCP header is at most 60 bytes (which also contains the 20-byte fixed part discussed earlier). A typical TCP header option structure is shown in Figure 3-4.

 

The first field of an option, kind, specifies the type of option. Some TCP options do not have the last two fields and only contain a 1-byte kind field. The second field length (if any) specifies the total length of the option, which includes the 2 bytes occupied by the kind and length fields. The third field info (if any) is the specific information of the option. There are seven common TCP options, as shown in Figure 3-5.

 

kind=0 is the option list end option.

kind=1是空操作(nop)选项,没有特殊含义,一般用于将TCP选项的总长度填充为4字节的整数倍。

kind=2是最大报文段长度选项。TCP连接初始化时,通信双方使用该选项来协商最大报文段长度(Max Segment Size,MSS)。TCP模块通常将MSS设置为(MTU-40)字节(减掉的这40字节包括20字节的TCP头部和20字节的IP头部)。这样携带TCP报文段的IP数据报的长度就不会超过MTU(假设TCP头部和IP头部都不包含选项字段,并且这也是一般情况),从而避免本机发生IP分片。对以太网而言,MSS值是1460(1500-40)字节。

kind=3是窗口扩大因子选项。TCP连接初始化时,通信双方使用该选项来协商接收通告窗口的扩大因子。在TCP的头部中,接收通告窗口大小是用16位表示的,故最大为65?535字节,但实际上TCP模块允许的接收通告窗口大小远不止这个数(为了提高TCP通信的吞吐量)。窗口扩大因子解决了这个问题。假设TCP头部中的接收通告窗口大小是N,窗口扩大因子(移位数)是M,那么TCP报文段的实际接收通告窗口大小是N乘2M,或者说N左移M位。注意,M的取值范围是0~14。我们可以通过修改/proc/sys/net/ipv4/tcp_window_scaling内核变量来启用或关闭窗口扩大因子选项。

和MSS选项一样,窗口扩大因子选项只能出现在同步报文段中,否则将被忽略。但同步报文段本身不执行窗口扩大操作,即同步报文段头部的接收通告窗口大小就是该TCP报文段的实际接收通告窗口大小。当连接建立好之后,每个数据传输方向的窗口扩大因子就固定不变了。关于窗口扩大因子选项的细节,可参考标准文档RFC 1323。

kind=4是选择性确认(Selective Acknowledgment,SACK)选项。TCP通信时,如果某个TCP报文段丢失,则TCP模块会重传最后被确认的TCP报文段后续的所有报文段,这样原先已经正确传输的TCP报文段也可能重复发送,从而降低了TCP性能。SACK技术正是为改善这种情况而产生的,它使TCP模块只重新发送丢失的TCP报文段,不用发送所有未被确认的TCP报文段。选择性确认选项用在连接初始化时,表示是否支持SACK技术。我们可以通过修改/proc/sys/net/ipv4/tcp_sack内核变量来启用或关闭选择性确认选项。

kind=5是SACK实际工作的选项。该选项的参数告诉发送方本端已经收到并缓存的不连续的数据块,从而让发送端可以据此检查并重发丢失的数据块。每个块边沿(edge of block)参数包含一个4字节的序号。其中块左边沿表示不连续块的第一个数据的序号,而块右边沿则表示不连续块的最后一个数据的序号的下一个序号。这样一对参数(块左边沿和块右边沿)之间的数据是没有收到的。因为一个块信息占用8字节,所以TCP头部选项中实际上最多可以包含4个这样的不连续数据块(考虑选项类型和长度占用的2字节)。

kind=8是时间戳选项。该选项提供了较为准确的计算通信双方之间的回路时间(Round Trip Time,RTT)的方法,从而为TCP流量控制提供重要信息。我们可以通过修改/proc/sys/net/ipv4/tcp_timestamps内核变量来启用或关闭时间戳选项。

 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326430497&siteId=291194637