计算机网络 运输层下 | TCP概述 可靠传输 流量控制 拥塞控制 连接管理

news2024/11/24 15:06:15

文章目录

  • 3 运输层主要协议 TCP 概述
    • 3.1 TCP概述 特点
    • 3.2 TCP连接
    • RSVP资源预留协议
  • 4 TCP可靠传输
    • 4.1 可靠传输工作原理
      • 4.1.1 停止等待协议
      • 4.1.2 连续ARQ协议
    • 4.2 TCP可靠通信的具体实现
      • 4.2.1 以字节为单位的滑动窗口
      • 4.2.2 超时重传时间的选择
      • 4.2.3 选择确认SACK
  • 5 TCP的流量控制
    • 5.1 滑动窗口实现
  • 6 TCP拥塞控制
    • 6.1 拥塞控制一般原理
    • 6.2 拥塞控制的方法
      • 1 慢开始
      • 2 拥塞避免
      • 3 快重传
      • 4 快恢复
      • 主动队列管理AQM
  • 7 TCP运输连接管理
    • 7.1 TCP的建立
    • 7.2 TCP的连接释放

3 运输层主要协议 TCP 概述

3.1 TCP概述 特点

TCP是面向连接的运输协议

  • 每一条TCP只能有两个端点,点对点
  • 提供可靠的全双工交付
  • 面向字节流,但占用很多资源
  • 不提供广播和多播服务

所以从某种意义来说

UDP是一种更加有效的工作方式

TCP面向流的概念

把字节写入发送缓冲,加上TCP首部构成TCP报文段,从接收缓存读取字节,到接收方

3.2 TCP连接

TCP的连接端点叫做套接字(端口号拼接到IP地址构成了套接字)

套接字socket=(IP地址:端口号) 如(192.268.2.2:80)

对于要实现传送,可靠传送,拥塞控制等,某些状态信息是必要的。从发送方主机和接收方主机上预留的资源,中间系统不必为主机预留资源

RSVP资源预留协议

是在终端和路由器之间进行业务质量参数协商的信令协议

商量预留带宽和缓冲区的大小

双向资源预留

4 TCP可靠传输

4.1 可靠传输工作原理

4.1.1 停止等待协议

就是每发送完一个分组就停止发送,等待对方确认,在收到确认之后再发送下一个分组

全双工通信的双方既是发送方也是接收方

假设我们发送方是A,接收方是B

发送消息 M 0 , M 1 … … M_0,M_1…… M0,M1……

无差错情况

即A发送,B确认后正常返回确认信息

在这里插入图片描述

出现差错

出现差错有两种情况

情况一:发送信息没有到达接收方B,接收方B自然不会向发送方A传输确认信息

情况二:接收方B检测出了错误,直接丢弃,也不会给发送方A传输确认信息

那么A怎么判断是否出现差错呢?就是通过超时重传(设置一个超时计时器) 等一段时间如果没有收到确认信息,则认为传输差错,重传

在这里插入图片描述

确认丢失和确认迟到

在这里插入图片描述

这种情况发生在接收方向发送方发送确认信息的时候,确认信息丢失

导致A以为B没有正确收到,就会导致重复发送M信息,然后B收到重复的M之后,处理是

第一步 丢弃重复的M

第二步 向A再发送确认信息

停止等待协议优点是简单

缺点是信道利用率太低

采用了流水线式的传输

4.1.2 连续ARQ协议

连续ARQ协议会设置一个滑动窗口,窗口内部的是可以进行发送的,发送方每收到一个确认,就把发送窗口向前移动一个分组的位置。

接收方一般都采用累积确认方法,也就是说不必逐个发送确认,而是收到几个分组之后,对按序到达的最后一个分组发送确认(这就表示到目前为止所有分组发送都正确的)

优点是:容易实现

缺点是:不能向发送方及时反映接收方收到的消息

4.2 TCP可靠通信的具体实现

具体实现方式之前,先了解TCP报文段首部格式

TCP面向字节流,但是传输单元是报文段

一个TCP报文段分为首部和数据两部分,而TCP的全部功能体现在它首部中各字段的作用。

TCP报文段首部的前20个字节是固定的,后面有4n字节是根据需要而增加的选项

4.2.1 以字节为单位的滑动窗口

首先对于发送方有一个发送窗口,接收方有一个接收窗口

发送方根据接收方传来的确认号与自己的发送窗口大小构建窗口或者移动窗口

