讲完了IP层之后,我们开始说一下传输层的工作,传输层最常见的协议有两种,一种是UDP协议,一种是TCP协议,在从事应用开发的人员来说,最常见的就是这两个协议
那么对于面试中,我们也是经常遇到UDP协议和TCP协议两种情况,大多数的时候我们会首先回答,TCP协议是面向连接的,UDP协议是面向无连接的,什么是面向连接,什么是无连接的,在互通之前,面向连接的协议会建立连接,在TCP上,就是三次握手,但是UDP不会
真正的面向连接,可以说是为了维护客户端和服务器端的连接,我们建立了一定的数据结构来维护双方的交互状态,用这种数据结构来保证所谓的面向连接的特性
例如,TCP可以让我们在传输过程中,传输的数据,无差错,不丢失,按照顺序到达,而UDP则不行,不保证顺序,不保证不丢失,TCP之所以能够保证不丢失,是因为其有一个维护连接的程序
再比如,TCP是面向字节流的,发的时候都是按照流的方式发送,而UDP则是按照数据报的,一个包一个包的发送
再比如,TCP是可以拥塞控制的,在意识到包丢失或者环境不好了,就会根据情况来调整字节IDE行为,看看是不是发快了,降低发送的速度,但是UDP不会,应用让发就直接发,不会管网络速度的
总结下来,TCP是一个有状态服务,内部维护了发送了没有,接受到了吗,发送到哪个了,应该发送哪个了,UDP则是无状态的协议,就是没有脑子的,天真无邪,发出去就发出去了,因为在网络传输中,是以包为单位的,包自行选路,在不同的设备中解封装,不保证到达,基于这个理解,UDP就是只管发送,不保证到达
UDP的包的头是什么样的
其实很简单,在IP头中,我们会有一个8位协议,表示是UDP协议还是IP协议,取出来了之后,根据不同的协议进行不同的处理,
里面包含了两个的端口号和UDP的长度及校验,接受和发送端各自监听自己的端口号,我们根据端口号来将数据发往相对应的应用程序,UDP只具有很简单的结构
那么UDP的特性就是
1.沟通简单,不需要一肚子的花花肠子,大量数据结构,默认网络通路可以容易的送达
2.轻信他人,不会建立连接,谁都可以传给他,他可以传给任何人
3.愣头青,无论网络多么的拥堵,都会该发就发,可不管网络堵塞
因为这些特性,其有着自己独特的场景去使用
1.需要资源少,在网络比较好的内网,或者丢包不敏感的应用
就好比刚进公司,不会一上来就写代码,肯定还是先去看一些说明文档,做一些小事
再好比之前说的DHCP,协议,启动的时候获取IP,如果获取不到,没有关系,反正是内网,发送的快,而且PXE也是,启动的时候安装操作系统,操作系统镜像下载使用的是TFTP,基于UDP协议,因为是内网,而且客户端的资源很少
2.不需要一对一的场景,广播的应用
之前说的DHCP就是一种广播的协议,基于UDP协议,广播包之前也说过了
而且,一开始我们也说过,IP协议有一种D类协议,就是组播协议,使用这个地址,可以将一个包组播个一批机器,当一个机器需要监听某个组播地址的时候,发送IGMP包给网关,路由器接受到IGMP包之后,就知道有人监听这个地址了,当这个地址有包到了,就会转发给这个机器,实现了组播
至于VXLAN协议,就是用到了组播,基于了UDP协议的
3.需要处理快,可以容忍丢包,但是要求即使网络阻塞,也不能退缩
UDP简单,处理快,而且不会因为网络拥堵而放低发包的速度,这就很好,有的包丢了就丢了,没必要重传,有的很重要,需要自己的重传,UDP就好比一个士兵,只会服众命令,没有自己的思想,我们可以使用UDP,在发送失败的时候,使用应用层实现重发就可以了
我们举一些基于UDP而自定义实现的例子
1.网络或者APP访问
网络访问和app都是基于的HTTP协议的,HTTP协议基于了TCP协议,建立的时候需要多次的交互,对于移动中互联网来说,建立TCP很耗时,而且很容易断了,而且目前的HTTP协议中,采用了多个数据通道共享一个连接的情况,这样做本来可以加快传输速度,但是TCP的顺序策略让共享通道也是前一个不来,后一个来了也要等待的情况
Google提出了QUIC(快速UDP互联网连接),基于了UDP改进的通信协议,目的是降低了网络通信的延迟,提供更好的用户交互体验,其也是在应用层,自己实现了快速连接,减少重连时延,自适应拥塞控制
2.流媒体(直播)
直播之前一般使用的RTMP协议,也是基于了TCP协议,但TCP协议需要在前一个保证收到的之后,再接受下一个,如果前一个收不到,下一个必须等着,对于直播,不合适,因为用户不会去看老的视频帧,而是要求时时刻刻都是最新的视频帧,对于直播,可以丢包,但不能卡顿
对于丢包,对于视频播放来说,有的包可以丢,有的包不能丢,在视频的连续帧里面,有的重要,有的不重要,如果要丢包的话,尽可能的丢一些不重要的帧,而且做到不连续丢帧,保证视频的连贯性
在网络不好的时候,TCP协议会降低发送的速度,这对于直播视频来说就是卡顿,这就不合适,应该不管是否卡顿,都立刻马上的去重传,而不是主动的让步,于是很多直播应用都实现了自己的视频传输协议
3.实时游戏
对于对战游戏,对于实时的传输很重要,一般客户端和服务器端要建立一个长连接,来保证实时的传输,但是游戏玩家往往比服务器可以提供的TCP连接数量要大的多,于是在引入异步IO之前,UDP是一种解决海量客户端连接的策略
对于TCP来说,对于网络的要求很简单,客户端发送给服务器端玩家的操作,服务器端处理完成后返回给客户端,客户端解析相应,并渲染新的场景,如果一个数据包丢失,所有的事情都会停下来等待这个数据包重发,客户端会出现等待接受数据,但是往往一等待,就意味着失败
对于这种实时要求严格的情况,可以考虑使用自定义的可靠UDP协议,自定义重传策略,将丢包的延迟讲到最低,减少网络问题对于游戏性的影响
4.IoT物联网
物理网的终端资源少,能调用的传输资源少,所以维护TCP资源代价会大些,所以Google旗下的Nest建立了Thread Group,推出了Thread物理网通信协议,基于UDP的
5.移动通信协议
在4G中,移动流量上网的数据面对的协议是GTP-U也是基于UDP的,GTP本身就包含了很复杂的手机上下线的通信协议,如果还基于了TCP,TCP的机制就显得很多余
本章小结
TCP的连接建立很复杂,UDP则很简单,TCP需要维护连接,但是UDP不用
UDP虽然简单,但是有很多独特的用法,适合在需要广播,应用层自己控制传输的地方可以大展身手,比如DHCP VXLAN,QUIC等
课后思考
1.TCP是面向连接的,那么,怎么才算一个连接呢?
2.TCP的连接是如何建立的,如何关闭的呢?
1.对于连接,我们不应该把他看做是一座桥,而是看做是两个码头,但是TCP在码头的两端各自维护了记录人员,核查人和督导人,保证了连接的稳定性
而所谓的建立连接,并不是在两端之间有一个先,而是利用了三次握手来做到了彼此感知了对方的存在
2,对于建立连接,我们在建立的时候,进行了三次握手,彼此各位维护了各自的数据结构
对于分手,则是四次挥手,正式关闭这些数据结构和客户端