| 种类 | 长度 | 名称 | 描述与目的 |
|---|---|---|---|
| 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表示分。
认证选项
通信双方在运行之前必须建立一套共享密钥。