接收方不断确认,然后按序交付给高层

4.2.2 超时重传时间的选择

前面我们讲到TCP发送方在规定时间没有收到则要进行重传

重传时间的选择是非常复杂的

TCP采用了一种自适应的算法

它记录一个报文段发送出去的时间,以及收到相应的确认的时间。这两个时间之差就是报文段往返时间 R T T RTT RTT,为了结果更加平滑,引入了加权平均往返时间 R T T s RTT_s RTTs

每测量一个新的RTT样本,进行一次重新的计算

新 R T T S = ( 1 − a ) × ( 旧的 R T T S ) + a × ( 新的 R T T 样本 ) 新RTT_S=(1-a)×(旧的RTT_S)+a×(新的RTT样本) RTTS=(1a)×(旧的RTTS)+a×(新的RTT样本)

a是一个常数,一般选择0.125

最后我们的超时重传时间RTO应略大于上面得出的加权平均往返时间 R T T S RTT_S RTTS

实际计算

R T O = R T T S + R T T D RTO=RTT_S+RTT_D RTO=RTTS+RTTD

R T T D RTT_D RTTD是RTT的偏差加权平均值

4.2.3 选择确认SACK

还有一个问题,就是如果收到的报文没有差错,只是未按序号,中间还缺少一些

那么能否只传输缺少的数据,而不传输已经正确到达的

是可以的,选择确认就是一种可行的处理方法SACK

这个SACK是可以选择的,双方通信可以约定好,如果使用的话会造成更大开销

5 TCP的流量控制

一般来说,我们总是希望数据传输的快一些,但是如果发送方数据传输过快,那么接收方就来不及接收而造成数据丢失,所以需要流量控制——让发送方的发送速率不要太快,让接收方来得及接收

5.1 滑动窗口实现

实际就是通过如果发送方发现发过去会导致丢失,那么则减小滑动窗口的大小

  1. 糊涂窗口综合征:当发送方和接收方对滑动窗口的大小以及如何控制它的方式存在一些不一致或不清晰的理解时,就会出现糊涂窗口综合征。这可能导致以下问题:
    • 窗口过小:如果接收方认为滑动窗口太小,无法有效利用可用的带宽,可能会导致数据传输速度变慢,从而浪费了网络资源。
    • 窗口过大:如果发送方认为滑动窗口可以更大,但接收方不能及时处理或确认所有数据包,就会导致拥塞和丢包问题。
    • 滑动窗口不同步:如果发送方和接收方之间的窗口大小或滑动窗口控制逻辑不一致,可能会导致数据包的重传和混淆,从而使网络性能下降。
  2. 解决方法:要解决糊涂窗口综合征,需要确保发送方和接收方之间对于窗口大小和滑动窗口控制的方式达成一致。这可以通过更好地协调和调整滑动窗口参数,以及在网络中实施拥塞控制策略来实现。

6 TCP拥塞控制

6.1 拥塞控制一般原理

当对网络中的某一资源的需求大于网络能够提供的资源时,则会产生拥塞,导致网络性能变坏,因而要进行拥塞控制

在这里插入图片描述

6.2 拥塞控制的方法

1 慢开始

拥塞窗口用来反映当前网络的这个拥塞情况,越大说明越拥塞

​ 用来确定网络的负载能力,核心由小到大逐渐增大拥塞窗口数值

​ 初始拥塞窗口cwnd的设置:

​ 旧规定,先把初始拥塞窗口cwnd设置为1到2个发送方最大报文段SMSS的数值

​ 新的RFC 5681 把初始拥塞窗口cwnd设置为不超过2到4个SMSS数值

慢开始门限

拥塞窗口控制方法:

​ 在每收到一个对新的报文段的确认后,可以把拥塞窗口增加最多一个SMSS的数值

使用慢开始算法后,没经过一个传输轮次,拥塞窗口cwnd就加倍

一个传输轮次所经历的时间就是往返时间RTT。传输轮次更加强调:把拥塞窗口cwnd所允许发送的报文段都连续

设置一个慢开始门限ssthresh,

当cwnd<ssthresh 使用慢开始算法

当cwnd>ssthresh 改为使用拥塞避免算法

2 拥塞避免

​ 让拥塞窗口缓慢增大,即每经过一个往返时间RTT就把发送方的拥塞窗口+1,而不是加倍,使拥塞窗口cwnd按线性规律缓慢增长

因此,在拥塞避免阶段就有点“加法增大”特点

