前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基础知识-网络-TCP四次挥手

基础知识-网络-TCP四次挥手

作者头像
BUPTrenyi
发布2019-07-15 17:01:14
3590
发布2019-07-15 17:01:14
举报

一 TCP四次挥手是什么?以及过程?

TCP连接是全双工的,所以客户端client到服务端server的连接需要关闭,同理server到client的连接也需要关闭。所以TCP四次挥手做的事情就是,关闭两条TCP连接并释放资源。

二 开讲!

和昨天一样,边解释名词,边解释挥手:

FIN 关闭序号,是1,它表示关闭连接。(对应握手的SYN标志位,会很好记)代表,client对server已经没有数据要发送了,client请求关闭TCP连接。同理,同时随机选取一个seq=u的数据包。

ACK 确认序号,是1,一样的表示响应。server发送ACK=1的数据包表示,我已确认收到,你,client的关闭连接请求。同时我对到u为止的数据包,都已经正确收到,且我希望你client下次给我发的数据包的序列号是u+1

第三次挥手,同样由server端发起,表示,我server现在也要关闭,从我到你client的TCP连接了。

第四次挥手,client告诉server:对于你要关闭向我传输数据的TCP连接这个请求,我也确认收到了。自此,两个TCP连接关闭,释放资源,即ip+port。

三 经典面试问题

  1. FIN_WAIT_1和FIN_WAIT_2有什么区别?

A:使用netstat -ant可以查看套接字的状态。

FIN_WAIT_1 就是主动发起关闭连接的一方,在发送了FIN之后,等待另一端ACK的状态。

FIN_WAIT_2 就是主动发起关闭连接的一方,在收到了另一端的ACK之后,等待另一端FIN的状态。

2.为什么TCP需要四次挥手?三次挥手不行吗?

A:三次还是四次的问题主要集中在,为什么server要把FIN和ACK分到两次数据包发送?打包成一次发送不行吗?

这就需要理解全双工了。client的FIN关闭仅仅代表client没有数据要给server发送了,但不代表server也没有数据要发送了。所以server要先确认client的关闭连接请求,此时有可能继续发送数据,发完之后,再告诉客户端,我也好了,请求关闭。

插一个问题:我曾经遇到过一个面试官,问我,如果server也没有数据要发送了,那四次挥手能不能改成三次挥手呢?即server把ACK和FIN打包一起发送?我想了想,确实可以,我回答是。后来我问他,也得到了肯定答案

3.TIME_WAIT状态是什么?时间多长?为什么会有TIME_WAIT

A:主动发起关闭的一方,在最后一次挥手之后,会进入TIME_WAIT状态,时间为2MSL。

MSL即Maximum Segment Lifetime,即报文最大生存时间。

TIME_WAIT为什么要有呢?

我们假设,主动发起关闭的一方,比如就是client吧,最后发送的ACK报文在网络中丢失,根据TCP的重传机制,server一方会重新发送FIN,在FIN到达client之前,client必须维护这条连接,直到FIN到达client,client重发ACK。

那么2MSL就是,client发送了ACK之后,ACK这个报文的MSL,和ACK丢失后,server重传FIN的报文的MSL,是这两个MSL相加。

即总结:主动关闭的一方,进入TIME_WAIT状态,在这期间,它的ip和port不能被重新分配。持续2MSL之后,这样就保证了原TCP连接的旧数据包因为过期而丢失,之后,就可以以相同的四元组(local_ip, local_port, remote_ip, remote_port)再次建立TCP连接了。

明天预告:二叉树+TCP怎么保证数据的可靠传输

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法其实很好玩 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档