计算机网络微课堂(湖科大教书匠)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和紧急指针

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

在这里插入图片描述

扩展首部:

选项:

在这里插入图片描述

填充:

在这里插入图片描述

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

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

相关文章

FFmpeg 剪切(Seeking)视频后音画不同步问题分析

问题 需求:最近,需要剪切一段mp4格式的视频,要求从第30s位置开始剪切,持续30s的视频段。于是乎,拿出音视频领域最强工具之一,FFmpeg神器,输入命令行:ffmpeg -i input.mp4 -ss 00:00:30.0 -codec copy -t 30 output.mp4播放这段视频output.mp4,问题出现了:前几秒没有画…

Django 表单使用示例:数据格式校验

在本文中,我们将使用 Django 的表单(Forms)功能来创建一个添加角色的页面,并对用户提交的数据进行格式校验。 创建 Django 项目和应用 首先,我们创建一个名为 ​​form_demo​​​ 的 Django 项目和一个名为 ​​app01​​ 的应用: django-admin startproject form_de…

FAST SPLIT PARTITION 快速分割分区

How to Perform a FAST SPLIT PARTITION Using ALTER TABLE? (Doc ID 1268714.1) 快速分割分区&#xff0c;就是如果最大的分区全部满足新split分区的条件&#xff0c;直接把最大的这个改名&#xff0c;再新加一个max分区出来。这样可以避免partition分区index的unsable&…

Nginx配置referer报错大坑:unknown directive “valid_referers“

错误&#xff1a; nginx: [emerg] unknown directive "if($invalid_referer)" in /usr/local/nginx/conf/nginx.conf:27 代码&#xff1a; 设置有效的refer值 none&#xff1a;检测地址没有refer&#xff0c;则有效server_name&#xff1a;检测主机地址&#xf…

KV260视觉AI套件--开箱报告

目录 1. 简介 2. 与 Zynq 的渊源 3. 官方的入门步骤 4. 总结 1. 简介 传统的ARMFPGA或DSPFPGA控制方案在软件、逻辑、硬件以及系统工程的协同调试中&#xff0c;往往需要团队成员之间严格按照预定计划和接口规范进行分工合作&#xff0c;这不仅增加了测试过程的复杂性&…

求一个集合里面的所有子集 使用c++

#include <iostream> // 包含输入输出流头文件 #include <vector> // 包含vector容器头文件 #include <cmath> // 包含数学函数头文件&#xff0c;用于pow函数using namespace std; // 使用std命名空间&#xff0c;避免每次都写std::// 定义生成幂集…

《概率论与数理统计》期末复习笔记_上

目录 第1章 随机事件与概率 1.1 随机事件 1.2 事件的关系与运算 1.3 概率的定义与性质 1.4 古典概型_重点 1.5 几何概型 1.6 条件概率与乘法公式 1.7 全概率公式与贝叶斯公式_重点 1.8 事件的独立性_重点 1.9 伯努利概型_重难点 第2章 随机变量及其分布 2.1 随机变…

实验2 色彩模式转换

1. 实验目的 ①了解常用的色彩模式&#xff0c;理解色彩模式转换原理&#xff1b; ②掌握Photoshop中常用的颜色管理工具和色彩模式转换方法&#xff1b; ③掌握使用Matlab/PythonOpenCV编程实现色彩模式转换的方法。 2. 实验内容 ①使用Photoshop中的颜色管理工具&#xff…

Dubbo 简单入门

Dubbo 简单入门 Dubbo 是一个高性能的分布式服务框架&#xff0c;旨在解决微服务架构下的 RPC&#xff08;远程过程调用&#xff09;问题。其核心原理包括服务注册与发现、通信协议、负载均衡、容错机制等。以下是对这些核心原理的详细讲解&#xff1a; 1. 服务注册与发现 服…

Kafka~消息系列问题解决:消费顺序问题解决、消息丢失问题优化(不能保证100%)

消息消费顺序问题 使用消息队列的过程中经常有业务场景需要严格保证消息的消费顺序&#xff0c;比如我们同时发了 2 个消息&#xff0c;这 2 个消息对应的操作分别对应的数据库操作是&#xff1a; 用户等级升级。根据用户等级下的订单价格 假如这两条消息的消费顺序不一样造…

