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

TCP vs UDP:揭秘可靠性与效率之争

概述

今天我们开始主要讲解TCP的相关知识点。在之前讲解分层章节的时候,我们提到过一个重要观点。在网络层及以下几层,更多的是让主机与主机建立连接,也就是说你的电脑需要知道另一台电脑在哪里才能连接上它。然而,在网络中的通信往往是进程间的通信,而不是机器间的通信。因此,TCP协议引入了端口的概念。一个端口只能被一个进程占用,这样就可以为运行在不同主机上的应用进程提供直接的通信服务。

运输层的任务是如何为运行在不同主机上的应用进程提供直接的通信服务,因此也被称为端到端的协议。运输层屏蔽了网络核心的细节,使应用进程看到的就像是在两个运输层实体之间有一条端到端的逻辑通信信道。

TCP的全称是Transmission Control Protocol,它被称为一种面向连接的协议。这意味着在一个应用程序开始向另一个应用程序发送数据之前,这两个进程必须先进行握手。握手是一个逻辑连接的过程,它确保了数据的可靠传输和有序接收。在握手过程中,源主机和目标主机之间通过交换一系列的控制报文来建立连接,并约定一些参数和规则,以确保数据的成功传输。

TCP 基本认识

什么是 TCP ?

TCP(Transmission Control Protocol)是一种面向连接、可靠的、基于字节流的传输层通信协议。

image

  • 面向连接:面向连接意味着TCP通信是一对一的,即点对点端到端的通信,不像UDP可以同时向多个主机发送消息,因此无法实现一对多的通信。
  • 可靠的:TCP的可靠性保证了无论网络链路中发生何种变化,TCP都能确保报文的可靠传输到达接收端,这也使得TCP的协议报文格式相比UDP更为复杂。
  • 基于字节流:基于字节流的特性使得TCP可以传输任意大小的消息,而且保证了消息的有序性,即使前一个消息未被完全接收,即使后面的字节已经接收,TCP也不会将其交付给应用层处理,同时对于重复的报文会自动丢弃。

一旦主机 A 和主机 B 建立了连接,应用程序只需使用该虚拟通信线路进行数据的发送和接收,由此确保数据的传输。TCP 协议负责控制连接的建立、断开和保持等任务。需要注意的是,此处我们说的虚拟线路只是说明了建立连接,TCP协议的建立连接只是表明双方可以开始进行数据传输了,并且确保了数据的可靠性。具体的路由和传输节点由网络设备进行处理,TCP协议本身并不关心这些细节。

TCP连接是一种全双工服务(full-duplex service) 的,全双工指的是在TCP连接中,主机A和主机B可以同时进行双向数据传输。也就是说,数据可以在主机A和主机B之间以双向流动的方式传输。

TCP会将数据临时存储到连接的发送缓存(send buffer)中。这个send buffer是在三次握手期间设置的缓存之一。随后,TCP会在适当的时间将发送缓存中的数据发送到目标主机的接收缓存中。实际上,每一端都会拥有发送缓存和接收缓存,具体如下所示:
image

发送缓存(send buffer)是在发送端的TCP实现中维护的一块内存区域,它用于临时存储要发送的数据。在进行三次握手建立连接时,发送缓存就开始被设置并用于存储数据。发送缓存会按照网络的拥塞情况和接收端的反馈信息来动态调整。

接收缓存(receive buffer)是在接收端的TCP实现中维护的一块内存区域,它用于临时存储接收到的数据。TCP会将接收到的数据存储到接收缓存中,等待上层应用程序读取。

需要注意的是,发送缓存和接收缓存的大小是有限的,当缓存已满时,TCP可能会采取一些策略,如拥塞控制、流量控制等来保证数据的可靠传输和网络的稳定性。

在计算机网络中,主机之间的数据传输是通过报文段(segment)进行的。那么什么是报文段呢?

TCP会将要传输的数据流分为多个块(chunk),然后为每个块添加TCP标头,从而形成了一个TCP段,也就是报文段。每个报文段能够传输的长度是有限的,不能超过最大数据长度(Maximum Segment Size,简称MSS)。在报文段向下传输的过程中,会经过链路层。链路层有一个最大传输单元(Maximum Transmission Unit,简称MTU),即数据链路层上所能通过的最大数据包大小。最大传输单元通常与通信接口有关。

那么MSS和MTU有什么区别呢?

