TCP协议详解

时间:2024-11-14 08:25:43

一、整体抓包情况

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个数据包。
在这里插入图片描述