当出现拥塞的时候,减少分组数

3 快重传

让对方尽早知道发生了个别报文段的丢失

快重传算法首先要求接收方不要等待自己发送数据才进行捎带确认,而不是立即发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认

当发送方一连收到三个重复确认,就知道接收方确实没有收到报文段,因而立即进行重传

4 快恢复

当发送方一连收到三个重复确认,不认为此时发生了拥堵

因而不执行慢开始算法,而是执行快恢复算法

主动队列管理AQM

就是不要等到路由器的队列长度已经达到最大值的时候才不得不丢弃后面到达的分组,这样就太被动了

应当在队列长度到达某个值得警惕的数值时,就主动丢弃到达的分组

7 TCP运输连接管理

7.1 TCP的建立

​ TCP建立的过程叫做握手

​ 握手需要再客户和服务器之间交换三个TCP报文段,称之为三报文段握手

​ 采用三报文段握手主要为了防止已失效的连接请求报文段突然又传送到了,因而产生错误

7.2 TCP的连接释放

​ 四次握手

​ 为什么四次,核心原因就是因为全双工的原因!

TCP的有限状态机

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

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

相关文章

Python---socket之send和recv原理剖析

1. 认识TCP socket的发送和接收缓冲区 当创建一个TCP socket对象的时候会有一个发送缓冲区和一个接收缓冲区&#xff0c;这个发送和接收缓冲区指的就是内存中的一片空间。 2. send原理剖析 send是不是直接把数据发给服务端? 不是&#xff0c;要想发数据&#xff0c;必须得…

GEE-Sentinel-2月度时间序列数据合成并导出

系列文章目录 第一章&#xff1a;时间序列数据合成 文章目录 系列文章目录前言时间序列数据合成总结 前言 利用每个月可获取植被指数数据取均值&#xff0c;合成月度平均植被指数&#xff0c;然后将12个月中的数据合成一个12波段的时间数据合成数据。 时间序列数据合成 代码…

嵌入式中断理解

一、概念 中断&#xff1a; 在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运行。 中断优先级&#x…

YACS(上海计算机学会竞赛平台)一星级题集——水仙花指数

题目描述 定义一个正整数的十进制表示中各位数字的立方和为它的水仙花指数&#xff0c;给定一个整数 n&#xff0c;请计算它的水仙花指数。 例如 n1234 时&#xff0c;水仙花指数为 输入格式 单个整数&#xff1a;表示 n 输出格式 单个整数&#xff1a;表示 n 的水仙花指…

IPC之九:使用UNIX Domain Socket进行进程间通信的实例

socket 编程是一种用于网络通信的编程方式&#xff0c;在 socket 的协议族中除了常用的 AF_INET、AF_RAW、AF_NETLINK等以外&#xff0c;还有一个专门用于 IPC 的协议族 AF_UNIX&#xff0c;IPC 是 Linux 编程中一个重要的概念&#xff0c;常用的 IPC 方式有管道、消息队列、共…

深入探讨开源对话系统:IntelliQ的世界

在人工智能的快速发展时代&#xff0c;开源项目成为了推动技术革新的重要力量。最近&#xff0c;我注意到了一个特别有趣的项目——IntelliQ。这个项目旨在利用大型语言模型&#xff08;LLM&#xff09;构建一个多轮问答系统&#xff0c;不仅具备强大的意图识别和词槽填充&…

【Unity】【WebRTC】如何用Unity而不是浏览器接收远程画面

【背景】 之前几篇我们讨论了如何设置信令服务器&#xff0c;如何发送画面给远端以及如何用浏览器查看同步画面&#xff0c;今天来讨论如何实现Unity内部接收画面。 看本篇之前请先看过之前将web服务器设置和基本远程画面功能的几篇博文。&#xff08;同专栏下查看&#xff09…

使用VSC从零开始Vue.js——备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项——任务3:数据可视化

使用Visual Studio Code&#xff08;VSC&#xff09;进行Vue开发非常方便&#xff0c;下面是一些基本步骤&#xff1a; 一、下载和安装Vue 官网下载地址Download | Node.js Vue.js是基于Node.js的&#xff0c;所以首先需要安装Node.js&#xff0c;官网下载地址&#xff1a;No…

PMP项目管理 - 范围管理

系列文章目录 系统架构设计 PMP项目管理 - 整合管理 PMP项目管理 - 质量管理 PMP项目管理 - 采购管理 PMP项目管理 - 资源管理 PMP项目管理 - 风险管理 PMP项目管理 - 沟通管理 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is …

