当前位置: 首页 > news >正文

【计算机网络】详谈TCP协议确认应答机制捎带应答机制超市重传机制连接管理机制流量管理机制滑动窗口拥塞控制延迟应答

一、TCP 协议段格式 

1.1、4位首部长度

        4位首部长度的基本单位是4字节,也就是说如果4位首部长度填6,那报头长度就是24字节。报头长度的取值范围为[0,60]字节,也就是说选项的最大长度为40字节。 

二、确认应答机制

         发送数据和发送应答,一般是由双方操作系统自动完成的,通信细节由操作系统自动解决了。服务端和客户端发送的都是报文

2.1、32位序号

        客户端可能一次性给服务端发送了多条报文,为了区分报文,每一个TCP报文在发送时都会填写上序号。如果服务端收到了多条报文,服务端就可以按照序号在接收缓冲区中对报文进行按序到达。

2.2、32位确认序号

        收到的报文的序号加1就是服务端发送回给客户端的报文的确认序号。这就表明服务端告诉客户端,该确认序号之前的数据我已经全部收到了,下次发送请从这次发送的确认序号开始。

三、捎带应答机制

        捎带应答机制可以用来解答为什么tcp报头里序号和确认序号要分开。在真实的tcp通信过程中,一个报文可能既作为应答又携带了要传送的信息,这个时候就需要用确认序号标识应答,序号标识要传送的信息,如果序号和确认序号不分开,就无法实现捎带应答机制

四、标志位

4.1、SYN、ACK、FIN

        我们的服务器在通信的过程中,一定会收到不同客户端的请求建立连接、发送正常报文、请求断开连接的报文,所以TCP报文是需要类型的,用于区分不同的报文。标志位就是用来区分不同报文的。在服务器和客户端进行三次握手时,客户端先向服务器发送SYN标志位置一的TCP报文(此时服务端要处于listen状态),服务端收到了再接着向客户端发送SYN标志位和ACK标志位置一的TCP报文,客户端再向服务器发送ACK标志位置一的TCP报文(此时服务端要处于accept状态),完成三次握手。操作系统要对连接进行管理,就会消耗时间和空间成本。四次挥手时客户端先给服务器发送FIN标志位为1的报文,服务器响应回ACK标志位为1的报文;同样的,服务器也要给客户端发送FIN标志位为1的报文,客户端响应回ACK标志位为1的报文,这就是四次挥手。

        TCP报文中ACK标志位置一加上数据就可以实现捎带应答。

4.2、URG

        URG标志位被置一的报文16位紧急指针被启用,紧急指针对应的数据会被上层优先处理。16位紧急指针表示紧急数据在数据中的偏移量。紧急数据只有一个字节

五、超时重传机制

        在此有一个约定,如果我没有收到应答,就认为对方没有收到报文。如果超过一个固定的时间我没有收到应答,我这端就要进行超时重传。Linux中(BSDUnix和Windows也是如此),超时以500ms为一个单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍。如果重发一次之后,仍然得不到应答,等待2*500ms后再进行重传。如果仍然得不到应答,等待4*500ms进行重传。依次类推,以指数形式递增。累计到一定的重传次数,TCP认为网络或者对端主机出现异常,强制关闭连接。

