防止TCP上的分组



我正在编写一个程序,该程序使用TCP插座通过网络传输文件。

现在我注意到,当我发送一个大小的数据包时,例如1024字节,我会在另一侧分开它们。

由"拆分"我的意思是我得到一些数据包,好像它们是整个数据包的一部分。

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

为了防止分裂,我有什么可以做的吗?

已解决:我将连接切换到UDP,并且由于UDP是包围的,因此它可以使用

TCP中没有这样的东西。

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

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

因为TCP是面向流的,TCP不会传输'数据包边界'的信息,例如UDP和SCTP。

因此,如果还没有,则必须将数据包边界的信息添加到TCP有效载荷中。有几种方法:

  • 您可以使用一个长度字段来指示以下数据包包含多少个字节。
  • 或可能有一个保留的符号来分开不同的数据包。

,如果未收到完整的数据包,则接收器必须再次读取TCP输入流。

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

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

最新更新