3路握手时数据包丢失

Packet loss during 3way handshake

本文关键字:数据包 3路      更新时间:2023-10-16

我需要在用c++(使用winsock 2)编写的客户端和服务器应用程序之间执行3向停止等待握手,以进行分配。客户端发送一个SYN。服务器递增客户端序列号并发送SYN-ACK。客户端递增服务器序列号并发送ACK。

为了模拟数据包丢失,客户端和服务器连接到一个中间路由器程序,该程序偶尔不转发数据包,从而导致丢失。我应该如何构造sendto()、select()、recvfrom()语句来考虑可能的数据包丢失?

例如,如果SYN丢失,客户端超时,则重新发送。如果SYN-ACK丢失,则客户端超时并重新发送SYN。我不知道如果ACK丢失了该怎么办。

编辑:在我的客户端上基本上是这样的:

  • 发送SYN
  • select()语句失败时循环并重新发送SYN
  • 接收SYN-ACK
  • 发送ACK
  • 循环以在ACK丢失的情况下可能重新接收SYN-ACK

我如何知道何时停止循环?

select可用于检查何时可以在不阻塞的情况下读取套接字。

至于检查ACK属于哪个发送的数据包,您可以检查序列号。

如果在超时时间内没有收到ACK,只需重新发送最后一个数据包。你发送了什么样的数据包并不重要,如果你没有收到ACK,你应该重新发送。