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

news2024/10/11 16:40:54

一、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。 窗口越大,网络吞吐量就越大,传输效率就越高。我们的目标是在保证网络不拥塞的情况下尽量提高传输效率

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

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

相关文章

python爬虫 - 初识正则表达式

🌈个人主页:https://blog.csdn.net/2401_86688088?typeblog 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、正则表达式 (一)正则表达式的基本作用 &#xf…

DAY7 继承多态

继承 目的 提高代码的重用性,减少一些重复代码的书写 权限修饰符 就是是用来限制类中的成员(成员变量、成员方法、构造器)能够被访问的范围。 private 只能本类 缺省 本类、同一个包中的类 protected 本类,同一个包中的类、子…

thenable的执行时机

thenable执行只有2个时机 1.触发resolve()时,代码尚未注册then的内容,那么直到代码扫描到then那一行,才会把then的内容放进队列 2.先注册then,直到后期遇到resolve(),才会进入队列 视频教学 https://www.bilibili.com/video/BV12zsqeMEyt

传智杯 第六届—C

题目描述: 输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如:第一个字符串是"They are students.",第二个字符串是”aeiou"。删除之后的第一个字符串变成"Thy r stdnts."。保证两个字符…

仿生水凝胶微纤维:从蜘蛛丝获得灵感,探索高性能纤维材料的新路径

大家好!今天咱们来了解一种水凝胶微纤维——《Bioinspired Mechanically Robust and Recyclable Hydrogel Microfibers Based on Hydrogen‐Bond Nanoclusters》发表于《Advanced Science》。研究人员从蜘蛛丝那儿获得灵感,想要做出既机械性能好&#xf…

Spring Cloud 配置中心详解:微服务动态读取与案例示范

在微服务架构中,每个微服务往往都有其独立的配置,这些配置可能会根据环境的不同(开发、测试、生产)进行调整和变化。Spring Cloud 配置中心提供了一种集中化管理和动态更新微服务配置的解决方案。在本文中,我们将详细介…

详细分析Spring Framework中 @ConditionalOnProperty的基本知识(附Demo)

目录 前言1. 基本知识2. Demo 前言 基本的Java知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRUD的功能整理(持续更新) 从实战中学习启发 1. 基本知识 Conditiona…

一键将表格嵌入ppt作为附件!2个做ppt必知的技巧分享!

怎样把表格作为附件放入ppt? 众所周知,微软推出的Office套件包含了Powerpoint和Excel这两款软件,如果想在Powerpoint中插入表格,且表格数据量比较大,此时最好的呈现方式,是在Excel中来展示这些数据&#x…

msvcp120.dll无法继续执行代码的五个解决方法

在计算机系统中,MSVCP120.dll是一个至关重要的动态链接库文件,它是Microsoft Visual C Redistributable Package的一部分,对于许多基于Windows的应用程序运行至关重要。当系统提示“msvcp120dll丢失”时,意味着该文件可能由于误删…

清华毕业生去向引发的思考....

近日,清华最新发布的毕业生去向一经公布,便在社会上引起了广泛的关注和热议,许多人看完后都陷入了沉默。这一份去向报告,不仅仅是一组数据的呈现,更是对教育成果、社会需求以及个人发展等多方面问题的深刻映射。 一、数…

文件与目录的基本操作

前提:使用su root 切换到权限最大的root用户 1.显示当前工作目录的绝对路径(pwd) 用途:用于显示当前工作目录的绝对路径的命令。无论用户在文件系统的哪个位置,pwd 命令都能提供当前所在位置的完整路径信息。 用法&a…

现货白银交易技巧:向下突破回撤策略

有关现货白银交易的技巧一直是投资者关注的重点,投资者确实应该保持学习,这样才能跟得上市场,不会落后,下面我们就来介绍一个现货白银交易中的突破回撤的策略。 首先这个现货白银交易技巧判断的基础就是找到一波横盘趋势。所谓的突…

【C# 网络编程】基本概念

基本概念 OSI模型 背景: 为了统一和兼容不同计算机厂商的网络体系结构概念,国际标准化组织(ISO)在1979年提出了OSI参考模型(Open System Interconnection,) 结构 物理层(Physica…

java反序列化之CommonCollections6利⽤链的学习

一、源起 前文学习CC1链和URLDNS链的学习,同时学习过程中知道cc1受jdk版本的限制,故而进一步分析cc6链的利用过程,这个利用链不受jdk版本的限制,只要commons collections小于等于3.2.1,都存在这个漏洞。 ps&#xff1…

Flink 介绍(特性、概念、故障容错、运维部署、应用场景)

概述 特性 概念 数据流 状态 时间 savepoint 故障容错 运维部署 部署应用到任意地方 Flink能够更方便地升级、迁移、暂停、恢复应用服务 监控和控制应用服务 运行任意规模应用 应用场景 事件驱动型应用 什么是事件驱动型应用? 事件驱动型应用的优势 Flink如何…

对接外卖霸王餐api要遵循哪些步骤?

对接外卖霸王餐API接口的步骤通常包括以下几个关键环节: 选择服务提供商:根据需求、预算、服务内容、接口稳定性、覆盖范围(是否支持全国多个城市、是否支持主要外卖平台如美团和饿了么等)、技术支持等因素选择合适的霸王餐API服…

实现一个时钟

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QPainter>//画家类 #include<QTime>//时间类 #include<QTimer>//定时器类QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget …

vue3.5系列之响应式props解构的几点技巧对比

在最新的版本3.5x中&#xff0c;对props的能力也进行了加强。下面&#xff0c;我们具体看下有哪些变化&#xff0c;给我们带来的新的体验&#xff01; 体验一 3.5之前解构props的效果 // 子组件 <template><div><h1>响应式props</h1><p>{{ co…

【储能优化】使用优化的微电网能源管理系统 (EMS)

摘要 本文介绍了一种基于优化的微电网能源管理系统&#xff08;EMS&#xff09;&#xff0c;通过储能优化实现电网、光伏发电、以及储能设备之间的智能调度。系统旨在降低能源成本、减少碳排放&#xff0c;并提高能源利用效率。利用该EMS系统&#xff0c;电网用户能够在满足负…

使用docker、编写dockerfile、httpd镜像,并启动镜像,创建httpd主页和分页。(2)

1.准备一台机子&#xff0c;准备源&#xff0c;下载docker-ce vi /etc/yum.repo.d/Centos-7.repo 加入以下内容[base] nameCentOS-$releasever - Base - mirrors.aliyun.com failovermethodpriority baseurlhttp://mirrors.aliyun.com/centos/$releasever/os/$basearch/http:/…