UDP
传输层最重要的协议为TCP
协议和UDP
协议。这两者使用"网络"的方式走了两个极端。两个协议的对比非常有趣。TCP
协议复杂,但传输可靠。UDP
协议简单,但传输不可靠。其他的各个传输层协议在某种程度上都是这两个协议的折中。(PS: 记得曾经听说过一个协议叫做UDT~)
UDP协议
UDP(User Datagram Protocol
)传输与IP传输很像,甚至可以将UDP协议看作IP协议呈现在传输层的一个接口,UDP
协议同样以数据包(datagram)的方式传输,它的传输方式也是"我尽力"式的,所以UDP
协议也像IP
协议一样,是不可靠的。
其实我在看IP协议那块时候,大神文章里提到IP是不可靠传输的协议时,我当时联想到了UDP,都是不可靠的那么还要UDP干嘛的,直接用IP协议不就行了嘛,当看后这篇的时候总算明白了
UDP的意义
那么,我们为什么不直接使用IP
协议而要额外增加一个UDP
协议呢? 一个重要的原因是IP协议中并没有端口(port
)的概念,IP
协议进行的是IP地址到IP地址的传输,这意味者两台计算机之间的对话。但每台计算机中需要有多个通信通道。多个通信通道分配给不同的进程(服务)使用。为了满足这一需求,传输层的网络协议实现了端口。一个端口就代表了一个通信通道,UDP
协议实现了端口,从而让数据包可以在送到IP
地址的基础上,进一步送到指定端口,从而将数据正确传输到指定的进程(服务)。
哈哈,看到这里瞬间就明白了~
UDP
协议的产生晚于更加复杂的TCP
协议。早期的网络开发者开发出IP
协议和TCP
协议分别位于网络层和传输层,所有的通信都要先经过TCP
封装,再经过IP
封装,也就是应用层→TCP→IP的过程。开发者将TCP/IP
视为相互合作的套装。但很快,网络开发者发现,IP
协议的功能和TCP
协议的功能是相互独立的。对于一些简单的通信,我们只需要"我尽力"式的IP
传输就可以了,而不需要TCP
协议复杂的建立连接的方式。特别是在早期网络环境中,如果过多建立TCP
连接,会造成很大的网络负担,而UDP
协议可以相对快速的处理这些简单通信。UDP
协议随之被开发出来,作为IP
协议在传输层的"傀儡"。这样,网络通信可以通过应用层→UDP→IP的封装方式,用简单的UDP
协议绕过TCP
协议。
UDP Header
UDP
的数据包同样分为头部(header
)和数据(payload
)两部分。UDP
是传输层协议,高于网络层。因此,UDP
的数据包最终会经过IP
协议的封装,然后通过IP
协议传输到目的电脑。随后IP
包中包含的UDP
包在目的电脑拆封,并将数据部分送到相应端口。下图是UDP协议的头部:
UDP
头部总共分为四部分:
- Source Port:源端口
- Destination Port: 目标端口
- Length: 整个UDP包的长度
- Checksum: Checksum的算法与IP协议的头部校验算法相类似。然而,UDP的校验码所校验的序列包括了整个UDP数据包,以及封装的IP头部的一些信息,主要是出发地IP和目的地IP。这样,校验码就能确保IP地址和端口两者的正确性了。在IPv4中,UDP的校验码可以为0,意味着不使用校验。IPv6要求必须进行校验码的校验。