网络10分钟--四次挥手

tech2022-07-27  160

网络10分钟--四次挥手

提问环节原理解析生活场景模拟问题解答细节浅谈书籍推荐下章预告

提问环节

我们一起带着问题来阅读吧!

四次挥手是怎么进行的?为什么要四次挥手?三次不行吗?挥手完就算连接结束了吗?会产生别的问题吗?平时四次挥手需要注意些什么呢?

原理解析

当TCP客户端使用完之后,需要断掉连接,避免一直占用资源。建立连接那么严谨,断掉连接同样很重要,我们一起来看看吧! 1.主动关闭方发起关闭:将FIN标志位(关闭标志位) 置为1,将顺序号seq 赋值为x(x为一个半随机的值),形成一个包发送给对方。此时主动关闭方不再发送业务报文。 2.被动关闭方回复: 被动关闭方将顺序号seq赋值为y(半随机的值),将ack(接收顺序号) 置为x+1,并将ACK(响应标志) 设置为1.将其打包发送给对方。此时被动关闭方不再接收对方的业务报文 3.被动关闭方关闭通知: 当被动关闭方不需要再发送业务报文时,则发送FIN标志位置为1,ack为x,seq为z给对方。 4.主动关闭方回复:将seq设置为x,ack设置为z发送给被动关闭方进入TIME_WAIT(等待状态),然后等待2*MSL(报文最大生存时间) 再进入关闭状态。当被动关闭方收到这个回复则直接进入关闭状态。 当上面的流程完成,连接也就真正断开。

生活场景模拟

还是自来水的故事:书接上回,水管连好了,这个时候A罐管理员工作完成了便想把水管拔掉收工。于是: 1.A罐管理员发短信给B:我这里是A罐的x管道,我的水放完了,我想拔掉水管。 2.B管理员收到后回复:我收到了你x管道的信息了,我知道你放完了,我再不接收你的水咯! 当B罐管理员这边的水也放完了时。 3.B管理员发送信息:x管道,我这里y管道也用完了,准备关掉了哟。你那边不用再接了。 4.A管理员收到后发送信息: y管道,我x管道收到你的信息了,你可以拔掉水管了。

当A管理员发送最后一条信息时,会等待一段时间,让水管里面还可能存在的水都流完。避免有一些水还在管子里。当时间到了时就拔掉水管。而B管理员收到信息就拔掉水管了。两个管理员完成了今天的工作。

问题解答

四次挥手其实就是连接双方的四次发包。为了让主动方和被动方都能正确的接收到报文,则必须经历四次挥手,不然容易造成连接一方不能正常关闭的现象。为什么主动关闭方要进入TIME_WAIT状态?1:因为网络是不一定稳定的,有可能最后一个包发出去丢失了,如果不等待则被动方永远不会关闭,当发送FIN的一方一直没收到ACK时会再发送一次,而对方收到重复的FIN时则知道包丢失了,则会再次发送ACK包则称为RTO,确保连接双方的稳定性。而其中的时差则为2MSL(一个来回)。2:连接中可能还有其他的包残留,等待2MSL能保证连接中的所有包都被接收到。TIME_WAIT的时间可以通过TCP_TIMEWAIT_LEN设置,MSL一般为30S则TIME_WAIT一般为一分钟。所以有时明明端口连接断掉了还是不能用,则可能该端口还未关闭。TIME_WAIT带来的问题有:连接的内存消耗,端口占用。解决的办法有net.ipv4.tcp_max_tw_buckets 超过这个值则会将所有的TIME_WAIT状态都重置掉。具体的以后在TIME_WAIT文章中详聊。

细节浅谈

当连接双方同时发起关闭时,则双方都会进入TIME_WAIT状态。TIME_WAIT状态带来的问题需要仔细考虑。不然会影响连接等问题。

书籍推荐

入门:《图解TCP/IP》,《TCP/IP网络编程》

深入:《Unix 高级环境编程》,《Unix 网络编程》 第 1 卷 套接口 API 、第 2 卷 进程间通信

下章预告

拥塞控制

ps:IT10分钟会持续更新,有兴趣的同学可以关注一下,有想了解的知识点可以评论。

最新回复(0)