精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
通信残包是指接收时收到了不完整的包,如果是开头部分,可能结合后续接收数据能够恢复,如果是后半部分,数据恢复不了,只能丢弃。在网络堵塞时,看视频经常会有马赛克画面部分不清楚,有时候会卡住,这时候多少也有数据,但是数据量小,肯定大部分都是残包,发给视频解码器,视频解码不了,就会马赛克或卡顿。所以通信开发,长连接大量数据传输接收要考虑残包处理,而短连接数据量小时一般不考虑残包情况。
SOCKET残包、套接字残包和TCP残包是一个意思,如下面协议解释来理解残包。
1:包头标志:8:CC:前半段内容
2:后半段内容:包尾标志。
3: 部分内容
上面第2个包就是连包,第3个是残包,无开头标志和结束标志,0x8cc是包长度。
前面讲到视频播放器接收通信残包,导致有马赛克画面部分不清楚,哪把有效数据给编码器不就能解决问题了吗?这只是理想,很难实现,现代的编码协议非常复杂,编码器解包一次,在外面再做一次验证解包,没有必要。现代的解码器一般能够处理好一些数据不一致问题,不会死机。
另外在无线通信和卫星通信时,容易有残包,丢失部分数据也会导致残包,在无线通信和卫星通信时,通信介质不稳定带来接收异常或中断,就有了丢失部分数据情况。这时候经常要用类似CRC机制来进行验证,如果不是完整的包,不进行处理。如果是紧急的数据,可以回复重传包,让发送方再传一次。
普通开发时,只要包长不大于最大传输单元(Maximum Transmission Unit,MTU),一般不会有残包。现代的光纤传输技术和有线局域网数据传输都比较可靠。
在网络设备遇到极端情况下,CPU过高机器发热时,通信紊乱状态下,也可能会有残包,在软件遇到特别通信异常时,要考虑环境问题。