架构师之路(十六)计算机网络(传输层)

前置知识(了解):计算机基础。

作为架构师,我们所设计的系统很少为单机系统,因此有必要了解计算机和计算机之间是怎么联系的。局域网的集群和混合云的网络有啥区别。系统交互的时候网络会存在什么瓶颈。

既然网络层已经能把源主机上发出的数据传送给目的主机,那么为什么还需要加上一个传输层呢?这就需要我们理解主机用户应用层通信的主体,位于两台网络主机中真正的数据通信主体并不是这两台主机,而是两台主机中的各种网络应用进程。同一时间一台主机上可能有多个进程同时运行,这时候就需要为应用程序提供一个标识,那就是端口.而传输层就是为了提供这种端到端的服务而存在的.

端口分为知名端口和动态端口。有些网络服务会使用固定的端口,这类端口称为知名端口,端口号范围为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连接更好

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一款相对比较强大的国产ARM单片机HC32F4A0

已经用了3年的HC32F4A0,已经对它比较熟悉了,与STM32相比它的外设使用这些的确是挺大大,不像GD32一类的单片机很多都能兼容STM32。用久了之后就更喜欢用HC32F4A0,功能强大,外设使用灵活,用点向FPGA靠拢的感觉…

MAX27——处理max模型导出Zbrush中,无UV,或者UV炸开,反向等问题。

现在很多小伙伴要做数字人的时候会用到zbrush拓补高模。制作法线。有些人喜欢在zbrush中去做封套。也有喜欢直接用max做低模,做好的uv导入到Zbrush中,直接把高模法线,烘焙到低模UV的。这里主要讲解以下max导出到zbrush中,UV炸开&a…

来自世坤!寻找Alpha 构建交易策略的量化方法

问:常常看到有人说Alpha seeking,这究竟是什么意思? 推荐这本《Finding Alphas: A Quantitative Approach to Building Trading Strategies》。我拿到的PDF是2019年的第二版。来自WorldQuant(世坤)的Igor Tulchinshky…

热门技术问答 | 请 GaussDB 用户查收

近年来,Navicat 与华为云 GaussDB 展开一系列技术合作,为 GaussDB 用户提供面向管理开发工具的生态工具。Navicat 现已完成 GaussDB 主备版(单节点、多节点)和分布式数据库的多项技术对接。Navicat 通过工具的流畅性和实用性&…

内网穿透、远程桌面、VPN的理解

最近在研究内网穿透的相关技术,然后回想起一些相关的技术,比如说要远程桌面公司的电脑,VPN连入内网等。然后想着在此处记录一下,各个的区别,这个纯粹是从技术层面的理解,此处不详细解释怎么去实现或者用什么…

k8s的图形化工具rancher

