UDP包头
无论应用程序写的使用 TCP 传数据,还是 UDP 传数据,都要监听一个端口。正是这个端口, 用来区分应用程序,要不说端口不能冲突呢。两个应用监听一个端口,到时候包给谁呀?所以按理说,无论是 TCP 还是 UDP 包头里面应该有端口号,根据端口号,将数据交给相应的应用 程序。
UDP格式:
UDP的三大特点
(下面将说法更人性化了)
a. 沟通简单,不需要处理大量的数据结构、处理逻辑、包头字段。相信网络通路默认就是很容易送达的,不容易被丢弃
b. 轻信他人,它不会建立连接,虽然有端口号,但是监听在这个地方,谁都能传数据给它,他也可以传数据给别人,也可以同时给多人传数据
c. **愣头青,做事不懂权变。**它不会根据网络情况进行发包的拥塞控制,无论网络丢包如何,它显得“不知道”。
ps:(如果不清楚上面的举例,可以对比看TCP,这就容易理解了)
UDP的三大使用场景
- 需要资源少,在网络情况比较好的内网,或者对于丢包不敏感的应用。这很好理解,就像
如果你是领导,你会让你们组刚毕业的小朋友去做一些没有那么难的项目,打一些没有那么难的
客户,或者做一些失败了也能忍受的实验性项目。(DHCP就是基于UDP协议的,一般的获取IP地址都是内网请求。) - 不需要一对一沟通,建立连接,而是可以广播的应用。(DHCP就是一种广播形式,基于UDP协议;
VXLAN协议,是需要用到组播,也是基于UDP的 - 需要处理速度快,时延低,可以容忍少数丢包,但是要求即便网络拥塞,也毫不退缩,一
往无前的时候。(不会像TCP一样,需要考虑很多问题,这样对网络要求极高,)
基于UDP使用的几个例子
1. 网页或者 APP 的访问
原来访问网页和手机 APP 都是基于 HTTP 协议的。HTTP 协议是基于 TCP 的,建立连接都需要 多次交互,对于时延比较大的目前主流的移动互联网来讲,建立一次连接需要的时间会比较长, 然而既然是移动中,TCP 可能还会断了重连,也是很耗时的。而且目前的 HTTP 协议,往往采 取多个数据通道共享一个连接的情况,这样本来为了加快传输速度,但是 TCP 的严格顺序策略 使得哪怕共享通道,前一个不来,后一个和前一个即便没关系,也要等着,时延也会加大。
而QUIC(全称Quick UDP Internet Connections,快速 UDP 互联网连接)是 Google 提出的 一种基于 UDP 改进的通信协议,其目的是降低网络通信的延迟,提供更好的用户互动体验。
QUIC 在应用层上,会自己实现快速连接建立、减少重传时延,自适应拥塞控制,是应用层的代表。
2. 流媒体协议
现在直播比较火,直播协议多使用 RTMP,而这个 RTMP 协 议也是基于 TCP 的。TCP 的严格顺序传输要保证前一个收到了,下一个才能确认,如果前一个 收不到,下一个就算包已经收到了,在缓存里面,也需要等着。对于直播来讲,这显然是不合适 的,因为老的视频帧丢了其实也就丢了,就算再传过来用户也不在意了,他们要看新的了,如果 老是没来就等着,卡顿了,新的也看不了,那就会丢失客户,所以直播,实时性比较比较重要, 宁可丢包,也不要卡顿的。
另外,对于丢包,其实对于视频播放来讲,有的包可以丢,有的包不能丢,因为视频的连续帧里 面,有的帧重要,有的不重要,如果必须要丢包,隔几个帧丢一个,其实看视频的人不会感知, 但是如果连续丢帧,就会感知了,因而在网络不好的情况下,应用希望选择性的丢帧。
还有就是当网络不好的时候,TCP 协议会主动降低发送速度,这对本来当时就卡的看视频来讲 是要命的,应该应用层马上重传,而不是主动让步。因而,很多直播应用,都基于 UDP 实现了 自己的视频传输协议。
3. 实时游戏
游戏有一个特点,就是实时性比较高。快一秒你干掉别人,慢一秒你被别人爆头,所以很多职业 玩家会买非常专业的鼠标和键盘,争分夺秒。
因而,实时游戏中客户端和服务端要建立长连接,来保证实时传输。但是游戏玩家很多,服务器 却不多。由于维护 TCP 连接需要在内核维护一些数据结构,因而一台机器能够支撑的 TCP 连接 数目是有限的,然后 UDP 由于是没有连接的,在异步 IO 机制引入之前,常常是应对海量客户 端连接的策略。
另外还是 TCP 的强顺序问题,对战的游戏,对网络的要求很简单,玩家通过客户端发送给服务 器鼠标和键盘行走的位置,服务器会处理每个用户发送过来的所有场景,处理完再返回给客户 端,客户端解析响应,渲染最新的场景展示给玩家。
如果出现一个数据包丢失,所有事情都需要停下来等待这个数据包重发。客户端会出现等待接收 数据,然而玩家并不关心过期的数据,激战中卡 1 秒,等能动了都已经死了。
游戏对实时要求较为严格的情况下,采用自定义的可靠 UDP 协议,自定义重传策略,能够把丢 包产生的延迟降到最低,尽量减少网络问题对游戏性造成的影响。
4. IOT物联网
一方面,物联网领域终端资源少,很可能只是个内存非常小的嵌入式系统,而维护 TCP 协议代 价太大;另一方面,物联网对实时性要求也很高,而 TCP 还是因为上面的那些原因导致时延 大。Google 旗下的 Nest 建立 Thread Group,推出了物联网通信协议 Thread,就是基于 UDP 协议的。
5. 移动通信领域
在 4G 网络里,移动流量上网的数据面对的协议 GTP-U 是基于 UDP 的。因为移动网络协议比 较复杂,而 GTP 协议本身就包含复杂的手机上线下线的通信协议。如果基于 TCP,TCP 的机制 就显得非常多余。