UDP协议为什么比TCP协议快的原理

一直以来,大家知道相对于TCP协议,UDP协议快,但是具体快在哪里呢,研究了一番,记录下来供大家学习。

1.工作位置:

首先,在OSI七层模型中,TCP,UDP工作在传输层,使源端主机和目标主机上提供端到端的会话,也就是我们常说的端口号,因为ip协议可能分组经过不同的路由路径传输,因此主机的ip层不保证顺序,也不保证一定收到,因此我们在传输层就需要做到一些事情:

  • 提供端到端的数据传递
  • 顺序保证
  • 可靠性保证

2.TCP与UDP的区别

  • 首先为什么TCP需要连接呢?

TCP协议需要保证数据传输可靠,那么我们通过连接(三次握手)这个过程确定,双方都可以收发数据。如果连接都连接不上,那么就可以确定双方的通信不可达,建立连接失败,没办法可靠的传输。

  • UDP为什么不需要连接呢?

UDP只提供端到端的数据传递,不做可靠性校验,因此不需要连接去确认

  • UDP广播机制

广播UDP与单播UDP的区别就是IP地址不同,广播使用广播地址255.255.255.255,将消息发送到在同一广播网络上的每个主机。值得强调的是:本地广播信息是不会被路由器转发。当然这是十分容易理解的,因为如果路由器转发了广播信息,那么势必会引起网络瘫痪。这也是为什么IP协议的设计者故意没有定义互联网范围的广播机制。

  • 数据传输格式

UDP使用数据报的方式传递数据,TCP使用数据流的方式传递数据,所谓数据报,数据流,其实是一种承载数据的方式。这其实与这两个协议本身的传输机制有关,tcp提供可靠的传输机制,也就是说只要是被发送的数据都会被接收方接收到,并且双方也知道被正确接收了,这就有一种现象:一段比较大的数据被分段传送出去,对于接收方而言,就像一股水流一样不断地并且一滴不漏的被接收(这个过程中有确认机制,更加形象地类似水流)。而udp不负责可靠传输,他只知道尽最大的努力把数据发送出去,并不关心数据是否被接收方实际接收,对于接收方而言,他接收数据的情形是:来一个我接受一个,并不关心中间是否有丢失的数据报,就像飞机空投物资一样,并不是投一包东西,然后地面确认一下,再投第二包东西(这种方式在无形中使得物资之间有了一种默契),而是多架飞机一起往下投物资,没有顺序可言,哪个先下来我先接那个,并且投下的物资是否在半空被老鹰叼走了地面并不关心(这种方式下,不同物资之间似乎相互独立,从传输层理解的话就是每个udp报文独立存在,他们的联系是发生在他的高层应用层)。再结合到数据的发送和接收上,对于接收端而言并无顺序可言,数据报之间没有约定的连接格式,每个udp数据报之间就像独立的个体一样。因此数据报是直接打包,直接发送,而数据流有可能分包发送,然后顺序到达。从这里可以看出来,数据报适合小的数据,数据流可以进行大文件传输。

  • TCP可靠性保证:

1.三次握手,四次分手,保证连接,断开连接正常。

 

2.流量控制——滑动窗口

TCP滑动窗口技术通过动态改变窗口大小来实现对端到端设备之间的数据传输进行流量控制。

如图所示,主机A和服务器A之间通过滑动窗口来实现流量控制。为方便理解,此例中只考虑主机A发送数据给服务器A时,接收端服务器A通过滑动窗口进行的流量控制。主机A向服务器发送4个长度为1024字节的数据段,其中主机A的窗口大小为4096个字节。服务器A收到第3个数据段后,缓存区满,第4个数据段被丢弃。服务器以ACK3073响应,窗口大小调整为3072,表明服务器的缓冲区只能处理3072个字节的数据段。于是主机A改变其发送速率,发送窗口大小为3072的数据段。这样子,主机A下次发送的数据段的窗口大小都是3072。

3.拥塞控制

当一个网络面对的负载超过了它了处理能力时,拥塞就会发生。若出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降

 

慢开始:当cwnd < ssthresh时,让cwnd从1开始指数增加拥塞窗口的值

拥塞避免:当cwnd > ssthresh时, 通过线性增长cwnd的值,降低拥塞的概率

快重传:在丢包发生的情况下,接收端重复发送上一次接受的重复确认,发送方收到了累计3个连续的报文段的重复确认,立即重传之后的报文段

快恢复:收到3个重复确认,不启动慢开始,执行快恢复

  • 首部开销

UDP:

TCP:

由上图可见,UDP报头,大小为8字节,TCP为固定头20字节,以及选项最多可达40字节。

私信我,领取最新最全C++音视频学习提升资料,内容包括(C/C++LinuxFFmpeg webRTC rtmp hls rtsp ffplay srs

3.UDP为什么比TCP快:

从上面的分析,我们可以得出以下结论:

1.当代网络远距离采用光纤传输,给UDP的稳定性提供可靠网络保障,丢包率很低,如果使用应用层重传,能够确保传输的可靠性(基于TCP/IP协议开发出来是在1973年,而真正的大面积应用是在1983年。现状的网络状况以及有了很大的改善)。

2.TCP为了可靠性保证,增加了3次握手4次挥手,复杂的拥塞控制,以及流量控制,让网络传输的延迟进一步增加。

3.采用TCP,一旦发生丢包,TCP会将后续的包缓存起来,等前面的包重传并接收到后再继续发送,延时会越来越大,基于UDP对实时性要求较为严格的情况下,采用自定义重传机制,有包就发,能够把丢包产生的延迟降到最低,尽量减少网络延迟。

4.基于滑动窗口,接收方因为需要对保证顺序,因此前面的包没到,不会继续去处理后续的包。

5.TCP头部的大小,进一步增加了,传输的数据量。

猜你喜欢

转载自blog.csdn.net/m0_60259116/article/details/124453607