第0章_项目方案介绍

文章目录 第0章 项目方案介绍0.1 功能介绍0.2 硬件方案0.3 软件方案0.3.1 上位机方案0.3.2 **中控方案**0.3.3 **传感器方案**0.3.4 **技术难点** 第0章 项目方案介绍 0.1 功能介绍 本课程来自一个真实项目&#xff1a;多个气体传感器的管理。由于气体传感器比较昂贵&#xf…

比尔盖茨:Agent将是AI最大的赛道

Agent不仅将改变人们与计算机的互动方式&#xff0c;还将颠覆软件行业&#xff0c;引发自从我们从键入命令到点击图标以来计算机领域的最大革命。 保罗艾伦和我一起创立微软的至今&#xff0c;我对软件的热爱至今依然不减。 然而&#xff0c;尽管在过去的几十年中软件已经取得…

Vue.js 和 Node.js 全栈项目的运行与部署指南

Vue.js 和 Node.js 全栈项目的运行与部署指南 前言具体运行方式导入数据库初始化安装配置nodejs启动server后端启动client前端确保前后端正确连接 前言 本博客用来介绍一下一个包含前端和后端代码的全栈项目MoreMall&#xff0c;前端部分使用了 Vue.js&#xff0c;后端部分使用…

多阶段分层构建容器化Spring Boot应用程序

上一节中&#xff0c;容器化spring boot应用程序-CSDN博客我们介绍了基于简单的Dockerfile对spring boot进行容器化的过程&#xff0c;本讲将介绍如何基于Dockerfile进行多阶段的分层构建过程&#xff0c;希望对大家有所帮助。 Spring Boot从版本2.3.0开始支持分层构建容器化的…

Mysql中varchar类型数字排序不对踩坑记录

场景 在进行表设计时将版本号字段设计了为varchar类型&#xff0c;尽量从表设计阶段将数字类型列设计为int型。 再进行排序时如果版本号累计到了10及以上&#xff0c;那么再进行排序时则会出现问题。 比如下面执行排序时发现10被排在了第一位。 这是因为 varchar类型对数字…

51单片机第8步_absacc.h库函数

本章重点学习库函数absacc.h的使用,介绍绝对宏和绝对地址的用法。故事有点老掉牙&#xff0c;但学校的教授们还在继续。 #include <REG52.h> //包含头文件REG52.h,使能51内部寄存器; #include <absacc.h> #include <stdio.h> //包含头文件stdio.h //_get…

已备案网站变更并且不影响现有业务的方案

已备案网站变更并且不影响现有业务的方案 近日有个工作上的需求&#xff0c;已备案网站变更并且不影响现有业务&#xff0c;记录一下。 需求 域名&#xff1a;XXXXXX.com备案变更前主体&#xff1a; 海南XXXXXX科技有限公司 备案变更后主体&#xff1a; 深圳XXXXXX科技有限…

【05】从0到1构建AI生成思维导图应用 -- 前端交互实现

【05】从0到1构建AI生成思维导图应用 – 前端交互实现 大家好&#xff01;最近自己做了一个完全免费的AI生成思维导图的网站&#xff0c;支持下载&#xff0c;编辑和对接微信公众号&#xff0c;可以在这里体验&#xff1a;https://lt2mind.zeabur.app/ 上一章&#xff1a;http…

【图解大数据技术】Hive、HBase

【图解大数据技术】Hive、HBase Hive数据仓库Hive的执行流程Hive架构数据导入Hive HBaseHBase简介HBase架构HBase的列式存储HBase建表流程HBase数据写入流程HBase数据读取流程 Hive Hive是基于Hadoop的一个数据仓库工具&#xff0c;Hive的数据存储在HDFS上&#xff0c;底层基于…

Linux 常用命令 - dd 【复制及转换文件内容】

简介 dd 命令源自于磁盘复制&#xff08;disk dump&#xff09;的缩写&#xff0c;是 Linux 和 Unix 系统中用于转换和复制文件的一个强大工具。它可以在复制过程中进行格式转换&#xff0c;支持不同的块大小&#xff0c;能够直接对硬盘设备进行操作&#xff0c;非常适合进行备…