种类 长度 名称 描述与目的
0 1 EOL 选项列表结束
1 1 NOP 无操作(用于填充)
2 4 MSS 最大段大小
3 3 WSOPT 窗口缩放因子(窗口左移量)
4 2 SACK-Permitted 发送者支持SACK选项
5 可变 SACK SACK阻塞(接收到乱序数据)
8 10 TSOPT 时间戳选项
28 4 UTO 用户超时(一段空闲时间后的终止)
29 可变 TCP-AO 认证选项
253 可变 Experimental 保留供实验所用
254 可变 Experimental 保留供实验所用

tips:

  • 每一个选项的同一个字节为“种类”(kind)。
  • 不能被理解的选项会被忽略。
  • 选项的总长度包括种类和选项数据的字节。
  • NOP选项用于填充以便满足TCP头部长度为32比特的倍数。
  • EOL指出了选项列表的结尾。

最大段大小

最大段大小是指TCP协议允许的从对方接收到的最大报文段。

最大段大小只记录TCP数据的字节数,而不包括TCP和IP头部的字节。

建立一条TCP连接时,通信的双方都要在SYN报文段的MSS选项中说明自己允许的最大段大小。最大段大小的默认数值为536字节。


选择确认选项

由于接收的数据是无序的,如果TCP的发送方能够了解接收方当前接收到的序号的范围。那么发送方就能更好地进行重传工作。

TCP提供了SACK选项来实现此功能。

通过SYN报文段中的“允许选择确认”选项,TCP通信方会了解对方可以处理SACK信息。当接收到乱序的数据时,接收方就能提供一个SACK选项来描述这些乱序的数据,从而帮助对方有效地进行重传。

SACK信息包含了接收方已经成功接收的数据块的序列号范围。每一个范围称作一个SACK块,由一对32位的序列号表示。因此一个包含了n个SACK块的选项长度为8n+2个字节。增加的2个字节是SACK选项的种类和长度。

一个报文段中SACK块的数量最多为3.


窗口缩放选项

窗口缩放选项可以将TCP头中窗口字段从16位增加到30位。

TCP头中的窗口字段依然保持16位,同时使用窗口缩放选项中的值来作为这16位的比例因子。

该选项只能出现在SYN报文段中。TCP连接的双方,此选项值可不相同。

当某一方没有此选项时,另一方也不会使用此选项。

假设我们正在使用窗口缩放选项,发送出去的选项值为S,接收到的窗口缩放选项值为R。这样,我们从对方接收到的每一个16位的窗口大小都需要左移R位才能获得真实的窗口大小。每次向对方发送窗口更新时,都会将32位的窗口大小向右移动S位,然后将16位的数值填充到TCP头部中。


时间戳选项与防回绕序列号

时间戳选项可以让发送方估算每一个接收到的ACK的往返时间。

发送方将一个32位的数值填充到时间戳字段的第一部分,而接收方则将收到的时间戳数值原封不动地填充到第二部分,然后在第一部分填上自己的值,回传给发送方。

使用时间戳选项,会让TCP头部增加10个字节,8字节存储时间戳数值,2个字节存储选项种类和长度。

时间戳是一个单调增加的数值。接收方不关心时间戳的数值到底是什么。该选项也不要求两台主机之间进行时钟同步。

估算一条TCP连接的往返时间主要是为了设置重传的超时时间。


用户超时选项

用户超时数值(USER_TIMEOUT)指明了TCP发送者在确认对方未能成功接收数据之前愿意等待该数据ACK确认的时间。

USER_TIMEOUT是TCP协议本地配置的一个参数。

用户超时选项的数值是建议性的,并不表示另一端就必须遵从。

建立连接的SYN报文段、首个非SYN报文段以及USER_TIMEOUT的数值发生任何改变的报文段都会包含用户超时选项。

该选项的值由一个15位的数值部分与一个1位的单位部分构成。单位为0表示秒,为1表示分。


认证选项

通信双方在运行之前必须建立一套共享密钥。