Page 321 - Web性能权威指南
P. 321

➐ 乱序不可靠交付(UDP)

                 ➑ 使用指定的配置初始化 DataChannel


                            初始化 DataChannel 之后,应用可以访问 maxRetransmits 和 maxRetrans-
                            mitTime 这两个只读属性。同样,为方便起见,DataChannel 也提供了一
                            个 reliable 属性,只要使用了部分可靠策略,这个属性就会返回 false。

                 每个 DataChannel 可以使用不同的自定义参数(可靠性及是否有序)来配置,每一
                 端可以打开多个信道,这些信道都是通过对相同的 SCTP 关联多路复用实现的。结
                 果,信道之间相互独立,可以分别用于传输不同类型的数据。比如,可靠有序的信
                 道可用于聊天,部分可靠且乱序的交付可用于传输瞬时或低优先级的应用更新。


                 18.6.3 部分可靠交付与消息大小

                 要使用部分可靠的信道,需三思而后行。尤其是,应用必须密切关注消息大小:应
                 用传输的数据可能很大,因此会被分段封装到多个分组中,而这很可能导致难以接
                 受的结果。为说明这个问题,假设有以下场景。

                 •   两端协商好了一个乱序不可靠的 DataChannel。
                      Œ  信道的 maxRetransmits 为 0,即纯粹是 UDP。
                 •   丢包率大约为 1%。
                 •   其中一端想要发送一个 120 KB 的大消息。
                 WebRTC 客户端将 SCTP 分组的最大传输单位设置为 1280 字节,这是针对 IPv6 分
                 组推荐的 MTU。但我们也必须考虑到 IP、UDP、DTLS 和 SCTP 协议的开销,分别
                 是 20~40 字节、8 字节、20~40 字节和 28 字节,加起来大约为 130 字节。这样每个
                 分组就剩下大约 1150 字节给数据净荷。因此,120  KB 应用消息总共需要 107 个分
                 组(120×1024/1150)。

                 现在还看不出有问题,但每个分组丢失的概率为 1%。如果我们通过不可靠信道发
                 送全部 107 个分组,那么极有可能在中途会丢失其中一个!这会导致什么结果呢?
                 即使仅仅丢失一个分组,整个消息也会被抛弃。

                 为解决这个问题,应用有两个选择:可以使用重传策略(计数或超时),或者减少消
                 息大小。事实上,为了获得最佳结果,应该双管齐下。

                 •   在使用不可靠信道时,理想情况下,每个消息都应该可以封装到一个分组中。换
                   句话说,消息应该小于 1150 字节。
                 •   如果消息不能封装到一个分组中,则需要使用重传策略,以提高交付消息的成功率。

                                                                              WebRTC   |   311
   316   317   318   319   320   321   322   323   324   325   326