一、整体抓包情况
192.168.111.1:53965请求向192.168.111.128:80发起TCP连接。
注意:TCP连接是TCP端口向TCP端口的连接。
二、TCP连接请求(三次握手)
此处为简洁隐去端口号。
(1)192.168.111.1——>192.168.111.128
接收方(客户端)发起连接请求:[SYN],Seq == 0
//请求同步,客户端序列号置零
(2)192.168.111.128——>192.168.111.1
发送方(服务端)回复请求:[SYN,ACK],Seq == 0, Ack == 1
//请求同步,服务端序列号置零,传输的数据的第一个字节应该从1开始
(3)192.168.111.1——>192.168.111.128
接收方(客户端)回复响应:[SYN.ACK],Seq == 1, Ack == 1
//客户端序列号置1,客户端开始发送http请求数据,传输的数据的第一个字节应该从1开始(传输的第一个包是客户端的http请求,由于仍是客户端的回合,所以Seq值保持不变为1)
//服务器收到此包后建立连接
三、TCP数据传输
(1)192.168.111.1——>192.168.111.128
接收方(客户端)发送数据包(http包):[SYN.ACK],Seq == 1, Ack == 1
//此处ACK值应该是287,但是因为是第一个数据包,仍旧保留为1
//如果seq值还是1,后面tcp流控会有存在问题。
查看tcp流控窗口情况,客户端发送的tcp包中seq值都是287,如果seq值仍是1会影响tcp数据的计算和流控窗口。
(2)192.168.111.128——>192.168.111.1
发送方(服务端)回复:[SYN,ACK],Seq == 1, Ack == 287
//为了使客户端tcp中的seq值正常,服务器端发一个无数据的空包更新客户端的seq值
(3)seq值正确后客户端开始流控请求
客户端的流控窗口整体情况。
客户端只发送请求,提示数据包长度,tcp包没有数据载荷,长度为0。
(4)验证服务端的流控窗口
服务端发送一个tcp包,服务端发2个tcp包。
服务端总共回12个数据包。