计算机网络 —— 运输层

运输层

5.1 运输层概述

运输层的主要任务是,如何为运行在不同主机上的应用进程提供直接的通信服务。运输层协议又称为端到端协议。

在这里插入图片描述

根据应用需求的不同,因特网的运输层为应用层提供了两种不同的运输协议,即面向连接的TCP和无连接的UDP

5.2 运输层端口号、复用与分用的概念
端口号

运行在计算机上的进程使用进程标识符PID来标志。但是因特网上的计算机并不是使用统一操作系统,不同的操作系统(windows,linus,Mac OS)又使用不同格式的进程标识符。为了使运行不同操作系统的计算机的应用程序之间能够进行网络通信,就必须使用统一的方法对TCP/IP体系的应用进程进行标识

TCP/IP体系的运输层使用端口号来区分应用层的不同应用进程。

端口号使用16比特标识,取值范围0~65535

  • 熟知端口号:0~1023,IANA把这些端口号指派给了TCP/IP体系中最重要的一些应用协议,例如:FTP使用21/20,HTTP使用80,DNS使用53。
  • 登记端口号:1024~49151,为没有熟知端口号的应用程序使用。使用这类端口号必须在IANA按照规定的手续登记,以防止重复。例如:MySQL 使用的端口是 3306。
  • 短暂端口号:49152~65535,留给客户进程选择暂时使用。当服务器进程收到客户进程的报文时,就知道了客户进程所使用的动态端口号。通信结束后,这个端口号可供其他客户进程以后使用。

端口号只具有本地意义,即端口号只是为了标识本计算机应用层中的各进程,在因特网中,不同计算机中的相同端口号是没有联系的

发送方的复用和接收方的分用

发送方的某些应用进程所发送的不同应用报文,在运输层使用UDP协议进行封装,这称为UDP复用。而另一些应用进程所发送的不同应用报文,在运输层使用TCP协议进程封装,则被称为TCP复用

运输层采用端口号区分不同的应用进程,不管是使用运输层UDP协议封装成的UDP用户数据报,还是使用TCP协议封装成的TCP报文段,在网络层都需要被IP协议封装成IP数据报,这被称为IP复用

IP数据报首部中协议字段的值用来表名IP数据报的数据载荷部分封装的是何种协议数据单元。

  • 取值为6,表示封装的是TCP报文段
  • 取值为17,表示封装的UDP报文段

接收方的网络层收到IP数据报后进行IP分用。若IP数据报首部中协议字段的值为17,则把IP数据报的数据载荷部分所封装的UDP用户数据报上交运输层的UDP。若协议的字段为6,则把IP数据报的数据载荷部分所封装的TCP用户数据报上交运输层的TCP。运输层对UDP用户数据报进行UDP分用,对TCP报文进行TCP分用。根据端口号将它们交给上层相应的应用进程。

在这里插入图片描述

5.3 UDP 和 TCP 的对比

在这里插入图片描述

5.4 TCP 的流量控制

一般来说,我们总是希望数据传输得更快一些。但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失。所谓流量控制(flowcontrol)就是让发送方的发送速率不要太快,要让接收方来得及接收。利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。

TCP接收方利用自己的接收窗口的大小来限制发送方发送窗口的大小。

TCP发送方收到接收方的零窗口通知后,应启动持续计时器。持续计时器超时后,向接收方发送零窗口探测报文

  • ACK: TCP报文段首部中的标志位,取值1表示这是一个TCP确认报文段。
  • ack: TCP报文段首部中的确认号字段,取值201表示序号201之前的数据已全部正确接收,现在希望收到序号201及其后续数据。
  • rwnd:是TCP报文段首部中的窗口字段,取值300表示自己的接收窗口大小为300

在这里插入图片描述

假设主机B向主机A发送了零窗口的报文段后不久,主机B的接收缓存又有了一些存储空间。于是主机B向主机A发送了接收窗口等于300的报文段。然而这个报文段在传输过程中丢失了。

主机A一直等待主机B发送的非零窗口的通知。

主机B也一直等待主机A发送的数据。

如果不采取措施,这种互相等待而形成的死锁局面将一直持续下去。

为了解决这个问题,TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器超时,就发送一个零窗口探测报文,仅携带一字节的数据。而对方在确认这个探测报文段时,给出自己现在的接收窗口值,如果接收窗口值仍为0,那么收到这个报文段的乙方就重新启动持续计时器。

