Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >计网 - TCP 协议 VS UDP 协议

计网 - TCP 协议 VS UDP 协议

作者头像
小小工匠
发布于 2021-08-17 02:38:52
发布于 2021-08-17 02:38:52
58100
代码可运行
举报
文章被收录于专栏:小工匠聊架构小工匠聊架构
运行总次数:0
代码可运行

文章目录


Pre

计网 - 传输层协议 TCP:TCP 为什么握手是 3 次、挥手是 4 次?中提到了T CP 和 UDP 是今天应用最广泛的传输层协议,拥有最核心的垄断地位。

TCP 最核心的价值是提供了可靠性,而 UDP 最核心的价值是灵活,你几乎可以用它来做任何事情

例如:HTTP 协议 1.1 和 2.0 都基于 TCP,而到了 HTTP 3.0 就开始用 UDP 了。

UDP 在数据传输、网络控制、音视频、Web 技术中,都有很重要的地位. 设计系统时候,UDP 经常拿来和 TCP 比较. 那我们来粗略的看下 TCP 协议和 UDP 协议的优势和劣势吧


UDP 协议

UDP(User Datagram Protocol),目标是在传输层提供直接发送报文(Datagram)的能力。Datagram 是数据传输的最小单位。UDP 协议不会帮助拆分数据,它的目标只有一个,就是发送报文

额,既然是直接发送报文, 为什么不直接调用 IP 协议呢? 如果裸发数据,IP 协议不香吗?

这是因为传输层协议在承接上方应用层的调用,需要提供应用到应用的通信——因此要附上端口号。每个端口,代表不同的应用。传输层下层的 IP 协议,承接传输层的调用,将数据从主机传输到主机。IP 层不能区分应用,导致哪怕是在 IP 协议上进行简单封装,也需要单独一个协议。这就构成了 UDP 协议的市场空间。


UDP 的封包格式

UDP 的设计目标就是在允许用户直接发送报文的情况下,最大限度地简化应用的设计。下图是 UDP 的报文格式。

可以看到,UDP 的报文非常简化,只有 5 个部分。

1. Source Port 是源端口号。因为 UDP 协议的特性(不需要 ACK),因此这个字段是可以省略的。但有时候对于防火墙、代理来说,Source Port 有很重要的意义,它们需要用这个字段行过滤和路由

2. Destination Port 是目标端口号(这个字段不可以省略)。

3. Length 是消息体长度。

4. Checksum 是校验和,作用是检查封包是否出错。

5. Data octets 就是一个字节一个字节的数据,Octet 是 8 位。


校验和(Checksum)机制

校验和(Checksum)机制,这个机制在很多的网络协议中都会存在,因为校验数据在传输过程中有没有丢失、损坏是一个普遍需求。

在一次网络会话中,我们传输的内容可能是:“你好!”,但事实上传输的是 01 组成的二进制。请思考这样一个算法,我们把数据分成一个一个 byte,然后将所有 byte 相加,再将最终的结果取反。

比如现在数据有 4 个 byte:a,b,c,d,那么一种最简单的校验和就是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
checksum=(a+b+c+d) ^ 0xff

如果发送方用上述方式计算出 Checksum,并将 a,b,c,d 和 Checksum 一起发送给接收方,接收方就可以用同样的算法再计算一遍,这样就可以确定数据有没有发生损坏(变化)。当然 Checksum 的做法,只适用于数据发生少量变化的情况。如果数据发生较大的变动,校验和也可能发生碰撞。

可以看到 UDP 的可靠性保证仅仅就是 Checksum 一种。如果一个数据封包 Datagram 发生了数据损坏,UDP 可以通过 Checksum 纠错或者修复。 但是 UDP 没有提供再多的任何机制,比如 ACK、顺序保证以及流控等


UDP 与 TCP的区别

1. 目的差异

首先,这两个协议的目的不同:TCP 协议的核心目标是提供可靠的网络传输,而 UDP 的目标是在提供报文交换能力基础上尽可能地简化协议轻装上阵。


2. 可靠性差异

TCP 核心是要在保证可靠性提供更好的服务。TCP 会有握手的过程,需要建立连接,保证双方同时在线。而且TCP 有时间窗口持续收集无序的数据,直到这一批数据都可以合理地排序组成连续的结果。

UDP 并不具备以上这些特性,它只管发送数据封包,而且 UDP 不需要 ACK,这意味着消息发送出去成功与否 UDP 是不管的。


3. 连接 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)
  • File Transfer Protocol(FTP)
  • 邮件(SMTP、IMAP)等
  • 点对点文件传出(微信等)

第二类:UDP 场景

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

