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

计算机网络(五)——传输层

一、功能

       传输层的主要功能是向两台主机进程之间的通信提供通用的数据传输服务。功能包括实现端到端的通信、多路复用和多路分用、差错控制、流量控制等。

       复用:多个应用进程可以通过同一个传输层发送数据。

       分用:传输层在接收数据后可以将这些数据正确分发给相应的应用进程。

       端口号:在传输层中用端口号来区分一台主机上的不同应用进程。端口号只在本主机中有实际意义,用来唯一标识一个进程,不同主机的相同端口号之间没有联系。

二、UDP

        UDP是一种简单无连接且不可靠的传输层协议,只在IP数据报服务的基础上增加了复用和分用以及差错检测功能。在使用UDP协议进行通信之间不会建立连接,减少了网络开销以及发送时延。UDP不保证可靠交付,也没有拥塞控制。UDP是面向报文的,即无论应用层给UDP多长的报文,UDP都会完整地发送出去。基于这些特性,UDP常用于对实时性要求很高且对少量数据丢失不敏感的场景中

        UDP在进行差错检测时会在UDP报文前加上一个伪首部,之所以称其为伪首部是因为伪首部只负责参与差错检测,并不会发送出去。发送方首先会将首部的检验和部分填入全0,并在数据部分的后面填充0以使整个报文的长度为偶数个字节。然后以两个字节为单位对添加了伪首部的UDP报文作二进制反码求和运算就得到了校验和,最后将这个校验和替换掉原来填充的0,并去掉伪首部就可以将这个UDP报文转交给网络层了。接收方在收到UDP报文后也会先在报文前面加上伪首部,然后以两个字节为单位对UDP报文作二进制反码运算。如果结果为全1说明报文正确,否则表明报文在传输时出现了错误,接收方就会丢弃这个报文。UDP本身是不会要求发送方重新发送的,这也体现了UDP的不可靠性。TCP和UDP的差错检测相同,也使用了伪首部,不同的是当数据出错时TCP会要求发送方重新发送

