我正在编写一个程序,该程序使用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
类不支持此特定选项。