三重握手如何避免为重复数据包建立连接(稍后会出现)

网络工程 tcp 网络 协议论 传输协议 第 4 层
2022-02-16 17:52:40

三重握手背后的想法似乎是为了避免重复出现问题。我理解它的方式主机将序列 x 发送到服务器。服务器确认它并发送它自己的序列 y。主机再次确认 y,因此建立了连接。

这如何防止由重复引起的问题?

假设主机将序列 100 发送到服务器。服务器用自己的序列号 200 确认。主机确认 200 并因此建立连接。

比方说,在连接终止之后,再过一段时间重复到达。主机将序列 100 发送到服务器。而这次服务器随机选择 300,为什么主机现在会拒绝连接?

1个回答

主机不太可能连续两次发送相同的序列号来打开连接。请记住,这是一个 32 位随机数,并且 RFC 规定该数字只能每四个半小时左右重复一次。通过这种方式使用随机序列号,可以发现延迟的 SYN。

您真正拥有的是四次握手,但它分三个部分完成。每一方发送自己的序号,每一方都从对方确认序号,这让对方验证它发送的序号是否被对方正确接收。请参阅RFC 793,传输控制协议

同步要求每一方发送它自己的初始序列号并从另一方接收确认它的确认。每一方还必须接收对方的初始序列号并发送确认确认。

1) A --> B  SYN my sequence number is X
2) A <-- B  ACK your sequence number is X
3) A <-- B  SYN my sequence number is Y
4) A --> B  ACK your sequence number is Y

因为步骤 2 和 3 可以组合在单个消息中,所以这称为三向(或三消息)握手。

三次握手是必要的,因为序列号与网络中的全局时钟无关,并且 TCP 可能有不同的机制来挑选 ISN。第一个 SYN 的接收方无法知道该段是否是旧的延迟段,除非它记住连接上使用的最后一个序列号(这并不总是可能的),因此它必须要求发送方验证这个SYN。三路握手和时钟驱动方案的优点在[ 3 ]中讨论。

例如,如果主机 A 向主机 B 发送 SYN,但不知何故被延迟,主机 A 再次将 SYN 发送到主机 B,或者 SYN 在网络上以某种方式重复,主机 B 使用其 ACK 向主机 A 验证序号是正确的。主机 A 会发现它不是。