TCP的三次握手和四次挥手······详解

1、三次握手

三次握手是建立连接的过程

如图大致为三次握手的流程图:

当客户端对服务端发起连接时,会先发一个包 连接请求数据,去询问能否建立连接,该数据包称为 "SYN"包

然后,如果对方同意连接,那么对方将会回复一个 "SYN+ACK"包

客户端收到后,回复一个 "ACK"包,连接就建立了

因为该过程中,互相发送了三包数据,所以称为 "三次握手"

但是为什么是 "三次握手" , 而不是 "两次握手",明明服务端回复完 "SYN+ACK"包后就能建立连接

这是为了防止已失效的请求报文,忽然又传到服务器,从而引起错误

比如:

当发送请求包时,因为某些原因,该包并没有到达服务器,在某个节点产生了滞留 ,然而客户端为了建立连接会重新发送 "SYN"包 ,正常送达后回复 "SYN+ACK"包建立连接,但是,第一个包 滞留的包突然恢复,又送达到服务端,这时服务端会误以为客户端又 发送了一个连接请求 ,这时,服务端认为是两个连接 ,二客户端认为只有一个连接,造成了状态不一致。

如果在 "三次握手"的情况下

客户端没有回复 "ACK"包,就无法建立连接,解决了网络信道不可靠的问题

2、四次挥手

四次挥手大致流程图

第一次挥手

客户端向服务端发送 "FIN"包 ,表示要关闭连接,自己则进入终止等待1状态,这是第一次挥手,如图

第二次挥手

服务端接收到 "FIN"包 ,回复一个 "ACK"包 ,表示自己进入关闭等待状态 ,而客户端同时进入终止等待2状态,这是第二次挥手,如图

PS:服务端此时还可以发送未发送的数据,而客户端也还可以接收数据

第三次挥手

待服务端发送完数据后,会发送一个 "FIN"包 ,进入最后确认状态,这是第三次挥手

第四次挥手

客户端收到后,回复 "ACK"包 ,进入超时等待状态 ,经过超时时间后关闭连接 ,而服务端收到 "ACK"包 后立即关闭连接

为什么客户端需要 "等待超时时间"

这是为了保证 服务端已收到 "ACK"包 ,因为假设客户端发送完 "ACK"包后就断开连接 ,一旦 "ACK"包在网络中丢失 ,服务端就一直停留在最后确认状态。

而有了 "等待超时时间"

服务端会因为没有收到 "ACK"包,会对客户端重新 发 "FIN"包 ,此时,客户端会再 对服务端发送 "ACK"包 ,并且刷新超时时间,这也是为了在不可靠的网络连接中,可以可靠进行地连接断开。

相关推荐
syagain_zsx7 小时前
WebSocket 教程:websocketpp 写 echo 服务端
linux·网络·c++·websocket·网络协议·工具库
小白跃升坊7 小时前
PHP2Shell:AI 两天挖出 9.2 分漏洞,让全球 70% 网站连夜打补丁
php·1panel·ai安全·漏洞披露
骑着蜗牛撵大象3277 小时前
字节序、TLV 到 netlink:Linux 网络消息的编解码全链路
linux·网络·php·etl·序列化·字节序·tlv
huaweichenai7 小时前
php搭建mcp服务
开发语言·php·ai编程
漫步人生走在路上7 小时前
外贸SEO中的品牌词与产品词策略:大卖家和小卖家的不同打法
大数据·javascript·网络·数据库·人工智能·搜索引擎
张小姐的猫7 小时前
【MySQL】数据类型
android·linux·数据库·c++·mysql·adb·php
华允物联-HUAIOT8 小时前
DTU 和 LoRa 模块有什么区别?工业无线回传怎么选
网络·tcp/ip·udp
AI砖家8 小时前
验证码与接口防刷完整落地方案
网络·人工智能·安全验证
阿文和她的Key8 小时前
DeepInfer 与 TorchTPU 同日开源:供应商锁定的成本结构正在被重写
网络·人工智能·架构·开源
Raas1008 小时前
MemT-1.0 接入设计指南:硬件核算、三方案选型与写入触发点
大数据·网络·人工智能·机器学习·数据挖掘·ai agent