通过抓包分析TCP协议的连接与断开
TCP的连接与断开
TCP连接“三次握手”
TCP是提供可靠的面向连接的服务,也正是“可靠”,所以在进行通信前,要进行TCP建立连接,即“三次握手”。
第一次“握手”:
客户端向服务端发送一段报文,包含标记位SYN,表示我要请求连接,值为1,序号seq随机生成。
第二次“握手”:
服务器端接收到之后,停止监听,并返回一段TCP报文,其中包括标记位SYN和ACK,将值置为1,表示确认客户端请求的报文seq有效,并且继续随机生成一个seq序列号,返回一个确认号ack为x+1。
第三次“握手”:
客户端收到服务器端请求确认后,返回一段TCP报文,其中包括标记位ACK,值为1,表示确认收到服务器的信号,返回一个序列号seq,表示确认收到服务器端确认号ack,并且将其作为值,确认号ack表示收到服务端的seq,并将值加1作为自己的值。
服务器端收到报文后,开始进行数据传输。
抓包
第一次握手
第二次握手
第三次握手
TCP断开连接“四次挥手”
TCP是提供可靠的面向连接的服务,也正是“可靠”,未防止断开连接时还有数据在传输,可能导致的数据丢失,所以在断开连接时,连接的双方都确认后,释放该连接。
第一次“挥手”:
客户端向服务端发送一段报文,包含标记位FIN,值为1,表示我要释放连接,序号seq随机生成。
第二次“挥手”:
服务段向客户端发送一段报文,包含标记位ACK,值为1,ack为上一段报文的序列号加1,表示收到客户端的seq,确认客户端的释放连接请求序列号seq有效,seq随机生成。此时为半连接状态,即服务端可以向客户端发送数据。
第三次“挥手”:
服务端向客户端发送一段报文,包含标记位FIN,ACK,值为1,表示服务端将释放连接,不再发送数据,,ack、seq和第二次“挥手”时相同。
第四次“挥手”:
客户段向服务端发送一段报文,包含标记位ACK,值为1,seq序列号为上一段报文的ack确认号,ack为上一段报文的seq +1,表示客户端对上一段报文序号为y的确认,此时,双方断开连接。释放连接。
在本次抓包实验中,发现TCP四次“挥手”阶段时,第二、三次“挥手”合并在一起,因为在本次实验中,服务端可能已没有数据要发送,所以合并在一起发送。
抓包
第一次挥手
第二、三次挥手
第四次挥手
本文来自博客园,作者:whitehe,转载请注明原文链接:https://www.cnblogs.com/whitehe/p/18578413
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了