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

相关推荐
幺零九零零1 小时前
【计算机网络】TCP协议面试常考(一)
服务器·tcp/ip·计算机网络
热爱跑步的恒川1 小时前
【论文复现】基于图卷积网络的轻量化推荐模型
网络·人工智能·开源·aigc·ai编程
云飞云共享云桌面2 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
音徽编程4 小时前
Rust异步运行时框架tokio保姆级教程
开发语言·网络·rust
龙哥·三年风水5 小时前
群控系统服务端开发模式-应用开发-个人资料
分布式·php·群控系统
幺零九零零6 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
23zhgjx-NanKon6 小时前
华为eNSP:QinQ
网络·安全·华为
23zhgjx-NanKon6 小时前
华为eNSP:mux-vlan
网络·安全·华为
点点滴滴的记录6 小时前
RPC核心实现原理
网络·网络协议·rpc
Lionhacker7 小时前
网络工程师这个行业可以一直干到退休吗?
网络·数据库·网络安全·黑客·黑客技术