计算机网络微课堂(湖科大教书匠)TCP部分

计算机网络微课堂(湖科大教书匠)TCP部分

【计算机网络微课堂(有字幕无背景音乐版)】

TCP的流量控制

一般来说,我们希望数据传输得更快一些。但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失。

流量控制(flow control)就是让发送方的发送速率不要太快,要让接收方来得及接收,利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。

在这里插入图片描述

如果主机B接收窗口被调整为0,那么主机A就会启动持续计时器,持续计时器超时,就发送零窗口探测报文(携带1字节数据)。然后主机B要对零窗口探测报文进行确认,并告知自己的接受窗口。

主机B即使接收窗口为0,也必须接受零窗口探测报文段、确认报文段、以及携带有紧急数据的报文段。

零窗口探测报文段也有重传计时器,如果零窗口探测报文段丢失,那么等到重传计时器超时后,零窗口探测报文段会被重传。

在这里插入图片描述

TCP的拥塞控制

在这里插入图片描述

拥塞控制有四种算法:慢开始,拥塞避免,快重传,快恢复。

cwnd:拥塞窗口(动态变化)

cwnd维护原则:没有出现拥塞,cwnd就增大;出现拥塞,cwnd就减少。

拥塞窗口值是几就能发送几个数据报文段。

发送方将cwnd作为发送窗口swnd,cwnd=swnd。

慢开始门限ssthresh:

当 cwnd < ssthreshde 的时候,使用慢开始算法;

当 cwnd > ssthreshde 的时候,使用拥塞控制算法;

当 cwnd = ssthreshde 的时候,可以使用慢开始算法,也可以使用拥塞控制算法;

在这里插入图片描述

慢开始和拥塞避免

**慢开始:**每个传输轮次,发送方每收到一个对新报文段的确认时,就把拥塞窗口值+1。

比如最开始cwnd=1;发送一个,收到一个,cwnd+1=2;第二轮发送两个,收到两个,cwnd+2=4;第三轮发送4个,收到4个,cwnd+4=8。

也就是说,慢开始算法中cwnd值以指数规律增大。

当拥塞窗口值增长到慢开始门限时,就开始拥塞避免算法。

拥塞避免:每个传输轮次后,cwnd值只能线性+1.

在这里插入图片描述

传输图中丢失数据包,出现重传计时器超时的情况,判断网络很可能出现拥塞控制:

将ssthresh值更新为发生拥堵时cwnd值的一半;

将cwnd值减少为1,并重新开始执行慢开始算法。

比如图中的cwnd=24,ssthresh就设置为12.

在这里插入图片描述

全部过程如图所示:

在这里插入图片描述

“慢开始”是指一开始向网络注入的报文段少,并不是指拥塞窗口cwnd增长速度慢;
“拥塞避免”并非指完全能够避免拥塞,而是指在拥塞避免阶段将拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞;

快重传

在这里插入图片描述

发送M1报文段,接收方立即确认M1,

发送M2报文段,接收方立即确认M2;

发送M3报文段,丢失,接收方无法回复;

发送M4报文段,接收方重复确认M2;

发送M5报文段,接收方重复确认M2;

发送M6报文段,接收方重复确认M2;

发送方立即重传M3报文段,接收方重复确认M2;

在这里插入图片描述

快恢复

发送方将慢开始门限ssthresh值和拥塞窗口cwnd值调整为当前窗口的一半;开始执行拥塞避免算法。

在这里插入图片描述

TCP超时重传时间的选择

如果将报文段超时重传的时间,设置得比往返时间RTT的值小,就会引起不必要的重传加重网络负荷。

在这里插入图片描述

如果将超时重传的值设置的远大于RTT的值,会导致网络的空闲时间增大,降低了传输效率。

在这里插入图片描述

超时重传时间RTO应略大于往返时间RTT。

在这里插入图片描述

但是由于下面层次的结构也很复杂,例如每个IP数据报的转发路由可能不同,所以每次传输的往返时间不同。

如下图,RTO的时间略大于RTT0,但是下一次传输的往返时间RTT1比RTT0要长很多,此时的RTO就不适用于作为RTT1的超时重传时间,会导致没必要的重传。

在这里插入图片描述