如果接收窗口不是0,那么死锁的局面就可以被打破。

5.5 TCP 的拥塞控制

在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏。这种情况就叫做拥塞。若出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降

在这里插入图片描述

慢开始

拥塞窗口在小于慢开始门限值时按照指数增加

在这里插入图片描述

拥塞避免

拥塞窗口在大于慢开始门限后每次加一,如果出现丢失,慢开始门限折半,拥塞窗口大小变为1。重新进行慢开始

快重传

在这里插入图片描述

快恢复

在这里插入图片描述

在这里插入图片描述

5.6 TCP 超时时间重传的选择

RTT:往返时间

RTO:超时重传时间

在这里插入图片描述

5.7 TCP 可靠传输的实现

在这里插入图片描述

TCP基于以字节为单位的滑动窗口来实现可靠传输

  • 发送方在未收到接收方的确定时,可将发送窗口内还未发送的数据全部发送出去。
  • 接收方只能接收序号落入发送窗口内的数据

虽然发送方的发送窗口是根据接收方的接收窗口设置的,但在同一时刻,发送方的接收窗口和接收方的接收窗口并不总是一样大

  • 网络传送窗口值需要经历一定的时间滞后,并且这个时间还是不确定的。
  • 发送方还可能根据网络当时的拥塞情况适当减小自己的发送窗口尺寸。

对于不按时序到达的数据应该如何处理,TCP并无明确规定。

  • 如果接收方把不按时序到达的数据一律丢弃,那么接收窗口的管理将会比较简单,但这样做对网络资源的利用不利,因为发送方会重复传送较多数据。
  • TCP通常对不按时序到达的数据是先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按时序交付上层的应用程序

TCP要求接收方必须有累计确认和捎带确认机制,这样可以减小传输开销。接收方可以在合适的时候发送确认,也可以在自己有数据要发送时把确认信息顺便捎带上。

  • 接收方不应该过分推迟发送确认,否则会导致发送方不必要的超时重创,这反而浪费了网络的资源。TCP标准规定,推迟延迟的时间不应超过0.5秒。若收到一连串具有最大长度的报文段,则必须每隔一个报文段就发送一个确认。
  • 捎带确认实际上并不经常发生,因为大多数应用程序很少同时在两个方向上发送数据

TCP的通信是全双工通信。通信中的每一方都在发送和接收报文段。因此,每一方都有自己的发送窗口和接收窗口。

5.8 TCP 的运输连接管理

TCP是面向连接的协议,它基于运输连接来传送TCP报文段。

TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程。

TCP运输连接有以下三个阶段:

  1. 建立TCP连接
  2. 数据数据传输
  3. 释放连接

TCP的运输连接管理就是使运输连接的建立和释放都能正常地进行。

5.8.1 TCP 的连接建立

TCP的连接建立要解决以下三个问题:

  1. 使TCP双方能够确知对面的存在
  2. 使TCP双方能够协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选择以及服务等)
  3. 使TCP双方能够运输实体资源(如缓存大小、连接表中的项目等)进行分配

TCP报文中的字段

SYN:首部中的同步位

ACK:首部中的确认位

ack:确认号字段,主机甲对主机乙中TCP客户进程所选择的序列号seq的确认

seq:主机对另一个主机中TCP服务进程所选择的初始序号,可由TCP服务器随意制定

三次握手

  1. TCP客户端进程向服务端进程发送TCP请求报文段。

  2. 当TCP服务端收到请求报文后,若同意连接,则向TCP客户端进程发送TCP连接请求确认报文段,并进入同步接收状态。

  3. TCP客户进程收到TCP连接请求确认报文段后,还要向TCP服务端进程发送一个普通的TCP确认报文段,并进入连接已建立状态。

  4. 当TCP服务端收到报文段后也进入连接已建立状态,至此连接建立。

在这里插入图片描述

采用三报文握手而不是二报文握手的目的是为了防止已失效的连接请求报文段突然又传送到了TCP服务器

在这里插入图片描述

5.8.2 TCP 的连接释放

