[英]Preventing split packets over TCP
我正在编写一个程序,使用TCP套接字通过网络传输文件。
现在我注意到,当我发送一个大小为1024字节的数据包时,我会将它们拆分到另一端。
通过“拆分”我的意思是我得到一些数据包就好像它们是整个数据包的一部分。
当数据包大小非常小(每个数据包大约30个字节)时,我试图减小数据包大小和算法工作,因此文件传输速度非常慢。
有什么我可以做的,以防止分裂?
已解决:我将连接切换为UDP,因为UDP是数据包限制,所以它有效
TCP中没有这样的东西。
TCP是一个流,你写的就是你在另一端获得的。 这并不意味着你按照它的方式得到它; TCP可能会破坏或分组数据包,以便尽可能有效地完成工作。 您可以在一次写入中发送8兆字节数据包,TCP可以分解为10,100或1000个数据包,您需要知道的是,在另一端,您将获得正好8兆字节不再少。
为了有效地进行文件传输,您需要告诉接收器您要发送多少字节。 接收器可以在一个块或100个块中读取它,但必须跟踪它读取的数据和要读取的字节数。
由于TCP是面向流的,因此TCP不会传输“数据包边界”的信息,如UDP和SCTP。
因此,您必须将数据包边界的信息添加到TCP有效负载(如果尚未存在)。 有几种方法可以做到:
在所有方面,如果没有收到完整的数据包,接收器必须再次读取TCP输入流。
您可以在某些套接字实现中控制TCP最大段大小。 如果将其设置得足够低,则可以使段适合单个数据包。 BSD套接字API几乎影响了所有其他实现,它有一个setsockopt()
函数,可以让你在套接字上设置各种选项。 其中之一TCP_MAXSEG
控制最大段大小。
不幸的是,标准的Java Socket
类不支持这个特定的选项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.