在计算机网络中,分层架构是非常重要的,因为它考虑到了不同层次之间的差异。每个层次都有不同的名称,在传输层,数据被称为报文段(segment),而在网络层,数据被称为IP数据包(IP packet)。因此,MTU(Maximum Transmission Unit)可以被认为是网络层所能传输的最大IP数据包的大小,而MSS(Maximum Segment Size)则是传输层的概念,指的是TCP数据包每次可以传输的最大数据量。

注意下,当MSS(Maximum Segment Size)大于MTU(Maximum Transmission Unit)时,在网络层会进行IP分片,并不是TCP会将较大的数据分割成适合MTU大小的报文段进行传输,关于IP层我们会有网络层章节专门讲解。

TCP报文段结构

让我们来探讨一下TCP头的格式和内容。

image

序列号:在建立连接时由计算机生成的随机数作为其初始值在建立TCP连接时,并将该序列号通过SYN包发送给接收端。在数据传输过程中,发送端会根据发送的数据量递增序列号。接收端根据接收到的序列号来判断数据的顺序,如果发现有乱序的数据到达,接收端会重新排序,确保数据的有序性。

确认应答号:是TCP协议中用来确认接收到数据的序列号。它指示了发送端期望接收到的下一个数据的序列号。在TCP连接中,接收端会根据接收到的数据报文段的序列号,确定已经成功接收到的数据。当接收端成功接收到数据后,会向发送端发送一个ACK包,其中包含了确认应答号。发送端在收到ACK包后,可以确认在确认应答号之前的数据已经被接收成功。

TCP报文段的控制位包括以下几种:

  • ACK位:当该位为1时,表示确认应答字段有效。TCP规定除了最初建立连接时的SYN包之外,该位必须设置为1。
  • RST位:当该位为1时,表示TCP连接中出现异常,必须强制断开连接。
  • SYN位:当该位为1时,表示希望建立连接,并在序列号字段进行序列号初始值的设定。
  • FIN位:当该位为1时,表示今后不会再有数据发送,希望断开连接。

TCP的各种功能和特点都是通过TCP报文段的结构来体现的。

什么是UDP?

UDP(User Datagram Protocol)是一种面向无连接的通信协议,相比于TCP,UDP不提供复杂的控制机制。UDP协议允许应用程序在不建立连接的情况下直接发送封装的IP数据包。开发人员选择使用UDP而不是TCP时,应用程序与IP直接进行通信。

UDP协议的完整名称是用户数据报协议(User Datagram Protocol),其头部只有8个字节(64位),非常简洁。UDP头部的格式如下:

image

  • 目标和源端口:主要作用是指示UDP将报文发送给哪个进程。
  • 包长度:包长度字段保存了UDP首部的长度加上数据的长度之和
  • 校验和:设计目的是为了保证UDP首部和数据的可靠传输。校验和的作用是检测在UDP数据包传输过程中是否发生了错误或损坏,以确保数据的完整性。

TCP 和 UDP 区别

TCP和UDP的区别主要体现在以下几个方面:

连接方式:TCP是一种面向连接的传输层协议,传输数据之前需要先建立连接。而UDP则不需要连接,可以即刻传输数据。

服务对象:TCP是一对一的两点服务,即一条连接只有两个端点之间进行通信。而UDP支持一对一、一对多、多对多的交互通信,可以同时与多个主机进行通信。

可靠性:TCP提供可靠交付数据的服务,保证数据无差错、不丢失、不重复、按需到达。而UDP则是尽最大努力交付数据,不保证可靠交付。UDP在传输过程中可能会出现数据丢失等情况。

拥塞控制、流量控制:TCP具有拥塞控制和流量控制机制,可以根据网络情况调整数据传输速率,以保证数据传输的安全性和稳定性。而UDP没有拥塞控制和流量控制机制,即使网络非常拥堵,也不会对UDP的发送速率做出调整。

首部开销:TCP的首部长度较长,通常为20个字节,当使用了选项字段时,首部长度会变长。而UDP的首部只有8个字节,并且是固定不变的,因此UDP的首部开销较小。

TCP 和 UDP 应用场景:

TCP 和 UDP 是两种不同的传输层协议,它们在应用场景上有着一些区别。

由于 TCP 是是面向连接的协议,主要用于需要可靠数据传输的场景,一些常见的应用场景包括:

  • FTP 文件传输:TCP 可以确保文件在传输过程中不丢失和损坏。
  • HTTP / HTTPS:TCP 可以确保网页内容的完整性和正确性。

