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"包 ,并且刷新超时时间,这也是为了在不可靠的网络连接中,可以可靠进行地连接断开。

相关推荐
谢平康8 小时前
移动光猫放开 IPv6 入站:5G 手机直连家里 NAS,不用端口映射
5g·智能手机·php
狗凯之家源码网8 小时前
微博图床 PHP 系统搭建与实战应用指南
android·开发语言·php
梦帮科技9 小时前
领域认知知识库图谱注入:从双式记账图网络到高质量问答对自动化合成流水线
运维·网络·数据库·人工智能·矩阵·架构·自动化
菜鸡养成中...10 小时前
卫星通信协议笔记1-协议栈
网络
hzxpaipai11 小时前
杭州企业官网怎么建设?从策划到上线的5步建站方法
运维·服务器·前端·网络
smartpi_ai11 小时前
通用脱机烧录器为什么烧不进 CI-03?下载协议的门槛、免唤醒 10 条的建议值属性
服务器·网络·ci/cd
ITxiaobing202312 小时前
自研 IP 库与 AppsFlyer 判定不一致的排查实践
网络·网络协议·tcp/ip
2501_9378609412 小时前
中篇:TCP 为什么可靠又高效?滑动窗口、流量控制、拥塞控制与粘包全解析
服务器·网络·tcp/ip
刚及格的陆拾伍13 小时前
Wi-Fi核心知识精要:从频段到帧结构全解析
网络·物联网·网络协议·信息与通信·iot
xiaoye-duck13 小时前
《Linux 网络编程》深入理解 IO 多路复用:select 函数详解与 Echo 服务实战
linux·网络