我有一个程序可以模拟一个网络,其中数据包从客户端来回发送到主机。这个模拟包括一个数据包在发送时被丢弃的机会。我的客户端程序被设置为在终止前将数据包发送回五次,但是当数据包被丢弃时客户端不会停止等待,直到手动终止。我有一个客户端程序,它调用了一个方法,该方法不断地等待一个数据包,并且直到它收到一个数据包5次才让程序的其余部分执行,如果一个数据包被丢弃,客户端程序也不会终止。当数据包丢失或返回时间过长时,客户端程序需要什么才能识别?
jyztefdp1#
一个词:暂停。您无法直接检测丢弃的数据包。你应该建立一个定时规则。例如,你可能要求你的主机发送五个数据包,每秒钟一个。您可能需要客户机侦听器等待6秒钟,从而在最后一个数据包传输之后给网络额外的一秒钟。如果您使用的是TCP,则超时内置在堆栈中。
js4nwp542#
传输控制协议(传输控制协议)很好地实现了这一点。关于丢弃数据包的问题是,它发生在OSI模型的较低层之一的线路上。您的计算机无法访问这些信息,一旦数据包被发送,发送方就不知道该数据包的信息。在接收之前,接收机也不知道它。这些限制使得“传输控制”成为一个有点复杂的任务。TCP的工作原理是发送设置了SYN标志的数据包,然后,接收方发送回一个带有SYN-ACK且标识符递增+1的分组(分组中的Seq标志)。然后,最后原始发送方发回ack分组(再次递增seq标志)以确认接收到SYN-ACK。此模式是冗余的,允许体系结构中的客户机或服务器确保正确发送和接收所有数据包。诸如Linux syscall send(2)之类的网络操作将通过Linux内核,默认情况下(AFAIK)通过TCP发送。实现TCP模式将是一个很好的练习,有助于您全面了解网络堆栈。您还可以设置一个超时,如果服务器在y秒内没有收到x个数据包,则让客户端重新发送它们。
SYN
SYN-ACK
Seq
ack
seq
send(2)
2条答案
按热度按时间jyztefdp1#
一个词:暂停。
您无法直接检测丢弃的数据包。
你应该建立一个定时规则。例如,你可能要求你的主机发送五个数据包,每秒钟一个。
您可能需要客户机侦听器等待6秒钟,从而在最后一个数据包传输之后给网络额外的一秒钟。
如果您使用的是TCP,则超时内置在堆栈中。
js4nwp542#
传输控制协议(传输控制协议)很好地实现了这一点。关于丢弃数据包的问题是,它发生在OSI模型的较低层之一的线路上。您的计算机无法访问这些信息,一旦数据包被发送,发送方就不知道该数据包的信息。在接收之前,接收机也不知道它。这些限制使得“传输控制”成为一个有点复杂的任务。
TCP的工作原理是发送设置了
SYN
标志的数据包,然后,接收方发送回一个带有SYN-ACK
且标识符递增+1的分组(分组中的Seq
标志)。然后,最后原始发送方发回ack
分组(再次递增seq
标志)以确认接收到SYN-ACK
。此模式是冗余的,允许体系结构中的客户机或服务器确保正确发送和接收所有数据包。
诸如Linux syscall
send(2)
之类的网络操作将通过Linux内核,默认情况下(AFAIK)通过TCP发送。实现TCP模式将是一个很好的练习,有助于您全面了解网络堆栈。
您还可以设置一个超时,如果服务器在y秒内没有收到x个数据包,则让客户端重新发送它们。