林沛满-TCP之在途字节数

本文整理自:《Wireshark网络分析的艺术 第1版》
作者:林沛满 著
出版时间:2016-02

我一直谨记斯蒂芬·霍金的金玉良言—每写一道数学公式就会失去一半读者。不过为了深度分析网络包,有时候是不得不计算的,好在小学一年级的加减法就够用了。

网络的承载量就是一个需要计算的值。怎样理解这个概念呢?如图 1 所示,一架波音 747 能够承载上万个小包裹,而一架无人机只能承载一个,这就反映了它们不同的承载量。换个角度,也可以说承载量就是处于运输工具中的货物量,即已经从源仓库发货,但还没有到达目的地的包裹数量

在这里插入图片描述

图1

和运输机类似,网络承载量也可以用已经发送出去,但尚未被确认的字节数来表示。在英文技术文档中,形象地用“bytes in flight”来描述它,我觉得用“在途字节数”来翻译最好。

飞机如果超载了,是会发生严重事故的。而在途字节数如果超过网络的承载能力,也会丢包重传,这就是我们需要计算它的原因。怎么计算呢?假如网络上只有一个 TCP 连接在通信,那么还可以通过带宽和延迟来计算最多能承载多少在途字节数。而实际环境往往如图 2 所示,同一条网络路径是由多台主机之间共享的,根本不知道多少比例的带宽是分配给某个 TCP 连接。这时候就需要用到网络神器 Wireshark 来分析了。

在这里插入图片描述

图2

分析之前要先抓包。应该在哪一端抓呢?我们先两边都尝试一下。上文《书上错了吗?》已经交代过,网络延迟会导致同样的网络包在两端体现出不同的顺序,并用下面的图 3 演示

在这里插入图片描述

图3

我在图 3 的服务器上随机挑选一个时间点并标志为 T1。由于服务器在该点之前收到 8 号包并立即回复了“Ack 9”(表示 9 号之前的包都收到了),所以在途字节数为 0。也就是说,在数据接收方抓的包里是看不到在途字节数的,没有分析意义。

接着我在图 3 的客户端随机挑选一个时间点并标志为 T2,由于在该时间点之前 10 号包已经发出去,但收到的“Ack 7”只表示 7 号之前的包都收到了,也即意味着 7、8、9、10 号包都还没有确认,所以在途字节数就是这 4 个包所携带的数据量。这说明在数据发送方抓到的包才能用来分析在途字节数。

从模型图中理解了原理,接下来就可以用 Wireshark 来分析真实的包了。图 4
是在客户端(数据发送方)抓到的,如果我们想知道第 0.400000 秒时的在途字节数,应该如何计算呢?

在这里插入图片描述

图4

在该时间点之前客户端发送的是 10 号包,即“Seq=265248,Len=180”字节,表示序号在 265248+180=265428 之前的字节已经发送出去了。而第 0.400000 秒之前服务器的 Ack 为 3284,表示序号在 3284 之前的字节已经收到了。那么在途字节数就是 265428−3284=262144 字节。如果要归纳出一条公式,可以表示成:

在途字节数 = Seq + Len − Ack 

其中 Seq 和 Len 是来自上一个数据发送方的包,而 Ack 则来自上一个数据接收方的包。我们再拿第 0.500000 秒来练习一下,套用公式可以算出在途字节数应该是 266816+361−5033=262144,与第 0.400000 秒的一样多。

我们也可以使用Wireshark提供的功能来查看在途字节数,这样就不用我们手动来计算了。
在这里插入图片描述

图5

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

socket简介

套接字(Socket)实质上就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,为应用层进程利网络协议交换数据提供了相应机制。套接字出于承上启下的作用,向上连接应用进程&#xf…

【QT5-程序控制电源-[GPIB-USB-HS]-SCPI协议-上位机-基础样例【2】】

【QT5-程序控制电源-[GPIB-USB-HS]-SCPI协议-上位机-基础样例【2】】 1、前言2、实验环境3、自我总结1、基础了解仪器控制-熟悉仪器2、连接SCPI协议3、了解GPIB-USB-HS4、软件调试-代码编写 4、熟悉协议-SCPI协议5、实验过程-熟悉软件(1)去官网NI&#x…

【Java项目推荐之黑马头条】自媒体文章实现异步上下架(使用Kafka中间件实现)

自媒体文章上下架功能完成 需求分析 流程说明 接口定义 说明接口路径/api/v1/news/down_or_up请求方式POST参数DTO响应结果ResponseResult DTO Data public class WmNewsDto {private Integer id;/*** 是否上架 0 下架 1 上架*/private Short enable;}ResponseResult 自媒…

使用华为eNSP组网试验⑷-OSPF多区域组网

今天进行了OSPF的多区域组网试验,本来这是个很简单的操作,折腾了好长时间,根本原因只是看了别人写的配置代码,没有真正弄明白里面对应的规则。 一般情况下,很多单位都使用OSPF进行多区域的组网,大体分为1个…

2023-IDEA插件推荐