由于 UDP 是无连接的协议,它不提供可靠性保证,但具有高效性和实时性的特点。UDP 适用于以下场景:

  • 包总量较少的通信,如 DNS (Domain Name System):DNS 查询通常是短小的数据包,UDP 可以更快地完成查询操作。
  • 视频和音频等多媒体通信:对于实时性要求较高的多媒体传输,UDP 可以提供更低的延迟,确保数据能够及时传输。
  • 广播通信:UDP 支持一对多和多对多的通信,可以用于广播消息的传输。

总结

今天我们学习了TCP的相关知识。TCP是一种面向连接、可靠的、基于字节流的传输层通信协议。它通过建立连接、握手和确认应答等机制,保证了数据的可靠传输和有序接收。TCP协议使用端口来实现进程间的通信,为运行在不同主机上的应用进程提供直接的通信服务。TCP连接是全双工的,可以同时进行双向数据传输。相比之下,UDP是一种面向无连接的通信协议,不提供可靠性保证,适用于一些对实时性要求较高的场景。TCP和UDP在连接方式、服务对象、可靠性、拥塞控制、流量控制等方面有所区别,应用场景也不同。


我是努力的小雨,一名 Java 服务端码农,潜心研究着 AI 技术的奥秘。我热爱技术交流与分享,对开源社区充满热情。同时也是一位腾讯云创作之星、阿里云专家博主、华为云云享专家、掘金优秀作者。

💡 我将不吝分享我在技术道路上的个人探索与经验,希望能为你的学习与成长带来一些启发与帮助。

🌟 欢迎关注努力的小雨!🌟

相关文章:

TCP vs UDP:揭秘可靠性与效率之争

概述 今天我们开始主要讲解TCP的相关知识点。在之前讲解分层章节的时候,我们提到过一个重要观点。在网络层及以下几层,更多的是让主机与主机建立连接,也就是说你的电脑需要知道另一台电脑在哪里才能连接上它。然而,在网络中的通信…...

“树”的高度的计算——CSP-J1真题详解

如同树有高度一样,数据结构中的“树”也有高度,只不过这个高度指的是第几“层”。就像武功可以修炼到第几层一样,树也可以长到第几层。 需要指明的是,树的根节点属于第几层是没有严格的定义的,一般被认为是处于第0层或…...

Docker介绍、docker安装以及实现docker的远程管理

1.Docker介绍 1.Docker介绍 Docker 是⼀个开源的应用容器引擎,可以实现虚拟化,完全采用“沙盒”机制,容器之间不会存在任何接口。 Docker 通过 Linux Container(容器)技术将任意类型的应用进行包装,变成一…...

【UE5】基于摄像机距离逐渐剔除角色

效果 步骤 1. 新建一个工程,在内容浏览器中添加第三人称游戏内容包 2. 找到第三人称角色的材质实例“MI_Quinn_01”并打开 找到材质实例的父项材质“M_Mannequin” 打开材质“M_Mannequin” 在材质图表中添加如下节点 此时运行效果如文章开头所示。 参考视频&#…...

LabVIEW优化内存使用

在LabVIEW中,优化内存使用的关键在于理解LabVIEW的内存管理机制并采用一些最佳实践。以下是一些可能帮助减少内存占用的方法: 1. 减少数据副本的生成 避免不必要的数据复制:每当你在程序中传递数组或子数组时,LabVIEW可能会创建副…...

多进程和多线程基础概念LINUX

进程和程序的区别 程序是静态的,它是保存在磁盘上的指令的有序集合,没有任何执行的概念进程是一个动态的概念,它是程序执行的过程,包括了动态创建、调度和销毁的整个过程 并行:在 cpu 多核的支持下,实现物…...

React Native的Android端fetch的网络请求FormData请求错误:TypeError:Network request failed

// formdataconst formData new FormData();formData.append("code", appUserCode);formData.append("wallet", appName);// const formDataStr code appUserCode &wallet appName;// 参数形式//const _body code${appUserCode}&wallet${app…...

python之matplotlib (1 介绍及基本用法)

介绍 matplotlib是Python中的一个绘图库,它提供了一个类似于 MATLAB 的绘图系统。使用matplotlib你可以生成图表、直方图、功率谱、条形图、错误图、散点图等。matplotlib广泛用于数据可视化领域,是 Python 中最著名的绘图库之一。 同样matplotlib的安…...

ROS2常用指令

