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

相关推荐
探物 AI19 分钟前
yolo检测中的激活函数19:ReLU激活函数 (Rectified Linear Unit)
网络·人工智能·深度学习·yolo
buhuizhiyuci1 小时前
【Linux 网络篇】数据的 “循环系统“:协议认识与网络传输的流程
linux·运维·服务器·网络·vscode
GDAL9 小时前
Nginx TCP/UDP四层转发(Stream模块)完整深入教程
tcp/ip·nginx·udp
2401_8653825012 小时前
密评与等保的关系:不是替代,而是互补
网络·信息化造价
白狐_79814 小时前
408计算机网络第3章:PPP协议——帧格式、LCP/NCP、状态机与真题精讲
网络·计算机网络·智能路由器
MIXLLRED14 小时前
解决——Ubuntu远程桌面指令更换网络
linux·网络·ubuntu
zt1985q16 小时前
本地部署开源网络书签与内容管理工具 Karakeep 并实现外部访问
运维·服务器·网络·数据库·网络协议·开源
白狐_79818 小时前
408计算机网络第3章:以太网交换机与共享式以太网——知识总结
服务器·网络·计算机网络
渣渣盟18 小时前
当 Redis 写入成为性能瓶颈时,如何利用 异步批量 Sink 将吞吐量从 1w QPS 提升到 10w+?
数据库·redis·php
笨鸟先飞,勤能补拙18 小时前
网络安全等级保护 2.0:从定级备案、建设整改到持续合规的系统指南
网络·人工智能·windows·安全·web安全·网络安全·github