uyl*_*lmz 5 java udp protocols file transfer
我被赋予了使用UDP传输文件的经典任务.在不同的资源上,我已经阅读了检查数据包错误(将CRC与数据一起添加到数据包)是必要的并且UDP已经检查了损坏的数据包并丢弃它们,因此我只需要担心重新发送丢弃的数据包.
哪一个是正确的?我是否需要手动对到达的数据包执行完整性检查,或者已经丢弃了不正确的数据包?
顺便说一句,该项目的语言是Java.
编辑:一些来源(课本,互联网)说校验和只覆盖标题,因此确保发送者和接收者IP是正确的等等.有些消息来源称校验和也涵盖数据段.一些消息来源称校验和可能涵盖数据段,但它是可选的并由操作系统决定.
编辑2:问我的教授,他们说数据段的UDP错误检查在IPv4中是可选的,在IPv6中是默认的.但我仍然不知道它是由程序员控制,还是操作系统或其他层......
第一个事实:
UDP 有一个 16 位校验和字段,从数据包标头的第 40 位开始。这有(至少)两个弱点:
总之,这意味着 UDP 的内置校验和可能足够可靠,也可能不够可靠,具体取决于您的环境。
第二个事实:
比传输过程中的数据损坏更现实的威胁是数据包丢失重新排序:USP 不保证
事实上,UDP 根本没有内置机制来处理大于单个数据包的有效负载,因为它不是为此而构建的。
结论:
在没有额外措施的情况下逐个附加接收到的数据包必然会产生与除非常有利的环境之外的所有环境中的发送流不同的接收流,这使得它不是直接文件传输的最佳协议。
如果您确实想要或必须使用 UDP 来传输文件,则需要在应用程序中构建 TCP 不可或缺的部分,而不是 UDP 的组成部分。但有一种说法是,这很可能会导致 TCP 重新实现效果不佳。
成功的实现包括许多点对点文件共享协议,其中防止连接中断和数据包丢失或重新排序需要成为应用程序功能的一部分,以击败或减轻过滤器的影响。
实施建议:
对我们有用的是分块窗口实现:有效负载被分成固定且方便长度的块,(我们使用 1023 字节)N 个这样的块的状态数组保存在发送端和接收端。
在发送端:
在接收端:
在发送端:
在接收端:
显然,发送端需要一种特殊的消息类型,如果发送窗口滑出文件末尾,则在不发送块 N+i 的情况下发出确认信号的接收信号,我们通过简单地发送 N+i 个块来实现它存在,但没有有效负载。
| 归档时间: |
|
| 查看次数: |
1765 次 |
| 最近记录: |