三、TCP

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

        面向连接是指:在使用TCP协议进行通信时,通信双方会先建立一条TCP连接,然后开始发送数据;当数据传输完毕后会将这条连接释放掉。

        可靠传输是指:第一,TCP在建立连接时会采用三次握手的形式来确保连接是可靠的。第二,接收方会对接收的数据进行差错检测,确保数据在传输过程中没有出现差错。第三,如果数据在传输时没有出现差错或丢失,那么接收方需要在规定时间内向发送方返回确认报文;如果发送方没有在规定时间内收到确认报文就会重新发送,确保发送的数据是可靠的。第四,TCP支持流量控制,通过滑动窗口机制来动态控制发送方的发送速率,避免接收方因来不及接收数据而丢弃。最后,TCP支持拥塞控制,会根据网络的拥塞情况调整发送的数据量,防止过多的数据涌入网络,进一步提升传输的可靠性。

       基于字节流是指:TCP将应用层发送过来的所有数据看成是一连串的字节序列(也就是字节流),TCP不会区分哪一部分是一个整体,只负责将这些字节按顺序编号之后分割成大小合适的一个个报文进行发送。接收方会根据字节的编号把这些报文按照顺序进行重组,还原成原来的字节流,再交由应用层来将字节流划分为不同的消息整体。

       TCP的三次握手

       客户端会先向服务器端发送连接请求报文段用来请求建立TCP连接;服务器端收到后会为本次连接分配缓存和变量,并向客户端发送确认报文段表示允许建立连接;客户端收到确认报文段后会为本次连接分配缓存和变量,并向服务器端发送对确认报文的确认,此时连接就成功建立了。

       TCP的四次挥手

       当客户端的数据发送完毕后会向服务器端发送连接释放报文段,表示自己已停止发送数据,但仍可以接收服务器端的数据。随后服务器端会向客户端发送确认报文段,此时客户端到服务器端方向的TCP连接被释放。待服务器端发送完数据后会向客户端发送连接释放报文段,客户端收到之后会给服务器端返回一个确认报文段,服务器端收到后便会关闭连接,而客户端会在发送完确认报文后再等待一段时间才会关闭连接。当客户端和服务器端都关闭连接后本次TCP连接彻底结束。

       客户端会在发送完确认报文后再等待一段时间才会关闭连接有两个原因

       一是为了确保确认报文能够被服务器成功接收到。如果确认报文在发送时出现了问题,服务器端会让客户端重发确认报文,此时客户端需要保持连接状态才能响应重发请求;只有服务器端收到了确认报文才会关闭连接。

      另一个原因是为了防止在旧连接中的数据对新建立的连接产生干扰。在旧连接中的数据可能会因为网络繁忙等原因一直处在网络中,如果客户端在发送完确认报文后立即关闭旧连接而开启新的连接,那么这些旧连接中的数据很有可能在新连接的过程中才到达,此时这些数据会被认为是新连接中传输的数据进而对新连接产生干扰。由于数据在网络中传输有生存时间,所以等待一段时间可以让这些旧连接的数据在网络中自然消逝,防止对新连接产生干扰。

       TCP的流量控制:发送方会估计当前网络的拥塞程度,进而自己确定一个发送窗口大小,称之为拥塞窗口;同时,接收方会根据自己当前接收缓存的大小来确定接收窗口的大小。那么发送窗口的实际大小为拥塞窗口和接收窗口的最小值。在通信过程中拥塞窗口和接收窗口是不断变化的,并通过滑动窗口机制来动态控制发送窗口,实现流量控制。

       TCP的拥塞控制:包括慢开始拥塞避免快重传快恢复

       慢开始:拥塞窗口初始为1个最大报文段长度,发送方每收到一个对新报文段的确认就把拥塞窗口增加一个最大报文长度;如果接收窗口足够大,那么下一次就会发送两个最大报文长度的数据;以此类推,拥塞窗口会以指数形式增长。慢开始用于快速探测网络的承载能力。

       拥塞避免:当拥塞窗口达到一个阈值时会进入拥塞避免阶段,此时每经过一个往返时间拥塞窗口只增加1个最大报文长度,从指数增长转为线性增长。拥塞避免用来降低拥塞发生的风险。

       快重传:接收方在收到一个失序报文段后会立即报告给发送方,如果连续收到了多个失序报文,那么接收方也会连续报告给发送方;当发送方连续收到3次报告后会立即重发丢失的报文而不必等待相应报文的计时器超时。

       快恢复:发送方在执行快重传后会将拥塞窗口变为原来的一半,随后采取拥塞避免的方式调整拥塞窗口。快恢复能够在避免网络拥塞的同时保持快速的数据传输。

       TCP和UDP的区别

       ①TCP是面向连接的协议,在数据传输前要建立连接;而UDP不需要建立连接。

       ②TCP提供可靠的传输服务,而UDP是不保证可靠传输。

       ③TCP由于要建立连接且要保证数据的可靠性,所以传输速率较低且网络开销较大;而UDP没有这些复杂的机制,发送过程简单,传输速率高,且实时性较好。

       ④TCP适用于对数据的准确性和完整性要求很高的场景,如文件传输、电子邮件等;UDP适用于对实时性要求很高且对数据准确性要求较低的场景,如实时会议、直播等。

       TCP和UDP也有相同之处,比如都是全双工通信差错检测方式相同等。

相关文章:

计算机网络(五)——传输层

一、功能 传输层的主要功能是向两台主机进程之间的通信提供通用的数据传输服务。功能包括实现端到端的通信、多路复用和多路分用、差错控制、流量控制等。 复用:多个应用进程可以通过同一个传输层发送数据。 分用:传输层在接收数据后可以将这些数据正确分…...

【SQL】进阶知识 -- 删除表的几种方法(包含表内单个字段的删除方法)

大家好!欢迎来到本篇SQL进阶博客。如果你已经掌握了基础的SQL操作,接下来就让我们一起探索删除表的几种方法。删除表可能听起来有点危险,事实也是如此,所以在我们实际开发过程中,大多数时候我们都有数据的使用权限&…...

【搭建JavaEE】(3)前后端交互,请求响应机制,JDBC数据库连接

前后端交互 Apache Tomat B/S目前主流。 tomat包含2部分: apache容器 再认识servlet 抽象出的开发模式 项目创建配置 maven javaeetomcat 忽略一些不用的文件 webapp文件夹 HiServlet 这里面出现了webinfo,这个别删因为这个呢,是这这个这…...

项目概述、开发环境搭建(day01)