六、连接管理机制

        三次握手四次挥手在上面标志位中已经有提到了。在此做一个补充,三次握手并不能保证通信双方百分百把连接建立好了,而是经过三次握手后,通信双方都认为链接已经建立好了。如果三次握手并没有完成客户端直接向服务器发送数据,服务器会向客户端发送回RST标志位置一的报文,让客户端回到SYN_SENT状态重新发送三次握手。RST置一就是让双方链接重置,重新进行三次握手,用来解决链接出现异常的问题

        一次握手或者是两次握手服务器都可能受到客户端一次性发过来的大量的SYN所形成的SYN洪水攻击,此时服务器的链接数可能瞬间被打满,无法再接受其他链接的到来,这样一台客户端就可以让服务端瘫痪。三次握手服务器再建立好链接之前客户端要先建立好链接,这样服务器不太可能因为一台主机的攻击就陷入瘫痪,至少需要多台主机,三次握手首先解决了一次两次握手所存在的这一明显漏洞。另外一点,三次握手过程中,客户端和服务器都会经过一次收发,也就确认了自己的收发能力(确认全双工),也可以确保双方OS是健康的且愿意通信的。

        在四次挥手时,如果服务器主动断开链接,服务器会在TIME_WAIT状态下等待一段时间,此时如果再绑定该端口就会绑定失败,导致服务器无法立即重启。使用setsockpot可以设置端口号复用。TIME_WAIT状态是为了等待网络中历史报文的消散,在等的这段时间内也可以等待如果最后一次挥手的ACK丢了,一方再发送FIN时我可以收到然后再发ACK,尽量的保证四次挥手的完成。

七、流量控制机制

        16位窗口大小可以用来通知对方自己的接收能力。 接收端将自己可以接收的缓冲区大小放入TCP首部中的 "窗口大小" 字段,通过 ACK 端通知发送端;窗口大小字段越大,说明网络的吞吐量越高;接收端一旦发现自己的缓冲区快满了,就会将窗口大小设置成一个更小的值通知给发送端;发送端接受到这个窗口之后,就会减慢自己的发送速度;如果接收端缓冲区满了,就会将窗口置为 0;这时发送方不再发送数据,但是需要定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端。如果我这一端的窗口大小一直为0,另一端就会给我发送PSH标志位为1的报文,催促我这一边的上层尽快地把数据读走(需要数据尽快交付的情况都可以将PSH标志位置一)

八、滑动窗口

        滑动窗口是发送缓冲区的一部分, 滑动窗口里的数据无需等待确认应答而可以继续发送。不考虑网络状况,滑动窗口的大小一般就是对方接收缓冲区中剩余空间的大小。为了能够实现超时重传,一旦将滑动窗口中的数据发出去后,滑动窗口不会立即向右移动,要等待报文确认收到应答后才会向右移动,这也保证了如果没有收到应答超时了可以重发报文。滑动窗口的变更是根据收到的确认序号来变更的

        假设是1001到2000这一段报文丢了, 1001到2000后续的被对方收到的报文所返回的ACK报文中的确认序号会一直是1001,告诉我是1001开始的这一段报文丢了,要进行重发。

 九、拥塞控制

        虽然 TCP 有了滑动窗口,能够高效可靠的发送大量的数据。但是如果在刚开始阶段就发送大量的数据,仍然可能引发问题。因为网络上有很多的计算机,可能当前的网络状态就已经比较拥堵。在不清楚当前网络状态下,贸然发送大量的数据,是很有可能引起雪上加霜的。TCP引入 慢启动机制, 先发少量的数据,探探路,摸清当前的网络拥堵状态,再决定按照多大的速度传输数据。
        此处引入一个概念称为拥塞窗口。 发送开始的时候, 定义拥塞窗口大小为 1;每次收到一个 ACK 应答,拥塞窗口加 1;每次发送数据包的时候, 将拥塞窗口和接收端主机反馈的窗口大小做比较, 取较小的值作为实际发送的滑动窗口像上面这样的拥塞窗口增长速度,是指数级别的。"慢启动" 只是指初使时慢,但是增长速度非常快。为了不增长的那么快, 因此不能使拥塞窗口单纯的加倍.此处引入一个叫做慢启动的阈值。当拥塞窗口超过这个阈值的时候,不再按照指数方式增长,而是按照线性方式增长。
        当 TCP 开始启动的时候,慢启动阈值等于拥塞窗口最大值;在每次超时重发的时候,慢启动阈值会变成原来的一半,同时拥塞窗口置回1;少量的丢包,我们仅仅是触发超时重传;大量的丢包,我们就认为网络拥塞;当 TCP 通信开始后,网络吞吐量会逐渐上升;随着网络发生拥堵,吞吐量会立刻下降;拥塞控制,归根结底是 TCP 协议想尽可能快的把数据传输给对方,但是又要避免给网络造成太大压力的折中方案。
        数据链路层中的MTU限制了一次性发送的报文长度不能太长

