zoukankan      html  css  js  c++  java
  • 【计算机网络】TCP三次握手与四次挥手

    一、三次握手

    1、第一次握手

    客户端发送同步消息(SYN=1,ACK=0,seq=x)到服务器(TCP规定SYN=1时不能携带数据,x为随机产生的一个值),并进入SYN_SEND状态,等待服务器确认。

    注:

    • SYN(同步):在连接建立时的同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1。故SYN置为1,就表示这是一个连接请求和连接接收报文;
    • ACK(确认):当ACK=1时,确认字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1;
    • seq(Sequence Number):占4个字节。序号使用mod运算。TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。故该字段也叫做“报文段序号”。

    2、第二次握手

    服务器收到SYN报文段进行确认,将SYN标识位置为1,ACK置为1,seq置为y,ack置为x+1,然后进入SYN_RECV状态,这个状态被称为半连接状态。

    注:

    • ack(Acknowledgment Number):是期望收到对方下一个报文段的第一个数据字节的序号。若确认序号=N,则表明:到序号N-1为止的所有数据都已正确收到。

    3、第三次握手

    客户端再进行一次确认,将ACK置为1,seq置为x+1,ack置为y+1发向服务器,最后客户端与服务器都进入ESTABLISHED状态,完成三次握手,建立连接。

    4、为何还需要客户端在第三次握手中再次确认?

    若TCP仅采用两次握手的机制,即客户端发出连接请求,服务端确认请求则建立连接。

    假设客户端发出一次建立连接请求,因网络堵塞服务端并未收到请求,客户端认为请求丢失再次发送第二次建立连接请求,服务端收到请求并确认,成功建立链接。

    而第一个连接请求报文段并没有丢失,只是在某些网络节点长时间滞留了,以至于延误到连接释放以后的某个时间点才到达服务端。本来这个连接请求已经失效了,但是服务端收到此失效的连接请求报文段后,就误认为这是客户端又发出了一次新的连接请求。于是服务端又向客户端发出请求报文段,同意建立连接。

    由于现在客户端并没有发出连接建立的请求,因此不会理会服务端的确认,也不会向服务端发送数据,但是服务端却以为新的传输连接已经建立了,并一直等待客户端发来数据,这样服务端的许多资源就这样白白浪费了。

    采用三次握手的办法可以防止上述现象的发生。比如在上述的场景下,客户端不向服务端的发出确认请求,服务端由于收不到确认,就知道客户端并没有真正请求建立连接。

    二、四次挥手

    由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接,发送FIN方将执行主动关闭,而另一方执行被动关闭。

    数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。

    1、第一次挥手

    客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(u等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。

    2、第二次挥手

    服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。

    客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。

    3、第三次挥手

    服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。 

    4、第四次挥手

    客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。

    服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

     

  • 相关阅读:
    LeetCode-389-找不同
    xml配置与使用
    curl使用
    php中JPGraph入门配置与应用
    php开发通用采集程序
    adodb配置与使用
    swfupload上传
    ZendFramework使用中常见问题
    memcache配置与使用
    第四章 供给与需求的市场力量
  • 原文地址:https://www.cnblogs.com/6970-9192/p/11839801.html
Copyright © 2011-2022 走看看