http三次握手

130 阅读2分钟

为什么需要握手 为什么不是两次

为了保证可靠性传输,TCP需要两边维护socket,序列号, 握手就是为了在数据开始传输前让客户端和服务器准确无误的交换上述信息。

需要握手并且不是两次的原因:

  1. 阻止已经失效的历史请求的初始化,保证server client状态的一致(为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误)
  2. 只有通过三次握手才能交换序列号

握手的过程

image.png 图中内容可以简单理解为:

    你和朋友偶遇
    1. 你招手
    2. 朋友点头微笑并招手
    3. 你点头微笑
   
   

为什么不是四次握手

TCP的连接因为是全双工的,也就是Client和Server两端,发送消息两个方向的连接都要建立成功。如果要保证双向连接都成功的话,三次通信是最少的次数了。大于三次的话,后面的次数通信就没有必要了,是在浪费资源。 TCP的每次请求都是成对的,原则上应该是四次

    1.Client to Server】第一次SYN,seq=j
    2.Server to Client】第二次ACK,seq=k,ack=j+1(没有携带数据的ACK不消耗序列号)
    3.Server to Client】第三次SYN,seq=k,
    4.Client to Server】第四次ACK,seq=j+1,ack=k+1

可以看出第二次和第三次都是Server to Client,且他们之间没有任何事件发生,所以可以合并,不是四次的原因是2,3步骤合并,增加效率。

丢包和乱序

tcp作为传输层传输数据 握手相当于在不可靠的信道上创建了可靠的链接,对于传输的数据需要分包传输 这时如何保证丢包和乱序的问题