TCP协议与wireshark抓包分析
一、tcp协议格式

1. 源端口号 :
发送方使用的端口号
2. 目的端口号 :
接收方使用的端口号
3. 序号:
数据包编号 , tcp 协议为每个数据都设置编号,用于确认是否接收到相应的包
4. 确认序列号 :
使用 tcp 协议接收到数据包,会根据这个接收到这个数据包编号发送一个应答包,一般为上一次的数据包的编号加上长度,如果是 SYN或者FIN ,则是上一次的数据包的编号 加1
5. 标志位: 用于标识
URG: 表示紧急指针是否有效ACK : 表示确认号是否有效。称携带ACK标志的tcp报文段位确认报文段PSH : 提示接收端应用程序应该立即从tcp接受缓冲区中读走数据,为接受后续数据腾出空间(如果应用程序不将接收的数据读走,它们就会一直停留在tcp缓冲区中)
RST: 表示要求对方重新建立连接。携带RST标志的tcp报文段为复位报文段。
SYN: 表示请求建立一个连接。携带SYN标志的tcp报文段为同步报文段。
FIN: 表示通知对方本端要关闭连接了。携带FIN标志的tcp报文段为结束报文段。
6. 窗口大小:
用于 tcp 进行流量控制,这里的窗口用于向发送端说明当前 tcp 接收缓冲区还能存储的数据大小
7. 校验和:
用于接收端用于校验接收的数据是否正确,由发送端进行填充,计算校验和主要包括 tcp 协议头与数据区校验的方式为 CRC 校验
二、tcp三次握手
1. 设置 wireshark 使用绝对数据包编号
2. 选择网卡,并设置tcp端口过滤,开启抓包
3. 启动tcp服务器,并使用网络调试助手连接服务器
4. 查看抓包结果
第一次握手 : 客户端给服务器发送 SYN 数据包
Flags标志设置为 SYN ,数据包编号为 2968294989
第二次握手 : 服务器给客户端发送 SYN + ACK 的数据包
Flags 标志: 设置为 SYN + ACK
数据包应答编号为 2968294990,相当是 SEQ_SYN + 1
数据包编号为 672472624
第三次握手 : 客户端给服务器发送 ACK 数据包
Flags 标志 : ACK
数据包应答编号为 672472625,是第二个数据包的编号加1
数据包编号为 2968294990
三、tcp 四次挥手
TCP(传输控制协议)的四次挥手是用于关闭一个已经建立的TCP连接的过程。它确保了数据的可靠传输,并且能够让双方安全地断开连接。以下是四次挥手的详细过程:
1. 第一次挥手(FIN):主动方发起关闭请求
-
操作:假设客户端(A)想要关闭连接,它会发送一个带有
FIN
标志的TCP报文给服务器(B)。这个FIN
报文表示客户端已经没有数据要发送了,但仍然可以接收来自服务器的数据。 -
状态变化:客户端进入
FIN_WAIT_1
状态,等待服务器的响应。
2. 第二次挥手(ACK):被动方确认关闭请求
-
操作:服务器(B)收到客户端(A)的
FIN
报文后,会发送一个带有ACK
标志的TCP报文作为确认。这个ACK
报文的确认号是客户端FIN
报文序列号加1,表示服务器已经收到了客户端的关闭请求。 -
状态变化:客户端收到
ACK
后,进入FIN_WAIT_2
状态;服务器进入CLOSE_WAIT
状态。此时,服务器可能还有数据要发送给客户端。
3. 第三次挥手(FIN):被动方发起关闭请求
-
操作:当服务器(B)完成数据发送后,它会发送一个带有
FIN
标志的TCP报文给客户端(A),表示服务器也没有数据要发送了,希望关闭连接。 -
状态变化:服务器进入
LAST_ACK
状态,等待客户端的最终确认。
4. 第四次挥手(ACK):主动方确认关闭请求
-
操作:客户端(A)收到服务器(B)的
FIN
报文后,会发送一个带有ACK
标志的TCP报文作为确认,确认号是服务器FIN
报文序列号加1。此时,客户端进入TIME_WAIT
状态,等待2个最大报文段寿命(2MSL)的时间,以确保最后一个ACK
报文能够被服务器收到。 -
状态变化:服务器收到客户端的
ACK
后,进入CLOSED
状态,完成关闭过程。客户端在2MSL时间后也进入CLOSED
状态。
为什么需要四次挥手
-
确保数据完整传输:TCP是一个面向连接的协议,需要确保数据的可靠传输。四次挥手确保了双方都明确知道对方已经没有数据要发送,并且双方都收到了对方的关闭请求。
-
防止资源泄露:通过四次挥手,可以优雅地关闭连接,释放系统资源,避免连接长时间占用资源。
TIME_WAIT 状态的作用
-
确保最后一个ACK报文能够被对方收到:在第四次挥手时,客户端发送的
ACK
报文可能会丢失。服务器在等待ACK
超时后会重新发送FIN
报文。客户端进入TIME_WAIT
状态后,可以重新发送ACK
,确保连接能够正确关闭。 -
防止老的连接干扰新的连接:在2MSL时间内,网络中可能还残留着旧连接的报文。
TIME_WAIT
状态可以防止这些报文干扰新的连接。
TCP四次挥手是TCP协议中非常重要的机制,它确保了连接的可靠关闭,是TCP协议可靠性的关键体现之一。