做个了断:三次握手与四次挥手

做个了断:三次握手与四次挥手

在面试中,只要涉及到计网的内容,大概率都会问到有关TCP连接的三次握手四次挥手

今天,阿清决定仔细梳理一遍这两块内容,希望大家在日后遇到这两个问题时,都能完美地回答呀。



01


三次握手



来,我们直接看图。

其中

syn表示synchronous,即建立联机

ack表示acknowledgement, 即确认

做个了断:三次握手与四次挥手
三次握手

长话短说,在三次握手中,客户端与服务端都会向对方发送连接请求报文,并都会收到对方的确认报文。

客户端TCP状态变化:close->syn_sent->established

服务端TCP状态变化:listen->syn_rcvd->established

三次握手的过程如下:

  1. 第一次握手:客户端向服务端发送syn(c)报文,并进入syn_sent的状态。
  2. 第二次握手:服务端向客户端一次性发送syn(c)的确认报文ack(c)、与syn(s)报文,并进入syn_rcvd状态。
  3. 第三次握手:客户端向服务端发送syn(s)的确认报文ack(s),客户端进入established状态,服务端在收到确认报文后,也进入established状态。

为什么要进行三次握手呢?

在谢希仁的著作《计算机网络》中讲到,“三次握手”的目的是,“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。

我的理解是:

三次握手保证了客户端确认接受数据、发送数据正常,同时保证了服务端接受数据、发送数据正常。

在两次握手的情况下,当client端因网络并发量太高,导致发送的连接请求阻塞,此时client再次发送了一次连接请求,这时server端收到了两个连接请求,而实际client只有一个请求,server端却有两个响应(极端情况下会有多个响应),造成资源浪费。



02


四次挥手



先来看图。

做个了断:三次握手与四次挥手
四次挥手

四次挥手的过程,与三次握手类似,客户端与服务端都会向对方发送终止连接请求报文,并都会收到对方的确认报文。

客户端TCP状态变化:established->fin_wait_1->fin_wait_2->time_wait->close

服务端TCP状态变化:established->close_wait->last_ack->close

四次挥手的过程如下:

  1. 第一次挥手:客户端向服务端发送fin(c)报文,请求终止连接,并进入fin_wait_1状态。服务端在收到fin(c)报文后,进入close_wait状态。
  2. 第二次挥手:服务端向客户端发送ack(c)报文,客户端在收到ack(c)报文后,进入fin_wait_2状态。
  3. 第三次挥手:服务端向客户端发fin(s)报文,并进入last_ack状态,客户端在收到fin(s)报文后,进入time_wait状态。
  4. 第四次挥手:客户端向服务端发送ack(s)报文,并等待2MLS,之后进入close状态,服务端在收到ack(s)报文后,进入close状态。

MLS: Max Segment Lifetime,最大分段生存期,指一个TCP报文在Internet上的最长生存时间。每个具体的TCP协议实现都必须选择一个确定的MLS值,RFC 1122建议是2分钟,但BSD传统实现采用了30秒。

为什么要设置time_wait状态?

为了保证客户端能及时处理服务器端的延迟报文,并保证每一个连接资源不会受到之前的延迟报文的影响。

为什么要进行四次挥手?

同三次握手一样,客户端确认接受终止报文正常、发送确认报文正常,同时保证了服务端接受终止报文正常、发送数据正常

同三次握手进行比较,服务端在收到客户端的 fin(c)报文后,并没有一次性向客户端发送ack(c)报文与fin(s)报文。

因为在收到fin(c)报文后,仅代表客户端不再向服务端发送数据,而服务端此时有可能还有数据要向客户端发送。

因此将ack(c)报文与fin(s)报文分开发送。即多了一次挥手过程。



03


总结



三次握手与四次挥手的目的都是为了保证客户端与服务端都向对方发送了连接(终止)请求的报文,并都收到对方对相应请求的确认报文。

三次握手的原因:防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

四次挥手的原因:为了保证服务端数据处理完毕,因此分开向客户端发送ack(c)报文与fin(s)报文。

好了,今天的内容就到这里了~

关注六只栗子,面试不迷路!


作者    阿清

编辑   一口栗子  

原文始发于微信公众号(六只栗子):做个了断:三次握手与四次挥手

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/88629.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!