第三类:模糊地带

  • HTTP(目前以 TCP 为主)
  • 文件传输

以上我们从多个方面了解了 TCP 和 UDP 的区别,最后再来总结一下。UDP 不提供可靠性,不代表我们不能解决可靠性。UDP 的核心价值是灵活、轻量,构造了最小版本的传输层协议。在这个之上,还可以实现连接(Connection),实现会话(Session),实现可靠性(Reliability)……


总结

这里针对 UDP 协议的内容进行了探讨, 互联网协议群的传输层大体过了一遍。协议对于我们来说是非常重要的,协议的制定让所有参与者一致、有序地工作。

学习协议的设计,对工作非常有帮助。比如:

  • 学习 TCP 协议可以培养思维的缜密性——序号的设计、滑动窗口的设计、快速重发的设计、内在状态机的设计,都是非常精妙的想法;
  • 学习 UDP 协议可以带动我们反思自己的技术架构,有时候简单的工具更受欢迎。Linux 下每个工具都是那么简单、专注,容易理解。相比 TCP 协议,UDP 更容易理解。

从程序架构上来说,今天我们更倾向于简单专注的设计,我们更期望有解决报文传输的工具、有解决可靠性的工具、有解决流量控制的工具、有解决连接和会话的工具……


QA

好了 说一说 TCP 协议和 UDP 协议的优势和劣势?

TCP 最核心的价值就是提供封装好的一套解决可靠性的优秀方案。TCP 帮助我们在确保吞吐量、延迟、丢包率的基础上,保证可靠性。

历史上 TCP 也是靠可靠性起家的,有一次著名的实验,TCP 协议的设计者做了一次演示——利用 TCP 协议将数据在卫星和地面之间传播了很多次,没有发生任何数据损坏。从那个时候开始,研发人员开始大量选择 TCP 协议。然后随着生态的发展,逐渐提供了流控等能力。TCP 的成功在于它给人们提供了很多现成、好用的能力。

UDP 则不同,UDP 提供了最小版的实现,只支持 Checksum。UDP 最核心的价值是灵活、轻量、传输速度快。

考虑到不同应用的特性,如果不使用一个大而全的方案,为自己的应用特性量身定做,可能会做得更好。比如网络游戏中游戏客户端不断向服务端发送玩家的位置,如果某一次消息丢失了,只要这个消息不影响最终的游戏结果,就可以只看下一个消息。不同应用有不同的特性,需要的可靠性级别不一样,这就是越来越多的应用开始使用 UDP 的原因之一。

