zoukankan      html  css  js  c++  java
  • 聊聊你对三次握⼿和四次挥⼿的理解

    三次握手

    建立TCP连接时,需要配客户端和服务器共发送3个包。
    第一次:客户端发送初始序号x和syn=1请求标志
    第二次:服务器发送请求标志syn,发送确认标志ACK,发送自己的序号seq=y,发送客户端的确认序号ack=x+1
    第三次:客户端发送ACK确认号,发哦那个自己的序号seq=x+1,发送对方的确认号ack=y+1
     
     
     
    叁此握手过程分析:
    第一次:客户端发送请求到服务器,服务器知道客户端发送,自己接收正常。SYN=1,seq=x
    第二次:服务器发给客户端,客户端知道自己发送,接收正常,服务器接收,发送正常。ACK=1,ack=x+1,SYN=1,seq=y
    第三次:客户端发给服务器:服务器知道客户端发送,接收正常,自己接收,发送也正常,seq=x+1,ACK=1,ack=y+1
    上面分析过程可以看出,握手两次达不到让对方都得出自己、对方的接收、发送能力都正常的结论的。
     
     
     

    四次挥⼿

    • 第一次挥手:客户端发出释放FIN=1,自己序列号seq=u,进入FIN-WAIT-1状态
    • 第二次挥手:服务器收到客户端的后,发出ACK=1确认标志和客户端的确认号ack=u+1,自己的序列号seq=v,进入CLOSE-WAIT状态
    • 第三次挥手:客户端收到服务器确认结果后,进入FIN-WAIT-2状态。此时服务器发送释放FIN=1信号,确认标志ACK=1,确认序号ack=u+1,自己序号seq=w,服务器进入LAST-ACK(最后确认态)
    • 第四次挥手:客户端收到回复后,发送确认ACK=1,ack=w+1,自己的seq=u+1,客户端进入TIME-WAIT(时间等待)。客户端经过2个最长报文段寿命后,客户端CLOSE;服务器收到确认后,立刻进入CLOSE状态。

    四次挥手过程分析

    第一次:客户端请求断开FIN,seq=u
    第二次:服务器确认客户端的断开请求ACK,ack=u+1,seq=v
    第三次:服务器请求断开FIN,seq=w,ACK,ack=u+1
    第四次:客户端确认服务器的断开ACK,ack=w+1,seq=u+1
     

    其他问题

    为什么三次握手和四次挥手?

    三次握手时,服务器同时把ACK和SYN放在一起发送到了客户端那里
    四次挥手时,当收到对方的 FIN 报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方是否现在关闭发送数据通道,需要上层应用来决定,因此,己方 ACK 和 FIN 一般都会分开发送。

    为什么客户端最后还要等待2MSL?

    客户端需要保证最后一次发送的ACK报文到服务器,如果服务器未收到,可以请求客户端重发,这样客户端还有时间再发,重启2MSL计时。
     

  • 相关阅读:
    30天敏捷结果(2):用三个故事驱动你的一周
    30天敏捷结果(24):恢复你的精力
    30天敏捷结果(6):周五回顾,找到三件做的好以及三件需要改善的事情
    js 数组循环和迭代
    没有+求和
    js检测数组类型
    redis 在windows 下的安装和使用
    版本控制(一)——初步概念
    苹果树的故事(转发的)
    mongoDB之在windows下的安装
  • 原文地址:https://www.cnblogs.com/sq1995liu/p/14139623.html
Copyright © 2011-2022 走看看