关于udp传输的不可靠性,用过这个的人都知道会丢包。具体细节可能就不清楚了,经过我的理解和总结,有以下两点:
1)udp包的大小可以达到64k,但实际上mtu大小只有1k多,如果直接发一个超过mtu大小的包,就会在协议层被分片,这样的问题是,如果只要有一个分片在传输中出错了即校验不正确(这是较容易发生的),整个传输的udp包就被丢弃。注意是整个而不是单个分片。这就是为什么发送udp包通常也是1k多大小的原因,rtp是在udp之上的协议,也考虑了这个问题。
[popexizhi:
linux 查mtu :cat /sys/class/net/${network}/mtu
winodws 查mtu:
管理员权限cmd
netsh interface ipv4 show subinterfaces 按下回车键查看当前的mtu 值;
看pope的虚拟机默认都是1500,windows和linux都是,但是看lo是
cat /sys/class/net/lo/mtu
65536
windows:
MTU MediaSenseState 传入字节 传出字节 接口
------ --------------- --------- --------- -------------
4294967295 1 0 14790933 Loopback Pseudo-Interface 1
1500 5 0 0 VPN - VPN Client
1500 1 219020484 106550520 以太网
1500 1 9512 797253 VMware Network Adapter VMnet1
1500 1 9512 796170 VMware Network Adapter VMnet8
1500 5 0 0 以太网 2
]
2)实际上收到的数据都是经过校验的,不存在传错的问题,即在应用层调用udp传输时,不会出现发送了"ABCD",收到的却是"ABED"的情况,只有丢包或乱序的问题。而udp接收缓冲区过小也是造成丢包的原因,适当增大udp缓冲区能够降低丢包率。
[popexizhi:
原文后面详细讲解了,如何校验的,pope没有细看。
]
没有评论:
发表评论