繁体   English   中英

防止TCP上的拆分数据包

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM