TCP的问题描述的差不多了,处在传输层的另一个协议也已经蠢蠢欲动了,他就是UDP
1.UDP
UDP全称为用户数据报协议,对比TCP来说他是一个不负责任的协议,也就是说他只管发送,不管数据是否丢失?是否乱序...这种性质保证了他的速度,也就是说它适用于一些对于数据可靠性,准确性不在意的场景,比如直播,视频通话等场景,但由于其不可靠性,所以几乎不适用于任何应用,因此文章将把UDP与TCP进行对比讲解(要不实在是没啥讲的)。
1.UDP格式
相比于TCP,UDP的头部简单的不能再简单,他只包含了:
1.源端口,目的端口:用于网络寻址,告知UDP应该将数据包发送给谁
2.包长度:该字段保存了数据包和头部的长度
3.校验和:校验和是为了提供可靠的 UDP 首部和数据而设计,防止收到在网络传输中受损的 UDP 包。通常被设置为0。如果需要进行校验和计算,那么计算结果会填充到这个字段。校验和用于校验数据是否出错,如果数据在传输过程中出错,则报文会被丢弃。
这就是UDP的头部,仅有8个字节
2.UDP和TCP的区别
1.头部
这个区别就很明显了,UDP头部只有上述的内容,相比之下,TCP的头部就丰富许多了,所以相比之下TCP的头部开销就更大,TCP至少有20个字节(没有用选项字段情况下)而UDP只有固定的8字节
2.连接
TCP面向连接,传输前先建立连接,传输完成后断开连接
UDP不面向连接,即刻传送数据
3.服务
TCP是端对端的连接,也就是一对一的
UDP支持一对一,一对多,多对多
4.可靠性
TCP是可靠的连接,他保证数据的准确,不会乱序,不会丢失
UDP不可靠,无法保证数据的准确性,是否丢包,是否乱序,只会尽力交付数据
5.传输方式
TCP为流式传输(数据像是水流一样可以分割)没有边界,但保证了准确和按序到达
UDP为报式传输,数据分成数据包,有边界,可能丢失和乱序
6.分片(我之前忘了讲分片,这里提一嘴)
每个传输链路的最大传输单元MTU各不相同,我们最常见的传输链路是以太网,大小为1500字节,当传输的数据包大小大于MTU他就会被分片(理解为货物太多了一车装不下,就分成好几车装)当数据经过分片发送后,只能由接收方将分片重组为一个大数据包,但是IP分片有一个问题,当分片有一个丢失,则整个数据全部作废,所以TCP引入了MSS(MSS=MTU-TCP报文头部-IP报文头部),也就是在TCP中分片,而不由IP分片,IP分片丢失一个 整个数据作废 浪费资源 所以在TCP分片后交给网络层 网络层就以为每个数据包都是完整的数据 而且正好能满足一个MTU大小 而且即使丢失了也会有TCP维护,对于UDP来说则没有这个选择,只能尽量控制数据包不超过MTU,所以区别这就来了
TCP的数据包在大于一个MTU时,会在TCP处进行分片,而后再交由网络层发送,接收方接收后也会在传输层重组这个数据包,即使丢失,只需要重传这个丢失的数据包即可
UDP没有分片的能力,当数据包大于一个MTU则会在IP层分片
3.UDP特点
1.无连接:不面向连接,每个数据包都是独立的没有先后顺序(因为没有序列号字段)
2.简单:相比TCP其头部更加简单,开销更小,并且没有握手和挥手等过程,耗时更少
3.速度快:由于没有TCP那么复杂的机制,这使得UDP拥有更快的速度
4.广播和多播支持:UDP支持广播和多播,允许向多个主机发送数据。
5.丢包:TCP并没有重传机制,所以对于丢包不会处理
6.无法保证顺序:UDP的每个数据包独立,所以需要在应用层处理数据包顺序(数据包乱序会发生奇怪的事)
7.拥塞控制,流量控制:UDP同样不支持,他只管发送,所以可能会导致网络拥塞(拥塞了也不管,只能委屈TCP触发拥塞发生算法了)
以上说了这么多,感觉UDP非常危险,其实真实情况并没有那么糟,之前我们提过在网络通畅的情况下,丢包的概率几乎为零,所以UDP并没有我们想象的那么不堪,科学家已经非常努力的建设网络了,你还不努力学习吗!