百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

TCP 和 UDP,哪个更胜一筹?

myzbx 2025-04-24 05:32 35 浏览

作为 TCP/IP 中两个最具有代表性的传输层协议,TCP 和 UDP 经常被拿出来相互比较。这些协议具体有什么区别,又是什么作用呢?

在 IT 圈混迹多年的小伙伴们,对 TCP 和 UDP 肯定再熟悉不过了。作为计算机网络专业毕业多年的二狗子,除了自己 OSI 七层和 TCP/IP 四层模型,就是对网络协议印象比较深刻了。在面试中,网络协议也是我们必须要掌握的知识。作为 TCP/IP 中两个最具有代表性的传输层协议,TCP 和 UDP 经常被拿出来相互比较。

今天我们就来简单聊聊 TCP 和 UDP,不过在讲 TCP 和 UDP之前,我们先来了解一下 TCP/IP。

收藏的129页kcp优秀博文和下面视频,免费分享,私信【1】获取

TCP/IP 网络模型

网络设备之间要互相通信,双方就必须用相同的方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则。而这种规则就称之为协议(Protocol)。

TCP/IP 是互联网相关的各类协议族的总称,它以两个原始协议:传输控制协议(TCP)和Internet 协议(IP)来命名。比如:TCP,UDP,IP,FTP,HTTP,ICMP,SMTP 等都属于 TCP/IP 族内的协议。TCP/IP 模型是互联网的基础,它可以划分为四层,分别为链路层、网络层、传输层和应用层。

  • 链路层:负责封装和解封装 IP 报文,发送和接受 ARP/RARP 报文等。
  • 网络层:负责路由以及把分组报文发送给目标网络或主机。
  • 传输层:负责对报文进行分组和重组,并以 TCP 或 UDP 协议格式封装成报文。
  • 应用层:负责向用户提供应用程序,比如 HTTP、FTP、Telnet、DNS、SMTP 等。

下面我们主要来介绍一下传输层协议:TCP 和 UDP。

TCP

TCP 全称为传输控制协议(Transmission Control Protocol),它由 IETF 的 RFC 793 定义,是一种面向连接的点对点传输通信协议,它以有序顺序将数据包作为非结构化字节流发送。

TCP 通过使用序列号和确认消息,从发送节点提供有关传输到目标节点的数据包的传递的信息。TCP 确保数据的可靠性,端到端传递,重新排序和重传,直到达到超时条件或接收到数据包的确认为止。

TCP 是 Internet 上最常用的协议。当我们在浏览器中请求网页时,计算机会显示 TCP 数据包发送到 Web 服务器的地址,要求它将网页返还给我们。Web 服务器通过发送 TCP 数据包流进行响应,然后浏览器将这些数据包缝合在一起形成网页。TCP 的全部意义在于它的可靠性,它通过对数据包编号来对其进行排序,而且它会通过让服务器将响应发送回浏览器说“已收到”来进行错误检查。因此在传输过程中不会丢失或破坏任何数据。

我们接下来看下 TCP 的连接过程:

1.TCP 的连接过程(三次握手)

  • 主机 A 通过将 TCP SYN 数据包发送到主机 B 来建立连接。其中包含了随机序列号(4321),该号标记了 A 将要发送数据的序号的开始。
  • B 接收到数据包并以自己的序列号(5501)进行响应。响应中还包含确认号,该号是 A 的序列号加 1(4322)。
  • A 通过发送确认号来确认服务器的响应,该确认号是 B 的序列号加 1(5502)。

2.TCP 终止连接

