UDP协议
-
传输层里有两个比较重要的协议:TCP和UDP。对于不从事底层开发的人员来讲,或者对于开发应用的人来讲,最常用的就是这两个协议。
-
TCP是面向连接的,UDP是面向无连接的。所谓的建立连接,是为了在客户端和服务端维护连接,而建立一定的数据结构来维护双方交互的状态,用这样的数据结构来保证所谓的面向连接的特性。
-
TCP提供可靠交付,即通过TCP连接传输的数据,无差错、不丢失、不重复、并且按序到达。但是IP包没有可靠性保证,而UDP继承了IP包的特性,不保证不丢失,不保证按顺序到达。
-
TCP是面向字节流的,发送的时候发的是一个流,没头没尾。但IP包不是一个流,而UDP继承了IP的特性,基于数据报一个一个地发,一个一个地收。
-
TCP有拥塞控制,它会根据实际情况(如丢包,网络环境较差)调整发送的行为,但是UDP不会。
-
TCP是一个有状态服务,它会精确地记录发送信息,但是UDP则是无状态服务,只负责发送。
-
当发送的UDP包到达目标机器后,发现MAC地址匹配,于是就取下来,将剩下的包传给处理IP层的代码,把IP头取下来,判断是否匹配目标IP。
-
发送端发送的UDP包,需要接收端确定是UDP协议,所以在IP头里有个8位协议判断数据是TCP还是UDP,当知道UDP头的格式后,就能从数据里面将它解析出来。
-
处理完传输层的事情,内核的任务就基本完成,里面的数据应该交给应用程序去处理。
-
无论应用程序使用TCP传数据,还是UDP传数据,都要监听一个端口,该端口用来区分传输的数据包应该分配给哪一个应用程序。无论是TCP还是UDP,包头里面都有端口号,根据端口号将数据交给相应的应用程序。UDP的包头里只有端口号(源端口号和目标端口号),格式较为简单。
-
UDP的三大特点:A.沟通简单,不需要大量的数据结构、处理逻辑、包头字段。B.不会建立连接,虽然有端口号,但是数据可以和任何人互相传。C.不会根据网络的情况进行发包的拥塞控制(即不会控制发送的速度),不会判断包发送的情况,只管发出去。
- UDP的三大使用场景:
A.需要资源少,在网络情况比较好的内网,或者对于丢包不敏感的应用。
B.不需要一对一沟通建立连接,而是可以广播的应用。
C.需要处理速度快,时延低,可容忍少数丢包,即便网络拥塞,也继续发送的应用。
- UDP简单、处理速度快,时延小,而TCP在网络不好出现丢包时,拥塞控制策略会主动的退缩,降低发送速度,导致发送更加卡顿。如果实现的应用需要有自己的连接策略,可靠保证,时延要求,则可以使用UDP,然后再在应用层实现可靠性要求。
-
基于UDP协议的扩展:
A.网页或者APP的访问。之前访问网页和APP都是基于HTTP协议,而HTTP协议基于TCP,时延比较大。Google提出了一种基于UDP改进的通信协议QUIC(快速UDP互联网连接),它在应用层上会自己实现快速连接建立、减少重传时延,自适应拥塞控制。
B.流媒体协议。如直播,它对于网络状况要求比较高,当网络不好时,TCP协议会主动降低发送速度,不能满足实时性,因而很多直播应用,都基于UDP实现自己的视频传输协议。
C.实时游戏。游戏对实时要求较为严格,通常采用自定义的可靠UDP协议,自定义重传策略,能够把丢包产生的延迟降到最低,尽量减少网络问题对游戏性造成的影响。
D.物联网。物联网领域终端资源紧缺,很可能只是内存非常小的嵌入式系统,而维护TCP协议代价太大,且物联网对实时性要求也很高,而TCP会导致时延较大。
E.移动通信领域。移动网络的协议比较复杂,如果基于TCP,TCP的机制就显得非常多余,所以会基于UDP。