网络知识入门,深入了解ACK控制位,网络传输缓慢的毒瘤:ACK等待时间 (五)
上一篇文章讲了协议栈内部的组成,以及客户端与服务器建立连接时协议栈是如何工作的,本章将具体讲一下TCP控制信息里的控制位--ACK。
【网络知识入门,探索一次网页请求的旅程(一)】 https://blog.csdn.net/ck784101777/article/details/103741398
【网络知识入门,探讨DNS服务器在网页请求中的作用(二)】 https://blog.csdn.net/ck784101777/article/details/103741398
【网络知识入门,何为协议栈(三)】https://blog.csdn.net/ck784101777/article/details/103746921
【网络知识入门,深入探索协议栈(四)】https://blog.csdn.net/ck784101777/article/details/103761880
目录
一、使用ACK确认网络包已经收到
二、网络传输缓慢的毒瘤:ACK等待时间
一、使用ACK确认网络包已经收到
1.数据包的序号和ack序列号
到这里,网络包已经装好数据并发往服务器了,但数据发送操作还没有结束。TCP 具备确认对方是否成功收到网络包,以及当对方没收到时进行重发的功能,因此在发送网络包之后,接下来还需要进行确认操作。 我们先来看一下确认的原理(下图)。
首先,TCP 模块在拆分数据时,会先算好每一块数据相当于从头开始的第几个字节,接下来在发送这一块数据时,将算好的字节数写在 TCP 头部中,“序号”字段就是派在这个用场上的。然后,发送数据的长度也需要告知接收方,不过这个并不是放在TCP 头部里面的,因为用整个网络包的长度减去头部的长度就可以得到数据的长度,所以接收方可以用这种方法来进行计算。有了上面两个数值, 我们就可以知道发送的数据是从第几个字节开始,长度是多少了。 通过这些信息,接收方还能够检查收到的网络包有没有遗漏。例如, 假设上次接收到第 1460 字节,那么接下来如果收到序号为 1461 的包,说明中间没有遗漏;但如果收到的包序号为 2921,那就说明中间有包遗漏了。像这样,如果确认没有遗漏,接收方会将到目前为止接收到的数据长度加起来,计算出一共已经收到了多少个字节,然后将这个数值写入 TCP头部的 ACK 号中发送给发送方。
简单来说,发送方说的是“现在发送的是从第 ×× 字节开始的部分,一共有 ×× 字节哦!”而接收方则回复说,“到第 ×× 字节之前的数据我已经都收到了哦!”这个返回 ACK 号的操作被称为确认响应,通过这样的方式,发送方就能够确认对方到底收到了多少数据。
然而,下图的例子和实际情况还是有些出入的。在实际的通信中, 序号并不是从 1 开始的,而是需要用随机数计算出一个初始值,这是因为 如果序号都从 1 开始,通信过程就会非常容易预测,有人会利用这一点来发动攻击。但是如果初始值是随机的,那么对方就搞不清楚序号到底是从 多少开始计算的,因此需要在开始收发数据之前将初始值告知通信对象。大家应该还记得在我们刚才讲过的连接过程中,有一个将 SYN 控制位设为 1 并发送给服务器的操作,就是在这一步将序号的初始值告知对方的。实际上,在将 SYN 设为 1 的同时,还需要同时设置序号字段的值,而这里的值就代表序号的初始值。
此外,如图所示,客户端和服务器双方都需要各自计算序号,因此双方需要在连接过程中互相告知自己计算的序号初始值。明白原理之后我们来看一下实际的工作过程(如下图)。首先,客户端在连接时需要计算出与从客户端到服务器方向通信相关的序号初始值,并将这个值发送给服务器(图①)。接下来,服务器会通过这个初始值计算出 ACK 号并返回给客户端(图②)。初始值有可能在通信过程中丢失,因此当服务器收到初始值后需要返回 ACK 号作为确认。同时,服务器也需要计算出与从服务器到客户端方向通信相关的序号初始值,并将这个值发送给客户端(图②)。接下来像刚才一样,客户端也需要根据服 务器发来的初始值计算出 ACK 号并返回给服务器(图 ③)。到这里,序号和 ACK 号都已经准备完成了,接下来就可以进入数据收发阶段了。数据收发操作本身是可以双向同时进行的,但 Web 中是先由客户端向服务器发送请求,序号也会跟随数据一起发送(图 ④)。然后,服务器收到数据后再返回 ACK 号(图 ⑤)。从服务器向客户端发送数据的过程则正好 相反(图 ⑥⑦)。
二、网络传输缓慢的毒瘤:ACK等待时间
返回ACK和更新滑动窗口的时机
要提高收发数据的效率,还需要考虑另一个问题,那就是返回 ACK 号和更新窗口的时机。如果假定这两个参数是相互独立的,分别用两个单独的包来发送,结果会如何呢?
首先,什么时候需要更新窗口大小呢?
当收到的数据刚刚开始填入缓冲区时,其实没必要每次都向发送方更新窗口大小,因为只要发送方在每次发送数据时减掉已发送的数据长度就可以自行计算出当前窗口的剩余长度。因此,更新窗口大小的时机应该是接收方从缓冲区中取出数据传递给应用程序的时候。这个操作是接收方应用程序发出请求时才会进行的,而发送方不知道什么时候会进行这样的操作,因此当接收方将数据传递给应用程序,导致接收缓冲区剩余容量增加时,就需要告知发送方,这就是更新窗口大小的时机。
那么 ACK 号又是什么情况呢?
当接收方收到数据时,如果确认内容没有问题,就应该向发送方返回 ACK 号,因此我们可以认为收到数据之后马上就应该进行这一操作。如果将前面两个因素结合起来看,首先,发送方的数据到达接收方,在接收操作完成之后就需要向发送方返回 ACK 号,而再经过一段时间 ,当数据传递给应用程序之后才需要更新窗口大小。但如果根据这样的设计来实现,每收到一个包,就需要向发送方分别发送 ACK 号和窗口更新这两个单独的包。这样一来,接收方发给发送方的包就太多了,导致网络效率下降。
因此,接收方在发送 ACK 号和窗口更新时,并不会马上把包发送出去,而是会等待一段时间,在这个过程中很有可能会出现其他的通知操作, 这样就可以把两种通知合并在一个包里面发送了。
举个例子,在等待发送ACK 号的时候正好需要更新窗口,这时就可以把 ACK 号和窗口更新放在一个包里发送,从而减少包的数量。当需要连续发送多个 ACK 号时,也可以减少包的数量,这是因为 ACK 号表示的是已收到的数据量,也就是说,它是告诉发送方目前已接收的数据的最后位置在哪里,因此当需要连续发送 ACK 号时,只要发送最后一个 ACK 号就可以了,中间的可以全部省略。当需要连续发送多个窗口更新时也可以减少包的数量,因为连续发生窗口更新说明应用程序连续请求了数据,接收缓冲区的剩余空间连续增加。这种情况和 ACK 号一样,可以省略中间过程,只要发送最终的结果就可以了。
网络知识入门,深入了解ACK控制位,网络传输缓慢的毒瘤:ACK等待时间 (五)相关推荐
- 网络知识入门:路由器基础知识全接触
网络知识入门:路由器基础知识全接触 发布时间:2008.05.29 07:01 来源:赛迪网 作者:月伴雨 路由器综述 路由器是互联网的主要节点设备.路由器通过路由决定数据的转发.转发策 ...
- 网络知识入门,什么是以太网包,TCP/IP包,MAC头部,IP头部以及TCP头部(六)
目录 一.以太网包 二.协议栈中IP模块的工作方式 1.TCP委托IP模块 2.IP模块的工作方式 三.mac头部 四.何为以太网 1.以太网的定义 2.如何收发以太网包 3.以太网接收网络包详细 4 ...
- 网络知识入门,探讨DNS服务器在网页请求中的作用(二)
上一篇文章讲到网络请求是基于http协议传输的,消息请求包含了"对什么"和"做什么操作",于是一个网页请求就这么发送出去了.但是在发送消息之前,我们还需要对域名 ...
- 网络知识入门,用户如何连接互联网,ADSL调制解调器的妙用,PPP上网的三种方式(十二)
互联网与家庭网络的区别 互联网是一个遍布世界的巨大而复杂的系统,但其基本工作方式却出奇地简单.和家庭.公司网络一样,互联网也是通过路由器来转发包的, 而且路由器的基本结构和工作方式也并没有什 ...
- 网络知识入门,网络协议体系架构(一)
1.常用网络知识目录 1)子网掩码.ip分段 .tcp三次握手四次切断.ip地址库,纯真库,自建ip库,ip寻址算法,ip寻址工具,dhcp,pppoe,udp协议 2)dns原理,相关网络命令,dn ...
- 网络知识入门,探索网络运营商的内部:NOC和POP,电话公司的通信线路租借服务(十三)
POP和NOC POP:Point of Presense,中文一般叫作"接入点" 网络到达了网络运营商的路由器,将是如何工作的呢?. 路由器是互联网的入口.互联 ...
- 网络知识入门,路由器工作原理(十)
路由器工作原理 路由器的转发的工作原理和交换机类似,也是通过查表判断包转发的目标.不过在具体的操作过程上,路由器和交换机是有区别的.因为路由器是基于 IP 设计的,而交换机是基于以太网设计 ...
- Java网络爬虫入门:第01课:网络爬虫原理
引言 随着互联网的迅速发展,网络资源越来越丰富,信息需求者如何从网络中抽取信息变得至关重要.目前,有效的获取网络数据资源的重要方式,便是网络爬虫技术.简单的理解,比如您对百度贴吧的一个帖子内容特别感兴 ...
- 网络知识:46张图带你了解网络传输、WIFI、以太网协议和网络寻址
一.线缆和Wi-Fi 首先我们需要知道,想要将设备连接到网络,有两种方式可供选择,那就是「有线和无线」. 相信大家对这两兄弟都不陌生了,有线连接从很早以前就出现了,最早可追溯到1960年代,有线网络使 ...
最新文章
- 编程能力如何突飞猛进?
- 为什么越来越多的程序员开始学机器学习?揭秘一个重要原因
- 类加载机制(整个过程详解)
- JAVA基础知识+基础代码
- windows操作系统_国产Linux操作系统体验:易用性不比Windows差,但输在这点上
- window下c语言c s通信,c++ Windows Socket实现最简单的C/S网络通信(TCP)
- 优秀的长截图标注工具:iShot for Mac中文免费
- 文章三 国家助学贷款-还款
- 1/4-36UNS-2A的螺纹
- 【C语言】abs()用法及其他绝对值函数
- GitHub 克隆加速
- STM32CuBeMX驱动舵机
- i12蓝牙耳机怎么设置成中文_windows10的蓝牙怎么打开?如何修复Windows 10中的蓝牙问题...
- VBA 2000年之后活期存款利息计算
- Vue代理解决生产环境跨域问题
- 欧洲央行行长:与“主流”货币政策理论商榷
- 无人机综合管理系统、设备管理、设备台账、零部件管理、故障维修、维护工单、飞控成员、飞行站点、飞行计划、飞行记录、运维管理、维护管理、人员管理、无人机管理、维修保养、配件管理、保养管理、团队管理
- 校园人员与车辆综合管理平台之服务端
- python打印数字倒三角形脸适合什么发型_脸型瘦的做什么发型好看 倒三角的脸型适合什么发型...
- 光环国际——如何将PRINCE2植入到组织当中?
热门文章
- 16.求两个数的最大公约数和最小公倍数
- 概率论与数理统计 第一章 概率论的基本概念 要点复习笔记
- SQLite数据库rowid
- C/C++编程学习 - 第1周 ⑦ 头文件、强制类型转换、递归
- Android 1000实例代码集结(一 )
- java图片管理系统_基于Java Web技术的图片管理系统的设计与实现.doc
- 帆软相同列合并_合并报表软件有哪些深受欢迎
- Elmedia Video Player Pro 7.15 中文版 强大的mac视频播放器
- html页面打印调用jqprint.js
- 如何利用人性七宗罪来做营销