TCP 协议和 UDP 协议 的优势和劣势

news2024/9/22 3:43:17

TCP 最核心的价值是提供了可靠性,而 UDP 最核心的价值是灵活,你几乎可以用它来做任何事情。例如:HTTP 协议
1.1 和 2.0 都基于 TCP,而到了 HTTP 3.0 就开始用 UDP 了。UDP 在数据传输、网络控制、音视频、Web 技术中,都有很重要的地位。

UDP 协议

UDP(User Datagram Protocol),目标是在传输层提供直接发送报文(Datagram)的能力。Datagram 是数据传输的最小单位。UDP 协议不会帮助拆分数据,它的目标只有一个,就是发送报文。可能会问: 为什么不直接调用 IP 协议呢? 如果裸发数据,IP 协议不香吗?这是因为传输层协议在承接上方应用层的调用,需要提供应用到应用的通信——因此要附上端口号。每个端口,代表不同的应用。传输层下层的 IP 协议,承接传输层的调用,将数据从主机传输到主机。IP 层不能区分应用,导致哪怕是在 IP 协议上进行简单封装,也需要单独一个协议。这就构成了 UDP 协议的市场空间。

UDP 的封包格式

UDP 的设计目标就是在允许用户直接发送报文的情况下,最大限度地简化应用的设计。下图是UDP 的报文格式。
在这里插入图片描述
UDP 的报文非常简化,只有 5 个部分。
Source Port 是源端口号。因为 UDP 协议的特性(不需要 ACK),因此这个字段是可以省略的。但有时候对于防火墙、代理来说,Source Port 有很重要的意义,它们需要用这个字段行过滤和路由。Destination Port 是目标端口号(这个字段不可以省略)。Length 是消息体长度。Checksum 是校验和,作用是检查封包是否出错。Data octets 就是一个字节一个字节的数据,Octet 是 8 位。先简单聊聊校验和(Checksum)机制,这个机制在很多的网络协议中都会存在,因为校验数据在传输过程中有没有丢失、损坏是一个普遍需求。在一次网络会话中,我们传输的内容可能是:“你好!”,但事实上传输的是 01 组成的二进制。请你思考这样一个算法,我们把数据分成一个一个byte,然后将所有 byte 相加,再将最终的结果取反。现在数据有 4 个 byte:a,b,c,d,那么一种最简单的校验和就是:checksum=(a+b+c+d) ^ 0xff如果发送方用上述方式计算出 Checksum,并将 a,b,c,d Checksum 一起发送给接收方,接收方就可以用同样的算法再计算一遍,这样就可以确定数据有没有发生损坏(变化)。当然Checksum 的做法,只适用于数据发生少量变化的情况。如果数据发生较大的变动,校验和也可能发生碰撞。你可以看到 UDP 的可靠性保证仅仅就是 Checksum 一种。如果一个数据封包 Datagram 发生了数据损坏,UDP 可以通过 Checksum 纠错或者修复。 但是 UDP 没有提供再多的任何机制,比如 ACK、顺序保证以及流控等。

