停止连接tcp数据包

时间:2016-02-15 21:52:17

标签: python sockets tcp

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

4 个答案:

答案 0 :(得分:3)

TCP使用数据包进行传输,但暴露给应用程序。相反,TCP层可能决定如何将数据分成数据包,甚至是片段,以及如何传递它们。通常,这是因为网络拓扑结构不正常。

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

如果要传输“数据包”,请使用面向数据报的协议(如UDP)(但要注意,此类数据包有大小限制,并且您需要自己负责重新传输UDP),或者手动换行。例如,您始终可以首先通过TCP发送数据包长度,然后发送有效负载。另一方面,首先读取大小,然后你知道需要遵循多少字节(注意,由于碎片,你可能需要多次读取才能获得所有内容)。在这里,TCP将负责按顺序传送和重传,因此这更容易。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

首先,您需要知道数据包在发送之前或之后是否合并。使用wireshark检查发件人正在发送一个或两个数据包。如果是发送一个,那么你的修复是在每次写入后调用flush()。如果收件人在收到数据包后合并数据包,我不知道答案。

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

答案 3 :(得分:0)

通常,TCP_NODELAY会阻止这种情况。但是很少有情况需要将其打开。其中一个有效的是telnet风格的应用程序。

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

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

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

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

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