TCP的连接与释放

一、TCP的连接建立

       TCP建立连接的过程称为握手,握手需要在客户和服务器之间交换三个TCP报文段。

       三报文握手(three way handshake),指的是一次握手过程中交换了三个TCP报文,而不是进行了三次握手。 


timg.jpg

过程:

  1. A主动打开连接,B被动打开连接。

  2. 首先,B的TCP服务器先创建传输控制模块TCB(Transmission Control Block),然后处于LISTEN(收听)状态,等待客户的连接请求。

  3. A的TCP客户端进程也创建传输控制模块TCB。然后向B发送连接请求报文段,首部中的同步位为SYN=1,初始序号seq=x。TCP规定,SYN报文段不能携带数据,但要消耗一个序号。此时,A处于SYN-SENT(同步已发送)状态。

  4. B收到连接请求报文,如同意建立连接,则向A发送确认报文,SYN=1,ACK=1,初始序号seq=y,确认号ack=x+1。此报文段也不能携带数据并消耗掉一个序号。此时B处于SYN-RCVD(同步收到)状态。

  5. A收到B的确认后,还要向B给出确认。确认报文段ACK=1,确认号ack=y+1,seq=x+1。TCP规定,ACK报文段可携带数据。但如果不携带数据则不消耗序号,在这种情况下,下一个报文段的序号仍为seq=x+1。这时,TCP连接已建立。A进入ESTABLISHED(已建立连接)状态。

  6. B收到A的确认后,也进入ESTABLISHED状态。

注:传输控制模块TCB(Transmission Control Block)存储了每一个连接中的一些重要信息,如TCP连接表,当前的发送和接收序号,等等。

 

二、TCP的连接释放

       TCP连接的释放又称四次挥手。

timg (1).jpg

       具体过程:

  1. A、B均处于ESTABLISHED状态。

  2. A先向TCP发出连接释放报文段,并停止发送数据,主动关闭TCP连接。A的连接释放报文为:首部的终止控制位FIN=1,seq=u(前面已传送过的数据的最后一个字节的序号加1)。此时A进入FIN-WAIT-1(终止等待1)状态,等待B的确认。TCP规定,FIN报文段即使不携带数据,它也消耗掉一个序号。

  3. B收到连接释放报文后即发出确认,确认号是ack=u+1,这个报文段自己的序号是v(前面已传送过的数据的最后一个字节的序号加1)。然后B进入CLOSE-WAIT(关闭等待)状态。TCP服务器这时应通知高层应用进程,因而从A到B这个方向的连接就释放了,这时的TCP连接处于半关闭(half-close)状态,即A已经没有数据要发送了,但B若要发送数据,A仍要接收。也就是说,从B到A这个方向的连接并未关闭,这个状态可能会持续一段时间。

  4. A收到来自B的确认,进入FIN-WAIT-2(终止等待2)状态,等待B发出连接释放报文段。

  5. 若B已经没有要向A发送的数据,其应用进程就会通知TCP释放连接。这时B发出的连接释放报文必须使FIN=1。现假定B的序号为w(在半关闭状态B可能又发送了一些数据)。B还必须重复上次已发送过的确认号ack=u+1。这时B就进入LAST-ACK(最后确认)状态,等待A的确认。

  6. A在收到B的连接释放报文段后,必须对此发出确认。在确认报文段中,ACK=1,ack=w+1,seq=u+1。然后进入TIME-WAIT(时间等待)状态。此时TCP连接还未释放,必须经过时间等待计时器(TIME-WAIT timer)设置的2MSL后,A才进入CLOSED状态。

  7. 当A撤销相应的传输控制块TCB后,就结束了这次的TCP连接。

注:时间MSL叫做最长报文段寿命(Maximum Segment Lifetime),RFC793建议设为2分钟。



猜你喜欢

转载自blog.csdn.net/weixin_42061048/article/details/80171094
今日推荐