3路握手时数据包丢失
Packet loss during 3way handshake
我需要在用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,你应该重新发送。
相关文章:
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 发送固定大小的 UDP 数据包
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 在 c++ 中解析数据包数据的最佳方法是什么?
- 接受函数在发送数据包时等待
- 如何在 omnet++ 中发送自定义数据包?
- 数据包访问实践
- 在C++中创建一个简单的数据包路由器,如何跟踪"客户端"?
- 德拉吉诺 LG01-S 收到异常数据包并停止工作
- 将数据包从C++服务器发送到NodeJs服务器时出现MessagePack解码错误
- 使用C++将UDP数据包存储在Structure中
- FFmpeg av_read_frame从音频流返回数据包
- 为什么操作系统正在更改我的数据包的指定传出端口
- 是否可以将多个结构作为一个数据包存储在一个函数中,然后传递给其他函数并在那里提取?
- recvfrom 只收到几个数据包,之后它进入等待状态
- 如何调试由 C++ 编写的 npm 数据包
- 如何在INET的应用层中发送广播数据包
- C 程序检测物理链路状态和数据包丢失
- 3路握手时数据包丢失