WireShark—TCP解析
三次握手详解
利用WireShark抓包,追踪流,抓取到一个会话的数据包。前三个TCP数据包对应了TCP建立连接的三次握手
上图为TCP的报文段格式
SYN字段
SYN:同步序列编号(Synchronize Sequence Numbers)。是TCP/IP建立连接时使用的握手信号。在客户机和服务器之间建立正常的TCP网络连接时,客户机首先发出一个SYN消息,服务器使用SYN+ACK应答表示接收到了这个消息,最后客户机再以ACK消息响应。这样在客户机和服务器之间才能建立起可靠的TCP连接,数据才可以在客户机和服务器之间传递。
ACK字段
ACK (Acknowledge character)即是确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符。表示发来的数据已确认接收无误。
wireshark抓取的包中637号包对应图中的x号包,638对应y号包,639对应x+1。
第一次握手
637号包中分别发送了如下信息
MSS
最大报文段长度(MSS)是TCP协议的一个选项,用于在TCP连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长度(不包括文段头)。
在此处IP为192.X的主机告知了IP为182.X的主机期望收到的数据的最大长度为1460。
Win和WS(window scale 窗口缩放因子)
因为窗口字段大小仅为16bit,ws字段主要是实现在不改变窗口字段大小的前提下,可以表示更大的窗口空间。
实际接收窗口大小为Win * WS
此处可知实际的接收窗口大小为64240*256
SACK_PERM
允许选择确认
第二次第三次握手
略,知识点与第一次握手中的相同。要注意的是虽然数据包Len=0,但Seq仍需要+1
数据传输过程
注意图中“TCP segment of a reassembled PDU”,说明上层要传输的数据超过了一个TCP数据包最大的数据长度(此处为14400,因为在三次握手的阶段,IP为182就已告知MSS为1440),所以数据被分段,拆分为几个TCP数据包进行传输。
662数据包对之前所接收的数据进行累计确认,661数据包Seq为2944173087,Len = 1440,故662数据包的ACK = 2944174527