• 网络通信 --> TCP三次握手和四次挥手


    TCP三次握手和四次挥手 

    建立TCP需要三次握手才能建立,而断开连接则需要四次握手。整个过程如下图所示:

    一、TCP报文格式

    如下图:

    (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
    (2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
    (3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
                  (A)URG:紧急指针(urgent pointer)有效。
                  (B)ACK:确认序号有效。
                  (C)PSH:接收方应该尽快将这个报文交给应用层。
                  (D)RST:重置连接。
                  (E)SYN:发起一个新连接。
                  (F)FIN:释放一个连接。

    需要注意的是:
                  (A)不要将确认序号Ack与标志位中的ACK搞混了。
                  (B)确认方Ack=发起方Req+1,两端配对。

    、TCP三次握手

    如何建立连接?

    首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。

      (1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
           (2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为 1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
           (3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发 送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入 ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

    三、TCP四次挥手

    如何断开连接?

       假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

       (1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态
            (2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态
            (3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态
            (4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1Server进入CLOSED状态,完成四次挥手。

    四、问答知识点

    为什么连接的时候是三次握手,关闭的时候却是四次握手?
      答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同 步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你 发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

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

      答:按道理四个报文都发送完毕,可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可能最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

    ref:http://blog.csdn.net/whuslei/article/details/6667471 

  • 相关阅读:
    JAVA小记 (1)
    页面布局
    布局
    JDBC连接数据库
    国际化项目
    Class打包成jar
    Description Resource Path Location Type Java compiler level does not match the version of(编译问题)
    SSM框架下 Failed to load resource: the server responded with a status of 404 (Not Found)错误
    DES加密算法
    HashMap 和 Hashtable 的 6 个区别,一般人不知道最后一条
  • 原文地址:https://www.cnblogs.com/jeakeven/p/4851000.html
Copyright © 2020-2023  润新知