【第六天】TCP和UDP的区别 TCP连接如何确保可靠性

TCP和UDP的区别

概念:

  • TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议
  • UDP(用户数据报协议)为应用程序提供了一种无需建立连接就可以发送封装的IP数据包的方法。

特点:

  • TCP:面向连接,传输可靠,传输形式为字节流,传输效率慢,所需资源多。
  • UDP:无连接、传输不可靠、传输形式为数据报文段,传输效率快,所需资源少。

区别:

  • 是否面向连接:TCP是面向连接的传输,UDP是无连接的传输。
  • 是否可靠:TCP是可靠的传输服务,在传输前,会有三次握手建立连接;在传输时,有确认
  • 、窗口、重传、拥塞控制机制。UDP是不可靠传输,数据传输不需要给出确认,且不保证数据不丢失以及到达顺序。
  • 是否有状态:TCP传输是有状态的,它会去记录自己发送消息的状态,比如是否发送,是否被接收。而UDP是无状态的。
  • 传输形式:TCP是面向字节流的,UDP是面向报文的。
  • 传输效率:TCP传输时多了连接,确认重传机制,所以TCP传输效率比UDP低。
  • 首部开销:TCP首部开销(20~60字节),UDP首部开销(8字节)
  • 是否提供广播或多播服务:TCP只支持点对点通信。UDP支持一对一,一对多,多对一,多对多。

使用场景:

  • TCP常用于要求通信数据可靠的场景(如网页浏览,文件传输,邮件传输,远程登录,数据库操作等)
  • UDP常用于要求通信速度高场景(如域名转换、视频直播、实时游戏等)

TCP连接如何确保可靠性

1. 数据块大小控制:

应用数据被分割成TCP认为的最合适发送的数据块,再传输给网络层,数据块被称为报文段或段。

2. 序列号:

TCP给每个数据包指定序列号,接收方根据序列号对数据包进行排序,并根据序列号对数据包去重。

3. 校验和:

TCP将保持它首部和数据的校验和。这是一个端到端的校验和,目的是检测数据在传输过程中的任何变化。如果收到的报文检验和有差错,TCP将丢弃这个报文段和不确认收到这个报文段。

4. 流量控制:

TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收端来不及处理发送方的数据时,能提示发送方降低发送的速率,防止包丢失。TCP利用滑动窗口实现流量控制。

5. 拥塞控制:

当网络拥塞时,减少数据的发送。
有以下几种方法:

  1. 慢启动:在连接刚开始时,发送方会逐渐增加发送窗口的大小,从而以指数增长的速度增加发送的数据量。
  2. 拥塞避免:一旦慢启动阶段过去,发送方进入阻塞避免阶段。在这个阶段里,发送方逐渐增加发送窗口的大小,但增加速率较慢,避免过快增加导致网络阻塞。
  3. 超时重传:如果发送方在超时时间内未收到确认,它会认为数据包丢失,并重传这些数据包。这是拥塞控制的最后手段,用于检测和处理网络中的丢包或阻塞情况。当网络出现拥塞,也就会发生数据包重传。
  4. 快速重传和快速恢复:当发送方发送的数据包丢失或网络出现拥塞时,接收方会重复发送确认(duplicate ACK)通知发送方有数据包丢失。当发送方收到一定数量的重复通知时,立刻重传丢失的数据包,而不是等待超时。这样可以减少网络拥塞程度。
  5. 拥塞窗口调整:发送方根据网络的拥塞程度动态调整发送窗口的大小,通过监测网络延迟和丢包情况来确定适合的发送速率,以避免网络阻塞。

6. 确认应答:

通过ARQ协议实现。基本原理是每发完一个分组就停止发送,等待对方确认。如果没收到确认,会重发数据包,知道确认后再发下一个分组。

7. 超时重传:

当TCP发出一个数据段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。

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

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

相关文章

深入Scrapy框架:掌握其工作流程

深入Scrapy框架:掌握其工作流程 引言 作为一名资深的Python程序员,我对各种数据采集工具有着深刻的理解。Scrapy,作为一个上场率极高的爬虫框架,以其高效、灵活和强大的特性,成为数据采集领域的不二选择。在本文中&a…

CSS常用属性(列表属性、表格属性、背景属性、鼠标属性)

一、CSS列表属性 列表相关的属性,可以作用在 ul 、 ol 、 li 元素上。 CSS 属性名 功能 属性值 list - style - type 设置列表符号 常用值如下: none :不显示前面的标识(很常用!) square &#xf…

Unity 物理动画:利用物理引擎创造逼真动作

在Unity中,物理动画是一种利用物理引擎来模拟真实世界物理效果的动画技术。通过物理动画,开发者可以创造出更加逼真和自然的动画效果,如重力、碰撞、布料摆动等。本文将介绍Unity物理动画的基本概念、实现方法以及一些实用的技巧。 Unity物理…

Oat++ 后端实现跨域

这里记录在官方的例子中,加入跨域。Oat Example-CRUD 在官方的例子中,加入跨域。 Oat Example-CRUD 修改AppComponent.hpp文件中的代码,如下: #include "AppComponent.hpp"#include "controller/UserController…

路径规划——Dijkstra算法

