zoukankan      html  css  js  c++  java
  • 关于对TCP三次握手的理解

    TCP报文格式

    1. TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。TCP在发送数据前必须在彼此间建立连接,这里连接意思是:双方需要内保存对方信息(例如:IP,Port…)

    2. 报文主要段的意思

        序号(sn):表示发送的数据字节流,确保TCP传输有序,对每个字节编号

        确认序号(asn):发送方期待接收的下一序列号,接收成功后的数据字节序列号加 1。只有ACK=1时才有效。

        ACK:确认序号的标志,ACK=1表示确认号有效,ACK=0表示报文不含确认序号信息

        SYN:连接请求序号标志,用于建立连接,SYN=1表示请求连接

        FIN:结束标志,用于释放连接,为1表示关闭本方数据流

      我在这里把序号叫做Sequence Number,简写sn

      确认序号叫做Acknowledgment Sequence Number,简写asn

    第一阶段:客户端发起连接阶段

       客户端发起连接请求,将SYN置为1, 同时发送序列号sn为x(x 是随机生成的一个 int 数值), 然后客户端进入SYN_SEND状态,等待服务器的确认,

      总之: client 发送的数据包:SYN=1;sn=x

      状态:SYN_SEND

    第二阶段:服务器确认收到请求

      服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Sequence Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为 y (y 是随机生存的一个 int 数值);服务器端将上述所有信息放到一个报文段中,一并发送给客户端,此时服务器进入SYN_RECV状态

           总之:server发送的数据包, SYN=1;ACK=1;asn=x+1;sn=y

      状态:SYN_RECV

    第三阶段:客户端确认收到,发送确认信息

      客户端收到报文后,需要对报文段进行确认,所以ACK标志位为1,设置Acknowledgment Sequence Number为y+1;这个时候,不是发起连接请求,不必要对SYN标志位置为1;同时发送自己的序列号sn=x+1

           总之:server发送的数据包, ACK=1;asn=y+1;sn=x+1

      状态:ESTABLISHED

    三次握手过程分析:

    • 第一次:客户端发送请求到服务器,服务器知道客户端发送,自己接收正常。客户端没法知道自己的状态。SYN=1,seq=x
      • 客户端:没法知道自己发送和接收是否正常,也没法知道服务器是否发送接收正常
      • 服务器:知道客户端发送正常,知道自己接收正常。
    •  
    • 第二次:服务器发给客户端,客户端知道自己发送、接收正常,服务器知道自己接收正常。ACK=1,ack=x+1,SYN=1,seq=y
      •  客户端:知道自己发送和接收都正常了,知道服务器发送接收都正常了
      •  服务器:知道客户端发送正常,知道自己接收正常
    • 第三次:客户端发给服务器:服务器知道客户端发送,接收正常,自己接收,发送也正常.seq=x+1,ACK=1,ack=y+1
      • 客户端:知道自己发送和接收都正常了,知道服务器发送接收都正常了
      • 服务器:知道客户端发送接收都正常了,知道自己发送了接收都正常了

    上面分析过程可以看出,握手两次达不到让双方都得出自己、对方的接收、发送能力都正常的结论的。

      

    当值未一旬,而视茫茫,而发苍苍,而齿牙动摇
  • 相关阅读:
    laravel 服务提供者
    乐观锁和悲观锁
    MySQL索引原理及慢查询优化
    Laravel Session保存机制和terminate中间件
    laravel session踩坑
    理解 JavaScript 的 async/await(转)
    知识点
    js异步
    Office使用笔记
    YUM常用命令
  • 原文地址:https://www.cnblogs.com/niuniuc/p/14387722.html
Copyright © 2011-2022 走看看