UDP 与 TCP的区别

  • 目的差异
    首先,这两个协议的目的不同:TCP 协议的核心目标是提供可靠的网络传输,而 UDP 的目标是在提供报文交换能力基础上尽可能地简化协议轻装上阵。
  • 可靠性差异
    TCP 核心是要在保证可靠性提供更好的服务。TCP 会有握手的过程,需要建立连接,保证双方同时在线。而且TCP 有时间窗口持续收集无序的数据,直到这一批数据都可以合理地排序组成连续的结果。UDP 并不具备以上这些特性,它只管发送数据封包,而且 UDP 不需要 ACK,这意味着消息发送出去成功与否 UDP 是不管的。
  • 连接 vs 无连接
    TCP 是一个面向连接的协议(Connection-oriented Protocol),传输数据必须先建立连接。 UDP 是一个无连接协议(Connection-less Protocol),数据随时都可以发送,只提供发送封包(Datagram)的能力。
  • 流控技术(Flow Control)
    TCP 使用了流控技术来确保发送方不会因为一次发送过多的数据包而使接收方不堪重负。TCP在发送缓冲区中存储数据,并在接收缓冲区中接收数据。当应用程序准备就绪时,它将从接收缓冲区读取数据。如果接收缓冲区已满,接收方将无法处理更多数据,并将其丢弃。UDP 没有提供类似的能力。
  • 传输速度
    UDP 协议简化,封包小,没有连接、可靠性检查等,因此单纯从传输速度上讲,UDP 更快。
  • 场景差异
    TCP 每个数据封包都需要确认,因此天然不适应高速数据传输场景,比如观看视频(流媒体应用)、网络游戏(TCP 有延迟)等。具体来说,如果网络游戏用 TCP,每个封包都需要确认,可能会造成一定的延迟;再比如音、视频传输天生就允许一定的丢包率;Ping 和DNSLookup,这类型的操作只需要一次简单的请求/返回,不需要建立连接,用 UDP 就足够了。近些年有一个趋势,TCP/UDP 的边界逐渐变得模糊,UDP 应用越来越多。比如传输文件,如果考虑希望文件无损到达,可以用 TCP。如果考虑希望传输足够块,就可能会用 UDP。再比如 HTTP 协议,如果考虑请求/返回的可靠性,用 TCP 比较合适。但是像 HTTP 3.0 这类应用层协议,从功能性上思考,暂时没有找太多的优化点,但是想要把网络优化到极致,就会用UDP 作为底层技术,然后在 UDP 基础上解决可靠性。所以理论上,任何一个用 TCP 协议构造的成熟应用层协议,都可以用 UDP 重构。这就好比,本来用一个工具可以解决所有问题,但是如果某一类问题体量非常大,就会专门为这类问题创造工具。因此,UDP 非常适合需要定制工具的场景。下面我把场景分成三类,TCP 应用场景、UDP 应用场景、模糊地带(TCP、UDP 都可以考虑),可以参考。

第一类:TCP 场景

远程控制(SSH)

  • List item
  • File Transfer Protocol(FTP)
  • 邮件(SMTP、IMAP)等
  • 点对点文件传出(微信等)

第二类:UDP 场景

  • List item
  • 网络游戏
  • 音视频传输
  • DNS
  • Ping
  • 直播

第三类:模糊地带

  • HTTP(目前以 TCP 为主)
  • List item

文件传输
最后再来总结一下。UDP 不提供可靠性,不代表我们不能解决可靠性。UDP 的核心价值是灵活、轻量,构造了最小版本的传输层协议。在这个之上,还可以实现连接(Connection),实现会话(Session),实现可靠(Reliability)……
协议对于我们来说是非常重要的,协议的制定让所有参与者一致、有序地工作。学习协议的设计,对你的工作非常有帮助。比如:学习 TCP 协议可以培养你思维的缜密性——序号的设计、滑动窗口的设计、快速重发的设计、内在状态机的设计,都是非常精妙的想法;学习 UDP 协议可以带动我们反思自己的技术架构,有时候简单的工具更受欢迎。Linux下每个工具都是那么简单、专注,容易理解。相比 TCP 协议,UDP 更容易理解。从程序架构上来说,今天我们更倾向于简单专注的设计,我们更期望有解决报文传输的工具、有解决可靠性的工具、有解决流量控制的工具、有解决连接和会话的工具……
TCP 最核心的价值就是提供封装好的一套解决可靠性的优秀方案。解决可靠性是非常复杂的,要考虑非常多的因素。TCP 帮助我们在确保吞吐量、延迟、丢包率的基础上,保证可靠性。
历史上 TCP 也是靠可靠性起家的,有一次著名的实验,TCP 协议的设计者做了一次演示——利用 TCP 协议将数据在卫星和地面之间传播了很多次,没有发生任何数据损坏。从那个时候开始,研发人员开始大量选择 TCP 协议。然后随着生态的发展,逐渐提供了流控等能力。TCP的成功在于它给人们提供了很多现成、好用的能力。UDP 则不同,UDP 提供了最小版的实现,只支持 Checksum。UDP 最核心的价值是灵活、轻量、传输速度快。考虑到不同应用的特性,如果不使用一个大而全的方案,为自己的应用特性量身定做,可能会做得更好。比如网络游戏中游戏客户端不断向服务端发送玩家的位置,如果某一次消息丢失了,只要这个消息不影响最终的游戏结果,就可以只看下一个消息。不同应
用有不同的特性,需要的可靠性级别不一样,这就是越来越多的应用开始使用 UDP 的原因之一。其实对于我们来说,TCP 协议和 UDP 协议根本不存在什么优势和劣势,只不过是场景不同,选择不同而已。最后还有一个非常重要的考虑因素就是成本,如果没有足够专业的团队解决网络问题,TCP 无疑会是更好的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/509071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Chroma向量数据库