ROS2(Robot Operating System 2)是一个用于机器人软件开发的灵活框架,它提供了一套丰富的工具和库来支持机器人的开发、模拟、部署和测试。ROS2的常用指令可以大致分为几个类别,包括功能包管理、节点管理、话题管理、服务管理、动…...

SQL注入(原理、分类、union、POST注入)

目录 【学习目标、重难点知识】 【学习目标】 【重难点知识】 SQL注入简介 SQL注入原理 SQL注入类型 MySQL与SQL注入的相关知识 information_schema 数据库的结构 数据库查询语句 limit的用法 需要记住的几个函数 注释符号 SQL注入探测方法 SQL注入漏洞攻击流程…...

【勒索病毒应急响应流程】

概述 不同应急事件响应方式不同,建议大家阅读以下案例,解决自己当前的困扰,当然也可以根据自己的经验对文章进行补充和修正,欢迎在评论区留言。 案例1 事件概述 某安服团队接到某政府部门的远程应急响应求助,要求对被勒索服务器进行排查分析并溯源。 排查溯源 1、应…...

C ++初阶:C++入门级知识点

目录 🌞0.前言 🚈1.C输入输出 🚈2.缺省参数 🚝2.1全缺省参数 🚝2.2半缺省参数 🚈3.函数重载 🚝3.1参数类型不同 🚝 3.2参数个数不同 🚝3.3参数类型顺序不同 ​…...

php中如何高效地实现一个函数以判断给定日期是否位于多个预定义的时间范围内,同时确保代码的可读性、可维护性和性能优化

