阻止 tcp 数据包连接



我有两个应用程序发送tcp包,都是用python 2编写的。当客户端将 tcp 数据包发送到服务器的速度过快时,数据包将被串联起来。有没有办法让python只从套接字恢复上次发送的包?我将使用它发送文件,所以我不能只使用某些字符作为数据包终止符,因为我不知道文件的内容。

TCP 使用数据包进行传输,但不向应用程序公开。相反,TCP层可以决定如何将数据分解为数据包,甚至是片段,以及如何传递它们。通常,发生这种情况是由于非常规网络拓扑。

从应用程序的角度来看,您应该将TCP连接视为八位字节流,即您的数据单元是字节,而不是数据包。

如果要传输"数据包",请使用面向数据报的协议,例如UDP(但请注意,此类数据包有大小限制,使用UDP时,您需要自己处理重新传输(,或手动包装它们。例如,您始终可以通过 TCP 先发送数据包长度,然后再发送有效负载。另一方面,先读取大小,然后你知道需要跟随多少字节(请注意,由于碎片,您可能需要多次读取才能获取所有内容(。在这里,TCP将负责按顺序交付和重新传输,因此这更容易。

TCP 是一种流式处理协议,它不会公开单个数据包。虽然从流中读取和获取数据包可能在某些配置中工作,但即使对所涉及的操作系统或网络硬件进行微小的更改,它也会中断。

若要解决此问题,请使用更高级别的协议来标记文件边界。例如,您可以使用文件的长度(以八位字节为单位(作为文件前缀。或者,您可以切换到已经处理此类内容的协议,例如http。

首先,您需要知道数据包是在发送之前还是之后组合的。使用 wireshark 检查发送者是否正在发送一个或两个数据包。如果它正在发送一个,那么您的解决方法是在每次写入后调用 flush((。我不知道答案是否接收者在收到数据包后合并数据包。

您可以更改要发送的内容。您可以发送发送的字节,后跟字节。然后另一方会知道要读取多少字节。

通常,TCP_NODELAY可以防止这种情况发生。 但是在极少数情况下,您需要将其打开。 为数不多的有效应用程序之一是 telnet 样式应用程序。

您需要的是 tcp 连接之上的协议。 将 TCP 连接视为管道。 你把东西放在管道的一端,然后把它们从另一端拿出来。 您不能只通过此发送文件而不协调两端。 你已经认识到你不知道它有多大,它在哪里结束。 这是你的问题。协议可以解决这个问题。 你没有协议,所以你写的东西永远不会是健壮的。

说你不知道长度。 获取文件的长度并在标头中传输,后跟字节数。

例如,如果标头是长度为 64 位,那么当您在服务器端收到标头时,您将 64 位数字读取为长度,然后继续读取直到文件末尾应该是长度。

当然,这是非常简单的,但这是它的基础。

事实上,您不必设计自己的协议。 您可以访问互联网并使用现有协议。 比如HTTP。

相关内容

最新更新