算法原理 Dijkstra算法采用贪心算法的思想,解决的问题可以描述为:在无向图G(V,E)中,假设每条边E[i] 的长度为 w[i],找到由顶点vs到其余各点的最短路径。 通过Dijkstra计算图G中的最短路径时,需要指定起点vs(即从顶点v…

BI数据可视化看板的力量与应用

在当今数据驱动的时代,企业面对着海量的信息与数据。随着业务的复杂性加剧,如何有效地解读和利用这些数据,成为了企业决策的重要环节。而BI(商业智能)数据可视化看板,便是解决这一难题的关键工具。数聚将深…

idea-springboot后端所有@注释含义汇总-持续更新!

(1)启动类 ①SpringBootApplication 出现这个代表这个就是整个程序的入口,是运行的开始位置 (2)Dao层 ①Repository 作用就是声明自己这个为bean文件(每一个controller都是一个bean文件)&am…

vue3 中使用xlsx 插件 导出excel文件

介绍一下 vue中得导出excel 文件 功能 ① 安装插件 npm i xlsx ②导入插件 import * as XLSX from xlsx; ③ 使用插件 直接是一个 方法 const exportExcel()>{const data[["姓名","年龄"],["张三",18],["李四",20],["王五…

blender顶点乱飞的问题解决

初学blender,编辑模式下移动某些顶点,不管是移动还是滑动都会出现定点乱飞的问题,后来才发现是开了吸附工具的原因!!!! 像下面这样,其实我只是在Z轴上移动,但是就跑的很…

Anaconda目录

安装目录 Anaconda 在默认情况下会安装到 C:\ProgramData\Anaconda3,而 conda 环境和包会安装在 C:\Users\username\.conda\ 目录下。 备注:我是在windows下安装 的Anaconda。我的安装目录是C:\Program Files\Anaconda3 pkgs目录 在以上两个目录下都有…

CH571F基于官方模版创建工程

直接使用MounRiver创建的工程只有最简单的串口和GPIO功能,其他PWM和SPI等驱动基本上都有,但蓝牙和USB只有参考官方的示例来,全部自己写属实有点麻烦了,而且还需要添加BLE的库。下面就简单基于官方的示例工程创建我们自己的工程。 …

抓包工具——wireshark的使用

​ 什么是wireshark wireshark是一个数据包捕捉程序。和linux下的tcpdump,以及sniffer,Fidder等软件功能类似。按理说,我们的计算机中的网卡设备只会将发给本机的数据包传输到上层进行解析,而其他的数据包会进行丢弃,…

jenkins集成allure测试报告

1.allure插件安装 (1)点击首页的【Manage Jenkins】-【Manage Plugins】 (2)选择【Available】选项,搜索输入框输入Allure,搜索出来的名字就叫Allure,当安装后名字会变为Allure Jenkins Plugi…

QVariantMap是QVariant类型的键值对容器,它在 Qt 中被广泛使用,用于存储和传递复杂的数据结构

QVariantMap 是 QVariant 类型的键值对容器&#xff0c;它在 Qt 中被广泛使用&#xff0c;用于存储和传递复杂的数据结构。QVariantMap 类似于 QMap<QString, QVariant>&#xff0c;允许使用字符串作为键来存储各种类型的数据。 QVariantMap 的基本功能 创建和使用 QVa…

Android SurfaceFlinger——GraphicBuffer获取内存信息(三十一)

上一篇文章介绍了 GraphicBuffer 初始化的 initWithSize() 函数中的申请内存流程,这里我们看一下另一个比较重要的函数,GraphicBufferMapper. getTransportSize 获取内存信息。该函数通常在需要了解缓冲区的实际内存占用情况时调用,例如在调试内存使用情况或优化性能时。 一…

语言模型检索用的知识库,是越大越好吗?

语言模型在预训练时所使用的数据量越大&#xff0c;推理时的准确率等性能总的来说就会越好。根据美国华盛顿大学和艾伦AI研究所近期发表的一篇论文[1]&#xff0c;语言模型检索用的知识库同样也存在着规模效应&#xff0c;知识库的规模越大&#xff0c;模型完成知识密集型任务的…

MySQL 8.0 字符集与比较规则介绍

前言&#xff1a; 我们都知道 MySQL 8.0 与 MySQL 5.7 的区别之一就是默认字符集从 latin1 改成了 utf8mb4 &#xff0c;除此之外&#xff0c;MySQL 8.0 下的字符集和比较规则还有没有其他变化呢&#xff1f;本篇文章我们一起来学习下。 utf8mb4 字符集 在 MySQL 8.0 中&…

C和C++的区别?

C和C是两种广泛使用的编程语言&#xff0c;它们在许多方面有相似之处&#xff0c;但也有一些关键的区别。以下是C和C的一些主要区别&#xff1a; 目录 1. **语言起源和设计哲学**:2. **面向对象编程**:3. **内存管理**:4. **标准库**:5. **类型检查**:6. **函数重载**:7. **引…

PPT模板替换秘籍:一键撤销原模板,轻松更换新风格!

将PPT中的模板换成另一个模板&#xff0c;可以通过几种不同的方法实现。以下是几种常用的方法&#xff1a; 方法一&#xff1a;使用PowerPoint内置的设计选项卡 打开PowerPoint&#xff1a;首先&#xff0c;打开你想要更改模板的PPT文件。 选择“设计”选项卡&#xff1a;在…

(部署服务器系列四)部署Vue步骤(使用nodejs)

1. 构建项目&#xff08;打包Vue&#xff09;&#xff1a; 构建前设置main.js //关闭开发模式提示 Vue.config.devtoolsfalse Vue.config.productionTip false设置指向的服务端后端ip和端口&#xff0c;我的常量属性统一放在了constants.js export const AIOS_BASE_URL &q…