TCP的四次挥手

  1. TCP客户进程发送TCP连接释放报文段,并进入终止等待1状态
  2. TCP服务端收到TCP连接释放报文段后,会发送一个普通的TCP确认报文段并进入关闭等待状态。TCP服务端进程这时应通知高层应用进程:TCP客户端进程要断开与自己的TCP连接。此时从TCP客户端到TCP服务端进程这个方向的连接就释放了,这时的TCP属于半关闭状态,从TCP服务端进程到TCP客户端进程这个方向的连接并未关闭。
  3. TCP客户端进程收到TCP确认报文字段后就进入终止等待2状态,等待TCP服务端进程发出的TCP连接释放报文段
  4. 若使用TCP服务器进程的应用程序已经没有数据要发送了,应用程序就通知其TCP服务端进程释放连接。TCP服务进程发送TCP连接释放报文段并进入最后确认状态
  5. TCP客户进程收到TCP连接释放报文段后,必须针对该报文段发送普通的TCP确认报文段。之后进入时间等待状态,经过2 MSL后才能进入关闭状态
  6. TCP服务端进程收到该报文段后就进入关闭状态

在这里插入图片描述

TCP保活计时器

TCP双方已经建立了连接,突然TCP客户端进程发生了故障,通过计时器,可以使TCP服务端进程发现这种状况。

在这里插入图片描述

5.9 TCP 报文的首部格式

为了实现可靠传输,TCP采用面向字节流的方式。但TCP在发送数据时,是从发送缓存取出一部分或全部字节并给其添加一个首部使之成为TCP报文段后进行发送。

  • 一个TCP报文段由首部和数据载荷两部分构成;
  • TCP的全部功能都体现在它首部中各字段的作用

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

金融需要多样性,量化需要C++!通过本文,你可以知道:1、为什么是C++

通过本文,你可以知道: 1、为什么是C 2、Python的用武之地 3、量化C岗位薪酬水平 C VS Python 量化交易系统开发语言主要用C,也有人用Python。 但是从经验看,用C开发的量化交易系统能够让在系统中程序运行的速度更快。 量化交易…

Maya为模型添加细分数

文章目录 方法1 通道盒操作注意 方法2 添加分段操作注意 方法3 平滑操作 方法1 通道盒 操作 选中物体,选择通道盒/输入/点一下模型的名字/细分数,分别为长宽高添加细分 这相当于修改模型的底层数据,不会平滑模型,只会进行细分 …

瑞熙贝通实验室物联网管理平台新升级|支持远程开门视频监控与电源控制以及环境监测

瑞熙贝通实验室智能物联网管控平台:利用“互联网与物联网技术”有机融合,对实验室的用电安全监测、实验室环境异常监测(颗粒物监测、明火监测、可燃气体、烟雾监测、温湿度传感器、红外人体感应)、实验室人员安全准入、万物互联等…

爬虫案例1

通过get请求直接获取电影信息 目标页面: https://spa6.scrape.center/在network中可以看到是通过Ajax发送的请求,这个请求在postman中也可以直接请求成功,这只是一个用来练习爬虫的,没有达到js逆向的过程,需要通过分析js 代码来获…

Excel判断CD两列在EF两列的列表中是否存在

