计算机网络(五)——传输层
一、功能
传输层的主要功能是向两台主机进程之间的通信提供通用的数据传输服务。功能包括实现端到端的通信、多路复用和多路分用、差错控制、流量控制等。
复用:多个应用进程可以通过同一个传输层发送数据。
分用:传输层在接收数据后可以将这些数据正确分发给相应的应用进程。
端口号:在传输层中用端口号来区分一台主机上的不同应用进程。端口号只在本主机中有实际意义,用来唯一标识一个进程,不同主机的相同端口号之间没有联系。
二、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),是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。 这个项目分为这么几步: 接收命令行参数读…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...