CamelCase 链接 https://plugins.jetbrains.com/plugin/7160-camelcase https://github.com/netnexus/camelcaseplugin 介绍 提供下划线、驼峰等代码风格的切换。快捷键是⇧ ⌥ U / Shift Alt U GsonFormatPlus 链接 https://plugins.jetbrains.com/plugin/14949-gs…

11.2 基本电路和基本分析方法

一、基本电路 电路类型电路名称特点和典型功能指标参数或功能描述方法基本放大电路共射放大 ∣ A ˙ ∣ |\dot A| ∣A˙∣大;适用于小信号电压放大 A ˙ u \dot A_u A˙u​、 R i R_i Ri​、 R o R_o Ro​、 f L f_L fL​、 f H f_H fH​、 f b w f_{bw} fbw​共集…

Docker 安装 MongoDB

一、什么是MongoDB MongoDB 是一个基于分布式文件存储的数据库。是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 二、MongoDB的安装 这里使用docker来安装MongoD 1.docker 拉取mysql镜像 docker pu…

unity脚本_生命周期函数 c#

帧:fps 即每秒钟跑的游戏帧数 游戏的本质 是一个死循环 每一次循环处理游戏逻辑就会更新一次画面 之所以能看到画面在动 是因为切换画面的速度达到一定时人眼就认为画面时流畅的 一帧就是执行一次循环 人眼舒适放松时可视帧数 24帧/s 游戏卡顿的原因: …

x64内核实验7-线程

x64内核实验7-线程 TOC 线程是比较重要的内核结构,思考一下其实可以想到线程结构体在64位下的变化应该不会很大最多只是扩充了一些内容,因为从我们之前分析段页时候会发现cpu更新的这些内容大部分不影响xp时候的线程切换机制,下面我们来验证…

初识链表(7.25)

前面我们学习了顺序表,但顺序表其实存在一些问题 1. 中间/头部的插入删除,时间复杂度为O(N) 2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗(尤其是异地扩容)。 3. 增容一般是呈2倍的增长&am…

【Java 进阶篇】深入了解JDBCTemplate:简化Java数据库操作

数据库操作是几乎所有现代应用程序的一部分。从存储和检索数据到管理业务逻辑,数据库操作是不可或缺的。在Java应用程序中,JDBCTemplate是一种强大的工具,可帮助开发人员轻松进行数据库操作。本文将深入探讨JDBCTemplate,了解它的…

【gcc】RtpTransportControllerSend学习笔记 1

本文是大神 https://www.cnblogs.com/ishen 的文章的学习笔记。主要是大神文章: webrtc源码分析(8)-拥塞控制(上)-码率预估 的学习笔记。大神的webrtc源码分析(8)-拥塞控制(上)-码率预估 详尽而具体,堪称神作。因为直接看大神的文章,自己啥也没记住,所以同时跟着看代码。跟…

二蛋赠书四期:《Go编程进阶实战:开发命令行应用、HTTP应用和gRPC应用》

前言 大家好!我是二蛋,一个热爱技术、乐于分享的工程师。在过去的几年里,我一直通过各种渠道与大家分享技术知识和经验。我深知,每一位技术人员都对自己的技能提升和职业发展有着热切的期待。因此,我非常感激大家一直…

Java类加载机制

一、java类加载机制 类加载分为三个步骤:加载,连接,初始化: 1. JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负…

设备上架与调试步骤项目篇

1.设备又哪些常见的调试方法? 2.设备开箱 -> 使用的步骤是什么? 3.开局新设备都要设置哪些功能? -- 工程师:架构设计 项目实施 故障排查 -- 调试设备: -- 1.WEB界面 - 界面调试 - 内容比较少的 主要项目 …

Zygote Secondary:加速应用启动的未来之路

Zygote Secondary:加速应用启动的未来之路 1. 引言 在现代的移动应用开发中,启动速度和响应性能是用户体验的重要方面。然而,传统的 Android 进程管理方式在启动应用时会出现性能瓶颈,导致启动时间过长和资源占用过多。为了解决…

2023/9/28 -- ARM

【内存读写指令】 int *p0X12345678 *p100;//向内存中写入数据 int a *p;//从内存读取 1.单寄存器内存读写指令 1.1 指令码以及功能 向内存中写: str:向内存中写一个字(4字节)的数据 strh:向内存写半个字(2字节)的数据 strb:向内存写一个字…

连接虚拟机工具推荐

连接虚拟机工具推荐 连接虚拟机的工具有很多种,以下是一些常用的推荐: PuTTY:这是一个非常常用的SSH和telnet客户端,适用于Windows系统。它允许你在本地机器上通过命令行接口远程登录到虚拟机。 SecureCRT:这是一个支…

202. 最幸运的数字

202. 最幸运的数字 - AcWing题库 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \nusing namespace std;typedef pair<int, int> PII; typedef long long ll; typedef long double ld;ll qmi(ll a, ll k, ll m…

微信小程序-2

微信开发文档 https://developers.weixin.qq.com/miniprogram/dev/framework/ 一、app.js中的生命周期函数与globalData(全局变量) 指南 - - - 小程序框架 - - - 注册小程序 删除app.js里的东西&#xff0c;输入App回车&#xff0c;调用生命周期 选项 - - - 重新打开此项目…