需求 需要将CD两列的ID和NAME组合起来,查询EF两列的ID和NAME组合起来的列表中是否存在? 比如,判断第二行的“123456ABC”在EF的第二行到第四行中是否存在,若存在则显示Y,不存在则显示N 实现的计算公式 IF(ISNUMBER…

淘宝基于Nginx二次开发的Tengine服务器

最近在群里看到这样一张阿里云网关报错的截图,我保存下来看了下 看到下面有 Tengine提供技术支持,这个Tengine是什么东西呢?我搜索了下似乎是淘宝在nginx的基础上自己改的Web服务器 Tengine还支持OpenResty框架,该框架是基于Ngin…

SAR ADC学习笔记(5)

高精度比较器 一、基于开环运放的比较器 OP开环应用时不需要考虑频率特性(相位裕度那些) ,不存在稳定性问题。 单级运放的时域响应 多级运放 二、Latch比较器 Latch比较器的速度 Latch比较器的噪声优化 三、高速高精度比较器 消除失调电压OFFSET OOS IOS

nRF52832——唯一 ID 与加密解密

nRF52832——唯一 ID 与加密解密 唯一 ID 概念唯一 ID 作用读取唯一 ID 唯一 ID 用于加密TEA 加密算法唯一 ID 的加密和解密 唯一 ID 概念 唯一 ID 作用 nRF52xx 微控制器提供一组 64 位的唯一 ID 号,这个唯一身份标识所提供的 ID 值对任意一个 nRF52xx 微控制器&…

展会邀约 | 加速科技将携重磅产品亮相SEMICON China 2024

SEMICON China 2024将于3月20日-3月22日在上海新国际博览中心隆重举行。展会期间,加速科技将携重磅产品高性能数模混合信号测试机ST2500EX、LCD Driver测试机Flex10K-L、高密度数模混合信号测试系统ST2500E、高性能数模混合信号测试系统ST2500A亮相此次行业盛会&…

WEB区块链开发组件 - KLineChart

当我们开发区块链的时候,实现K线可能大家会想到EChart,但是EChart做可能需要耗费大量工作量,实现出来的功能估计也是牵强着用。 这时候,我们可能网上会搜索到TradingView,可是这个组件虽然功能非常强大,但是还是要费事…

Android7.1 ANR error 弹窗处理

Android7.1 ANR error 弹窗处理 问题描述解决方法 郑重声明:本人原创博文,都是实战,均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Platform: Rockchip OS:Android 7.1.2 Kernel: 3.10 问题描述 有时会用到第三方apk,内置到系统中&…

全国车辆识别代码信息API查询接口-VIN深度解析

我们先来介绍下什么是vin码,以及vin码的构成结构解析,汽车VIN码,也叫车辆识别号码,通俗可以理解为汽车的身份证号码。 VIN码一共分四大部分: 1~3位,是世界制造厂识别代号(WMI)&…

DevOps本地搭建笔记(个人开发适用)

需求和背景 win11 wsl2 armbian(玩客云矿渣),构建个人cicd流水线,提高迭代效率。 具体步骤 基础设施准备 硬件准备:一台笔记本,用于开发和构建部署,一台服务器,用于日常服务运行。 笔记本…

如何批量注册无数个电子邮箱

需求 最近我们需要批量注册无数个steam账号来做一些不可描述的事情,那么我们就需要先批量注册无数个电子邮箱Email 而且我们希望注册和接收邮件是可以通过脚本自动化的,最好是通过正常的API接口 什么叫正常的API接口?正常的API接口是指邮件…

Antd中s-table组件某字段进行排序

Antd中s-table组件某字段进行排序 提前说明&#xff0c;s-table组件包含分页等功能 <s-tableref"table":columns"columns":data"loadData"bordered:row-key"(record) > record.id"></s-table>而其中loadData为获取表数…

线性表的顺序存储实验

附 录 #include<stdio.h> #include<stdlib.h>typedef struct {double* data;int length; }Sqlist;void initSqlist(Sqlist* L, int n) {L->data (double*)malloc(n * sizeof(double)); if (L->data NULL){printf("内存分配失败\n");exit(1);}pri…

MTK安卓开发板_联发科开发板评估套件_安卓主板硬件开发

在介绍开发板之前&#xff0c;让我们先来区分一下核心板和开发板的区别。核心板是一种集成度高、功能完整的计算模块&#xff0c;搭载系统&#xff0c;简化了外围接口&#xff0c;体积尺寸相对较小&#xff0c;主要适用于嵌入式系统。而开发板由核心板底板组成&#xff0c;提供…

Python实战:采集全国5A景点名单

本文将以采集全国 5A 景点名单为例&#xff0c;详细介绍如何使用 Python 进行数据采集。 本文采集到全国340家5A景区的名单&#xff0c;包括景区名称、地区、 A级、评定年份这些字段。 一、分析数据源 为了获取权威数据&#xff0c;我们来到主管部门的官方网站&#xff0c;在右…

Java集合中经典的 5种设计模式,打死也要记住啊!

集合 一、 迭代器模式(Iterator Pattern)二、 工厂模式(Factory Pattern)三、 装饰器模式(Decorator Pattern)四、 适配器模式(Adapter Pattern)五、 组合模式(Composite Pattern) Java 集合框架中的 List、Set、Map 以及其实现类都使用了多种经典的设计模式 一、 迭代器模式(I…

测试用例是什么?怎么写?不会测试用例的看过来,

前言 今天笔者想和大家来聊聊测试用例&#xff0c;这篇文章主要是想要写给测试小伙伴们的&#xff0c;因为我发现还是有很多小伙伴在遇到写测试用例的时候无从下手&#xff0c;我就想和大家简单的聊聊&#xff0c;这篇文章主要是针对功能测试的哟。 一、什么是测试用例&#…