Linux C/C++网络编程实战-陈硕-笔记2-一个TCP的简单实验
实验环境
命令
dd命令:
- 用于读取、转换并输出数据。
- 可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。
参数:
if=文件名:输入文件名,默认为标准输入。即指定源文件。
bs=bytes:同时设置读入/输出的块大小为bytes个字节。
count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。nc命令
- netcat的简写,有着网络界的瑞士军刀美誉。一款功能强大的网络工具
参数:
l 用于指定nc将处于侦听模式。该参数意味着nc被当作server,侦听并接受连接。ls -l 出来的单位是B
ls - lh 出来的单位是KB
time命令 - “time a simple command or give resource usage”,即测量命令的执行时间,或者给出系统资源的使用情况
测试
下面我们使用 netcat 来测试一下在千兆网中 tcp 可以达到的吞吐量
在 atom 机器 发送到 e6400 机器:
- e6400: 在5001端口监听,收数据。
- atom:从 /dev/sero 读一千兆数据,发送到5001端口(注:/dev/zero文件代表一个永远输出 0的设备文件,使用它作输入可以得到全为空的文件。因此可用来创建新文件和以覆盖的方式清除旧文件)
- 带宽 118MB/s
本地测试:从 atmo 发送到 atom
第一次测量:从 dev/zero 读取数据10G数据测带宽为 580MB/s
第二次测量:从本地读取数据1G左右数据文件,运行时间为 9.4s,测带宽为 115.720MB/s【1087774720(文件大小) / 9.4(运行时间) / 1000000】。因为该步测试从磁盘加载文件,测试结果内含磁盘读取时间消耗,作为网络带宽结果不准确,因此再进行第三次测量。
第三次测量:从本地读取数据1G左右数据文件,测带宽为 1074.876MB/s。由于步骤2测试时,已经将文件数据加载进内存中了,该步测试可以认为是直接从内存中加载数据。
在 atom 机器 发送到 e350 机器:
- 可以看出为 118 MB/s,tcp 协议栈开销不大
结果
- 在 atom 和 {e6400,e350} 千兆网测试出的结果吞吐量是 118MB/s
- 在 atom 这台机器上,如果用 dd 重定向到 nc ,用 nc 测,是 580 MB/s
- 在 atom 这台机器上,改用文件重定向是 1074 MB/s
- 可以看到,2 与 3 的测试结果差异很大。原因是 2 在测试时使用 dd 命令也有一定的资源消耗
- 下面我们测试 dd
atom发送端:使用 dd + nc 测试
atom接收端:使用 nc + pv 测试
可以看到此次测试结果约为 455MB/s , 弱于第 3 次测试的1074.876MB/s - 原因分析:该atom机器为双核,在本次测试中可视为启动了四个进程,他们之间会有一定的争用。而第 3 次测试中使用了 time + nc 两个进程,他们刚好充分的利用了CPU,因此测试结果较优。
- 如果此时我们使用 top 命令可以看到他们占用CPU的情况
原因
- 当只有 nc -> tcp -> nc 为 118MB/s
- 当 dd -> pipe -> nc -> tcp -> nc -> tcp 为 580 ≈ 118 * 3
- 最后 1074Mb/s 是从缓存在内存中的文件开始读的
- 在 atom 上使用 dd 命令工具测试的结果实际上并不只是 tcp 上的开销,在发送端,包含有从内核 /dev/zero 拷贝到用户态 dd , 由 dd 拷贝到内核管道中,通过管道拷贝到 nc 中, 通过 nc 将数据发送给 tcp ;在接收端, 从tcp 接收数据到 nc 中, 在由 nc 拷贝到 dev/null
- 因此,我们看到 580MB/s 并不是真的测出的 tcp 的传输速率
- 由此,我们发现影响网络传输速率的不只由网络环境决定,也与程自身所占资源利用率有关(比如CPU占用率等)
Linux C/C++网络编程实战-陈硕-笔记2-一个TCP的简单实验相关推荐
- Linux C/C++网络编程实战-陈硕-笔记15-如何正确使用 TCP
netcat netcat 除了读取 socket 描述符,还要读取 stdin 和 stdout 并发模型 thread-per-connection IO 复用和非阻塞 IO 配合 如何安全的关闭 ...
- Linux C/C++网络编程实战-陈硕-笔记3-回顾基础的 Sockets API
性能指标 带宽(Bandwidth):每秒收发的数据量,MB/s.(只关注数据量,不关注消息数) 吞吐量(Throughput):消息/s.查询/s(QPS).事物数/s(TPS) 延迟(Latenc ...
- Linux C/C++网络编程实战-陈硕-笔记20-使用非阻塞IO
基于IO复用(非阻塞IO)实现的 netcat 使用非阻塞IO可以有效避免上述情况的发生.但非阻塞IO在编程上要比阻塞IO更难,并且在程序的维护上比较痛苦.一般使用非阻塞IO编程时建议使用一些封装好的 ...
- Linux C/C++网络编程实战-陈硕-笔记10-网络时间同步
网络时间同步(NTP)原理 Device A发送一个NTP报文给Device B,该报文带有它离开Device A时的时间戳,该时间戳为10:00:00am(T1). 当此NTP报文到达Device ...
- Linux C/C++网络编程实战-陈硕-笔记11-Roundtrip代码分析
代码 UDP, two threads recipes/tpc/roundtrip_udp.cc UDP with muduo, single thread muduo/examples/roundt ...
- Linux C/C++网络编程实战-陈硕-笔记17-多个版本的Netcat概览
操作模式 对于 netcat 程序,存在两种模式,即 服务端 和 客户端, 它们的区别在于连接建立的方式. 一旦连接建立,客户端/服务器 的行为都是一样的,使用两个并行的循环处理: 从标准输入,写到 ...
- Linux C/C++网络编程实战-陈硕-笔记7-TCP自连接
TCP 自连接 tcp连接两段使用了同一端口进行连接,而tcp并没有报错并且连接成功.即localhost:x --> localhost:x 只存在于 tcp 本地通信,而且客户端先于服务端启 ...
- 网络编程实践陈硕笔记零
1.理查德森的unix网络编程有两样不足:一消息格式处理,特别是非阻塞IO上处理TCP分包问题:二是并发模型稍显陈旧,传统高并发采用事件驱动加非阻塞IO方式. 2.程序员面对的网络术语 Etherne ...
- 陈硕《网络编程实战》 02 一个TCP的简单实验
[稿] 陈硕<网络编程实战> 02 一个TCP的简单实验 站在巨人的肩膀之上. 按照录像整理,部分专有名词不太肯定,版权归陈硕大神. 实验用的是我家里的几台计算机,第一台的主机名叫atom ...
最新文章
- R函数:交集intersect、并集union、找不同setdiff、判断相同setequal
- 【Groovy】map 集合 ( map 集合操作符重载 | + 操作符重载 | 代码示例 )
- Opencv2.4.9源码分析——HoughLinesP
- Zju2112 Dynamic Rankings(树状数组套可持久化权值线段树)
- 本地方法(JNI)——编码签名
- 浅谈进程间的消息传递
- 移动app测试的多样性_做移动APP功能测试,这些因素你得都考虑到~
- 【Pytorch神经网络理论篇】 20 神经网络中的注意力机制
- vue2.0 唤起百度地图app_开车选高德,出门靠百度,高德百度地图APP对比
- WIN10 VMWARE 虚拟机安装WIN10 64系统
- Linux kernel中网络设备的管理
- Windows中使用Netsh Winsock Reset命令解决网络连接问题
- VSCode创建Vue项目完整教程
- [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码
- LaTeX之非英语字母输入
- 【SCENIC】Single Cell rEgulatory Network Inference and Clustering
- 前端异步解决方案大全(2021版)
- 手机号码界面输入数字查看手机信息
- SQL Server 题库
- I2C 连接 12864 OLED 屏幕