所以不能直接使用某次测量得到的RTT样本来计算超时重传时间RTO。

所以我们计算加权平均往返时间RTTs,超时重传时间RTO略大于RTTs。

在这里插入图片描述

RTO计算:

在这里插入图片描述

往返时间RTT比较难测量,如果出现重传,容易导致测量的时间不准。

在这里插入图片描述

利用Karn算法修正版计算RTO的值:

在这里插入图片描述

如下图所示,在第五次传输中,由于RTT5>RTO4的值,所以会发生超时重传,于是此时的RTO5直接等于RTO4的两倍。

在这里插入图片描述

TCP可靠传输的实现

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

下图:报文段首部中的窗口字段rwnd的值为20——接收方表明自己的接收窗口尺寸为20字节;确认号的字段为31——接收方希望收到的下一个数据的序号是31。序号30为止的数据已经全部正确接收了。

发送根据这两个字段的值构建自己的发送窗口=20.

在这里插入图片描述

发送方在没有接到确认的情况下可以将发送窗口里面的数据全部发出,凡是没有确认的数据,在确认之前都需要保留,因为可能会超时重传。

在这里插入图片描述

发送窗口的前沿和后沿:

在这里插入图片描述

如何描述发送窗口的状态:

在这里插入图片描述

滑动窗口的滑动过程建议看原视频P63 5.7部分:

【计算机网络微课堂(有字幕无背景音乐版)】

发送窗口的数据已经全部发出后,发送方需要等待接受方的确认才能继续发送数据。

如果迟迟没有确认,重传计时器超时,会重传发生窗口内已发送的数据,并重新启动重传计时器。

在这里插入图片描述

一些其他的要点:

在这里插入图片描述

TCP的连接建立

TCP连接的三个阶段:

在这里插入图片描述

三次握手

TCP规定SYN=1的报文段不能携带数据,但要消耗掉一个序号。

TCP连接由客服端主动发起。

在这里插入图片描述

客户发送对于TCP连接请求的确认的确认是否多余?

在这里插入图片描述

四次挥手

客户发送的TCP报文段中:

序号seq字段的值u为TCP客户进程之前已发送过的、数据的最后一个字节的序号+1;

序号ack字段的值v为TCP客户进程之前已收到的、数据的最后一个字节的序号+1。

服务器发送的:

序号seq字段的值v为TCP服务器进程之前已发送过的、数据的最后一个字节的序号+1(与上面的ack字段值匹配);

序号ack字段的值u+1是对上面客户发送的seq的确认。

在这里插入图片描述

FIN=1和ACK=1表示这是一个TCP释放报文段。

在这里插入图片描述

是否有必要使得客户进入时间等待状态?

是有必要的。如果没有时间等待状态就关闭,那么如果最后一次确认丢失了,服务器就会进入无限等待客户确认的状态里,无法关闭。

在这里插入图片描述

如果客户出现故障,那么服务器怎么关闭连接?

在这里插入图片描述

TCP的首部格式

为了实现可靠传输,TCP采取了面向字节流的方式。

一个TCP报文由首部和数据载荷两部分构成。

**源端口号:**标识发送该TCP报文段的应用进程。

**目的端口号:**标识接收该TCP报文段的应用程序。

在这里插入图片描述

**序号:**指出本TCP报文段数据载荷的第一个字节的序号。

在这里插入图片描述

**确认号:**为n,表明序号到n-1为止的数据都已正确接收,期待接收序号为n的数据。

只有当确认标志位ACK取值为1时,确认号字段才有效。

在这里插入图片描述

在这里插入图片描述

一个全双工通信举例:

可以看到发送端的序号和接收端的确认号是对应的,发送端的确认号和接收端的序号也是对应的。

在这里插入图片描述

**数据偏移:**指出TCP报文段首部的长度。

在这里插入图片描述

保留:占6比特,保留为今后使用,目前为0。

校验和:不重要

**同步标志为SYN:**在TCP建立连接时用来同步序号。

SYN置1表示这是TCP连接报文段。

在这里插入图片描述

终止标志位FIN:用来释放TCP连接。

FIN置1表示这是TCP释放报文段。

在这里插入图片描述

复位标志位RST:用来复位TCP连接。

在这里插入图片描述

推送标志位PSH

