TFTP客户端实施数据包竞争条件

时间:2018-10-05 12:44:45

标签: sockets networking tftp

TFTP(临时文件传输协议)是一种非常不错的轻量级协议,用于通过UDP在主机之间传输数据。 RFC 1350中对此进行了描述。我喜欢它,并用它来进行设备管理。

它做的一件事让我有些头疼:它在建立连接时更改端口。客户端使用随机的源端口号(称为“ n”)将其初始数据包(读取或写入请求)发送到服务器上的端口69。然后,服务器使用其自己的随机源端口号(称为“ m”)将数据包(分别为数据或ack数据包)发送回端口n。从原理上讲,会发生以下情况:

Client                            Server
   [ IP1,IP2,n,69,RRQ/WRQ ] ---->
       <---- [ IP2,IP1,m,n,ACK/DATA ]

我的问题在于服务器的应答包在我的客户端计算机上到达的速度太快了:它还没有机会开始监听端口'n'。您会看到,发送第一个数据包所需的套接字不能与接收第二个数据包所需的套接字相同-关联的端口号不同!因此,在发送第一个数据包之后,我必须关闭第一个套接字,创建第二个套接字,然后开始侦听它。这需要时间。似乎时间太多了,因为到第二个套接字最终监听时,服务器的应答包已经过去了。我的问题:

  • 以前有没有人见过这个问题(例如,您应该仅使用原始套接字实现TFTP)?

  • 是否要创建第二个套接字,并在第一个套接字之前监听它,例如在另一个线程内进行监听,并使用SO_REUSEADDR或SO_REUSEPORT帮助?

  • 是否存在另一种修改第一个套接字的方法,以便将其从其最初的port-69名称“剥离”,因此我可以重用它以进行监听,并且这样做只能使用一个套接字?

谢谢!

0 个答案:

没有答案