• TCP三次握手,四次挥手


    三次握手过程:三次握手的最主要目的是保证连接是双工的,(“可靠”更多的是通过重传机制来保证的)

    问题1:为什么建立连接是三次握手,四次不可以吗

    第一次握手:

        Client什么都不能确认   
        Server确认了对方发送正常


    第二次握手:

         Client确认:自己发送/接收正常,对方发送/接收正常
         Server确认:自己接收正常 ,对方发送正常

    第三次握手:

        Client确认:自己发送/接收正常, 对方发送/接收正常
        Server确认:自己发送/接收正常,对方发送/接收正常

    所以通过三次握手确认双方收发功能都正常,四次也可以但是显得比较多余

    TCP三次握手,如果两次握手会怎么样

    有这样一种情况,当A发送一个消息给B,但是由于网络原因,消息被阻塞在了某个节点,然后阻塞的时间超出设定的时间,A会认为这个消息丢失了,然后重新发送消息。

    当A和B通信完成后,这个被A认为失效的消息,到达了B
    对于B而言,以为这是一个新的请求链接消息,就向A发送确认,
    对于A而言,它认为没有给B再次发送消息(因为上次的通话已经结束)所有A不会理睬B的这个确认,但是B则会一直等待A的消息

    这就导致了B的时间被浪费(对于服务器而言,CPU等资源是一种浪费),这样是不可行的,这就是为什么不能两次握手的原因了


    四次挥手过程:

    第一次挥手:

    Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

    第二次挥手:

    Server收到FIN后,发送一个ACK给Client, Server进入CLOSE_WAIT状态;Client进入FIN_WAIT_2.

    第三次挥手:

    Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

    第四次挥手:

    Client收到FIN后,Client进入TIME_WAIT状态,发送ACK给Server,Server进入CLOSED状态,完成四次握手。


    问题:为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

    建立连接

    因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。

    关闭连接

    当收到对方的FIN报文时,仅表示对方不再发送数据但还能接收收据,我们也未必把全部数据都发给了对方,所以我们可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方表示同意关闭连接。因此我们的ACK和FIN一般会分开发送。

  • 相关阅读:
    帧同步资料收集
    随机数种子问题
    【转】 DOTA2中的伪随机及其lua实现
    C++ 异常机制分析
    细说new与malloc的10点区别
    static关键字总结
    C++11 并发编程基础(一):并发、并行与C++多线程
    论一个程序员的自我修养
    gSoap的多线程程序
    面试常见问题:
  • 原文地址:https://www.cnblogs.com/ceceliahappycoding/p/10647129.html
Copyright © 2020-2023  润新知