前面讲的IP层属于网络层,接下来我们开始讲传输层。传输层有两个重要的协议,一个是TCP,一个是UDP。对于开发应用的人来讲,最常用的就是这两个协议。
TCP和UDP有哪些区别?
TCP是面向连接的,UDP是面向无连接的。
什么是面向连接呢?就是在互通之前先建立连接。所谓的建立连接,是为了在客户端和服务端维护连接,而建立一定的数据结构来维护双方交互的状态,用这样的数据结构保证所谓的面向连接的特性。
TCP提供可靠交付。通过TCP连接传输的数据保证无差错、不丢失、不重复、按顺序送达。我们知道IP包是不保证可靠的,数据包丢了就丢了,TCP能做到上述的特性,需要做很多额外的工作。UDP继承IP包的特性,不保证不丢失,不保证按顺序到达。
TCP是面向字节流的。即发送的数据当作一个流,没头没尾。IP包本身不是一个流,而是一个个的包。之所以变成流,也是TCP做的事情。UDP继承了IP的特性,基于数据包,一个个的发,一个个的收。
TCP是可以有拥塞控制的。即TCP可以控制收发数据的速度,当网络好的时候快点发,当网络不好的时候慢点发。UDP没有这个特性,应用让我发,我就发。
TCP是一个有状态的服务。简单地讲就是它知道发送了没有,接收了没有,发到哪儿了。UDP是无状态的,发出去就发出去了。
如果说MAC定义了局域网的传输行为,IP层定义了整个网络端到端的传输行为,这两层的特点是:网络传输以包为单位,二层叫帧,网络层叫包,传输层叫段。我们笼统地称为包。包单独传输,自行选路,不保证到达。
UDP包头什么样?
当发送的UDP包到达目标机器后,发现MAC地址匹配,于是就接收,将MAC头取下来,剩下的包传给处理IP层的代码。IP层将IP头取下来,发现目标IP匹配,接下来怎么办?IP包的数据部分给谁呢?
IP头里面有一个8位协议,这个协议标识是TCP还是UDP,我们这里是UDP。我们知道UDP头的格式,然后将数据解析出来。解析出来的数据给谁处理呢?
应用程序无论是使用TCP还是UDP,都要监听一个端口。这个端口就是用来区分应用程序的,根据端口号传输层把数据包交给对应的应用。
UDP的报文格式相比TCP来说,十分简单。
UDP的三大特点:
UDP像小孩子一样,有三大特点:
第一,沟通简单。它相信网络世界是美好的,默认网络是很容易送达的。
第二,轻信他人。它不建立连接,谁都可以给它传数据,也可以传给任何人数据。
第三,不懂变通。不会根据网络情况拥塞控制,就按照自己的方式发。
UDP的三大使用场景
基于UDP的这些特点,可以考虑在以下场景使用:
第一,需要资源少,网络状况好的内网,或对于丢包不敏感的应用。
DHCP就是基于UDP的协议。一般获取IP地址都是内网请求,一次获取不到也没事,还有下一次机会。PXE可以在启动时候安装操作系统,操作系统镜像下载使用TFTP,这个协议也是基于UDP。因为还没有操作系统的时候,客户端拥有的资源少,不适合维护一个复杂的状态机。
第二,不需要建立连接,可以广播的应用。UDP的不面向连接特性,可以承载广播或多播的协议。DHCP就是一种广播的形式,就是基于UDP协议的。VXLAN协议,也用到组播,也是基于UDP协议的。
第三,需要处理速度快,时延低,可以容忍少数丢包,但是即便网络拥塞,也要不退让。UDP简单、处理速度快,不需要重传、保证顺序等复杂操作,所以时延低。
当前许多应用都是要求低时延的,它们不想用TCP的复杂的传输机制,而是应用根据需要实现自己的可靠和连接保证。
由于UDP十分简单,也就给了应用“城会玩”的机会。
基于UDP的“城会玩”的五个例子
1. 网页或者APP的访问
原来访问网页和手机APP都是基于HTTP协议。HTTP协议是基于TCP的,建立连接需要多次交互,很耗时。
QUIC(Quick UDP Internet Connections,快速UDP互联网协议)是Google的基于UDP改进的通信协议,目的是降低网络通信的延迟。QUIC在应用层上,实现快速建立连接、减少重传时延,自适应拥塞控制。
2. 流媒体的协议
直播协议多使用RTMP,RTMP协议是基于TCP的。TCP是严格保证顺序的,前一个包收到了,下一个才能确认,如果前一个没收到,下一个包就是收到了,也得等着。这对直播来讲显然是不合适的。
对于直播来讲,实时性比较重要,宁可丢包,也不要卡顿。
因而,很多应用都基于UDP实现自己的视频传输协议。
3. 实时游戏
游戏对实时性的要求比较高,很多游戏就是在毫秒之间定胜负。
实时游戏的客户端和服务端要建立长连接保证实时传输。服务器维护TCP连接需要维护一些数据结构,所以能够支持的TCP连接数是有限的。由于UDP是没有连接的,在异步IO引入之前,应对海量客户端常常用UDP。
对战游戏,对网络的要求很简单,玩家通过客户端发送给服务器鼠标和键盘行走的位置,服务器处理用户发过来的所有场景,处理完再返回给客户端。如果出现一个数据包丢失,所有事情都停下来等待这个数据包重发,这显然是不合适的。
所以游戏对实时性要求比较高的情况下,采用自定义的可靠的UDP协议,自定义重传策略。
4. IoT物联网
物联网领域的终端资源少,一般都是非常小的嵌入式系统,维护TCP协议i的代价又太大;物联网对实时性的要求也很高。Google推出的物联网协议Thread,就是基于UDP协议的。
5. 移动通信领域
4G网络里,GTP-U是基于UDP的。
小结
-
如果将TCP比作成熟的社会人,UDP就是头脑简单的小朋友。TCP复杂,UDP简单;TCP维护连接,UDP谁都相信;TCP知进退,UDP愣头青。
-
UDP虽然简单,但有自己的用处。可以在简单的环境、需要多播、应用层自己控制的地方。例如DHCP、VXLAN,QUIC等。
两个思考题:
1. 都说TCP是面向连接的,在计算机看来,怎么样才算一个连接呢?
2. TCP的连接是如何建立的,又是如何关闭的?