关于对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
    • 客户端:知道自己发送和接收都正常了,知道服务器发送接收都正常了
    • 服务器:知道客户端发送接收都正常了,知道自己发送了接收都正常了

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

  

当值未一旬,而视茫茫,而发苍苍,而齿牙动摇
原文地址:https://www.cnblogs.com/niuniuc/p/14387722.html