软件开发整体介绍 软件开发流程 第1阶段: 需求分析 需求规格说明书, 一般来说就是使用 Word 文档来描述当前项目的各个组成部分,如:系统定义、应用环境、功能规格、性能需求等,都会在文档中描述。产品原型,一般是通过…...

车联网安全--TLS握手过程详解

目录 1. TLS协议概述 2. 为什么要握手 2.1 Hello 2.2 协商 2.3 同意 3.总共握了几次手? 1. TLS协议概述 车内各ECU间基于CAN的安全通讯--SecOC,想必现目前多数通信工程师们都已经搞的差不多了(不要再问FvM了);…...

【python】OpenCV—Extract Horizontal and Vertical Lines—Morphology

文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、参考 更多有趣的代码示例,可参考【Programming】 1、功能描述 基于 opencv-python 库,利用形态学的腐蚀和膨胀,提取图片中的水平或者竖直线条 2、代码实现 导入基本的库函数 im…...

Redis十大数据类型详解

Redis(一) 十大数据类型 redis字符串(String) string是redis最基本的类型,一个key对应一个value string类型是二进制安全的,意思是redis的string可以包含任何数据。例如说是jpg图片或者序列化对象 一个re…...

Open FPV VTX开源之betaflight配置

Open FPV VTX开源之betaflight配置 1. 源由2. 配置3. 总结4. 参考资料5. 补充 - 飞控固件版本 1. 源由 飞控嵌入式OSD - ardupilot配置使用betaflight配套OSD图片。 Choose correct font depending on Flight Controller SW. ──> /usr/share/fonts/├──> font_btfl…...

AT32 bootloader程序与上位机程序

从8051到stm32, 从串口下载到JLINK调试,从keil到arm-none-eabi-gcc,从"Hello wrold"到通信协议,一路起来已学会很多,是时候写一下bootloader了。 基本原理 单片机代码编译完后可以生成".hex"和".bin"文件&…...

数据结构与算法之栈: LeetCode 151. 反转字符串中的单词 (Ts版)

反转字符串中的单词 https://leetcode.cn/problems/reverse-words-in-a-string/ 描述 给你一个字符串 s ,请你反转字符串中 单词 的顺序单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开 返回 单词 顺序颠倒且 单词 之间用单个空…...

使用 configparser 读取 INI 配置文件

使用 configparser 读取 INI 配置文件 适合于读取 .ini 格式的配置文件。 配置文件示例 (config.ini): [DEFAULT] host localhost port 3306 [database] user admin password secret import configparser# 创建配置解析器 config configparser.ConfigParser()# 读取配…...

idea 自动导包,并且禁止自动导 *(java.io.*)

自动导包配置 进入 idea 设置,可以按下图所示寻找位置,也可以直接输入 auto import 快速定位到配置。 Add unambiguous imports on the fly:自动帮我们优化导入的包Optimize imports on the fly:自动去掉一些没有用到的包 禁止导…...

RK3588-NPU pytorch-image-models 模型编译测试

RK3588-NPU pytorch-image-models 模型编译测试 一.背景二.操作步骤1.下载依赖2.创建容器3.安装依赖4.创建脚本A.生成模型名列表B.生成ONNX模型C.生成RKNN模型D.批量测试脚本 一.背景 测试RK3588-NPU对https://github.com/huggingface/pytorch-image-models.git中模型的支持程…...

低代码从“产品驱动”向“场景驱动”转型,助力数字化平台构建

一、前言 在数字化时代的大潮中,从宏观层面来看,新技术的落地速度不断加快,各行各业的数字化进程呈现出如火如荼的态势。而从微观层面剖析,企业面临着行业格局快速变化、市场竞争日益激烈以及成本压力显著增强等诸多挑战。 据专…...

相加交互效应函数发布—适用于逻辑回归、cox回归、glmm模型、gee模型

