【计算机网络】详谈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.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 里面下载。这些第三方的包都是开发者们发布的自己的库。我们有自己的想法,或者有一些常用的方法想要分享出去,就可以发布自己的库ÿ…...
农行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密钥:…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...