TCP 是全双工的,在断开连接时两端都需要发送 FIN 和 ACK。

  • 若客户端 A 认为数据发送完成,则它需要向服务端 B 发送连接释放请求。
  • B 收到连接释放请求后,会告诉应用层要释放 TCP 链接。然后会发送 ACK 包,并进入 CLOSE_WAIT 状态,此时表明 A 到 B 的连接已经释放,不再接收 A 发的数据了。但是因为 TCP 连接是双向的,所以 B 仍旧可以发送数据给 A。
  • B 如果此时还有没发完的数据会继续发送,完毕后会向 A 发送连接释放请求,然后 B 便进入 LAST-ACK 状态。
  • A 收到释放请求后,向 B 发送确认应答,此时 A 进入 TIME-WAIT 状态。该状态会持续 2MSL(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有 B 的重发请求的话,就进入 CLOSED 状态。当 B 收到确认应答后,也便进入 CLOSED 状态。

UDP

用户数据报协议(User Datagram Protocol)是一种无连接的传输层通信协议,用于建立低容错和丢失等待时间的连接,可以在网络内或跨网络传递服务或数据包。UDP 有不提供数据包分组、组装和不能对数据包进行排序的缺点。也就是说,当报文发送之后,是无法得知其是否安全完整到达的。

当应用程序使用 UDP 时,数据包仅发送到目标。发送者不必等待确保接收者已收到该数据包,它会继续发送下一个数据包。如果目标错过了一些数据包,则它们只会被丢掉,发送者不会重新发送它们。这也意味着设备可以更快地进行通信。

例如在游戏中,如果我们因为网络原因错过了接收一些 UDP 数据包,那当收到较新的数据包时,游戏画面可能会跳帧。如果错过了旧数据包,错过了就是错过了,因为就算没有我们,游戏也会继续运行。在游戏中重要的是正在发生的事情,而不是几秒钟前发生的事情。抛弃一些错误有助于加快游戏连接速度并减少延迟。

大多数应用程序都需要 TCP 的可靠性和纠错机制,但是某些应用程序也需要 UDP 的高效性和降低开销。我们可以通过一些诸如 Wireshark、Fiddler 等网络分析工具,就可以看到发送和接收不同类型的数据包。

TCP vs UDP

TCP 和 UDP 有许多区别和相似之处。它们都是通过 Internet 发送数据包的最常用的协议。并且它们都在 TCP/IP 协议栈的传输层上工作。

一个简单的例子,可以清楚地了解两者的差异:

假设有两座房子,House1 和 House2,并且必须从 H1 发送一封信到 H2。但是这两座房子之间有一条河。现在我们如何寄信?

解决方案 1:在河上架桥,然后将其交付。

解决方案 2:通过鸽子运送。

将第一个解决方案视为 TCP,必须进行连接(桥)才能传递数据(信)。

这样得到的数据是可靠的,因为它可以直接到达另一端而不会丢失或者出错。

第二种解决方案类似 UDP,无需连接即可发送数据。与需要建立连接(桥)的 TCP 相比,该过程更快。但是数据并不可靠:因为我们并不知道这只鸽子是否会朝正确的方向前进,或者会在途中掉信或遇到一些其他问题。

简单总结下 TCP 和 UDP 的区别:

**连接和无连接:**TCP 是面向连接的协议,而 UDP 是无连接协议。TCP 可以在发送数据之前在发送方和接收方之间建立连接。而 UDP 在发送数据之前不会先建立连接。

**可靠性:**TCP 是可靠的。使用 TCP 协议发送的数据可以保证传递到接收。如果数据在传输过程中丢失,它会恢复数据并重新发送。TCP 还将检查数据包中的错误并跟踪数据包,以保证数据不会丢失或损坏。

而 UDP 是不可靠的,它不能提供有保证质量的传递,并且数据报包可能会在传输中损坏或丢失。

**流量控制:**TCP 使用流控制机制来确保发送者不会一次发送太多数据包而压倒接收者。TCP 将数据存储在发送缓冲区中,并在接收缓冲区中接收数据。当应用程序准备就绪时,它将从接收缓冲区读取数据。如果接收缓冲区已满,则接收器将无法处理更多数据并将其丢弃。为了保持可以发送给接收方的数据量,接收方会告诉发送方接收缓冲区中有多少剩余空间(接收窗口)。每次接收到数据包时,都会使用当前接收窗口的值向发送方发送一条消息。UDP 不提供流控制。使用 UDP,数据包以连续流的形式到达或被丢弃。

**速度:**TCP 比 UDP 慢,因为它“顾虑”比较多:TCP 必须建立连接,进行错误检查,并确保按照发送顺序接收文件。而 UDP 则更简单,更高效。

**使用场景:**TCP 最适合用于对时序不太关心的,且要求高可靠性的应用程序。

  • 万维网(HTTP,HTTPS)
  • 安全外壳(SSH)
  • 文件传输协议(FTP)
  • 电子邮件(SMTP,IMAP / POP)

UDP 最适合需要速度和效率的应用程序。

  • 串流影片
  • 线上游戏
  • 现场直播
  • 域名系统(DNS)
  • 互联网协议语音(VoIP)
  • 普通文件传输协议(TFTP)

聊了这么多,相信你对 TCP 和 UDP 也有了基本的了解,那么你认为:TCP 和 UDP,哪个更胜一筹呢?

相关推荐

怎么恢复7z文件 7z文件删除了怎么恢复

7z是一种压缩格式的文件,它运用LZMA压缩算法,该压缩算法的输出稍后被算数编码进行处理以便后续进一步压缩,压缩比十分高。我们可以将文件压缩成这种格式,便于传输,保存,占空间少。了解更多7z文件知识...

郎酒让消费者喝得明明白白 算术题里有答案

日前,『郎酒酱香产品企业内控准则』颁布,郎酒首次公开酱香产品生产全过程,公布酱香产品产能、储能及投放计划。随后,郎酒官微向消费者发出「品控算术题」有奖问答。郎酒亮出家底,消费者踊跃留言。8天后,谜底揭...

学龄前,比识字、算术更重要的是这三件事

“为了给孩子选择一家合适的幼儿园,我曾穿梭于纽约各家幼儿园的开放日,这些幼儿员既包括主流的公立幼儿园,还包括那些遥不可及的私人幼儿园。我的目的就是想了解他们的教育理念是什么,到底厉害在哪里,看看对于我...

参加CSP-J信奥赛需要掌握数学知识

在C++语法的学习中需要储备的数学知识如下①数据类型:需要知道整数、正整数、负整数、小数、判断对错②算术运算符:加法、减法、乘法、除法、取模运算③关系表达式:大于、大于等于、小于、小...

1g米饭能做多少深蹲?今天我们来算一算

减重我们都知道3分在练,7分在吃,吃这件事情上,真的是每一口都算数。今天我们来算一笔账,1粒米饭可以做多少事情?本着认真负责的态度,今天在食物秤上称了1g米饭,是16粒。根据能量换算:100g米饭是4...

web 自动化测试,一定得掌握的 8 个核心知识点

使用cypress进行端对端测试,和其他的一些框架有一个显著不同的地方,它使用JavaScript作为编程语言。传统主流的selenium框架是支持多语言的,大多数QA会的pytho...

大话C语言:赋值运算符(c语言中赋值运算符是什么)

赋值运算符是最基本的运算符之一,用于将右侧的值或表达式的计算结果赋给左侧的变量。它是一个二元运算符,意味着它需要两个操作数:一个是目标变量(左侧),另一个是要赋给该变量的值或表达式(右侧)。赋值运算符...

Vue进阶(幺幺伍):js 将字符串转换为boolean

Boolean();参数为0、null和无参数返回false,有参数返回true。Boolean("");//输出为:falseBoolean(null);//输出为...

mongodb查询的语法(大于,小于,大于或等于,小于或等于等等)

1).大于,小于,大于或等于,小于或等于$gt:大于$lt:小于$gte:大于或等于$lte:小于或等于例子:db.collection.find({"field":{$gt:valu...

Python学不会来打我(21)python表达式知识点汇总

在Python中,表达式是由变量、运算符、函数调用等组合而成的语句,用于产生值或执行特定操作。以下是对Python中常见表达式的详细讲解:1.1算术表达式涉及数学运算的表达式。例如:a=5b...

C|数据存储地址与字节偏移、数据索引

话说C是面向内存的编程语言。数据要能存得进去,取得出来,且要考虑效率。不管是顺序存储还是链式存储,其寻址方式总是很重要。顺序存储是连续存储。同质结构的数组通过其索引表示位置偏移,异质结构的结构体通过其...

下班后累懵?4 个 JS 手写题帮你搞定前端面试高频考点

打工人下班后最痛苦的事,莫过于拖着疲惫的身子还要啃前端面试题吧?看着那些密密麻麻的JS代码,脑子都快转不动了!别担心,今天咱就用轻松的方式,带你吃透4道高频手写题,让你在面试时自信满满,再也不...

嵌入式数据库sqlite3【进阶篇】-子句和函数的使用,小白一文入门

sqlite在《嵌入式数据库sqlite3命令操作基础篇-增删改查,小白一文入门》一文中讲解了如何实现sqlite3的基本操作增删改查,本文介绍一些其他复杂一点的操作。比如where、orderby...

前缀表达式与后缀表达式(前缀表达式后缀表达式中缀表达式计算)

昨天晚上和儿子一起学习了前缀表达式和后缀表达式。这应该是字符串算式如何被计算机识别并计算的2种方法。本来是想先给他讲一个逆波兰式(后缀表达式),以后再讲前缀表达式。没想到他还挺聪明,很快就把2个都掌握...

Python快速入门教程1:基本语法、数据类型、运算符、数字字符串

Python3的基础教程,涵盖了基本语法、数据类型、类型转换、解释器、注释、运算符、数字和字符串等内容,并附有使用实例场景。Python3的基础教程,涵盖了基本语法、数据类型、类型转换、解释器、注释、...