在统计分析中交互作用是指某因素的作用随其他因素水平变化而变化,两因素共同作用不等于两因素单独作用之和(相加交互作用)或之积(相乘交互作用)。相互作用的评估是尺度相关的:乘法或加法。乘法尺度上的相互作用意味着两次暴露的综合效应大于(…...

用gpg和sha256验证ubuntu.iso

链接 https://ubuntu.com/tutorials/how-to-verify-ubuntuhttps://releases.ubuntu.com/jammy/ 本文是2的简明版 sha256sum介绍 sha256sum -c SHA256SUMS 2>&1这段脚本的作用是验证文件的 SHA-256 校验和。具体来说,命令的各个部分含义如下: …...

深入解析 ZooKeeper:分布式协调服务的原理与应用

1.说说 Zookeeper 是什么? ZooKeeper 是一个开源的分布式协调服务,由 Apache Software Foundation 开发维护。它为构建分布式应用程序提供了一套简单且高效的协调接口。ZooKeeper 的设计目的是为了简化分布式系统中常见的任务,例如命名、配置…...

【Rust自学】11.10. 集成测试

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 11.10.1. 什么是集成测试 在Rust里,集成测试完全位于被测试库的外部。集成测试调用库的方式和其他代码一样,这也…...

对当前日期进行按年、按月、按日的取值

对当前日期进行按年、按月、按日的取值。 其规则为: 按年 为当前日期到来年同一日期的前一天(2024-12-01到2025-11-30)。 按月 为当前日期到下个月的同一日期的前一天 (2024-12-01 到 2024-12-31)。 按日 为当前日…...

【Rust自学】12.2. 读取文件

12.2.0. 写在正文之前 第12章要做一个实例的项目——一个命令行程序。这个程序是一个grep(Global Regular Expression Print),是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。 这个项目分为这么几步: 接收命令行参数读…...

标注工具核心架构分析——主窗口的图像显示

🏗️ 标注工具核心架构分析 📋 系统概述 主要有两个核心类,采用经典的 Scene-View 架构模式: 🎯 核心类结构 1. AnnotationScene (QGraphicsScene子类) 主要负责标注场景的管理和交互 🔧 关键函数&…...

Oracle实用参考(13)——Oracle for Linux物理DG环境搭建(2)

13.2. Oracle for Linux物理DG环境搭建 Oracle 数据库的DataGuard技术方案,业界也称为DG,其在数据库高可用、容灾及负载分离等方面,都有着非常广泛的应用,对此,前面相关章节已做过较为详尽的讲解,此处不再赘述。 需要说明的是, DG方案又分为物理DG和逻辑DG,两者的搭建…...

SOC-ESP32S3部分:30-I2S音频-麦克风扬声器驱动

飞书文档https://x509p6c8to.feishu.cn/wiki/SKZzwIRH3i7lsckUOlzcuJsdnVf I2S简介 I2S(Inter-Integrated Circuit Sound)是一种用于传输数字音频数据的通信协议,广泛应用于音频设备中。 ESP32-S3 包含 2 个 I2S 外设,通过配置…...

运动控制--BLDC电机

一、电机的分类 按照供电电源 1.直流电机 1.1 有刷直流电机(BDC) 通过电刷与换向器实现电流方向切换,典型应用于电动工具、玩具等 1.2 无刷直流电机(BLDC) 电子换向替代机械电刷,具有高可靠性,常用于无人机、高端家电…...

Xcode 16.2 版本 pod init 报错

Xcode 版本升级到 16.2 后,项目执行 pod init 报错; ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchron…...

Java多线程从入门到精通

一、基础概念 1.1 进程与线程 进程是指运行中的程序。 比如我们使用浏览器,需要启动这个程序,操作系统会给这个程序分配一定的资源(占用内存资源)。 线程是CPU调度的基本单位,每个线程执行的都是某一个进程的代码的某…...

云原生技术驱动 IT 架构现代化转型:企业实践与落地策略全解

📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、背景:IT 架构演进的战略拐点 过去十年,企业 IT 架构经历了从传统集中式架构到分布式架构的转型。进入云计算…...

大语言模型解析

1. Input Embedding embedding:将自然语言翻译成index 每个index对应一个embedding,embedding需要训练,embedding是一个数组...

【优选算法】模拟 问题算法

​一&#xff1a;替换所有的问号 class Solution { public:string modifyString(string s) {int n s.size();for(int i 0; i < n; i){if(s[i] ?){for(char ch a; ch < z; ch){if((i0 && ch !s[i1]) || (in-1 && ch ! s[i-1]) || ( i>0 &&…...

Redis知识体系

1. 概述 本文总结了Redis基本的核心知识体系&#xff0c;在学习Redis的过程中&#xff0c;可以将其作为学习框架&#xff0c;以此更好的从整体的角度去理解和学习Redis的内容和设计思想。同时知识框架带来的好处是可以帮助我们更好的进行记忆&#xff0c;在大脑中形成相应的知识…...