我正在编写一个使用TCP套接字通过网络传输文件的程序。
现在我注意到当我发送一个大小为1024字节的数据包时,我会将它们拆分到另一端。
通过“拆分”,我的意思是我得到一些数据包,好像它们是整个数据包的一部分。
当数据包大小非常小(每个数据包大约30个字节)时,我试图减小数据包大小和算法工作,因此文件传输速度非常慢。
为了防止分裂,我能做些什么吗?
解决:我将连接切换为UDP,因为UDP是数据包限制,所以它可以工作
答案 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
类不支持此特定选项。