网络编程之TCP/IP协议族-传输层UDP协议
UDP是一个简单的面向数据报的协议:每个应用层数据包在该层正好封装成一个UDP数据报,并交给IP协议发送。
与TCP类似,封装UDP数据包的过程会添加一个UDP首部,其格式如下(图片来自网络)。
源端口号:2个字节,发送端端口号。
目的端口号:2个字节,接收端端口号。
UDP长度:2个字节,包含首部和数据,8个字节为单位。
UDP检验和:2个字节,覆盖首部和数据。
相较于TCP,UDP是个简单协议。它不会对数据做过多处理,也不提供可靠性、流量控制和差错恢复等功能。应用层数据由UDP添加一个首部,然后到达传输层,IP协议将其组装成一个待发送的IP数据报。UDP是面向数据报的,必然有一个最大数据长度。理论上,由于IP首部总长度为2个字节,故最大长度是65535字节,除去IP首部长度20字节,UDP数据报最大长度为65515字节。实际上,因为实现上的区别,一般小于此值。
前面文章说过,数据在传输过程中,IP协议会将较大的数据报分片。同时标准规定,主机必须能够接受最小576字节的IP数据报。所以许多UDP应用程序设计中,应用层数据长度被限制成512字节或更小。应用层应该选择合适的报文大小。
UDP无连接,传输数据不需要建立和断开连接,所以开销更小。但不保证可靠性,所以可能丢包,数据也可能失序。
TCP协议与UDP协议的选择。
TCP:数据传输的性能必须让位于数据传输的完整性、可控制性和可靠性时。
UDP:强调传输性能而不是传输的完整性时,如音频和多媒体应用;或者数据传输时间很短,以至于此前的连接过程成为整个流量主体的情况。
值得一提的是,IP支持单播、广播和多播,广播和多播仅应用于UDP,它们对需要将报文同时传往多个接收者的应用来说十分重要。具体细节暂不表述。