架构师之路(十六)计算机网络(传输层)
前置知识(了解):计算机基础。
作为架构师,我们所设计的系统很少为单机系统,因此有必要了解计算机和计算机之间是怎么联系的。局域网的集群和混合云的网络有啥区别。系统交互的时候网络会存在什么瓶颈。
既然网络层已经能把源主机上发出的数据传送给目的主机,那么为什么还需要加上一个传输层呢?这就需要我们理解主机用户应用层通信的主体,位于两台网络主机中真正的数据通信主体并不是这两台主机,而是两台主机中的各种网络应用进程。同一时间一台主机上可能有多个进程同时运行,这时候就需要为应用程序提供一个标识,那就是端口.而传输层就是为了提供这种端到端的服务而存在的.
端口分为知名端口和动态端口。有些网络服务会使用固定的端口,这类端口称为知名端口,端口号范围为0~1023。比如:FTP,HTTP,Telnet,SNMP服务均使用知名端口。
动态端口范围1024~65535,这些端口号一般不会固定分配给某个服务,也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。
运输层是只有主机才有的层次,传输层使用网络层的服务为应用层提供通信服务。传输层定义了主机应用程序之间端到端的连通性。传输层中最为常见的两个协议分别是传输控制协议TCP(Transmission Control Protocol)和用户数据报协议UDP(User Datagram Protocol)
目录
UDP协议
TCP协议
可靠传输
流量控制
拥塞控制
连接管理
UDP协议
UDP是一种面向无连接的传输层协议,传输可靠性没有保证。udp只在ip数据报服务之上增加了很少功能,即复用分用和差错检测功能
udp的主要特点
1.udp是无连接的,减少开销和发送数据之前的时延
2.udp使用最大努力交付,即不保证可靠交付
3.udp是面向报文的,适合一次性传输少量数据的网络应用
4.udp无拥塞控制,适合很多实时应用
5.udp首部开销小,8B,tcp20B
主机A发送数据包时,这些数据包是以有序的方式发送到网络中的,每个数据包独立地在网络中被发送,所以不同的数据包可能会通过不同的网路径叨叨主机B。这样的情况下,先发送的数据包不一定先到达主机B。因为UDP数据包没有序号,主机B将无法通过UDP协议将数据包按照原来的顺序重新组合,所以此时需要应用程序提供报文的到达确认,排序和流量控制等功能(也就是说UDP报文的到达确认,排序和流量控制是应用程序来确定的)。通常情况下,UDP采用实时传输机制和时间戳来传输语音和视频数据。
TCP协议
TCP是一种面向连接的端到端协议。TCP作为传输控制协议,可以为主机提供可靠的数据传输。TCP需要依赖网络协议为主机提供可用的传输路径。TCP允许一个主机同事运行多个应用进程。每台主机可以拥有多个应用端口,每对端口号,源和目标IP地址的组合唯一地标识了一个会话。
可靠传输
ARQ协议,即自动重传请求(Automatic Repeat-reQuest),是OSI模型中数据链路层和传输层的错误纠正协议之一。它通过使用确认和超时这两个机制,在不可靠服务的基础上实现可靠的信息传输。如果发送方在发送后一段时间之内没有收到确认帧,它通常会重新发送。 ARQ包括停止等待ARQ协议和连续ARQ协议,拥有错误检测(Error Detection)、正面确认(Positive Acknowledgment)、超时重传(Retransmission after Timeout)和 负面确认及重传(Negative Acknowledgment and Retransmission)等机制。
由于停止等待ARQ协议信道利用率太低,所以需要使用连续ARQ协议来进行改善。这个协议会连续发送一组数据包,然后再等待这些数据包的ACK。发送方采用流水线传输。流水线传输就是发送方可以连续发送多个分组,不必每发完一个分组就停下来等待对方确认。如下图所示:
连续ARQ协议通常是结合滑动窗口协议来使用的,发送方需要维持一个发送窗口,如下图所示:
图(a)是发送方维持的发送窗口,它的意义是:位于发送窗口内的5个分组都可以连续发送出去,而不需要等待对方的确认,这样就提高了信道利用率。
连续ARQ协议规定,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。例如上面的图(b),当发送方收到第一个分组的确认,就把发送窗口向前移动一个分组的位置。如果原来已经发送了前5个分组,则现在可以发送窗口内的第6个分组。
接收方一般都是采用累积确认的方式。也就是说接收方不必对收到的分组逐个发送确认。而是在收到几个分组后,对按序到达的最后一个分组发送确认。如果收到了这个分组确认信息,则表示到这个分组为止的所有分组都已经正确接收到了。
累积确认的优点是容易实现,即使确认丢失也不必重传。但缺点是,不能正确的向发送方反映出接收方已经正确收到的所以分组的信息。比如发送方发送了前5个分组,而中间的第3个分组丢失了,这时候接收方只能对前2个发出确认。而不知道后面3个分组的下落,因此只能把后面的3个分组都重传一次,这种机制叫Go-back-N(回退N),表示需要再退回来重传已发送过的N个分组。
滑动窗口协议:
规则:
(1)凡是已经发送过的数据,在未收到确认之前,都必须暂时保留,以便在超时重传时使用。
(2)只有当发送方A收到了接收方的确认报文段时,发送方窗口才可以向前滑动几个序号。
(3)当发送方A发送的数据经过一段时间没有收到确认(由超时计时器控制),就要使用回退N步协议,回到最后接收到确认号的地方,重新发送这部分数据。
流量控制
一条TCP连接每一侧主机都为该连接设置了接收缓存。当该TCP连接收到了正确的、按序的字节后,他就将数据放入接收缓存。相关联的应用进程会从该缓存中读取数据。但不必是数据一到达就立即读取。事实上,接收方也许正忙于其他任务,甚至要过很长时间后才读取该数据。如果某个应用进程读取比较缓慢,但是发送方发送的太多、太快,发送的数据就会很容易地使该连接的接收缓存溢出。
TCP为它的应用程序提供了流量控制服务(flow-control service)以消除发送方使接收方缓存溢出的可能性。流量控制因此是一个速度匹配服务,即发送方的发送速率与接收方应用程序的读取速率相匹配。
TCP通过让发送方维护一个称为接收窗口(receive window)的变量(TCP报文段首部的接收窗口字段)来提供流量控制。通俗的讲,接收窗口用于给发送方一个指示--该接收方还有多少可用的缓存空间。因为TCP是全双工通信,在连接两端的发送方都各自维护了一个接收窗口。
拥塞控制
拥塞控制是作用于网络的,它是防止过多的数据注入到网络中,避免出现网络负载过大的情况;常用的方法就是:( 1 )慢开始、拥塞避免( 2 )快重传、快恢复。
"拥塞窗口":是为了避免发生拥塞而设置的窗口,最终发送的字节数是接收端为发送端设置的"发送窗口"和"拥塞窗口"的最小值.
"慢启动阈值"(SSTHRESH):初始值是64k,即65535个字节,当发生一次数据丢失时,其值变为"拥塞窗口"大小的一半.
慢启动 拥塞避免:
主机刚开始发送报文段时先将拥塞窗口的大小设置为一个MSS(该连接上当前使用的最大数据段大小)。每收到一个报文段的确认后,将拥塞窗口增加最多一个MSS的大小。以此类推,用这样的方法逐步增大发送端拥塞窗口的大小,使分组注入到网络的速率更加合理,直到拥塞窗口的值达到慢启动阈值,这时候"拥塞避免"就发挥作用了.
该方案不再像慢启动一样以指数速度增长拥塞窗口的大小,而是到达慢启动阈值后,按线性规律增长,是网络比较不容易出现拥塞.
以上两个方案配合使用,可有效减少网络拥塞的影响,但不能完全避免拥塞情况,后来又提出了"快速重传"和"快速恢复"机制
快重传和快恢复:
快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认。这样做可以让发送方及早知道有报文段没有到达接收方。发送方只要一连收到三个重复确认,即认为对应"确认号"上的字段已丢失,TCP不等重传定时器失效,就重传已丢失的数据,此为快速重传,同时快速恢复发挥作用,把当前拥塞窗口大小设置为当前慢启动阈值大小的一半,以减轻网络负荷,然后再执行"拥塞避免"。不难看出,快重传并非取消重传计时器,而是在某些情况下可更早地重传丢失的报文段。
连接管理
建立连接:TCP通常使用IP作为网络层协议,这是TCP数据被封装在IP数据包内。TCP数据段由TCP Header(头部)和TCP Data(数据)组成。TCP最多可以有60个字节的头部,如果没有Options字段,正常的长度是20字节。
1)主机A(通常也叫客户端)发送一个标识了SYN数据段,标识期望与服务器A建立连接,此数据段的序列号(seq)为a;
2)服务器A回复标识了SYN+ACK的数据段,此数据段的序列号(seq)为b,确认序列号为主机A的序列号加1(a+1),以此作为对主机A的SYN报文的确认。
3)主机A发送一个标识了ACK的数据段,此数据段的序列号(seq)为a+1,确认序列号为服务器A的序列号加1(b+1),以此作为对服务器A的SYN报文段的确认。
TCP是一种可靠的,面向连接的全双工传输层协议。TCP连接的建立是一个三次握手的过程。
为什么是三次握手
tcp连接是全双工的,数据在两个方向上能同时传递。所以要确保双方,同时能发数据和收数据
第一次握手:证明了发送方能发数据 第二次握手:ack确保了接收方能收数据,syn确保了接收方能发数据 第三次握手:确保了发送方能收数据 实际上是四个维度的信息交换,不过中间两步合并为一次握手了。四次握手浪费,两次握手不能保证“双方同时具备收发功能”
关闭连接:为什么是四次挥手
因为tcp连接是全双工的,数据在两个方向上能同时传递。同时tcp支持半关闭(发送一方结束发送还能接收数据的功能)。因此每个方向都要单独关闭,且收到关系通知需要发送确认回复
为什么要支持半关闭
客户端需要通知服务端,它的数据已经传输完毕,同时仍要接收来自服务端的数据,使用半关闭的单连接效率要比使用两个tcp连接更好
相关文章:

