三次握手四次挥手针对面试总结

文章目录

  • 一:三次握手
    • 内容:
      • 1.什么是三次握手?
      • 2.三次握手的作用?
      • 3.第三次握手的作用(TCP建立连接可以两次握手吗?为什么?):
      • 4.如果已经建立了连接,但是客户端突然出现了故障怎么办?
  • 二:四次挥手
    • 内容:
      • 1. 什么是四次挥手?
      • 2.为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

一:三次握手

三次握手四次挥手针对面试总结_第1张图片

内容:

1.什么是三次握手?

  • 第一次握手:客户端将SYN置为1,随机产生一个初始序列号seq=x,发送给服务器,进入SYN-SENT状态;

  • 第二次握手:服务器收到客户端服务器的SYN报文后,将SYN置为1,ACK置为1,随机产生一个初始序列号seq=y,同时告诉客户端下一次传输数据时序号为x+1;

  • 第三次握手:客户端收到服务器的SYN-ACK报文后,将SYN和ACK都置为1,此时发送的序号为x+1的数据,同时告诉服务器下一次传输数据的序号啊为y+1。

2.三次握手的作用?

① 确认双方的接收能力,发送能力是否正常。

② 指定自己的初始化序列号,为后面的可靠传送做准备。

3.第三次握手的作用(TCP建立连接可以两次握手吗?为什么?):

防止已失效的连接请求报文段又传到了服务器。

客户端发送的第一个连接请求报文段没有丢失,而是在某个网络结点长时间滞留,导致延误到连接释放以后的某个时间才到达服务器。本来这是一个早已失效的报文段。但服务器收到失效的连接请求报文段后,误以为是客户端再次发出的一个新的连接请求,于是就向客户端发出确认报文段,同意建立连接。

如果没有第三次握手的话,那么只要服务器做出确认,新的连接就会建立,但客户端实际并没有发出建立连接的请求,因此服务器会一直等待客户端传输数据,服务器的资源就会被浪费。

4.如果已经建立了连接,但是客户端突然出现了故障怎么办?

TCP中设有保活计时器,服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒发送一次,若一连发了10个仍没有反应,服务器就认为客户端出现了故障,连接关闭。



二:四次挥手

三次握手四次挥手针对面试总结_第2张图片

内容:

1. 什么是四次挥手?

  • 第一次挥手:客户端发送FIN报文给服务器,此时客户端发送数据序列号为seq=u,进入FIN-WAIT-1状态;
  • 第二次挥手:服务器接收客户端的FIN报文,回应ACK报文,告诉客户端收到他的请求并同意,此时的服务器发送数据序列号为seq=v,并告诉服务器希望收到下一个数据的序列号为ack=u+1,进入CLOSE-WAIT状态;
  • 第三次挥手:待服务器数据传输完毕,向客户端发送FIN-ACK请求关闭连接,此时服务器发送的数据系列号为seq=w(w不一定是v+1,w是指数据传送结束后的最后一个字节序列号+1),并且告诉客户端希望收到下一个数据的序列号为ack=u+1,进入TAST-ACK状态;
  • 第四次挥手:客户端接收服务器的请求,发送ACK报文给服务器,同意服务器的关闭请求,此时客户端发送的数据序列号为u+1。ack=w+1。进入TIME-WAIT阶段。

2.为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

  • ①MLS是“报文最大生存时间”。当第三次挥手服务器发出FIN-ACK包后,客户端需要做出回应,发出ACK包同意服务器的关闭请求,如果在此过程中第四次挥手发出的ACK包丢失,服务器会在超时后重新发送第三次挥手的FIN-ACK包,所以这时的客户端就需要等待服务器是否进行重传操作,而这个等待并不是无限期的,而是等待2MLS后,客户端再没有收到服务器的第三次挥手重传包,那么客户端判定第四次挥手的ACK包被成功接收,TCP连接结束。

  • ② 防止已失效连接请求报文段出现在新的连接中。

    在TIME-WAIT状态时,两端的端口不能使用,要等到2ML时间结束后才可以继续使用,当连接处于2MLS等待阶段时,任何迟到的报文段都将被丢弃。

你可能感兴趣的:(java,面试,服务器,网络)