快速搭建Grafana Promethus 服务器监控系统

该文参考文章&#xff0c;其中又遇到一些问题&#xff0c;并解决&#xff0c;当前主要为了记录一下 探针 Grafana Prometheus 之比 Docker 更简单的部署流程 - 承飞之咎本文重在 Grafana Prometheus 探针 方案的部署流程&#xff0c;介绍和更多使用请到&#xff1a;探针 ̵……

【12.20】转行小白历险记 登录+注册页

一、登录注册页面逻辑 写样式布局&#xff1a;垂直居中、编程式路由、调后端接口正则表达式验证用户输入的密码规则校验通过后&#xff0c;跳转页面js兜底校验调后端接口将token值存储到vuex中&#xff0c;实现持久化存储 vuex不是持久化存储的&#xff0c;如果需要持久化存储…

当下流行的直播技术demo演示

nginx-http-flv-module&#xff08;更新不是很频繁&#xff09; SRS: https://ossrs.net/lts/zh-cn/&#xff08;独立官网&#xff0c;目前最新稳定版version5&#xff09; 基于SRS搭建直播demo演示&#xff1a; 一、搭建流媒体服务器 参见官网&#xff1a;https://ossrs.ne…

Windows 如何在局域网中建立NTP服务器实现时间同步(设置一台设备作为主机,其他设备作为从机来同步时间)

首先简单了解一下什么是NTP 网络时间协议(NTP)是一种用于同步计算机网络上各设备时间的协议。NTP时间同步在许多项目和应用中都是关键的&#xff0c;特别是那些对时间同步精度有要求的场景。比如需要使用NTP时间同步的情况有&#xff1a;金融交易系统、科学研究实验、工业自动…

ROS笔记之rosbag的快速切片(C++实现)

ROS笔记之rosbag的快速切片(C实现) —— 杭州 2023-12-21 夜 code review 文章目录 ROS笔记之rosbag的快速切片(C实现)1.运行效果2.文件结构3.fast_rosbag_slice.cpp4.CMakeLists.txt5.package.xml6.对fast_rosbag_slice.cpp进行函数封装 正常该功能是ROS官方命令行&#xff1a…

pycharm下执行conda命令提示无法识别解决方案

1 问题描述 win10环境命令行执行conda命令&#xff0c;报命令无法识别&#xff0c;错误信息如下&#xff1a; PS D:\code\cv> conda activate pt conda : 无法将“conda”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&a…

伽马校正:FPGA

参考资料&#xff1a; Tone Mapping 与 Gamma Correction - 知乎 (zhihu.com) Book_VIP: 《基于MATLAB与FPGA的图像处理教程》此书是业内第一本基于MATLAB与FPGA的图像处理教程&#xff0c;第一本真正结合理论及算法加速方案&#xff0c;在Matlab验证&#xff0c;以及在FPGA上…

106 uni-app 小程序之巨坑 not found path,not found methods v-for渲染出现报错

1.Component is not found in path 你是否像我一样&#xff0c;检查了无数遍&#xff0c;引入路径检查千万遍&#xff0c;就是没写错&#xff0c;小程序后台就是给你报错&#xff0c; 不用慌&#xff0c;心里默念&#xff1a;我不能砸电脑&#xff0c;我不能砸电脑&#xff0…

python可以做小程序研发嘛,python能做微信小程序吗

大家好&#xff0c;给大家分享一下python可以做微信小程序开发吗&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 大家好&#xff0c;给大家分享一下用python编写一个小程序&#xff0c;很多人还不知道这一点。下面详细解释一下用python代码…

[Spring 原理] 依赖查找

在Spring框架中&#xff0c;依赖注入是一项非常重要的功能&#xff0c;它能够帮助我们解决对象之间的依赖关系。而其中的doResolveDependency方法是Spring框架中执行依赖注入的核心方法之一。本篇博客将对doResolveDependency方法进行详细介绍&#xff0c;帮助读者更好地理解和…

手写题 - 实现一个带并发限制的异步调度器

题目 实现一个带并发限制的异步调度器 Scheduler&#xff0c;保证同时运行的任务最多有N个。 完善下面代码中的 Scheduler 类&#xff0c;使得以下程序能正确输出&#xff1a;class Scheduler {add(promiseCreator) { ... }// ... }const timeout (time) > new Promise(re…