防止TCP上的拆分数据包

时间:2014-03-06 10:15:28

标签: java sockets networking tcp packet

我正在编写一个使用TCP套接字通过网络传输文件的程序。

现在我注意到当我发送一个大小为1024字节的数据包时,我会将它们拆分到另一端。

通过“拆分”,我的意思是我得到一些数据包,好像它们是整个数据包的一部分。

当数据包大小非常小(每个数据包大约30个字节)时,我试图减小数据包大小和算法工作,因此文件传输速度非常慢。

为了防止分裂,我能做些什么吗?

解决:我将连接切换为UDP,因为UDP是数据包限制,所以它可以工作

3 个答案:

答案 0 :(得分:2)

TCP中没有这样的东西。

TCP是一个流,你写的就是你在另一端得到的东西。这并不意味着你按照它的方式得到它; TCP可能会破坏或分组数据包,以便尽可能有效地完成工作。您可以在一次写入中发送8兆字节数据包,TCP可以分解为10,100或1000个数据包,您需要知道的是,在另一端,您将获得正好8兆字节不再少。

为了有效地进行文件传输,您需要告诉接收器您要发送多少字节。接收器可以在一个块或100个块中读取它,但必须跟踪它读取的数据和要读取的字节数。

答案 1 :(得分:1)

由于TCP是面向流的,因此TCP不会传输“数据包边界”的信息,如UDP和SCTP。

因此,您必须将数据包边界的信息添加到TCP有效负载(如果尚未存在)。有几种方法可以做到:

  • 您可以使用长度字段来指示后续数据包包含的字节数。
  • 或者可能存在用于分隔不同数据包的保留符号。

在所有方面,如果没有收到完整的数据包,接收方必须再次读取TCP输入流。

答案 2 :(得分:0)

您可以在某些套接字实现中控制TCP最大段大小。如果将其设置得足够低,则可以使段适合单个数据包。 BSD套接字API几乎影响了所有其他实现,它具有setsockopt()功能,允许您在套接字上设置各种选项。其中一个TCP_MAXSEG控制最大段大小。

不幸的是,标准Java Socket类不支持此特定选项。