其实对于我们来说,TCP 协议和 UDP 协议根本不存在什么优势和劣势,只不过是场景不同,选择不同而已。最后还有一个非常重要的考虑因素就是成本,如果没有足够专业的团队解决网络问题,TCP 无疑会是更好的选择

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/07/04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
TCP和UDP对比的优势和劣势
TCP和UDP都是传输层协议。TCP最核心的是提供了可靠性,而UDP核心是灵活性高。HTTP1.0和2.0用的是TCP,到了HTTP3.0用的就是UDP了。
NeilNiu
2023/03/01
5820
UDP协议
1)源端口号,占16bit , 用于区分数据来源端口,即用于区分数据来自哪个进程。
数据小冰
2022/08/15
1.5K0
UDP协议
udp协议:udp和tcp相比快在哪里?
UDP 不支持可靠性,但是像校验和(Checksum)这一类最基本的数据校验,它还是支持的。
老马的编程之旅
2022/06/22
5800
详解TCP和UDP协议的原理和区别?
TCP和UDP是网络通信协议中两个常见的传输层协议,它们具有不同的特点和适用场景。本文将详细介绍TCP和UDP协议的原理和区别。
用户1289394
2023/08/22
9850
详解TCP和UDP协议的原理和区别?
TCP 和 UDP ...
有一个小姑娘在对着瓶口慢慢喝水,下面写着可靠的传输,少女的衣服没有被水浸湿,这张图被称为 TCP 。
ICT系统集成阿祥
2024/12/03
1080
TCP 和 UDP ...
UDP协议重点总结(附实例)
回顾2022年,展望2023年,博主给大家带来了网络中传输层的重点总结,附上博主本人的实例,帮助大家更好的理解数据是怎么在网络中传输的。
VIBE
2023/01/06
8920
UDP协议重点总结(附实例)
TCP/IP协议族
物理层(RS-232、V.35)和 数据链路层(HDLC、X.25)涉及到在通信信道上传输的原始比特流,它实现传输数据所需要的机械、电气、功能性及过程等手段,提供检错、纠错、同步等措施,使之对网络层显现一条无错线路;并且进行流量调控。Bits、Frames
mcxfate
2020/08/02
8260
[NetWork] TCP/UDP 基本原理
序列号 - 32Bit 用来标识源端设备向目的端发送的数据的编号,(相当于一个计数器)
BreezeCloud
2022/12/20
4660
[NetWork] TCP/UDP 基本原理
TCP 和 UDP 有什么区别?
TCP 和 UDP 都是 TCP/IP 协议簇中的比较有代表性的 传输层协议。这里的传输层负责为应用程序提供端对端的通信服务。
前端西瓜哥
2022/12/21
4870
TCP和UDP的区别
我们都知道TCP和UDP作为传输协议,被广泛应用于网络通信。这些基础的网络知识也是需要了解,既然两种传输协议都可以用于通信,那它们两者又有何区别。本文将以下面5个点进行对比:
WahFung
2022/05/11
6800
TCP和UDP的区别
传输层协议TCP与UDP
主机是用IP地址来标识的,而要标识主机中的进程,就需要使用端口号。TCP/IP协议族中,端口号占16 bit,用0~65535之间的整数标识。TCP和UDP是两个独立的软件模块,因此各自的端口号也相互独立。·端口号只具有本地意义,不同计算机的相同端口号是没有联系的。
十二惊惶
2024/02/28
6350
传输层协议TCP与UDP
关于TCP/IP
由于 OSI 模型过于复杂难以实现,导致 TCP/IP 模型更早地应用在现实中,这也使得 TCP/IP 模型成为标准
Leophen
2019/08/23
5070
关于TCP/IP
KCP协议:从TCP到UDP家族QUIC/KCP/ENET
行文前先安利下《再深谈TCP/IP三步握手&四步挥手原理及衍生问题—长文解剖IP 》、《再谈UDP协议—浅入理解深度记忆》
周陆军
2022/03/27
7.8K0
KCP协议:从TCP到UDP家族QUIC/KCP/ENET
TCP 和 UDP 的区别:解析网络传输协议
在开始之前,推荐大家阅读一篇文章《好技能 | Chromium 是如何解决队头阻塞问题的》https://cloud.tencent.com/developer/article/2470234,该文章介绍了 Chromium 为解决队头阻塞问题,从 2013 年起多次迭代重构底层消息机制的过程,有兴趣的朋友可以去了解下。
一杯茶Ja
2024/11/23
1.3K0
计算机网络OSI传输层
cheese
2023/10/25
2880
计算机网络OSI传输层
传输层Stu
** 为运行在不同主机上的应 用进程提供逻辑通信 ** ** 传输协议运行在端系统 **
用户11097514
2024/05/31
840
传输层Stu
TCP/UDP协议基本概念
TCP和UDP协议是TCP/IP协议的核心。 TCP 传输协议:TCP 协议是一TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。通俗说,它是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送;而UDP则不为IP提供可靠性、流控或差错恢复功能。一般来说,TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用。
Lansonli
2021/10/09
6460
UDP与TCP:网络传输协议的对比与应用
TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。它通过“三次握手”建立连接,确保数据在传输过程中不丢失、不重复,并且按顺序到达接收端。TCP协议通过校验和、序列号、确认应答、超时重传、滑动窗口等机制来保证数据的可靠传输。
用户11396661
2025/02/10
2000
【Linux网络】网络基础:传输层UDP/TCP协议(一)
前言:传输层协议,特别是用户数据报协议(UDP)和传输控制协议(TCP),是网络通信中最为基础也最为重要的部分。它们不仅决定了数据的传输方式,还影响着数据的可靠性、顺序性和实时性。对于想要深入了解互联网运行机制、掌握网络通信技术的朋友们来说,学习UDP/TCP协议无疑是必经之路。
Eternity._
2024/12/13
1610
【Linux网络】网络基础:传输层UDP/TCP协议(一)
三十天学不会TCP,UDP/IP网络编程-UDP,从简单的开始
如果对和程序员有关的计算机网络知识,和对计算机网络方面的编程有兴趣,欢迎去gitbook(https://www.gitbook.com/@rogerzhu/)star我的这一系列文章,虽然说现在这种“看不见”的东西真正能在实用中遇到的机会不多,但是我始终觉得无论计算机的语言,热点方向怎么变化,作为一个程序员,很多基本的知识都应该有所了解。而当时在网上搜索资料的时候,这方面的资料真的是少的可怜,所以,我有幸前两年接触了这方面的知识,我觉得我应该把我知道的记录下来,虽然写的不一定很好,但是希望能给需要帮助的人
一心一怿
2018/04/16
7520
三十天学不会TCP,UDP/IP网络编程-UDP,从简单的开始
相关推荐
TCP和UDP对比的优势和劣势
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验