架构师之路(十六)计算机网络(传输层)
前置知识(了解):计算机基础。 作为架构师,我们所设计的系统很少为单机系统,因此有必要了解计算机和计算机之间是怎么联系的。局域网的集群和混合云的网络有啥区别。系统交互的时候网络会存在什么瓶颈。 既然网络层已经…...
python 调用SumatraPDF 静默打印PDF
SumatraPDF 文档 https://www.sumatrapdfreader.org/docs/Command-line-arguments ⽆边框 noscale/缩⼩到合适⼤⼩(默认)shrink/合适⼤⼩ fit/compat 兼容 # 分为 Portrait (纵向)和 Landscape (横向)两类 https://github.com/sumatrapdfreader/sumatrap…...
nginx部署https域名ssl证书
1、在你服务器nginx文件夹下创建ssl文件夹存放证书文件和秘钥文件 把.crt和.key证书放上 2、在nginx.conf文件中配置 在nginx.conf文件中server下加入listen 443 ssl; server {listen 443 ssl;charset utf-8;index index.html index.htm index.jsp index.do;add_heade…...
Python学习之路-Django基础:HelloDjango
Python学习之路-Django基础:HelloDjango 简介 Django,发音为[dʒŋɡəʊ],是用python语言写的开源web开发框架,并遵循MVC设计。劳伦斯出版集团为了开发以新闻内容为主的网站,而开发出来了这个框架,于2005年7月在BSD…...

完成NAT实验
实验要求: 步骤一:配置vlan vlan b 2 3 interface GigabitEthernet 0/0/2 port link-type access port default vlan 2 interface GigabitEthernet 0/0/3 port link-type access port default vlan 3 interface GigabitEthernet 0/0/1 port link-type…...
uniapp 用web-view嵌套网页地址并传参
小程序登陆后把token和openId 对应传到pc端 pc端有两套一套pc端代码和适应移动端的代码 嵌套的是适应移动端的代码 1.uniapp <template><view class"main"><u-navbar :fixed"true" :autoBack"false" leftClick"goBack&quo…...
时序数据库Tdengine 批量插入避免因为主键ts时间重复导致数据被覆盖掉
目录 在Mybatis中使用 在数据库管理工具中使用 now100a 使用now() #{index}a 其中那这个 #{index}是<foreach>标签里的循环出来的index 在Mybatis中使用 <insert id"batchInsert" parameterType"java.util.List">insert into uri(id…...

【小白教程】幻兽帕鲁服务器一键搭建 | 支持更新 | 自定义配置
幻兽帕鲁刚上线就百万在线人数,官方服务器的又经常不稳定,所以这里给大家带来最快捷的搭建教程,废话不多说直接开始。 步骤一:准备服务器 服务器建议 Linux 系统,资源占用低,而且一键脚本只需要一条命令&am…...

Chatgpt的崛起之路
Chatgpt的崛起之路 背景与发展历程背景发展历程 技术原理第一阶段:训练监督策略模型第二阶段:训练奖励模型第三阶段:采用强化学习来增强模型的能力。 国内使用情况及应用的领域面临的数据安全挑战与建议ChatGPT获取数据产生的问题数据泄露问题…...
java截取视频最后一帧照片作为封面
引言 我们在日常工作中经常会遇到上传视频,而产品还会要求截取视频某一帧作为封面展示,对于这种情况新手还是比较头疼的,那我们直接世界上最简单的实现方案,必须是最简单,多一句啰嗦都不准点赞。 How to do 1.提前…...
ARM Cortex-A 内核的运行模式切换
ARM Cortex-A 内核的运行模式切换 ARM Cortex-A系列内核的处理器支持多种运行模式的切换。 不同的运行模式能满足不同的需求,如响应中断、运行操作系统内核、处理异常等。 目录 1 ARM Cortex-A 内核的处理器什么场景下有切换运行模式的需求 2 ARM Cortex-A 内核的处理…...

分布式因果推断在美团履约平台的探索与实践
美团履约平台技术部在因果推断领域持续的探索和实践中,自研了一系列分布式的工具。本文重点介绍了分布式因果树算法的实现,并系统地阐述如何设计实现一种分布式因果树算法,以及因果效应评估方面qini_curve/qini_score的不足与应对技巧。希望能…...
254.【2023华为OD机试真题】-任务处理(贪心算法-JavaPythonC++JS实现)
🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-任务处理二.解题思路三.题解代码Python题解代码…...

《WebKit 技术内幕》学习之十五(5):Web前端的未来
5 Crosswalk项目 Crosswalk项目是由英特尔公司发起的一个开源项目,该项目基于WebKit(Blink)和Chromium等开源项目打造,其目的是提供一个跨不同操作系统的Web运行环境,包括Android、Tizen、Linux、Windows、MacOS等众多…...

MySQL十部曲之四:MySQL中的数据类型
文章目录 前言概述数字类型数字类型语法数字类型字面量十六进制字面量位字面量布尔字面量 数字类型的属性超出范围和溢出处理 时间和日期类型时间和日期类型语法DATE、DATETIME和TIMESTAMP的异同TIMESTAMP和DATETIME的自动初始化和更新时间和日期字面量 字符串类型字符串类型语…...

flyway使用配置参数和注意事项介绍
文章目录 业务场景参数介绍initSqlsbaselineOnMigratebaselineVersiontargetvalidateOnMigrate SQL注意事项 业务场景 对于生产环境,随着项目版本迭代,数据库结构也会变动。如果一个项目在多个地方实施部署,且版本不一致,就需要一…...

ubuntu_qtcreator安装
https://download.qt.io/official_releases/qtcreator/ 5.15 以上安装 QT5.15以上不再提供离线安装包,只能在线安装,– 下载 下载地址如下: 腾讯云的国内资源: Index of /qt/official_releases/online_installers/ 官网下载:…...
uniapp map自定义气泡窗
uniapp map自定义气泡窗 1、map <template><view><map class"map" :latitude"mapCenter.lat" :longitude"mapCenter.lng" :scale"5" :markers"mapData"><!--自定义冒泡--><cover-view slot&qu…...

数据分析的理念、流程、方法、工具(上)
一、数据的价值 1、数据驱动企业运营 从电商平台的「猜你喜欢」到音乐平台的「心动模式」,大数据已经渗透到了我们生活的每一个场景。不论是互联网行业,还是零售业、制造业等,各行各业都在依托互联网大数据(数据采集、数据存储、…...

qiankun子应用静态资源404问题有效解决(涉及 css文件引用图片、svg图片无法转换成 base64等问题)
在👉🏻 qiankun微前端部署👈🏻这个部署方式的前提下,遇到的问题并解决问题的过程 最开始的问题现象 通过http请求本地的静态json文件404css中部分引入的图片无法显示 最开始的解决方式 在👉dz…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...