在这里插入图片描述

紧急标志位URG和紧急指针

接收方会从数据载荷部分取出紧急数据,直接上交应用进程,而不必在接收缓存中排队。

在这里插入图片描述

扩展首部:

选项:

在这里插入图片描述

填充:

在这里插入图片描述

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

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

相关文章

win11 (将星x17promax) 安装WSL 子系统

最初只是想着在win11系统下挂载ext4盘符&#xff0c;方便使用。 目录 0. 简介1.安装WSL子系统1.1 环境确认1.1.1 虚拟化设置1.1.2 系统设置1.1.3 开启开发者模式&#xff08;此项有必要&#xff1f;&#xff09;1.1.4 安装WSL子系统 2.WSL操作指令2.0 WSL相关命令2.1 WSL重置2.…

pytorch神经网络训练(VGG-19)

VGG-19 导包 import torchimport torch.nn as nnimport torch.optim as optimimport torchvisionfrom torchvision import datasets, transformsfrom torch.utils.data import DataLoaderimport matplotlib.pyplot as plt 数据预处理和增强 transform transforms.Compose(…

java的序列化和反序列化

一、概念 序列化是将对象的常态存储到特定的存储介质中的过程。 反序列化是将特定的存储介质中的数据重新构建对象的过程。 问题 为每个对象属性——编写读写代码&#xff0c;过程很繁琐且非常容易出错&#xff0c;如何解决&#xff1f; 二、使用Object Output Stream类实现…

C++:enum枚举共用体union

enum枚举 C继承C的枚举用法 (1)典型枚举类型定义&#xff0c;枚举变量定义和使用 (2)枚举类型中的枚举值常量不能和其他外部常量名称冲突&#xff1a; 举例1宏定义&#xff0c;举例2另一个枚举 // 定义一个名为Color的枚举类型 enum Color {RED, // 红色&#xff0c;默认值…

golang跨平台GUI框架fyne介绍与使用详解,开放案例

golang跨平台GUI框架fyne介绍与使用详解 Fyne 是一个使用 Go 编写的易于使用的 UI 工具包和应用程序 API。 它旨在构建使用单一代码库在桌面和移动设备上运行的应用程序。 通过批量调用身份证实名和三网手机实名和银行卡核验等接口&#xff0c;完成fyne框架的基本使用介绍 主要…

AES加密算法及AES-CMAC原理白话版系统解析

本文框架 前言1. AES加密理论1.1 不同AES算法区别1.2 加密过程介绍1.2.1 加密模式和填充方案选择1.2.2 密钥扩展1.2.3分组处理1.2.4多轮加密1.2.4.1字节替换1.2.4.2行移位1.2.4.3列混淆1.2.4.4轮密钥加1.3 加密模式1.3.1ECB模式1.3.2CBC模式1.3.3CTR模式1.3.4CFB模式1.3.5 OFB模…

技术周总结2024.06.17~06.23(Doris数据库)

文章目录 一、06.18 周二1.1&#xff09; 问题01&#xff1a; doris数据表写入使用 stream load好还是 inser into好 一、06.18 周二 1.1&#xff09; 问题01&#xff1a; doris数据表写入使用 stream load好还是 inser into好 对于Doris数据表的写入操作&#xff0c;通常推荐…

动手学深度学习(Pytorch版)代码实践 -计算机视觉-46语义分割和数据集

46语义分割和数据集 # 图像分割和实例分割 """ 图像分割将图像划分为若干组成区域&#xff0c;这类问题的方法通常利用图像中像素之间的相关性。 它在训练时不需要有关图像像素的标签信息&#xff0c;在预测时也无法保证分割出的区域具有我们希望得到的语义。 图…

PDF处理篇:如何调整 PDF 图像的大小

将视觉效果无缝集成到 PDF 中的能力使它们成为强大的通信工具。然而&#xff0c;笨拙的图像大小会迅速扰乱文档的流程&#xff0c;阻碍清晰度和专业性。幸运的是&#xff0c;GeekerPDF 和Adobe Acrobat等流行的应用程序提供了用户友好的解决方案来应对这一挑战。这个全面的指南…

LabVIEW项目外协时选择公司与个人兼职的比较

​在选择LabVIEW项目外协合作伙伴时&#xff0c;外协公司和个人兼职各有优劣。个人兼职成本较低且灵活&#xff0c;但在可靠性、技术覆盖面、资源和风险管理上存在不足。而外协公司拥有专业团队、丰富资源、完善的项目管理和风险控制&#xff0c;尽管成本较高&#xff0c;但能提…

30 哈希的应用

位图 概念 题目 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何判断一个数是否在这40亿个整数中 1.遍历&#xff0c;时间复杂度O(N) 2.二分查找&#xff0c;需要先排序&#xff0c;排序(N*logN)&#xff0c;二分查找&#xff0c;logN。…

CriticGPT: 用 GPT-4 找出 GPT-4 的错误

CriticGPT 是 OpenAI 发布的一个基于 GPT-4 的模型&#xff0c;它可以帮助我们人类 Review 并纠正 ChatGPT 在生成代码时的错误。使用 CriticGPT 审查代码时&#xff0c;有 60% 的概率生成的代码更好更正确。

搭建大型分布式服务(四十二)SpringBoot 无代码侵入实现多Kafka数据源整合插件发布

系列文章目录 文章目录 系列文章目录前言MultiKafkaStarter [V2.2]一、功能特性二、快速开始&#xff08;生产端&#xff09;三、快速开始&#xff08;消费端&#xff09;四、其它特性五、变更记录六、参考文章 前言 在分布式服务的架构演进中&#xff0c;消息队列作为核心组件…

容易涨粉的视频素材有哪些?容易涨粉的爆款短素材库网站分享

如何挑选社交媒体视频素材&#xff1a;顶级视频库推荐 在社交媒体上脱颖而出&#xff0c;视频素材的选择至关重要。以下是一些顶级的视频素材网站推荐&#xff0c;不仅可以提升视频质量&#xff0c;还能帮助你吸引更多粉丝。 蛙学网&#xff1a;创意的源泉 作为创意和独特性的…

携程二面测开—中核

4.12 35min面试经验 自我介绍 在面试的开始&#xff0c;我简洁明了地进行了自我介绍&#xff0c;突出了我的教育背景、技能特长以及实习经历&#xff0c;为后续的面试内容打下了良好的基础。 实习的具体工作内容 在谈及实习经历时&#xff0c;我详细阐述了在实习期间所承担…

NodeJs 使用中间件实现日志生成功能

写在前面 今天我们实现一个记录 nodejs 服务请求日志的功能&#xff0c;大概的功能包括请求拦截&#xff0c;将请求的信息作为日志文件的内容写入到 txt 文件中&#xff0c;然后输出到指定的日志到当天日期目录中&#xff0c;从而实现后续查找用户请求信息的功能&#xff0c;下…

Ubuntu 20.04安装中文输入法出错:gnome-user-docs-zh-hans安装失败

问题&#xff1a;Ubuntu20.04安装中文输入法出错&#xff1a;gnome-user-docs-zh-hans安装失败 现象&#xff1a; 打开language Support页面的时候&#xff0c;提示install依赖的文件 这个过程中会弹窗提示: The following packages have unmet dependencies:gnome-user-doc…

Lombok的使用

IntelliJ 安装 Lombok Lombok 注解大全说明 NonNull&#xff1a;给方法参数增加这个注解&#xff0c;会自动在方法内对该参数进行是否为空的校验&#xff0c;如果为空&#xff0c;则抛出 NPE&#xff08;NullPointerException&#xff09; Getter/Setter&#xff1a;用在属性上…

Python_Socket

Python Socket socket 是通讯中的一种方式&#xff0c;主要用来处理客户端与伺服器端之串连&#xff0c;只需要protocol、IP、Port三项目即可进行网路串连。 Python套件 import socketsocket 常用函式 socket.socket([family], [type] , [proto] ) family: 串接的类型可分为…

Rpc服务的提供方(Rpcprovider)的调用流程

首先&#xff0c;服务的提供方&#xff0c;会通过rpcprovider向rpc服务方注册rpc服务对象和服务方法&#xff0c; 那么&#xff0c;我们通过protobuf提供的抽象层的service和method&#xff0c;将服务对象和它所对应的服务方法记录在map表中&#xff0c; 当它启动以后&#xff…