常用的TCP Option
当前,TCP常用的Option如下所示
————
Kind (Type) |
Length |
Name |
Reference |
描述 & 用途 |
0 |
1 |
EOL |
RFC 793 |
选项列表结束 |
1 |
1 |
NOP |
RFC 793 |
无操作(用于补位填充) |
2 |
4 |
MSS |
RFC 793 |
最大Segment长度 |
3 |
3 |
WSOPT |
RFC 1323 |
窗口扩大系数(Window Scaling Factor) |
4 |
2 |
SACK-Premitted |
RFC 2018 |
表明支持SACK |
5 |
可变 |
SACK |
RFC 2018 |
SACK Block(收到乱序数据) |
8 |
10 |
TSPOT |
RFC 1323 |
Timestamps |
19 |
18 |
TCP-MD5 |
RFC 2385 |
MD5认证 |
28 |
4 |
UTO |
RFC 5482 |
User Timeout(超过一定闲置时间后拆除连接) |
29 |
可变 |
TCP-AO |
RFC 5925 |
认证(可选用各种算法) |
253/254 |
可变 |
Experimental |
RFC 4727 |
保留,用于科研实验 |
一般Option的格式为TLV结构,如下所示:
Kind / Type(1 Byte) |
Length(1 Byte) |
Value |
1. EOL和NOP Option(Kind 0、Kind 1)只占1 Byte,没有Length和Value字段;
2. NOP用于 将TCP Header的长度补齐至32bit的倍数(由于Header Length字段以32bit为单位,因此TCP Header的长度一定是32bit的倍数);
3. SACK-Premitted Option占2 Byte,没有Value字段;
4. 其余Option都以1 Byte的“Kind”开头,指明Option的类型;Length指明Option的总长度(包括Kind和Length)
5. 对于收到“不能理解”的Option,TCP会无视掉,并不影响该TCP Segment的其它内容;
① .Maximum Segment Size (MSS) Option
一般情况下,通信双方在建立连接时,SYN Segment中会携带MSS Option,MSS指明本端可以接受的最大长度的TCP Segment(Payload,不含TCP Header),也就是说,对端发送数据的长度不应该大于MSS(单位Byte)。
————
1. 首先要明确一点,MSS并非和对端协商的值,而是对对端发送数据长度的“限制”,表明在整个TCP连接期间,都不会接收长度大于MSS的TCP Segment。
2. 如果收到的SYN中没有MSS,将使用默认值536。MSS Option的Value字段长度固定为16bit,所以MSS最大值为65535(单位Byte)。因此,网络中所有设备都被要求,必须能够处理大小小于576Byte的数据包(IP Header + TCP Header + Default MSS 最小值为 576 Byte)
3. IPv4网络中,MSS的典型取值为1460 ,1460Byte + 20Byte IP Header + 20Byte TCP Header = 1500Byte = 以太网典型MTU;
4. IPv6网络中,典型MSS取值为1440;另外,如果MSS=65535,表示MSS = PMTU - 60
② .Selective Acknowledgment (SACK) Options
在标准的TCP实现中,使用的是累加式的ACK,例如“ACK Num = n”代表对序列号n以前的Bytes进行确认。但是,显然,这样将无法对不连续的Segment进行确认。此外,当出现不连续Segment时,还会导致TCP的接收队列出现一个“坑”,不将这个坑填上,坑后的数据就无法交付给应用程序。
为解决上述问题,TCP定义了SACK Option,可以使TCP接收者将这个“坑”的位置通告给发送者,让其对这一段数据进行重传。
注意:若要使用SACK特性,必须在建立连接时,在SYN Segment中附加上SACK-Permitted Option,以此告知对方自己支持SACK。
SACK-Permitted Option格式如下所示:
Kind = 4 |
Length = 2 |
SACK Option通过“Left Edge ~ Right Edge”,指定了一个或多个范围的Seq Num,称为SACK Block,指明了处于“坑”后面(或坑之间)的、已成功接收的Bytes。SACK Option格式如下所示
————
Kind (5) |
Length (可变) |
Left Edge of 1st Block (32bit) |
Right Edge of 1st Block (32bit) |
…… |
…… |
Left Edge of nst Block (n≤4) |
Right Edge of nst Block (n≤4) |
另外,由于TCP Header最长为60 Byte,因此SACK Option中最多只能包含4个SACK Block
Example(终端A - 终端B)
————
1. 终端A收到了TCP数据流中的Seq Num为0 ~ 1452、2905~4096的字节,但缺少了1453~2904;
2. 终端A向B发送ACK Segment,其中ACK Num=1453、SACK Option=2905~4097,表明它已经收到了数据流中的Seq Num为2905 ~ 4096的字节,但没有还没收到1453~2904;
3. 终端B收到这个SACK后,重传包含Byte 1453~2904的TCP Segment;
4. 终端A向B发送ACK Segment,其中ACK Num=4097,表明它已经收到Seq Num 4097之前的所有字节;
5. 之后,数据通信恢复正常。
③ .Window Scale (WSCALE or WSopt) Option
TCP Header的Window Size字段长度为16bit,因而正常情况下,Window Advertisement最大只能是65535 Bytes;
Window Scale Option用于将TCP Header的Window Size字段从16bit扩展至最多30bit,格式如下所示:
Kind (3) |
Length (3) |
shift.cnt (范围0~14) |
————
1. shift.cnt的取值范围为0~14,表示将Window Advertisement的值扩展至“WindowSize × 2s
2. WSopt只能出现在SYN Segment或SYN+ACK Segment中,因此shift.cnt在三次握手之后就会固定下来。
3. 另外,WSopt是双向独立的,因此连接的两个方向可以有不同的Shift.cnt。但是,WSopt必须双向同时启用,也就是说,如果SYN中不带有WSopt,SYN+ACK中也不能出现WSopt;同样,如果SYN+ACK中不带有WSopt,那么发起SYN的一端就会当作自己也不曾发送过WSopt。
4. shift.cnt根据接收Buffer的大小,由TCP自动选取。接收Buffer由系统或程序设定。
④ .Timestamps Option and PAWS(Protection against Wrapped Sequence Numbers,防止序列号回绕)
启用Timestamp Option后,每个TCP Segment中都会带有Timestamp Option,其中包含了两个32bit的Timestamp(TSval和TSecr),具体格式如下所示:
Kind (8) |
Length (10) |
Timestamp Value(TSval) |
Timestamp Echo Reply(TSecr) |
————
1. TSval指明了发送端在发送TCP Segment时的Timestamp;接收端在对该TCP Segment做ACK时,将TSval值回显在TSecr字段中。
注意:由于TCP连接是双向的,接收端在ACK中回显TSecr时,也会把自己当前的Timestamp放入TSval字段。
2. Timestamp是一个随时间单调递增的值,由于TCP接收端只需要在ACK中将TSval简单地回显,因此通信双方并不需要进行时间同步等操作。
3. 通过Timestamp Option,发送端再也不需要在内存中保存发送Segment的时间了,只需要将其放入TSval,然后接收端将其回显在ACK Segment即可。当发送端收到ACK Segment后,取出TSscr,和当前时间做算术差,即可完成一次RTT的测量。
4. 若非通过Timestamp Option来计算RTT,大部分TCP实现只会以“每个Window采样一次”的频率来测算RTT。因此通过Timestamp Option,可以实现更密集的RTT采样,使RTT的测算更精确。
另外,Timestamp Option还有PAWS(Protection Against Wrapped Sequence Numbers,防止序列号回绕)功能,详见以下示例
————
1. 假设TCP Window Size为1GB(使用Window Scale),发送者每发送一个Window的数据Timestamp值加100,数据的发送情况如下所示:
时间点 |
发送数据量 |
Seq Num |
Timestamp |
接收 |
1 |
0G:1G |
0G:1G |
0~100 |
OK |
2 |
1G:2G |
1G:2G |
100~200 |
其中某些Segment丢包后重传 |
3 |
2G:3G |
2G:3G |
200~300 |
OK |
4 |
3G:4G |
3G:4G |
300~400 |
OK |
5 |
4G:5G |
0G:1G |
400~500 |
OK |
6 |
5G:6G |
1G:2G |
500~600 |
此前丢包的Segment出现了 |
2. 在时间点2的时候,发生了丢包;在时间点4和5之间,序列号发生了回绕;在时间点6,已经被认为“丢包”的Segment延迟到达了。
3. 由于延时到达的Segment的timestamp为1xx,小于时间点6的有效timestamp(5xx),因此这个Segment会根据PAWS机制丢弃,从而不会对TCP造成影响。
使用TCP Timestamps option (TSopt) 进行RTT采样。当前大部分操作系统(Linux、Windows)的实现方式如下
User Timeout (UTO) Option
UserTimeout值表明了TCP发送者等待ACK的时间,如果在指定时间内没收到ACK,就会认为对端挂掉。对于传统TCP(RFC 793)而言,UserTimeout是本地配置的。RFC 1122建议,当TCP重传3次后,应该通知应用程序,100s后,应该拆除连接。
通过UTO,可以让TCP将UserTimeout值“告知”给对端,UTO格式如下所示:
Kind (28) |
Length (4) |
G bit(Granularity bit) |
UserTimeout |
————
1. G bit = 1,表示UserTimeout的单位为分钟;G bit = 0,表示UserTimeout的单位为秒
2. 通过UTO,TCP接收者可以根据“对端的UserTimeout”来调整自己的行为。UserTimeout建议取值为:min(U_Limit,max(Adv_UTO,Remot_UTO,L_Limit))
o U_Limit是本地UserTimeout的最高限制;Adv_UTO是通告出去的UserTimeout;Remot_UTO是对端的UserTimeout;L_Limit是本地UserTimeout的最低限制;
3. 要注意的是,UTO只是用于“告知”,TCP接收者却不一定要根据对端的UTO值来调整自己的行为。
4. 此外,NAT设备也可以根据UTO来调整连接保活计时器
5. 若使用 = min(U_LIMIT, max(ADV_UTO, REMOTE_UTO, L_LIMIT))
⑥ .Authentication Option (TCP-AO)and TCP MD5 Signature Option(TCP-MD5)
TCP-MD5和TCP-AO主要用于防止TCP欺骗攻击(TCP Spoofing Attacks)。TCP-MD5是旧标准(RFC 2385),例如BGP、LDP等协议就是以TCP-MD5作为认证手段的。2010年后,IETF建议使用TCP-AO去取代TCP-MD5,然而TCP-AO当前的普及率还很低。
TCP-MD5和TCP-AO的格式如下所示
————
TCP-MD5 Option的MD5 Hash根据以下信息计算:
1.TCP伪头部
2.TCP头部(包括Option,checksum设为0)
3.TCP Segment Data
4.密钥
相对于TCP-MD5,TCP-AO的主要改进之处在于:
1. 支持多种MAC算法
2. 支持带内的密钥变更操作
注意:TCP-AO与TCP-MD5一样,都不包含密钥分发机制。因此在密钥分发方面都存在一定风险。
常用的TCP Option的更多相关文章
- 常用的TCP/UDP端口
已知的TCP/UDP端口可以在wikipedia上找到: List of TCP and UDP port numbers, 太多了,按组列举了最常用的,如下: FTP:21SSH:22Telnet: ...
- 常用的TCP选项
MSS选项:通知最大可接收量.发送SYN的TCP一端使用本选项通告对端它的最大分节大小(maximum segment size)即MSS,也就是它在本连接的每个TCP分节中愿意接受的最大数据量.发送 ...
- (转)常用的 TCP KeepAlive 参数
socket编程里通过setsockopt系统调用针对单独的socket进行设置,可以覆盖Linux Kernel的选项.举个例子,以我的系统默认设置为例,kernel默认设置的tcpkeepaliv ...
- 常用的 TCP KeepAlive 参数
转自:http://dola.xinfan.org/?p=359 我们知道 TCP 协议有检测连接状态的机制,当连接不活跃的时候,连接双方会通过一定的算法检测连接是否正常.这个机制就是 TCP 的 K ...
- TCP/IP OPTION字段
0x01 简介 TCP头部和IPV4头部除了固定的20字节外,都设置了 OPTION 字段用于存储自定义的数据,因为TCP头部和IPV4的报文长度字段均为4字节,所表示的最大值为15, 乘4,报文头部 ...
- TCP/IP option data aligement issue cause system broken
1 Problem Description The field reports show that xxx panel will lockup and then reboot while d ...
- linux下的常用命令
1 fg切换前后台作业 将后台作业转换为前台作业,”fg %作业号“ 2 stty改变和打印终端行设置 tostop 阻止后台作业写终端,stty -a显示终端的所有选项 3 uname查看机子信息 ...
- Coping with the TCP TIME-WAIT state on busy Linux servers
Coping with the TCP TIME-WAIT state on busy Linux servers 文章源自于:https://vincent.bernat.im/en/blog/20 ...
- Xcode中的常用快捷键
新建项目 com + shift +N 新建文件 com + N 偏好设置 通用 com + , 跳到指定行 com + L 当前行加断点 com + \ 移动编辑区最上方 ...
随机推荐
- 重新装kafka
Linux搭建kafka 一.安装Java 1.查看linux 的系统版本 root@aliyun:~# uname --m x86_64 2.安装java mkdir -p /usr/local ...
- mysql ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
为了加强安全性,MySQL5.7为root用户随机生成了一个密码,在error log中,关于error log的位置,如果安装的是RPM包,则默认是/var/log/mysqld.log. 一般可通 ...
- SQL Server - 使用 Merge 语句实现表数据之间的对比同步
表数据之间的同步有很多种实现方式,比如删除然后重新 INSERT,或者写一些其它的分支条件判断再加以 INSERT 或者 UPDATE 等.包括在 SSIS Package 中也可以通过 Lookup ...
- 1.5.4、CDH 搭建Hadoop在安装之前(定制安装解决方案---配置自定义Java主目录位置)
配置自定义Java主目录位置 注意: Cloudera强烈建议安装JDK/ usr / java / jdk-version,允许Cloudera Manager自动检测并使用正确的JDK版本.如果在 ...
- fiddler常用操作之断点
fiddler常用操作断点 标签(空格分隔): fiddler断点 一.断点: 1.为什么要打断点呢? 比如一个购买的金额输入框,输入框前端做了限制100-1000,那么我们测试的时候,需要测试小于1 ...
- linux suse 同步时间
ntpdate 210.72.145.44 ip为中国(国家授时中心)
- Django 之多对多关系
1. 多对多关系 作者 <--> 书籍 1. 表结构设计 1. SQL版 -- 创建作者表 create table author( id int primary key auto_inc ...
- httpclient和httpUrlConnect区别
HttpURLConnection的用法 一.创建HttpURLConnection对象 URL url = new URL("http://localhost:8080/TestHttpU ...
- js阻止时间冒泡事件——event.stopPropagation()
1. 作用:不再派发事件. 2. 语法: html代码: <div class="oreder-cont" ng-click="Orderdetails()&quo ...
- 浅谈CSRF
CSRF是什么? (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为“One Click ...