综述
网络层的 IP 协定为主机之间提供了逻辑通信,而 IP 的服务模型是尽力而为提供服务。这就意味着 IP 尽力在主机之间交付报文,然而它并不做任何保障。不确保报文段的交付,不保障报文段的按序交付,也不保障报文段中数据的完整性。所以 IP 是不牢靠的服务
而运输层 (TCP 和 UDP) 将两个端系统间的 IP 的交付服务扩大为运行在端系统上的两个过程间的交付服务。而 UDP 仅提供了过程到过程的数据交付和过错查看两种服务,所以 UDP 也是一种不牢靠的服务
TCP 和 UDP 的比照
“TCP 是 面向连贯 的,而 UDP 是 无连贯 的”
建设连贯指的是,为了在客户端和服务端保护连贯,而建设肯定的数据结构来保护单方交互的状态,用这样的数据结构来保障所谓的面向连贯的个性。
面向连贯的意思是,在互通之前,面向连贯的协定会先建设连贯,例如 TCP 会进行三次握手,而 UDP 不会。应用 UDP 时,在发送报文之前,发送方和接管方的运输实体之间没有握手,如此 UDP 才被称为是无连贯的。
所以 TCP 和 UDP 的不同之处,次要体现在上面几个方面:
- 牢靠交付。通过 TCP 传输的数据,无差错、不失落、不反复、并且按序达到。而 UDP 继承了 IP 包的个性,不保障不失落,不保障按程序达到
- 面向对象不同。TCP 是面向字节流的,发送的时候是一个流,没头没尾。而之所以发送的是流,也是 TCP 本人的状态保护做的事件。然而 UDP 继承了 IP 包的个性,是基于数据包的,一个一个地发,一个一个地收
- 拥塞管制。TCP 有本人地拥塞管制机制,当它意识到包抛弃了或者是网络不好了,就会依据状况调整本人地行为,例如升高发送速度。而 UDP 没有拥塞管制,只会依据应用层地指令发包,即使是网络环境差,只有下层有指令发包,就会始终发
- 有无状态。TCP 通过给数据编号,准确地记录了某个数据发送了没有,接管到没有,发送到哪个了,应该接管哪个。而 UDP 则是无状态的,不记录发送的包的信息
UDP 包的构造
UDP 包是无连贯的,那么首次发送 UDP 包时,目标端口号如何得悉?服务器上的服务,应用的是 1024 以内的周知端口号,例如 DNS 服务器,那么源主机发送 UDP 时在目标端口号处填写 53 即可。(然而总感觉这个起因逻辑性不强)
解析 UDP 包之前的动作:接管方收到一个包之后,会先查看目标 MAC 地址和本人的 MAC 地址是否统一。若统一就把 MAC 头部取下来,再把剩下的局部交给 IP 层。IP 层取下 IP 头部之后,若发现目标 IP 地址和本人的 IP 地址雷同,而后再查看 IP 头部里的协定类型,发现 IP 数据包的局部是 UDP 协定。于是就开始解析 UDP 包。将 UDP 包解析进去之后,查看头部的目标端口号,而后把外面的数据交给监听这个端口的某个利用解决。
UDP 的特点
- 构造简略。UDP 的头部只有源端口和目标端口,以及报文长度和校验和,除此之外就是数据局部了。如此应用层就能够进行准确的管制
- 它不会建设连贯,尽管有端口号,然而监听时,谁都能够传给他数据,他也能够传给任何人数据,甚至能够同时传给多集体数据
- 无连贯状态。TCP 须要保护连贯状态,包含接管和发送缓存、拥塞控制参数以及序号与确认号的参数。而 UDP 不保护连贯状态,也就没有这些参数。所以运行在 UDP 之上的服务器个别都能反对更多的沉闷用户
- 首部开销小。UDP 首部只有 8 个字节,而 TCP 有 20 个字节
UDP 利用场景
- 须要资源少,网络状况好的内网;或者是对于丢包不敏感的利用。例如应用 DHCP,获取 IP 个别都是在内网进行,就算数据包没有达到,因为是内网,所以也无影响。还有 PXE 装置操作系统时,应用 TFTP 下载操作系统也是应用的 UDP,因为此时客户机还没有操作系统,领有的资源很少,难以保护较为简单的 TCP
- 不须要进行一对一沟通、建设连贯,能够播送的利用。UDP 无连贯,所以能够利用在播送或者多播的协定中。上述提到的 DHCP 就是播送
- 须要处理速度快,时延低,能够容忍多数丢包,然而要求即使网络拥塞,也必须发包的时候。UDP 构造简略,处理速度快,不像 TCP 要保障程序、还须要重传,因为这会减少时延。而且 UDP 没有拥塞管制,即使网络情况不好,也会发包。而 TCP 此时就会升高发送速度,使得本来卡顿的利用变得更加卡顿。
因为 UDP 构造简略,所以能够由利用本人做一些工作,并利用 UDP 速度快低时延、构造简略的个性,进而开发自定义的利用:
-
网页或 APP 的拜访。原先的网页和 APP 都是基于 HTTP 协定的,而 HTTP 协定是基于 TCP 的。建设连贯时须要屡次交互,就造成了时延较高的状况。此外手机处于挪动过程中,TCP 可能会断开连接,进行重连又会减少时延。而且目前的 HTTP 协定,往往采取多个数据通道共享一个连贯的状况,这样原本为了放慢传输速度,然而 TCP 的严格程序策略使得哪怕共享通道,前一个不来,后一个和前一个即使没关系,也要等着,时延也会加大
Chrome 中应用的 QUIC 协定,将 UDP 作为撑持运输协定并在 UDP 之上的应用层协定中实现可靠性
-
流媒体协定。直播协定多应用 RTMP 协定,而这个协定也是基于 TCP 的。TCP 严格保证数据的程序性对于直播是不适合的,因为老的视频帧丢了其实也就丢了,就算再传过来用户也不在意了,他们要看新的了。如果老是没来就等着,卡顿了,新的也看不了。所以直播,实时性比拟比拟重要,宁肯丢包,也不要卡顿的。当网络不好的时候,TCP 协定会被动升高发送速度,这就使得本来卡顿的视频更加卡顿。实际上,应用层应该马上重传,而不是被动退让
以下是对于视频帧的阐明。视频都是由一张一张的图片造成的,疾速播放一组图片也就造成了视频,一张图片在视频里叫做一帧。保留视频时,并不是将每一帧都残缺保留,而是保留与上一帧的不同之处,从而升高占用的存储空间。实践上,能够只保留视频的第一帧,当前都保留相较于第一帧的变动。但理论中会隔几帧就保留一整个帧,目标是为了避免传输中呈现谬误。
这个原理相当于保留 [1000, 1001, 1002, 1003, 1004] 这个数组时,若依照 [1000, 1, 1, 1, 1] 的模式保留,1000 当前的项都保留与前一项之间的大小差距,那么将节俭很多存储空间
- 实时游戏。游戏对时效性的要求比拟高,实时游戏中客户端和服务端要建设长连贯,来保障实时传输。保护 TCP 连贯须要在内核保护一些数据结构,因此一台机器可能撑持的 TCP 连贯数目是无限的,当玩家数量增多之后,一台机器就不够用了。而 UDP 是没有连贯的,在异步 IO 机制引入之前,经常是应答海量客户端连贯的策略。另外还是 TCP 的强程序问题,对战游戏中,客户端发送给服务器鼠标和键盘行走的地位,服务器会解决每个用户发送过去的所有场景,解决完再返回给客户端,客户端解析响应,渲染最新的场景展现给玩家。如果呈现一个数据包失落,所有事件都须要停下来期待这个数据包重发。客户端会呈现期待接收数据,然而玩家并不关怀过期的数据。游戏对实时要求较为严格的状况下,采纳自定义的牢靠 UDP 协定,自定义重传策略,可能把丢包产生的提早降到最低,尽量减少网络问题对游戏性造成的影响。
- Iot 物联网。一方面,物联网畛域终端资源少,很可能只是个内存十分小的嵌入式零碎,而保护 TCP 协定代价太大;另一方面,物联网对实时性要求也很高,而 TCP 还是因为下面的那些起因导致时延大
- 挪动通信畛域。在 4G 网络里,挪动流量上网的协定 GTP-U 就是基于 UDP 的。因为挪动网络协议比较复杂,而 GTP 协定自身就蕴含简单的手机上线下线的通信协议。如果基于 TCP,TCP 的机制就显得十分多余