1、rancher:是一个开源的企业级多集群的k8s管理平台 2、rancher和k8s的区别 (1)都是为了容器的调度和编排系统 (2)但rancher不仅能够调度,还能管理k8s集群,自带监控(普罗米修斯&a…

仅使用 Python 创建的 Web 应用程序(前端版本)第05章_共通代码

前面介绍了很多,但是让我们从本章开始实现 WTS。 在本章中,我们将实现所有页面的公共部分:SessionManager、MockDB、Model 和 Application。 SessionManger 与 Streamlit 会话交互。 在WTS中,我们的目标是使代码清晰,SessionManager负责读写st.session_state数据。 Mock…

插入排序

插入排序 概述步骤代码示例输出结果 概述 插入排序是一种最简单直观的排序算法,它的工作原理是通过创建有序序列和无序序列,然后再遍历无序序列得到里面每一个数字,把每一个数字插入到有序序列中正确的位置。 插入排序是一种简单直观的排序…

UI 自动化测试框架:PO 模式+数据驱动

1. PO 设计模式简介 什么是 PO 模式? PO(PageObject)设计模式将某个页面的所有元素对象定位和对元素对象的操作封装成一个 Page 类,并以页面为单位来写测试用例,实现页面对象和测试用例的分离。 PO 模式的设计思想与…

云计算项目五:部署数据库服务mysql |部署共享存储服务NFS | 配置网站服务

部署数据库服务mysql |部署共享存储服务NFS | 配置网站服务 案例1:配置逻辑卷步骤一:创建LV步骤二:格式化案例2:配置数据库服务器步骤一:安装软件MySQL服务软件(2台数据库服务器都要安装)步骤二:挂载lv设备步骤三:启动服务步骤四:管理员登录案例3:配置主从同步步骤一…

wsl利用netsh端口转发实现http代理

1、端口转发 netsh interface portproxy add v4tov4 listenaddress192.168.1.102 listenport10086 connectaddress127.0.0.1 connectport99992 端口检查 上面命令执行完成后,检查命令是否执行成功 netsh interface portproxy show all检查端口是否正常监听 nets…

Spring什么是控制反转IOC和依赖注入DI的关系?什么是IOC容器?IOC容器管理组件的例子

控制反转IOC的概念 控制反转IOC 是Spring的一个思想,我们具象化到它是一个容器,包含并管理组件对象的生命周期,容器主动的将资源注入给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的…

threejs学习

重要概念(场景、相机、渲染器) 如下图所示,我们最终看到浏览器上生成的内容是通过虚拟场景和虚拟相机被渲染器渲染后的结果,下面首先介绍这三个概念,将贯穿所有简单复杂的threejs项目。 场景 Scene 虚拟的3D场景&a…

【论文+App试玩+图像到视频】2311.Animate-anyone:上传1张图片为任何人制作动画(用于角色动画的一致且可控的图像到视频合成)(暂未开源)

项目主页:https://humanaigc.github.io/animate-anyone/ 论文: Animate Anyone: Consistent and Controllable Image-to-Video Synthesis for Character Animation 摩尔线程复现代码:https://github.com/MooreThreads/Moore-AnimateAnyone 原作者讲解&am…

Go 定时器:如何避免潜在的内存泄漏陷阱

这篇文章将探讨的是 Go 中如何高效使用 timer,特别是与select 一起使用时,如何防止潜在的内存泄漏问题。 引出问题 先看一个例子,我们在 Go 中的 select 使用定时器,实现为消息监听加上超时能力。 核心代码,如下所示…

linux clickhouse 安装

1、官网下载clickhouse安装包 下载地址, clickhouse分lts和stable版本,lts是长期版本,一般选择安装lts版本。 其中clickhouse-server是clickhouse服务,就是用来访问数据存储数据,clickhouse-client是用来通过命令访问数…

【操作系统和计网从入门到深入】(四)基础IO和文件系统

前言 这个专栏其实是博主在复习操作系统和计算机网络时候的笔记,所以如果是博主比较熟悉的知识点,博主可能就直接跳过了,但是所有重要的知识点,在这个专栏里面都会提到!而且我也一定会保证这个专栏知识点的完整性&…

Vue2 - keep-alive 作用和原理

目录 1&#xff0c;介绍和作用2&#xff0c;原理3&#xff0c;使用场景3.1&#xff0c;效果展示3.2&#xff0c;实现思路 1&#xff0c;介绍和作用 <!-- 非活跃的组件将会被缓存&#xff01; --> <keep-alive><component :is"activeComponent" />…

将AWS iot消息数据发送Kinesis Firehose Stream存向S3

观看此文章之前&#xff0c;请先学习AWS iot的数据收集&#xff1a; 使用Linux SDK客户端向AWS Iot发送数据-CSDN博客 1、工作原理&#xff1a; 1.1 规则 规则可让您的设备与 AWS 服务进行交互。分析规则并根据物品发送的消息执行操作。您可以使用规则来支持任务&#xff0…

前端开发提高效率的两大工具

一、浏览器中的开发者工具 怎么启动开发者工具&#xff1f; 在浏览器中按下F12或者鼠标右键点击检查 怎么利用&#xff08;常用的几点&#xff09;&#xff1f; 1、元素 点击标红的图标可以用于在页面选择元素&#xff0c;同时右侧会找到元素在前端代码中的位置 点击下方红…