C语言 如何让程序识别丢弃的数据包?

yebdmbv4  于 2023-03-17  发布在  其他
关注(0)|答案(2)|浏览(176)

我有一个程序可以模拟一个网络,其中数据包从客户端来回发送到主机。
这个模拟包括一个数据包在发送时被丢弃的机会。我的客户端程序被设置为在终止前将数据包发送回五次,但是当数据包被丢弃时客户端不会停止等待,直到手动终止。
我有一个客户端程序,它调用了一个方法,该方法不断地等待一个数据包,并且直到它收到一个数据包5次才让程序的其余部分执行,如果一个数据包被丢弃,客户端程序也不会终止。
当数据包丢失或返回时间过长时,客户端程序需要什么才能识别?

jyztefdp

jyztefdp1#

一个词:暂停。
您无法直接检测丢弃的数据包。
你应该建立一个定时规则。例如,你可能要求你的主机发送五个数据包,每秒钟一个。
您可能需要客户机侦听器等待6秒钟,从而在最后一个数据包传输之后给网络额外的一秒钟。
如果您使用的是TCP,则超时内置在堆栈中。

js4nwp54

js4nwp542#

传输控制协议(传输控制协议)很好地实现了这一点。关于丢弃数据包的问题是,它发生在OSI模型的较低层之一的线路上。您的计算机无法访问这些信息,一旦数据包被发送,发送方就不知道该数据包的信息。在接收之前,接收机也不知道它。这些限制使得“传输控制”成为一个有点复杂的任务。
TCP的工作原理是发送设置了SYN标志的数据包,然后,接收方发送回一个带有SYN-ACK且标识符递增+1的分组(分组中的Seq标志)。然后,最后原始发送方发回ack分组(再次递增seq标志)以确认接收到SYN-ACK
此模式是冗余的,允许体系结构中的客户机或服务器确保正确发送和接收所有数据包。
诸如Linux syscall send(2)之类的网络操作将通过Linux内核,默认情况下(AFAIK)通过TCP发送。
实现TCP模式将是一个很好的练习,有助于您全面了解网络堆栈。
您还可以设置一个超时,如果服务器在y秒内没有收到x个数据包,则让客户端重新发送它们。

  • 图片来自维基百科 *

相关问题