面试之计算机网络(篇三:TCP三次握手及四次挥手)

目录

1. TCP三次握手

2. TCP四次挥手

3. 为什么要进行三次握手,不能进行一次、二次或者四次握手

4. 为什么握手是三次,挥手则是四次?

5. 为什么要进入TIME-WAIT状态,且等待时间为2MSL

6.  连接建立后,客户端出现了故障,服务端如何处理?


1. TCP三次握手

(1)图例如下:

(2)具体过程:

  • 握手前客户端和服务端结束CLOSED状态,服务端进入LISTEN状态;
  • 第一次握手:客户端发送“SYN = 1, seq = x”报文,进入SYN-SENT状态;
  • 第二次握手:服务端接收到报文后,发送“SYN = 1, ACK = 1, seq = y, ack = x + 1”报文,进入SYN-RCVD状态;
  • 第三次握手:客户端接收到报文后,发送“ACK = 1, seq = x + 1, ack = y + 1”报文,进入ESTABLISHED状态;
  • 客户端接收到报文后,进入ESTABLISHED状态

(其中SYN为同步位——请求建立连接,ACK为确认位——确认应答,seq为发送报文的序列号,ack为下次想要收到的报文段序列号)

 

2. TCP四次挥手

(1)图解如下:

(2)具体过程:

  • 挥手前客户端与服务端都是ESTABLISHED状态;
  • 第一次挥手:客户端发送“FIN = 1, seq = u”报文,进入FIN-WAIT-1状态;
  • 第二次挥手:服务端接收到报文后,发送“ACK = 1, seq = v, ack = u + 1”报文,进入CLOSE-WAIT状态;
  • 客户端收到报文后,进入FIN-WAIT-2状态;
  • 第三次挥手:服务端发送“FIN = 1, ACK = 1, seq = w, ack = u + 1”报文,进入LAST-ACK状态;
  • 第四次挥手:客户端接收到报文后,发送“ACK = 1, seq = u + 1, ack = w + 1”报文,进入TIME-WAIT状态;
  • 服务端在收到报文后进入CLOSED状态;
  • 客户端在等待2MSL后进入CLOSED状态;

 

3. 为什么要进行三次握手,不能进行一次、二次或者四次握手

防止已失效的客户端连接请求报文被服务端接收,因此产生错误。

(1)一次握手:客户端在第一次握手中发送报文后进入ESTABLISHED状态,若报文在传输过程中丢失了,那么服务端接收不到报文,会一直处于LISTEN状态,无法与客户端建立连接。

(2)二次握手:若客户端在第一握手中发送的报文遭遇了网络堵塞,客户端在第一时间内没有收到确认报文,会重新发送报文进入等待状态。而此时服务端收到之前网络延迟的报文,发送确认报文给客户端,并进入ESTABLISHED状态,而客户端因为没有收到对应的确认报文无法进入ESTABLISHED状态。

(3)三次握手已经能够保证了TCP连接的正确建立,因此无需浪费资源进行第四次握手。

 

4. 为什么握手是三次,挥手则是四次?

(1)握手时,客户端发送SYN给服务端,服务端发送了SYN+ACK给了客户端,保证了数据的同步,使得连接能够正确建立。

(2)挥手时,客户端发送FIN给服务端,告知服务端客户端没有数据传给服务端了,但是服务端可能还有数据要传输或是正在传输给客户端,因此先发送了ACK给客户端,让客户端进行等待,等服务端数据传输完后再进行连接的关闭。

 

5. 为什么要进入TIME-WAIT状态,且等待时间为2MSL

(1)客户端在发送了确认报文后要进入TIME-WAIT状态是为了确定服务端可以收到报文,若报文丢失则客户端重传确认报文。

(2)MSL为报文段的最大存活时间,一般为2min;等待时间包括了第四次挥手客户端发送报文段到达服务端的时间,以及服务端没有收到第四次挥手报文(包括被第三次挥手的确认)时,进行重传到达客户端的时间。

(最好结合上面的图来看,比较容易理解)

 

6.  连接建立后,客户端出现了故障,服务端如何处理?

TCP设置了一个保活计时器,一般设置为2h。若服务端在2h内收到了客户端发送的报文,则复位计时器;若2h没有收到客户端发送的报文,则服务端开始每隔75s发送一个探测报文给客户端,若连续发送10个探测报文都没有回复的话,则关闭相应的连接。

 

下一篇:面试之计算机网络(篇四:HTTP与HTTPS)

以上内容均是个人理解总结,若有错误欢迎指出!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值