1、不需要重发的数据用UDP发送更高效:
之前文章中所提到的都是TCP协议,但是有些应用程序不使用TCP协议,而是使用UDP协议来收发数据。像DNS服务器查询IP地址的时候就是UDP协议。
TCP协议是为了将数据高效且可靠地发送给对方。为了实现可靠性就需要确认对方是否收到了我们发送的数据,如果没有还需要重发一次。为了实现高效的传输,TCP还可以避免重发已经发送并接收的包,只重发那些出错的或者未送达的包。
不过,在某种情况下,即便没有TCP这样复杂的机制,也能够高效的重发数据。这种情况就是数据很短,一个包就能够装下。因为只有一个包,所以即使全部重发也就只有一个包而已,而且可以通过回复的数据当作接收确认。简单的说,从应用程序获取的数据前面加上UDP头部,然后交给IP进行发送就可以了。UDP头部(8字节)如下表:
字段名称 | 长度(比特) | 含义 |
发送方端口号 | 16 | 网络包发送方的端口号 |
接收方端口号 | 16 | 网络包接收方的端口号 |
数据长度 | 16 | UDP头部后面数据的长度 |
校验和 | 16 | 用于校验错误 |
2、音频和视频数据:
在发送音频和视频数据的时候也会使用UDP协议,因为音频和视频数据对于必须在规定的时间内送达,一旦送达晚了就会错过播放时机,导致声音和图像卡顿。如果使用TCP协议则需要使用高速路线让重发的数据能够在规定时间内送达,但这样一来可能要增加几倍的带宽才行。一般只有在需要查穿过防火墙时,才会使用TCP协议,因为UDP协议经常会被防火墙阻止。
此外,音频和视频数据中缺少了某些包并不会产生严重的问题,只是会产生一些失真或者卡顿而已,一般都是可以接受的。所以在这些无需重发数据,或者重发了也没什么意义的情况下,使用UDP发送数据的效率会更高。