TCP通信是可靠通信,因此在建立TCP连接时,需要客户端和服务端之间总共发送三个包以确认连接的建立,我们将发送这三个数据包的过程叫做三次握手,该过程如图1所示。

wireshark里面的包是bogon是什么意思 wireshark syn包_TCP三次握手

 图1 TCP三次握手

客户端与服务端发送的握手数据包,其包头格式如图2所示。

wireshark里面的包是bogon是什么意思 wireshark syn包_Wireshark_02

 图2 TCP包头部结构

1 第一次握手

从图1可以看出,客户端与服务端的第一次握手,实际上就是客户端向服务端发送SYN数据包。

1.1 SYN数据包

SYN是Synchronize Sequence Numbers即同步序列编号的简称。客户端随机生成一个序列标号(Sequence Numbers),并将该随机的序列编号通过SYN数据包发送给服务端,即图1中第一次握手时的Seq,使得客户端和服务端的序列编号同步。

1.2 Wireshark捕获到的数据

图3所示,即为Wireshark捕获到的SYN数据包内容。

wireshark里面的包是bogon是什么意思 wireshark syn包_TCP头部_03

 图3 SYN数据包

根据图2的包结构和图3的包结构的具体值,接下来我们一起来看一下TCP第一次握手的SYN数据包含义。

1.2.1 源端口

其中,0x1908表示SYN数据包的源端口,即客户端发出SYN数据包的端口,转换成十进制是6408。

1.2.2 目的端口

0x0050表示SYN数据包的目的端口,即服务端用于接收SYN数据包的端口号,转换成十进制是80。

相关链接1 网络字节序与主机字节序,图3中显示的数据包中的数据保存方式为网络字节序,即低地址保存数据的低位,高地址保存数据的高位,因此1908即为0x1908;与网络字节序相对应的是主机字节序,即数据保存在主机中的字节顺序,该顺序为低地址保存数据的高位,高地址保存数据的低位,因此1908为0x0819。

1.2.3 序号

序号的值是0xf1995d87,即序列标号的值,SYN数据包的作用就是将该序列标号的值发送给对方。

1.2.4 确认号

确认号表示期望收到对方的下一个报文段数据中第一个字节的序号。例如主机A向主机B发送数据包,该包的序号是0x00000001,长度是5字节;则主机B收到该数据包之后,向主机A发送数据包中的确认号就是0x00000001+5=0x00000006,即期望主机A再次向主机B发送数据时,其序号应为0x00000006。这样,当主机A再次向主机B发送数据包时,可以确认该数据包的序号与从主机B收到的确认号是否相同,达到确认的目的。需要注意的是,确认号字段只有在ACK标志位为1的时候才有效,在下面的分析中可以看到,图3中的SYN数据包的ACK标志位是0,表示该数据包的确认号无效,因此当前数据包的确认号是0x00000000。

1.2.5 数据偏移

数据偏移指定了TCP头部的长度,该段占4bit,以4字节作为计算单位。图3中,数据偏移段的值是8,即表示TCP头部的长度是8*4=32字节。