首先说说为什么是三次握手?
当客户端发送一次请求 A 后, 但是 A 在网络延迟了很久, 接着客户端又发送了一次 B, 但是此时 A 已经无效了.
接着服务器相应了 B, 并返回 TCP 连接头, 建立连接(这里就 2 次哈).
然后, A 历经千山万水终于到服务器了, 服务器一看有请求来了, 则接受.
由于一开始 A 带着的 TCP 格式都是正确的, 那么服务器, 理所应当的也返回成功连接的 flag, 但是, 此时客户端已经判断该次请求无效, 废弃了.
然后服务器, 就这么一直挂着(浪费资源), 造成的一个问题是, md, 这个锅是谁的? 所以, 为了保险起见, 再补充一次连接就可以了.
所以 3 次是最合适的. 在 Chinese 中, 以 3 为起称为多, 如果你用 4,5,6,7,8... 次的话, 这不更浪费吗?
TCP 作为一种可靠传输控制协议, 其核心思想: 既要保证数据可靠传输, 又要提高传输的效率, 而用三次恰恰可以满足以上两方面的需求.
在 TCP/IP 协议中, TCP 协议提供可靠的连接服务, 采用三次握手建立一个连接, 链接过程是这样:
第一次握手: 建立连接时, 客户端发送 syn 包 (syn=j) 到服务器, 并进入 SYN_SEND 状态, 等待服务器确认;
第二次握手: 服务器收到 syn 包, 必须确认客户的 SYN(ack=j+1), 同时自己也发送一个 SYN 包(syn=k), 即 SYN+ACK 包, 此时服务器 进入 SYN_RECV 状态;
第三次握手: 客户端收到服务器的 SYN+ACK 包, 向服务器发送确认包 ACK(ack=k+1), 此包发送完毕, 客户端和服务器进入 ESTABLISHED 状态, 完成三次握手.
为什么要进行三次握手? 举个栗子吧!
在红军时期, A 连和 B 连分在左右翼, 约定在几时几分一同发起打击. 这个几时几分的信息就需要人工通过通讯员来走路传递. 所以 A 连指挥官派出通讯员.
这是第一次.
假设通讯员到达了 B 连, 并且告知了 B 连指挥官几时几分, B 连指挥官一定会让通讯员再回去通知 A 连指挥官, 可怜的通讯员只能冒着危险返回 A 连, 因为 A 连指挥官看不到通讯员返回的话, 不知道几时几分这个信息到底传达到了 B 连没有.
这是第二次.
现在 B 连指挥官开始担心通讯员是否回到了 A 连, 如果没回到, B 连指挥官会设身处地的想一想 A 连指挥官见不到返回的通讯员, 肯定是不敢打的, 所以 B 连指挥官最盼望的是再次看到通讯员出现在 B 连, 所以 A 连指挥官会让通讯员再回 B 连一次.
因此可以说三次握手是在最快最省力的情况下作出的选择.
上面分析还不够形象, 很容易忘记, 下面我们利用 wireshark 来证明一下上面的分析过程.
从下面的的输出就可以很容易看出来, 必须要经过前面的三次 tcp 请求才会有起一次 http 请求.
第一次握手数据包, 客户端发送一个 TCP, 标志位为 SYN, 序列号为 0, 代表客户端请求建立连接, 如下图所示
(第一次握手)
第二次握手的数据包, 服务器发回确认包, 标志位为 SYN,ACK. 将确认序号 (Acknowledgement Number) 设置为客户的 I S N 加 1 以. 即 0+1=1, 如下图所示
(第二次握手)
第三次握手的数据包, 客户端再次发送确认包(ACK) SYN 标志位为 0,ACK 标志位为 1. 并且把服务器发来 ACK 的序号字段 + 1, 放在确定字段中发送给对方. 并且在数据段放写 ISN 的 + 1, 如下图所示
(第三次握手)
以上就是 wireshark 中的 tcp 三次握手过程.
今天的分享就把到这了.
来源: http://network.51cto.com/art/201907/599854.htm