Linux C/C++网络编程实战-陈硕-笔记2-一个TCP的简单实验

实验环境

Linux C/C++网络编程实战-陈硕-笔记2-一个TCP的简单实验_第1张图片

命令

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
    Linux C/C++网络编程实战-陈硕-笔记2-一个TCP的简单实验_第2张图片
本地测试:从 atmo 发送到 atom
  • 第一次测量:从 dev/zero 读取数据10G数据测带宽为 580MB/s
    Linux C/C++网络编程实战-陈硕-笔记2-一个TCP的简单实验_第3张图片

  • 第二次测量:从本地读取数据1G左右数据文件,运行时间为 9.4s,测带宽为 115.720MB/s【1087774720(文件大小) / 9.4(运行时间) / 1000000】。因为该步测试从磁盘加载文件,测试结果内含磁盘读取时间消耗,作为网络带宽结果不准确,因此再进行第三次测量。
    Linux C/C++网络编程实战-陈硕-笔记2-一个TCP的简单实验_第4张图片
    Linux C/C++网络编程实战-陈硕-笔记2-一个TCP的简单实验_第5张图片

  • 第三次测量:从本地读取数据1G左右数据文件,测带宽为 1074.876MB/s。由于步骤2测试时,已经将文件数据加载进内存中了,该步测试可以认为是直接从内存中加载数据。
    Linux C/C++网络编程实战-陈硕-笔记2-一个TCP的简单实验_第6张图片

在 atom 机器 发送到 e350 机器:
  • 可以看出为 118 MB/s,tcp 协议栈开销不大
    Linux C/C++网络编程实战-陈硕-笔记2-一个TCP的简单实验_第7张图片

结果

  • 在 atom 和 {e6400,e350} 千兆网测试出的结果吞吐量是 118MB/s
  • 在 atom 这台机器上,如果用 dd 重定向到 nc ,用 nc 测,是 580 MB/s
  • 在 atom 这台机器上,改用文件重定向是 1074 MB/s
    Linux C/C++网络编程实战-陈硕-笔记2-一个TCP的简单实验_第8张图片
  • 可以看到,2 与 3 的测试结果差异很大。原因是 2 在测试时使用 dd 命令也有一定的资源消耗
  • 下面我们测试 dd
    atom发送端:使用 dd + nc 测试
    atom接收端:使用 nc + pv 测试
    Linux C/C++网络编程实战-陈硕-笔记2-一个TCP的简单实验_第9张图片
    可以看到此次测试结果约为 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的简单实验_第10张图片

你可能感兴趣的:(Linux,linux,网络,tcp/ip)