嵌入向量(vector embedding)是表示任何类型数据的 A.I 原生方式,使它们非常适合与各种 A.I 驱动的工具和算法一起使用。 它们可以表示文本、图像,很快还可以表示音频和视频。 有许多创建嵌入的选项,无论是在本地使用已…

Fiddler 微信小程序抓图教程(傻瓜式|汉化版|狗看了直呼内行)

前言 本篇文章主要给大家详细讲解如何用Fiddler爬取微信小程序的图片,内容图文并茂,流程非常简单,我们开始吧。 目录 获取软件并打开点击工具设置相关代理如何抓图答疑总结 一、获取软件并打开 1、通过百度网盘下载获取安装包(链接是永久的…

深度学习学习路线:从入门到精通

深度学习是机器学习的一个分支,已经成为人工智能领域最热门的技术之一。想要深入学习深度学习,需要具备一定的数学和编程基础。以下是一个深度学习学习路线的建议,可以帮助你快速入门深度学习: 数学基础: 线性代数&am…

从模式识别到图像文档分析——浅析场景文本识别研究

目录 一、场景文本识别工作简述二、基于视觉关系预测复杂场景文本识别2.1、FPN骨干网络2.2、文本片段检测模块2.3、候选关系对构建模块2.4、基于关系网络的连接关系预测2.5、损失函数 三、文档图像智能分析与处理前沿研究 文字作为人类语言的书面形式,是文本图像中最…

APP外包项目的线上维护方案

APP的使用已经非常普及,不论是2C还是2B的APP都已经渗透到了我们生活的方方面面,对于APP的开发公司来说APP项目的线上维护是一个非常重要的问题。如果APP项目比较重要而且用户规模比较大,那更需要专业的技术团队来维护。今天和大家分享这方面的…

神经注释精细化:用于肾上腺分析的新3D数据集的开发

文章目录 Neural Annotation Refinement:Development of a New 3D Dataset for Adrenal Gland Analysis摘要本文方法Neural Annotation Refinement 实验结果 Neural Annotation Refinement:Development of a New 3D Dataset for Adrenal Gland Analysis 摘要 人工注释是不完美…

如何将两张图片合成一张,多方式提高10倍效率

如何将两张图片合成一张?在日常工作和生活过程中,图片无处不在。图片能够及时记录当下生活,并且容易保存和传播。随着技术手段的创新和发展,图片质量也在不断提高。如何将多张图片进行有效合并,从而便于保存呢&#xf…

庄懂的TA笔记(十四)<特效:流动 + 扰动>

庄懂的TA笔记(十四)<特效:流动 扰动> 效果展示: 正文: 大纲: 一、增广: 1、排序问题: 造成这个问题的原因是,他在取背景前,小人的胳膊不算是透…

常用的排序算法--JavaScript

1.冒泡排序 这个函数使用了双重循环,第一个循环用于遍历数组中的每个元素,第二个循环用于比较相邻的元素,如果它们的顺序不正确,则交换它们的位置。在每次内部循环之后,最大的元素都会被移到数组的末尾,因此…

MSR015/MSR025低温漂、低功耗电压基准可pin对pin兼容REF015/REF025

MSR015/MSR025 是低温漂、低功耗、高精度 CMOS 电压基准, 具有0.05% 初始精度、低功耗特点。可pin对pin兼容REF015/REF025。该器件的低输出电压迟滞和低长期输出电压漂移特性,进一步提高稳定性和系统可靠性。 此外,器件的小尺寸和低运行电流特…

《一种使用光电容积图和生物特征进行无需校准的非侵入式血压估计方法》阅读笔记

目录 一、论文摘要 二、论文十问 Q1:论文试图解决什么问题? Q2:这是否是一个新的问题? Q3:这篇文章要验证一个什么科学假设? Q4:有哪些相关研究?如何归类?谁是这一…

GB/T25915.1法规基本标准-附 录 B(资料性)等级划分计算

附 录 B(资料性)等级划分计算实例 B.1 示例1 B.1.1 某个洁净室占地面积18m2,规定洁净度级别为动态ISO5级。使用采样流量为28.3L/min的 离散粒子计数器进行分级测试。2个关注粒径分别为:D≥0.3μm 和D≥0.5μm。 查表 A.1,采样点数 NL 为6。 B.1.2 从表1查得ISO5级的粒子浓度…

设计模式梳理

快速回顾 类别名称应用场景例子创建型模式Factory模式共用统一接口AbstactFactory模式共用统一接口Singleton模式只构建一次,每次构建只返回自己Builder模式一步步的进行复杂对象的构建链式构造器,解决复杂对象多个属性可选择性地设置的问题&#xff0c…

【ChatGPT】你会是被AI抢饭碗的那类人吗?

文章目录 前言一、AI替代“基础性工作”,二、AI没有魔法:人类做不到,它也做不到三 人类的恐惧:被替代、被超越四 AI让语言返祖,小语种与文化“濒危灭绝”五 人类的未来,教育何去何从?总结 前言 …

2023/5/9总结

Java基础(3) 1、成员变量和局部变量的区别 2.private关键字 是一个权限修饰符可以修饰成员变量和成员方法作用是保护成员不被别的类使用,被private修饰的成员只能在本类中才能访问 针对private修饰的成员变量,如果需要被其它类使…

缓存穿透、缓存雪崩和缓存击穿

1 缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存中没有,每次查询都要去数据库中查询,导致频繁地访问数据库,从而影响系统的性能。攻击者可以利用这一点,对系统进行拒绝服务攻击。 1.1 缓存穿透举例 攻击者…

课程《JavaWeb基础框架程序设计》考试题上篇——基础应用题(计算应用、水仙花数)

文章目录 📋前言🎯第一题(30分)🎯第二题(30分)📝最后 📋前言 这篇文章是大学课程《JavaWeb基础框架程序设计》考试题目的内容,包括了原题和答案。题目只包括…

开关电源基础07:离线式开关电源变压器设计(2)

说在开头:关于那几年 1933年希特勒上台成为德国总理,纳粹党开始了针对犹太人的运动。英国的弗雷德里克.亚历山大.林德曼教授到访柏林,他制定了一份名单,开列的都是处境不妙的犹太科学家,趁机邀请他们离开德国&#xf…

Java EE--多线程(一)

目录 一、认识多线程 1.1 概念 (1) 线程是什么 (2)为啥要有线程? (3) 进程和线程的区别 (4)Java 的线程和操作系统线程的关系 1.2 创建线程 方法1 继承 Thread 类 方法2 实现Runnable接口…

数据结构学习记录——哈夫曼树(什么是哈夫曼树、哈夫曼树的定义、哈夫曼树的构造、哈夫曼树的特点、哈夫曼编码)

目录 什么是哈夫曼树 哈夫曼树的定义 哈夫曼树的构造 图解操作 代码实现 代码解析 哈夫曼树的特点 哈夫曼编码 不等长编码 二叉树用于编码 哈夫曼编码实例 什么是哈夫曼树 我们先举个例子&#xff1a; 要将百分制的考试成绩转化成五分制的成绩 if(score < …