【计算机网络】详谈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密钥:…...

【韩顺平Java笔记】第8章:面向对象编程(中级部分)【297-313】
文章目录 297. super基本语法297.1 基本介绍297.2 基本语法 298. super使用细节1299. super使用细节2300. super使用细节3301. 方法重写介绍302. 方法重写细节303. 重写课堂练习1304. 重写课堂练习2输出结果: 姓名:田所浩二 年龄:24305. 养宠物引出多态3…...

快递批量查询物流追踪只揽收无物流信息的单号
在电子商务和物流领域,快递单号的追踪是确保货物顺利送达的关键环节。然而,在实际操作中,经常会遇到一些只显示揽收信息而没有后续物流更新的单号,这给商家和买家都带来了不小的困扰。本文将介绍如何通过快递批量查询物流的方法&a…...

【动态网站资源保存下载】
文章目录 概要解决思路技术细节小结 概要 我们在网上浏览网站时,经常有这样的需求:将浏览的网页保存下来,即使无网的情况下也可以继续浏览。比如一些教育类网站的PPT,内容为HTML格式的,无法作为PPT格式下载下来&#…...

Selenium自动化测试中如何处理数据驱动?
在自动化测试中,数据驱动(Data-Driven Testing)是指通过外部数据源(如Excel、CSV、数据库等)来控制测试用例的执行,而不是直接在代码中硬编码数据。这种方式可以提高测试的灵活性和可维护性,使得…...

淘宝API接口系列有哪些内容?
淘宝API(Application Programming Interface)接口系列是一套允许开发者与淘宝平台进行数据交互的接口集合,涵盖了商品信息、订单信息、物流信息、用户信息以及营销等多个方面的数据接口。以下是对淘宝API接口系列内容的详细归纳: …...

华为OD机试 - 冠亚军排名(Java 2024 E卷 100分)
华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(E卷D卷A卷B卷C卷)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加…...

VmWare中安装CenterOs(内网服务器)
VmWare中安装CenterOs(内网服务器) 文章目录 VmWare中安装CenterOs(内网服务器)[toc] 一 、CentOS 7的下载与安装1、下载2、安装(1)前期准备(2)正式安装 开始等待!!! 二、软件仓库更换1、root用…...

JS 数组去重 — 各类场景适合方法大全
JS 数组去重 — 各类场景适合方法大全 本文介绍各种场景 JS 去重 方法使用 性能最好、用的最多、场景大全 文章目录 JS 数组去重 — 各类场景适合方法大全 一、基础篇:简单直观的去重方法1. 使用Set数据结构2. 利用filter和indexOf方法3. reduce方法的应用 二、进阶…...

【Java 问题】集合——List
List 1.说说有哪些常见集合?2.ArrayList和LinkedList有什么区别?3.ArrayList的扩容机制了解吗?4.ArrayList怎么序列化的知道吗? 为什么用transient修饰数组?5.快速失败(fail-fast)和安全失败(fail-safe)了解吗…...

xss 跨站脚本攻击
XSS 的全称是 Cross-Site Scripting(跨站脚本攻击)。是一种常见的web安全漏洞。 1. XSS 的定义 XSS 是一种注入类型的攻击,攻击者将恶意脚本注入到受信任的网站中。当其他用户访问该网站时,这些脚本会在用户的浏览器中执行。 2…...