背景信息: 我有一个包含多个时间范围的数组,每个时间范围由起始日期和结束日期组成(目前以字符串形式给出),例如: $ranges [[start > 2023-01-01, end > 2023-03-31],[start > 2023-06-01, end …...

存在重复元素 II(LeetCode)

题目 给你一个整数数组 nums 和一个整数 k &#xff0c;判断数组中是否存在两个 不同的索引 i 和 j &#xff0c;满足 nums[i] nums[j] 且 abs(i - j) < k 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 解题 """ 时间复杂度…...

认知杂谈21

今天分享 有人说的一段争议性的话 I I 自在之“坏”&#xff1a;真实自我的绽放 在社交场合中&#xff0c;听到“他不是个好人”这句话可能会让人惊讶&#xff0c;但其实被贴上“坏人”标签的人往往敢于跳出规则框架&#xff0c;展现真实自我。他们不做表面和谐的牺牲品&am…...

2024前端面试题-工程化篇

1.webpack&#xff08;模块打包工具&#xff09;五大核心 Entry入口&#xff0c;Output定义输出路径和命名规则&#xff0c;Loader模块转换器&#xff0c;Plugin扩展插件&#xff0c;Mode模式&#xff08;Webpack使用相应模式的配置&#xff09; 2.谈一谈你对Loader和Plugin的…...

【附源码】Python :PYQT界面点击按钮随机变色

系列文章目录 Python 界面学习&#xff1a;PYQT界面点击按钮随机变色 文章目录 系列文章目录一、项目需求二、源代码三、代码分析3.1 导入模块&#xff1a;3.2 定义App类&#xff1a;3.3 构造函数&#xff1a;3.4 初始化用户界面&#xff1a;3.5 设置窗口属性&#xff1a;3.6 …...

[Qt][QSS][下]详细讲解

目录 1.样式属性0.前言1.盒模型(Box Model) 2.常用控件样式属性1.按钮2.复选框3.单选框4.输入框5.列表6.菜单栏7.注意 1.样式属性 0.前言 QSS中的样式属性⾮常多&#xff0c;不需要都记住&#xff0c;核⼼原则是⽤到了就去查 ⼤部分的属性和CSS是⾮常相似的 QSS中有些属性&am…...

RAII在实现webserver这个项目中是怎么体现的?起到了什么作用

在WebServer项目中&#xff0c;RAII&#xff08;Resource Acquisition Is Initialization&#xff0c;即资源获取即初始化&#xff09;是一种重要的资源管理策略&#xff0c;它主要通过智能指针、锁、文件句柄等对象的生命周期来管理资源的分配和释放。RAII在WebServer项目中的…...

QT下显示自己派生的QWidget界面(提升为)

在实际开发过程中&#xff0c;我们可能有这样的需求&#xff0c;自己绘制一个仪表盘界面&#xff0c;然后将其贴到主界面上方。 这个时候就会用到“提升为”这个功能&#xff0c;该功能目的是将QWidget提升为自己派生的QWdiget子类&#xff0c;具体操作为&#xff0c;在主界面…...

jvm监控工具一览

下面是对 BTrace、JAD、JMAP、JSTAT、JSTACK、JINFO 以及 MARK 工具的比较表&#xff1a; 工具/属性功能适用场景使用难度是否侵入式是否需要重启 JVMBTrace动态跟踪和监控 Java 应用程序性能分析、故障排查、日志收集、安全监控中等无侵入式否JAD反编译 Java 字节码文件&…...

使用 Visual Studio 编辑器作为 DailyNotes 的 markdown 编辑器

DailyNotes 是我使用过的最优秀的日常笔记管理工具&#xff0c;为它配置一个好的 markdown 编辑器&#xff0c;可以大幅提升效率。 除了使用 Typora 作为 markdown 编辑器&#xff0c;Visual Studio Code 也是一个非常不错的选择&#xff0c;令人惊喜的是&#xff0c;它也支持…...

Linux下进程间的通信--管道

关于进程间的通信 Linux进程间通信&#xff08;Inter-Process Communication&#xff0c;IPC&#xff09;是指在多个进程之间传输数据或信号的一些方法。由于Linux中的进程有各自独立的地址空间&#xff0c;因此它们不能直接访问对方的内存。为了实现进程间的通信&#xff0c;…...

【算法】汉诺塔、顺序查找和二分查找法、冒泡排序、插入排序、选择排序

1 时间装饰器 2 汉诺塔 3 顺序查找和二分查找法 4 冒泡排序 5 插入排序 6 选择排序 1 时间装饰器 import timedef cal_time(func):def wrapper(*args, **kwargs):t1 time.time()result func(*args, **kwargs)t2 time.time()print("%s running time: %s secs." % …...

Mac电脑遇到DNS解析失败,ip可以访问,域名无法访问

当Mac电脑遇到DNS解析失败的问题时&#xff0c;可以尝试以下几个解决方法‌&#xff1a; 1.检查网络连接‌&#xff1a;确保Mac已连接到可用的网络&#xff0c;并且网络连接正常。可以尝试重新连接Wi-Fi或使用有线连接来排除网络问题。 2.清除DNS缓存‌&#xff1a;打开终端应…...

走进 “星星的孩子” 的世界:理解与关爱儿童自闭症

在这个充满生机与活力的世界里&#xff0c;有一群特殊的孩子&#xff0c;他们仿佛来自遥远的星球&#xff0c;沉浸在自己的独特世界中&#xff0c;难以与外界进行有效的沟通和互动。他们是自闭症儿童&#xff0c;也被称为 “星星的孩子”。 自闭症&#xff0c;又称孤独症谱系障…...

【学习笔记】7、存储器、复杂可编程器件和现场可编程门阵列

可编程逻辑器件PLD复杂可编程逻辑器件CPLD现场可编程门阵列FPGA 7.1 只读存储器&#xff08;ROM&#xff09; 7.1.1 ROM的结构 ROM存储器 存储阵列 地址译码器 输出控制电路 存储阵列&#xff0c;由许多存储单元&#xff08;1bit&#xff09;组成。每次读出一组数据&…...

Java面试题———RabbitMQ篇

目录 1.你们项目中哪里用到了RabbitMQ 2、为什么会选择使用RabbitMQ 3、使用RabbitMQ如何保证消息不丢失 4、消息的重复消费问题如何解决的 5、如何解决消息堆积在MQ的问题 6、RabbitMQ如何保证消费的顺序性 7、RabbitMQ的延迟队列有了解过嘛 8、RabbitMQ如何设置消息过…...

2 种方式申请免费 SSL 证书,阿里云 Certbot

如何使用免费的 SSL 证书&#xff0c;有时在项目中需要使用免费的 SSL 证书&#xff0c;Aliyun 提供免费证书&#xff0c;三个月有效期&#xff0c;可以直接在aliyun 申请&#xff0c;搜索 SSL 证书&#xff0c;选择测试证书。 Aliyun 证书需要每三月来来换一次&#xff0c;页…...

49.给出一个字符串数组,实现一个算法给定一组字符串,将字母异位词组合在一起

49. Group Anagrams 题目 给定一组字符串&#xff0c;将字母异位词组合在一起。 示例: 输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 输出: [ [“ate”,“eat”,“tea”], [“nat”,“tan”], [“bat”] ] 注意: 所有输入均为小写字母。输出的顺序可以…...