• 三次握手和四次挥手详解


    为什么是三次握手?
    为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误。
    建立很多无效的连接,浪费资源
    客户端收到来自服务端的报文后,还需要再次发送确认报文来建立连接。
     
    三次握手

    第一次握手

    Client将标志位SYN置1,随机产生一个值seq=J,并将数据包发给Server
    Client进入SYN_SENT状态,等待Server确认

    第二次握手

    Server收到数据包后标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置1,随机产生一个值,并将数据包发给Client确认连接请求,Server进入SYN_RCVD状态

    第三次握手

    Client收到确认后若ACK为1,则将该数据包发送给Server,Server检查ACK为1则连接建立成功,Client与Server进入ESTABLISHED状态完成三次握手,可以传输数据

    第一次握手:
     
        Client什么都不能确认   
        Server确认了对方发送正常
     
    第二次握手:
     
          Client确认:自己发送/接收正常,对方发送/接收正常
          Server确认:自己接收正常 ,对方发送正常
     
    第三次握手:
     
        Client确认:自己发送/接收正常, 对方发送/接收正常
        Server确认:自己发送/接收正常,对方发送/接收正常
     
     
     
    四次挥手
     
    第一次挥手:
     
    Clien发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
     
    第二次挥手:
     
    Server收到FIN后,发送一个ACK给Client,Server进入CLOSE_WAIT状态。
     
    第三次挥手:
     
    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一般会分开发送。
     
    上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,具体流程如下图 
     
     
    为什么需要TIME_WAIT状态 
    1、可靠的终止TCP连接 
    2、保证让迟来的TCP报文段有足够的时间被识别并丢弃
    参考资料:
    https://blog.csdn.net/yu876876/article/details/81560122?ivk_sa=1024320u
  • 相关阅读:
    Linux下如何查看版本信息
    linux的top命令参数详解
    浅谈Linux内存管理机制
    python3 判断字符串是否为纯空格组成的方法
    python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用
    python3 json数据格式的转换(dumps/loads的使用、dict to str/str to dict、json字符串/字典的相互转换)
    python3 list列表随机选取一个元素、随机选择一个user-agent
    windows系统中,在当前目录下打开cmd命令行的两种方法
    name 'reload' is not defined解决方法
    Vue.js05:vue内联样式
  • 原文地址:https://www.cnblogs.com/qiutangfengmian/p/15388547.html
Copyright © 2020-2023  润新知