当前位置: 首页 > article >正文

UDP与TCP

用UDP一定比用TCP快吗?

假设我们需要在a电脑的进程发一段数据到b电脑的进程我们可以选择使用TCP或UDP协议进行通信。

对于TCP这样的可靠性协议每次消息发出后都能明确知道对方有没有收到,就像打电话一样,只要“喂喂"两下对方就能回你个"hi hi"你就知道对方有没有在听

UDP就像是给邮政的信箱寄信一样,你寄出去的信根本就不知道对方有没有正常收到丢了也是有可能的

可以通过创建socket的方式来选择使用TCP还是UDP 

fd = socket(AF_INET,SOCK_STREAM,0):是指使用字节流传输数据,就是TCP协议

fd = socket(AF_INET,SOCK_DGRAM ,0):是指使用数据报传输数据,就是UDP协议

返回的FD是指socket句柄,可以理解为socket的身份证号,这时候根据协议的不同还要执行一些操作,如果一切顺利就可以开始传输消息,如果不顺利,比如消息发到一半丢包了,那UDP和TCP的态度就不太一样了。

  • UDP:管我什么事
  • TCP(可靠性):是不是发的太快了,是不是链路太堵了,不过放心会重发的。

TCP为了保证可靠性:

重传机制:TCP会给发出的消息打上一个编号,也就是sequence,接收方收到后回一个确认ack包,发送方可以通过ack的数值知道接收方收到了哪些sequence的包,如果长时间等不到对方的确认TCP就会重新发送消息这就是所谓的重传机制,重传对性能影响比较严重,是下下策。

TCP就需要思考怎么尽量避免重传,因为数据发送方和接收方处理数据能力可能不同,以此可以根据双方的能力去调整发送的数据量就好了,就有了发送和接收窗口

接收方当前能接收的数据量大小TCP根据窗口的大小去控制自己发送的数据量,这样就能大大减少丢包的概率比如一开始窗口大小为2。

收到一个数据包之后窗口就变成了1,此刻只能再收一个数据包。

当接收窗口变为0时,也就是所谓的0窗口,此时发送端停止发送数据接收方接收到数据之后会不断处理,处理能力也不是一成不变的,有时候处理的快一些就可以多收点数据,处理的慢点,就希望对方能少发点数据,像这种根据自身能力不断调整窗口的机制就是所谓的滑动窗口机制

通过滑动窗口机制TCP实现了流量控制,但这还不够,有时候发生丢包并不是因为发送方和接收方的处理能力问题导致的而是跟网络环境有关,将网络想象为一条公路,马路上可能堵满了别人家的车只留下三辆车的空间,你也没办法同时上路

TCP希望能感知到外部网络环境根据网络环境及时调整自己的发包数量,但外部环境这么复杂,TCP是怎么感知到的呢?

TCP会先慢慢试探的发数据,不断加码,数据量越发越多,先发一个,再发两个,再发四个,直到出现丢包,这样TCP就知道当前网络大概吃得消几个包了,这就是所谓的拥塞控制机制

流量控制和拥塞控制的关系

  • 流量控制:针对的是单个连接数据处理能力的控制
  • 拥塞控制:针对的是整个网络环境数据处理能力的控制

都是怎么降低重传的概率,降低带来的影响

当我们需要发送一个超大的数据包时,如果数据包丢了就得重传同样大的数据包

但如果将其分成一小段一小段,就算丢了也就只需要传那一小段就好了,大大减少了重传的压力

这就是TCP的分段机制

所谓一小段的机制在传输层叫MSS(maximum segment size),数据包长度大于MSS,则会分成n个小于等于MSS的包

如果数据包还大于MTU(maximum transmit unit):还会继续分包

一般情况下MSS等于MTU减去40 byte

所以TCP分段后到了IP层大概率就不会再分片了,既然数据包会被分段,链路又这么复杂还会丢包,那么数据包乱序也就显得不奇怪了。

乱序的问题TCP也考虑到了:依靠数据包的sequence,接收方就能知道数据包的先后顺序,后发的数据包先到就先放到专门的乱序队列中等数据都到齐后 重新整理好数据包顺序后再给到用户,这就是乱序重排机制

网络环境列路很长还复杂,数据丢包是很常见的,平常用TCP做各种数据传输完全对这些事情无感知

TCP三大特性:

UDP没有这么多复杂的特性所以很快

这就是大部分人认为UDP比TCP快的原因,实际大部分情况下确实是这样

有没有用了UDP但却比TCP慢的情况

UDP的用途,大部分人不会尝试直接拿裸UDP放到生产环境中去做项目

UDP的价值:本质是内核提供的一个最小网络传输功能,很多时候,都号称自己用了UDP,但实际上都很忌惮他的丢包问题,所以大部分情况下都会在UDP的基础上做各种不同程度的应用层可靠性保证,某些游戏为了追求低延迟,不同程度使用了UDP,比如王者农药(KCP)

适合用于音视频传输,因为这些场景允许丢包

虽然选择了使用UDP,但是还是会在这一基础上做一些重传机制

如果现在需要传一个特别大的数据包,在TCP内部会根据MSS的大小分段这时候进入到IP层之后每个包大小都不会超过MTU,因此IP层一般不会再进行分片,这时候发生丢包只需要重传每个MSS分段就够了。

但对于UDP本身并不会分段,如果数据过大到了IP层就会进行分片,此时发生丢包再次重传就会重传一整个大数据包,对于上面这种情况使用UDP就比TCP慢

解决起来也不复杂:如果使用UDP的应用层也实现了分段机制就不会出现上述的问题。


http://www.kler.cn/a/551989.html

相关文章:

  • 神经网络实验——MLP
  • IM 即时通讯系统-06-聊一聊 IM 要如何保证扩展性?
  • 进程的延伸——线程(上)
  • 利用爬虫获取淘宝商品描述:实战案例指南
  • 大模型工具大比拼:SGLang、Ollama、VLLM、LLaMA.cpp 如何选择?
  • 功能测试与接口测试详解
  • 网页五子棋——匹配模块
  • 基于暗通道先验的图像去雾算法解析与实现
  • 百度地图接入DeepSeek技术解析:AI如何重塑地图搜索体验?
  • 远离手机APP——数字排毒,回归生活本真
  • 深度学习-1.简介
  • 基于指纹识别技术的考勤打卡设计与实现(论文+源码)
  • Day4:强化学习之Qlearning走迷宫
  • WPF的Prism框架的使用
  • XML Schema anyAttribute 元素详解
  • cmake:定位Qt的ui文件
  • 【JavaEE进阶】MyBatis通过注解实现增删改查
  • 在 Visual Studio 中使用 C++ 利用 dump 文件查找问题原因和崩溃点
  • 【python】4_异常
  • [LeetCode力扣hot100]-链表