十、延迟应答

        如果接收数据的主机立刻返回 ACK 应答,这时候返回的窗口可能比较小。假设接收端缓冲区为 1M。一次收到了 500K 的数据;如果立刻应答,返回的窗口就是 500K;但实际上可能处理端处理的速度很快,10ms 之内就把 500K 数据从缓冲区消费掉了;在这种情况下,接收端处理还远没有达到自己的极限,即使窗口再放大一些,能处理过来,如果接收端稍微等一会再应答,比如等待 200ms 再应答, 那么这个时候返回的窗口大小就是1M。 窗口越大,网络吞吐量就越大,传输效率就越高。我们的目标是在保证网络不拥塞的情况下尽量提高传输效率

相关文章:

【计算机网络】详谈TCP协议确认应答机制捎带应答机制超市重传机制连接管理机制流量管理机制滑动窗口拥塞控制延迟应答

一、TCP 协议段格式 1.1、4位首部长度 4位首部长度的基本单位是4字节,也就是说如果4位首部长度填6,那报头长度就是24字节。报头长度的取值范围为[0,60]字节,也就是说选项的最大长度为40字节。 二、确认应答机制 发送数据和发送应答&#x…...

rk3566开发之rknn npu 部署

目录 NPU使用 RKNN 模型 非 RKNN 模型 RKNN-Toolkit2工具 RKNN NPU 测试代码如下 main.cc ssd.cc 调用 ssd模型进行目标检测测试 ssd.h qt 中调用 rknn npu 接口 NPU使用 RK3566 内置 NPU 模块。使用该NPU需要下载RKNN SDK,RKNN SDK 为带有 NPU 的 RK3566/RK3568 芯片…...

项目生产经理需要具备哪些技能和素质

一、专业技能 1、技术知识 熟悉项目所涉及的工程领域专业知识,包括施工工艺、技术规范、质量标准等。能够准确理解设计图纸,指导施工人员进行正确的施工操作。掌握工程测量、材料检验、工程试验等基本技能,确保工程质量符合要求。 利用进度猫…...

Java数据类型常量

目录 一、数据类型 1.1分类 1.2关键字&内存占用&范围 1.3包装类 1.4说明 1.5类型转换 1.6类型提升 二、常量 2.1java中的常量 2.2定义常量 2.3分类 一、数据类型 1.1分类 1.2关键字&内存占用&范围 数据类型关键字内存占用范围字节型byte1字节-128…...

如何提高浮点类型计算的精度

把下面这篇文章的表达方式改成像正常的人类作者写的,而不是AI写的。 —————— 如何提高浮点类型计算的精度 在后端开发中,浮点数的计算一直一个常见难题,特别是在需要与GPU协作进行复杂计算时,浮点精度的偏差可能带来预期之…...

RabbitMQ简介及安装类

RabbitMQ概述-MQ介绍 RabbitMQ是一个开源的消息代理和队列服务器,它支持多种消息协议,并且可以轻松地与多种编程语言和框架集成。RabbitMQ是使用Erlang语言编写的,因此它具有高并发和高可用性的特点。以下是RabbitMQ的一些关键特性和概念 消息…...

游戏服务器防御策略:防止玩家因DDoS攻击而掉线

在网络游戏环境中,玩家体验至关重要。然而,DDoS(分布式拒绝服务)攻击是导致玩家在游戏中频繁掉线的一个重要原因。本文将探讨如何通过一系列技术和策略来减轻DDoS攻击的影响,保障玩家的游戏体验。 一、引言 DDoS攻击是…...

Django学习笔记二:数据库操作详解

Django框架提供了一个功能强大的ORM(对象关系映射)系统,使得开发者可以使用Python代码来操作数据库,而无需编写复杂的SQL语句。以下是Django数据库操作的一些基本概念和方法: 模型定义 在Django中,模型是…...

