天天看点

详解面试TCP三次握手,四次握手/四次挥手/两个二次握手

1. 前言

TCP是面向连接的协议,运输连接有三个阶段:连接建立、数据通信、连接释放。连接管理的目标是使连接的建立和连接的释放都能正常进行。TCP连接的建立采用客户服务器模式,主动发起连接建立的应用为客户(Client),被动建立连接的应用进程叫做服务器(Server)。
           

2.TCP连接的建立(三次握手)

1.客户A的初始状态为CLOSED(关闭),服务器B开机之后就一直处于监听(LISTEN)的状态,AB将通过三个报文段完成连接的建立,这个过程称为三次握手(Three-way Handshake).

    2.第一次握手:客户 A向服务B发送TCP的SYN(同步)报文段,即连接请求报文段。该报文段中,头部SYN=1,消耗一个序号seq=x也会给出自己的窗口大小以及选填字段MSS(最大报文段长度)。SYN报文段发送之后,进入SYN_SENT(同步已发送)状态。注意:TCP规定,同步报文段中不能携带数据,但是要消耗一个序号。

    3.第二次握手:服务器B收到同步报文段会后,回发一个SYNACK(同步确认)报文段,进行对A连接请求的确认,同意接受A的连接请求。该报文段中,SYN=1,ACK=1,seq=y,ack=x+1。确认号字段ack表示期待收到A的下一次数据序号,因为A在一次握手时候没有发送数据,所以ack=x+1。
    B也会给出自己的窗口大小,详细见上一篇文章TCP协议的讲解。[传输层TCP协议详解,以及面试题,面试要点](https://blog.csdn.net/weixin_40472874/article/details/103361278)
    B在SYNACK报文段发出后,将自己的状态设置为SYN_RECEIVED(同步已接受)。SYN报文段也不能携带数据,同时也要消耗一个序号。多提一句,第二次握手处理了两个任务,一是同意了A的连接请求,二是发送了一个自己对A的连接请求,因为TCP是全双工连接,双方都需要建立连接,都可以传递数据。

    4.第三次握手:客户A收到服务B的同步确认报文段之后,需要对B回发一个ACK(确认)报文段,用于表示接受B的连接请求,该报文段中,ACK=1,seq=x+1;x一次握手时已经消耗了,此次传x=1;ack=y+1,表示期待B下次请求发送的序号。客户端A发送完ACK(确认)报文段之后,立即进入ESTABLISHED(连接已建立)的状态。
    服务器B在收到ACK确认报文后,也立即进入ESTABLISHED状态。在第三次握手中,客户A可以携带数据也可以不携带数据。

    5.三次握手之后,TCP连接就已经建立,连接可以由任意一方发起,一旦连接建立,连接的任何一方都可以传递数据,双向对等的传递,没有所谓的主从关系。
    三次握手协议可以完成两个重要的功能:确保双方做好传输的准备,并将双方的初始序号进行了统一。
           
详解面试TCP三次握手,四次握手/四次挥手/两个二次握手

3.TCP连接的释放(四次握手/四次挥手/两个二次握手)

1.当TCP连接的双方通信完毕,任何一方都可以发起连接释放的请求。TCP采用和三次握手差不多的方法,即四次握手或称为两个二次握手。连接释放的操作可以看成是两个方向上分别释放连接的操作构成。
 
2.第一次握手:假设客户A先提出释放连接的请求。客户A向服务器B发出FIN(终止)报文段请求释放连接并停止发送数据,主动关闭TCP连接。该报文段中FIN=1,seq=i。FIN报文段发出后,客户A进入FIN_WAIT_1(关闭等待1)状态。TCP规定,FIN报文段需要消耗一个报文号。

3.第二次握手:服务器B收到FIN报文段之后,回发一个ACK(确认)报文段,同意接受A的释放请求。该报文段中ACK=1,seq=j,ack=i+1,服务器B发送ACK报文段之后进入CLOSE_WAIT(关闭等待)状态,A收到B的确认报文之后进入FIN_WAIT_2(关闭等待2)状态。
此后,A到B的方向的连接就释放了,A不再也不能向B发送数据,TCP处于半关闭的状态,B若有数据要发送,A仍要接收并进行确认。

4.第三次握手:若服务器B的数据发送完成,则向A发送FINACK报文段请求释放连接。该报文中FIN=1,ACK=1,seq=k(第二次握手之后,B还发送了一些数据所以序号不为j),ack=i+1。该报文段发送之后,B处于LAST_WAIT(最后确认)状态。

5.第四次握手:客户A收到B的FINACK报文段之后,发送ACK(确认)报文段。该报文段中ACK=1,seq=i+1,ack=k+1。A发送ACK报文段之后进入(TIME-WAIT)状态,该状态需要等待2MSL时间,此后进入CLOSED(关闭)状态,B收到ACK报文段之后立即进入CLOSED(关闭)状态。
等待2msl意义:为了保证客户A发送的最后一个ACK报文段能够到达服务器B,这个ACK报文段有可能丢失,因而使处在LAST_WAIT服务器B收不到对已发送的FINACK报文段的确认。B会超时重传这个FINACK报文段,而A就能在2MSL时间内收到这个重传的FINACK报文段。
接着A重传一次确认,重新启动2MSL计时器。最后,A和B都正常进入到CLOSED状态。如果A在确认后不等待一段时间,立即释放连接,那么就无法收到B重传的FINACK报文段,B就无法正常进入CLOSED状态。

6.四次握手不是固定的,a.第一次握手可能和A最后的数据报文段一起发出。b.当B收到A的FIN报文段,有可能B的数据也已经发送完毕,那么第二次,第三次握手可以合并。c.释放连接的请求一般是由客户发起,但是HTTP/1.0规定,释放连接由服务器执行主动关闭。
           
详解面试TCP三次握手,四次握手/四次挥手/两个二次握手

继续阅读