网络协议复习笔记(七)传输层:UDP协议

TCP 和 UDP 的区别

TCP 是面向连接的,UDP 是面向无连接的。
在互通之前,面向连接的协议会先建立连接。例如,TCP 会三次握手,而 UDP 不会。
建立连接,是为了在客户端和服务端维护连接,而建立一定的数据结构来维护双方交互的状态,用这样的数据结构来保证所谓的面向连接的特性。

TCP 提供可靠交付。通过 TCP 连接传输的数据,无差错、不丢失、不重复、并且按序到达。UDP 继承了 IP 包的特性,不保证不丢失,不保证按顺序到达。

**TCP 是面向字节流的。**发送的时候发的是一个流,没头没尾。IP 包不是一个流,而是一个个的 IP 包。UDP 继承了 IP 的特性,基于数据报的,一个一个地发,一个一个地收。

**TCP 是可以有拥塞控制的。**它意识到包丢弃了或者网络的环境不好了,就会根据情况调整自己的行为,看看是不是发快了,要不要发慢点。UDP 就不会,应用让我发,我就发,管它洪水滔天。

TCP 其实是一个有状态服务,里面精确地记着发送了没有,接收到没有,发送到哪个了,应该接收哪个了。**UDP 则是无状态服务。**不会记录,只管发。

如果 MAC 层定义了本地局域网的传输行为,IP 层定义了整个网络端到端的传输行为,这两层基本定义了这样的基因:网络传输是以包为单位的,二层叫帧,网络层叫包,传输层叫段。

UDP包头

当我发送的 UDP 包到达目标机器后,发现 MAC 地址匹配,于是就取下来,将剩下的包传给处理 IP 层的代码。把 IP 头取下来,发现目标 IP 匹配,发送的时候在IP 头里面有个8 位协议,这里会存放,数据里面到底是 TCP 还是 UDP,当然这里是 UDP。
网络协议复习笔记(七)传输层:UDP协议
无论应用程序写的使用 TCP 传数据,还是 UDP 传数据,都要监听一个端口。正是这个端口,用来区分应用程序,无论是 TCP 还是 UDP 包头里面应该有端口号,根据端口号,将数据交给相应的应用程序。

UDP三大特性(白话)

  1. 沟通简单,不需要大量的数据结构、处理逻辑、包头字段。但前提是网络通路默认就是很容易送达的,不容易被丢弃的。
  2. 轻信他人。不会建立连接,虽然有端口号,但是监听在这个地方,谁都可以传给他数据,他也可以传给任何人数据,甚至可以同时传给多个人数据。
  3. **愣头青,做事不懂权变。**不会根据网络的情况进行发包的拥塞控制,无论网络丢包丢成啥样了,它该怎么发还怎么发。

UDP三大使用场景

针对上述对应的特性,考虑在以下的场景中使用。

  1. 需要资源少,在网络情况比较好的内网,或者对于丢包不敏感的应用。
  2. 不需要一对一沟通,建立连接,而是可以广播的应用。

UDP 的不面向连接的功能,可以使得可以承载广播或者多播的协议。DHCP 就是一种广播的形式,就是基于 UDP 协议的。

D 类地址,也即组播地址,使用这个地址,可以将包组播给一批机器。当一台机器上的某个进程想监听某个组播地址的时候,需要发送 IGMP 包,所在网络的路由器就能收到这个包,知道有个机器上有个进程在监听这个组播地址。

  1. 需要处理速度快,时延低,可以容忍少数丢包,但是要求即便网络拥塞,也毫不退缩,一往无前的时候。

UDP 简单、处理速度快,不像 TCP 那样,操这么多的心,各种重传啊,保证顺序啊,前面的不收到,后面的没法处理啊。不然等这些事情做完了,时延早就上去了。TCP 在网络不好出现丢包的时候,拥塞控制策略会主动的退缩,降低发送速度,这就相当于本来环境就差,还自断臂膀,用户本来就卡,这下更卡了。

基于UDP的五个例子

网页或APP访问

原来访问网页和手机 APP 都是基于HTTP 协议的。HTTP 协议是基于 TCP 的,建立连接都需要多次交互,对于时延比较大的目前主流的移动互联网来讲,建立一次连接需要的时间会比较长,然而既然是移动中,TCP 可能还会断了重连,也是很耗时的。

QUIC(全称 Quick UDP Internet Connections,快速 UDP 互联网连接)是 Google 提出的一种基于UDP 改进的通信协议,其目的是降低网络通信的延迟,提供更好的用户互动体验。QUIC 在应用层上,会自己实现快速连接建立、减少重传时延,自适应拥塞控制。

流媒体的协议

现在直播比较火,直播协议多使用 RTMP,而这个 RTMP 协议也是基于 TCP的。TCP的严格顺序传输要保证前一个收到了,下一个才能确认,如果前一个收不到,下一个就算包已经收到了,在缓存里面,也需要等着。对于直播来讲这显然是不合适的,因为老的视频帧丢了其实也就丢了,就算再传过来用户也不在意了,他们要看新的了,如果老是没来就等着,卡顿了,新的也看不了,那就会丢失客户,所以直播,实时性比较比较重要,宁可丢包,也不要卡顿的。

对于视频播放来讲,有的包可以丢,有的包不能丢,因为视频的连续帧里面,有的帧重要,有的不重要,如果必须要丢包,隔几个帧丢一个,其实看视频的人不会感知,但是如果连续丢帧,就会感知了,因而在网络不好的情况下,应用希望选择性的丢帧

还有当网络不好的时候,TCP 协议会主动降低发送速度,这对本来当时就卡的看视频来讲是要命的,应该应用层马上重传,而不是主动让步。因而,很多直播应用,都基于 UDP实现了自己的视频传输协议。

实时游戏

游戏有一个特点,就是实时性比较高。因而,实时游戏中客户端和服务端要建立长连接,来保证实时传输。但是游戏玩家很多,服务器却不多。由于维护TCP连接需要在内核维护一些数据结构,因而一台机器能够支撑的TCP 连接数目是有限的。UDP 由于是没有连接的,在异步 IO 机制引入之前,常常是应对海量客户端连接的策略。

对战的游戏,对网络的要求很简单,玩家通过客户端发送给服务器鼠标和键盘行走的位置服务器会处理每个用户发送过来的所有场景,处理完再返回给客户端客户端解析响应渲染最新的场景展示给玩家。

如果出现一个数据包丢失,所有事情都需要停下来等待这个数据包重发。客户端会出现等待接收数据,然而玩家并不关心过期的数据,激战中卡 1 秒,等能动了都已经死了。

游戏对实时要求较为严格的情况下,采用自定义的可靠UDP协议,自定义重传策略,能够把丢包产生的延迟降到最低,尽量减少网络问题对游戏性造成的影响。

IOT 物联网

物联网对实时性要求也很高,而 TCP 还是因为上面的那些原因导致时延大。Google 旗下的 Nest 建立 Thread Group,推出了物联网通信协议 Thread,就是基于UDP协议的。

移动通信

4G网络里,移动流量上网的数据面对的协议 GTP-U 是基于 UDP 的。因为移动网络协议比较复杂,而GTP协议本身就包含复杂的手机上线下线的通信协议。如果基于TCPTCP 的机制就显得非常多余。

小结

  • TCP复杂,UDP 简单;TCP维护连接,UDP 谁都相信;TCP 会坚持知进退;UDP愣头青一个,勇往直前。
  • UDP虽然简单,但它有简单的用法。它可以用在环境简单、需要多播、应用层自己控制传输的地方。例如 DHCPVXLANQUIC 等。