• tcp 三次握手 四次挥手


    TCP协议中的三次握手和四次挥手

    建立TCP需要三次握手才能建立,而断开连接则需要四次挥手。

    三次握手,建立连接

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

    四次挥手断开连接 可以是Client端也可以是Server端

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

    注意:

    在TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,他将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒,1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口)都被释放。

    问题1:

    为什么连接的时候是三次握手,关闭的时候确实四次握手?

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

    问题2:

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

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

    参考:blog.csdn.net/whuslei

    以上就是这次的全部内容!

  • 相关阅读:
    A1023 Have Fun with Numbers (20分)(大整数四则运算)
    A1096 Consecutive Factors (20分)(质数分解)
    A1078 Hashing (25分)(哈希表、平方探测法)
    A1015 Reversible Primes (20分)(素数判断,进制转换)
    A1081 Rational Sum (20分)
    A1088 Rational Arithmetic (20分)
    A1049 Counting Ones (30分)
    A1008 Elevator (20分)
    A1059 Prime Factors (25分)
    A1155 Heap Paths (30分)
  • 原文地址:https://www.cnblogs.com/jingxiaoniu/p/7056396.html
Copyright © 2020-2023  润新知