1.2.6 保留位和标志位
图2中可以看到,保留位是6bit,标志位是6bit。从图3中可以看出,保留位的值是0b000000;而标志位的值是0b000010,根据图2的标志位示意图可以看出,SYN标志是1,说明该数据包是SYN数据包。
相关链接2 URG是紧急标志位,该标志位是1时,通知接收端应当优先处理;ACK标志是1时表示确认数据包;PSH是推标志位,该标志位是1时,发送端不是将该数据放入缓冲区而是立即向对端发送;而接收端也不是将该数据放入缓冲区而是立即处理;RST是复位标志,该标志是1时,表示是复位数据包,用来复位TCP连接;SYN是同步标志,该标志是1时,表示是同步数据包,使得通信双方同步;FIN是结束标志,该标志是1时,表示是结束数据包,用来结束一个TCP连接。
1.2.7 窗口
窗口指的是一个缓冲区,发送数据的主机在等待接收数据的主机确认应答(参考1.2.4 确认号)之前,可以将已发送的数据保存在这个缓冲区中,如果按时收到确认应答,则清除该缓冲区。而图2中窗口字段表示发送数据的主机A通知对端主机B,当前自己(主机A)能处理的数据字节数,当主机B收到该窗口数据之后,根据该数据设置自己(主机B)的窗口,以便自己(主机B)发送的数据,能够全部被主机A处理。从图3中可以看到,窗口字段的值是0xfaf0,即64240个字节,当主机B收到该SYN数据包后,会将自己的TCP窗口的大小设置64240个字节。
1.2.8 检验和
检验和是对TCP头部数据即图3中的数据和TCP内容进行校验和计算,接收端对收到的TCP头部和内容再次进行校验和计算,与该检验和进行比较,若不相同,则说明收到的TCP数据有误。从图3中可以看出,该TCP头部的校验和字段值是0x05a4。
1.2.9 紧急指针
紧急指针字段与“1.2.6 保留位和标志位”中提到的URG标志结合使用,当URG标志是1时,紧急指针字段有效。此时,由“1.2.3 序号”中提到的序号字段值加上紧急指针字段值,该地址对应的数据将被优先发送。从图3中可以看到,因为SYN数据包中的URG值是0,因此该数据包中的紧急指针值被忽略。
1.2.10 选项
选项字段包含了TCP选项的设置,该字段的长度可变,一般是8bit的整数倍。在该字段中,通过三个部分来表示某一选项,分别是类型、长度和含义。其中,类型的大小是8bit,表示如何设置该选项;长度的大小是8bit,表示某一选项的总长度;含义的大小是长度指定的大小减去2字节(类型大小与长度大小),表示选项的具体值。从图3中可以看出,第一个选项的数据是0x020405b4,其中,0x02表示MSS(Maximum Segment Size)即最大报文段长度,0x04表示第一个选项的总长度,4个字节;0x05b4表示最大报文段长度的值。第二个选项的数据是0x01,0x01表示不设置该选项,因此没有长度和含义的数据,该选项的数据只有1个字节;第三个选项的数据是0x030308,其中0x03表示WS(Window Scale)窗口扩大选项,0x03表示该选项的长度是3字节;0x08表示窗口扩大选项的值是8;接下来的两个0x01表示第四个选项和第五个选项都不进行设置;第六个选项的数据是0x0402,其中0x04表示SACK(Selective Acknowledgment) Permitted,即选择性确认,0x02表示本选项数据的长度是2字节。
1.2.11 填充
TCP头部的总长度应该是4字节的倍数,否则,则需要填充一些无用的数据。从图3中可以看到,本SYN头部的长度是32字节,则无需填充数据。
2 第二次握手
从图1可以看出,客户端与服务端的第二次握手,实际上就是服务端向客户端发送ACK+SYN数据包。该数据包如图4所示。
?图4 ACK+SYN数据包
与“1 第一次握手”中分析分析类似,此时ACK+SYN数据包头部包含了源端口是0x0050,目的端口是0x1908;序号是0xac8bb844;确认序号是0xf1995d88,需要注意的是,在“1 第一次握手”中提到的SYN包的序号是0xf1995d87,而对于SYN包来说,默认的长度是1字节,因此,服务端发送的确认序号是客户端发送的序号数值加1;数据偏移即头部大小是7*4=28字节;保留位和标志位是0x012,此时ACK和SYN标志是1,表示该数据包是ACK+SYN数据包;窗口字段值是0x3908;校验和是0x77c7;紧急指针是0x0000;选项值是0x020405a001030307,含义与“1.2.10 选项”中提到的相同。
3 第三次握手
从图1可以看出,客户端与服务端的第三次握手,实际上就是客户端向服务端发送ACK数据包。该数据包如图5所示。
?图5 ACK数据包
与“1 第一次握手”中分析分析类似,此时源端口是0x1908,目的端口是0x0050,序号是0xf1995d88,与“2 第二次握手”中提到的ACK+SYN包的确认序号相同;确认序号是0xac8bb845,是“2 第二次握手”中提到的ACK+SYN包的序号包的值加1;数据偏移即头部大小是5*4=20字节;保留位和标志位是0x010,ACK标志位是1,表示该数据包是ACK数据包;窗口字段值是0x0205;校验和是0xda81;紧急指针是0x0000,没有选项字段和填充字段。
|