Spring Boot 应用开发案例:在线书籍管理系统

Spring Boot 应用开发案例,涵盖从项目搭建到具体实现,包括常用的数据库操作、Restful API 开发、Spring Security 安全认证以及前后端分离架构。这个案例将以开发一个简单的“在线书籍管理系统”为例,介绍如何从头开始搭建项目、实现增删改查功能,并通过 JWT 进行用户认证。…...

阿里140滑块-滑块验证码逆向分析思路学习

一、声明! 原创文章,请勿转载! 本文内容仅限于安全研究,不公开具体源码。维护网络安全,人人有责。 文章中所有内容仅供学习交流使用,不用于其他任何目的,均已做脱敏处…...

使用 Linux 搭建并配置一个 NFS 服务器

目录 1. 安装相关软件包2. 启动并启用相关服务3. NFS 配置文件3.1 /etc/exports 文件3.2 共享目录3.3 客户端列表3.4 参数选项3.4.1 访问权限选项3.4.2 数据写入硬盘模式3.4.3 root 用户权限3.4.4 子树检查3.4.5 匿名用户3.4.6 安全性(特权端口)3.4.7 网络传输3.4.x 更多 (More…...

python发包

Python 中我们经常会用到第三方的包,默认情况下,用到的第三方工具包基本都是从 Pypi.org 里面下载。这些第三方的包都是开发者们发布的自己的库。我们有自己的想法,或者有一些常用的方法想要分享出去,就可以发布自己的库&#xff…...

农行1面:说说 final,finally,finalize的区别

你好,我是猿java。 在 Java中,“final”、“finally”和“finalize”是三个不同的关键字或方法,尽管它们的名字相似,但在功能和用途上却有显著的区别,这篇文章我们继续分析一篇农行1面的题目:说说 final&a…...

ChatGPT实时语音将于本周向免费用户推出:OpenAI DevDay 2024详细解读

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,专注于分享AI全维度知识,包括但不限于AI科普,AI工…...

一个月学会Java 第7天 字符串与键盘输入

Day7 字符串与键盘输入 字符串作为所有程序都很重要的东西,这个东西必须好好的学习,在Java中String会比较好学习,比起C和C里面会更加的简单, 在Java之中也是很好理解的,因为底层已经封装好了char数组,也就是…...

Java后端面试题(day16)

目录 java常见的引用类型java中深拷贝和浅拷贝如何设计一个秒杀系统?谈一下对高并发的理解,平时怎么处理高并发问题?Comparable和Comparator区别?解决hash冲突有哪些方法?Synchronized锁的升级过程 java常见的引用类型 java的引用类型一般分…...

Auto-Animate:是一款零配置、即插即用的动画工具,可以为您的 Web 应用添加流畅的过渡效果

嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 用户体验成为了检验产品成功与否的关键因素。而动画效果,作为提升用户体验的重要手段,在网页和应用开发中扮演着举足轻重的角色…...

k8s之ingress-nginx-controller安装

作者:程序那点事儿 日期:2024/01/30 01:25 要在master节点上安装 helm repo add ingress-nginx Welcome - Ingress-Nginx Controller helm search repo ingress-nginx helm pull ingress-nginx/ingress-nginx --version 4.4.2 mv ingress-nginx-4.4.…...

力扣SQL仅数据库(1098~1132)

1098 小众书籍 需求 编写解决方案,筛选出过去一年中订单总量 少于 10 本 的 书籍,并且 不考虑 上架距今销售 不满一个月 的书籍 。假设今天是 2019-06-23 。 返回结果表 无顺序要求 。 数据准备 Create table If Not Exists Books (book_id int, nam…...

优惠点餐api接口对接的具体步骤是什么?

优惠点餐API接口对接的具体步骤通常包括以下几个阶段: 需求分析:明确对接的目标和需求,例如实现在线点餐、订单管理、支付集成等 。选择API服务提供商:根据业务需求选择合适的点餐API服务提供商 。注册和获取API密钥:…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

GitHub 趋势日报 (2025年06月08日)

📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...