4. 网络
1)网络协议栈
在大学的时候,都学过网络的协议栈。OSI为7层,TCP/IP模型为4层,其对应关系如图3-32所示。
图3-32 OSI 7层协议与TCP/IP模型4层协议对照表
OSI模型仅为教学提供,在日常工作中使用TCP/IP协议。在Linux中TCP网络包如图3-33所示。
图3-33 Linux中的TCP网络包
在应用层仅为具体要用到的应用数据;到了传输层在头部加上TCP头信息;向下进入网络层,在TCP头信息头部再加上IP头信息;最后到达网络接口层,在数据包的头尾部各加上帧头和帧尾两部分。
在TCP/IP的传输过程中,发送方从上而下一层一层地在应用数据前后加上头信息与尾信息,接受方从下而上一层一层地把头信息与尾信息去除,直到在应用层只剩下应用信息为止,如图3-34所示。
图3-34 TCP/IP数据包的发送与接受
2)Linux 网络栈
Linux的网络栈如图3-35所示。
图3-35 Linux的网络栈
3)网络性能指标
同磁盘一样,网络也有对应的性能指标。
•带宽。
表示链路的最大传输速率。单位通常为b/s(比特/秒)。
•吞吐量。
表示没丢包时的最大数据传输速率。单位通常为b/s(比特/秒)或者 B/s(字节/秒),吞吐量受带宽限制,而吞吐量/带宽,也就是该网络的使用率。
•延时。
表示从网络请求发出后,一直到收到远端响应,所需要的时间延迟。在不同场景中,这一指标可能会有不同的含义。比如,它可以表示,建立连接需要的时间(比如 TCP 握手延时)或一个数据包往返所需的时间(比如 RTT)。
•PPS。
是 Packet PerSecond(包/秒)的缩写,表示以网络包为单位的传输速率。PPS 通常用来评估网络的转发能力,比如硬件交换机,通常可以达到线性转发(即PPS 可以达到或者接近理论最大值)。而基于Linux服务器的转发,则容易受网络包大小的影响。
•网络的可用性。
网络能否正常通信。
•并发连接数。
TCP 的并发连接数量。
•丢包率。
传输过程中丢包的数量与总包的数量的百分比。
•重传率。
重新传输的网络数据包占所有包的百分比。
4)常用命令
① ifconfig
# ifconfig ens33 ens33:flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.0.108 netmask 255.255.255.0 broadcast192.168.0.255 inet6 fe80::dacc:9183:6dd2:2c6e prefixlen 64 scopeid 0x20<link> ether 00:0c:29:55:10:1f txqueuelen 1000 (Ethernet) RX packets 23667 bytes 34981398 (34.9 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 18467 bytes 1668920 (1.6 MB) TX errors 0 dropped 0 overruns 0 carrier0 collisions 0
ifconfig是linux中用于显示或配置网络设备(网络接口卡)的命令,英文全称是network interfaces configuring。在这里。
•RUNNING。
表示这个网卡是连通的。
•mtu 1500。
表示MTU的当前值为1500。MTU为最大传输单元,其默认值为1500,MTU越大,需要的分包也就越少,自然网络吞吐能力就越好。
•inet 192.168.0.108 netmask255.255.255.0 broadcast 192.168.0.255。
表示当前的IPv4地址,子网掩码和广播地址。
•inet6 fe80::dacc:9183:6dd2:2c6e prefixlen 64 scopeid 0x20。
表示IPv6地址和子网掩码。
② ip
# ip -s addr show dev ens33 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP>mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:55:10:1f brd ff:ff:ff:ff:ff:ff inet192.168.0.114/24 brd 192.168.0.255 scope global dynamic noprefixroute ens33 valid_lft 6024sec preferred_lft 6024sec inet6fe80::dacc:9183:6dd2:2c6e/64 scope link noprefixroute valid_lft forever preferred_lft forever RX:bytes packets errors dropped overrun mcast 1066174744 1153443 0 0 0 0 TX:bytes packets errors dropped carrier collsns 313697585 701189 0 0 0 0 root@ubuntu:/home/ebusiness#
linux的ip命令和ifconfig类似,但ip功能更为强大,并旨在取代ipconfig之意。
•LOWER_UP。
表示这个网卡是连通的。
•mtu 1500。
表示MTU为1500。
•inet 192.168.0.108/24 brd 192.168.0.255。
表示当前的IPv4地址,子网掩码和广播地址。
•inet6 fe80::dacc:9183:6dd2:2c6e/64 scope link noprefixroute。
表示IPv6地址和子网掩码。
在ifconfig、ip中其他参数如表3-14所示。
表3-14 ifconfig、ip中其他参数
参数 |
解释 |
errors |
发生错误的数据包的数量,比如校验错误、帧同步错误等 |
dropped |
丢弃的数据包数,即数据包已经收到了 Ring Buffer,但因为内存不足等原因丢包 |
overruns |
超限数据包的数量,即网络 I/O 速度过快,导致 Ring Buffer 中的数据包来不及处理(队列满)而导致的丢包 |
carrier |
发生 carrirer 错误的数据包数,比如双工模式不匹配、物理电缆出现问题等 |
collisions |
碰撞数据包数 |
③ sar
# sar -n DEV 1 Linux 4.15.0-66-generic (ubuntu) 12/11/2019_x86_64_(4 CPU) 12:45:31 AM IFACE rxpck/s txpck/s rxkB/stxkB/s rxcmp/s txcmp/s rxmcst/s %ifutil 12:45:32 AM ens33 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 12:45:32 AM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sar命令配合-n参数可以查看网络的相关信息,有6个不同的开关:DEV、EDEV、 NFS、NFSD、SOCK和ALL 。DEV显示网络接口信息,EDEV显示关于网络错误的统计数据,NFS统计活动的NFS客户端的信息,NFSD统计NFS服务器的信息,SOCK显示套接字信息,ALL显示所有5个开关。它们可以单独或者一起使用。这里的参数如表3-15所示。
表3-15 sar -nDEV参数
参数 |
含义 |
单位 |
rxpck/s 和 txpck/s |
接收和发送的 PPS |
包 / 秒 |
rxkB/s 和 txkB/s |
接收和发送的吞吐量 |
KB/ 秒 |
rxcmp/s 和 txcmp/s |
接收和发送的压缩数据包数 |
包 / 秒 |
%ifutil |
网络接口的使用率 |
(rxkB/s+txkB/s)/Bandwidth(半双工模式下) |
max(rxkB/s, txkB/s)/Bandwidth(全双工模式下) |
||
Bandwidth 可以用 ethtool 来查询,它的单位通常是 Gb/s 或者 Mb/s,不过注意这里小写字母 b ,表示比特而不是字节。 |
④ping
ping命令通过ICMP协议查看网络的连通性和延时。
# ping 192.168.0.106 -c3 PING 192.168.0.106 (192.168.0.106) 56(84) bytes ofdata. 64 bytes from 192.168.0.106: icmp_seq=1 ttl=128time=0.280 ms 64 bytes from 192.168.0.106: icmp_seq=2 ttl=128 time=0.208ms 64 bytes from 192.168.0.106: icmp_seq=3 ttl=128time=0.351 ms --- 192.168.0.106 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss,time 2007ms rtt min/avg/max/mdev = 0.208/0.279/0.351/0.061 ms
•ttl。
表示生存时间,或者跳数。
•time。
表示往返延时。
•icmp_seq。
表示ICMP 序列号。
•rtt min/avg/max/mdev = 0.208/0.279/0.351/0.061 ms。
表示ttl的最小值为208ms、平均值为279ms、最大值为351ms以及平均偏差0.061 ms (mdev = SQRT(SUM(RTT×RTT) / N – (SUM(RTT)/N) 2,RTT(Round-Trip Time)。往返时延。是指数据从网络一端传到另一端所需的时间。时延由发送时延、传播时延、排队时延、处理时延四个部分组成)。
5)网络性能测试工具
① ab
ab是Apache开发的性能测试工具。在Ubuntu 中使用要通过apt-get install -yapache2-utils命令来安装。
# ab -c 10 -n 1000 http://192.168.0.23:8000/ This is ApacheBench, Version 2.3 <$Revision:1807734 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation,http://www.apache.org/ Benchmarking 192.168.0.23 (be patient) Completed 100 requests Completed 200 requests Completed 300 requests Completed 400 requests Completed 500 requests Completed 600 requests Completed 700 requests Completed 800 requests Completed 900 requests Completed 1000 requests Finished 1000 requests Server Software: WSGIServer/0.2 Server Hostname: 192.168.0.23 Server Port: 8000 Document Path: / Document Length: 1515 bytes Concurrency Level: 10 Time taken for tests: 14.477 seconds Complete requests: 1000 Failed requests: 0 Total transferred: 1882000 bytes HTML transferred: 1515000 bytes Requests per second: 69.08 [#/sec] (mean) Time per request: 144.767 [ms] (mean) Time per request: 14.477 [ms] (mean, across all concurrentrequests) Transfer rate: 126.96 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.1 0 1 Processing: 38 144 42.5 142 330 Waiting: 17 119 39.3 117 298 Total: 38 144 42.5 142 330 Percentage of the requests served within a certaintime (ms) 50% 142 66% 158 75% 171 80% 177 90% 197 95% 219 98% 244 99% 263 100% 330 (longest request)
•ab -c 10 -n 1000 http:// 192.168.0.23:8000/。
测试URL为192.168.0.23的8000端口,并发数为10,共发送1000个请求。
•Server Software: WSGIServer/0.2。
测试服务器的名字。
•Server Hostname: 192.168.0.23。
请求的URL主机名。
•Server Port: 8000。
Web服务器监听的端口。
•Document Path: /。
请求的URL中的根绝对路径,通过该文件的后缀名,一般可以了解该请求的类型。
•Document Length: 1515 bytes。
HTTP响应数据的正文长度。
•Concurrency Level: 10。
并发用户数,即-c中的参数。
•Complete requests: 1000。
总请求数量,即-n中的参数。
•Failed requests: 0。
表示失败的请求数量,这里的失败是指请求在连接服务器、发送数据等环节发生异常,以及无响应后超时的情况。
•Total transferred: 1882000 bytes。
有请求的响应数据长度总和,包括每个HTTP响应数据的头信息和正文数据的长度。
•HTML transferred: 1515000 bytes。
所有请求的响应数据中正文数据的总和,也就是减去了Total transferred中HTTP响应数据中的头信息的长度。
•Requests per second: 69.08 [#/sec] (mean) 。
吞吐率,计算公式为Complete requests/Time taken for tests,总请求数/处理完成这些请求数所花费的时间。
•Time per request: 144.767 [ms] (mean)。
用户平均请求等待时间,计算公式:Time token for tests/(Complete requests/Concurrency Level)。处理完成所有请求数所花费的时间/(总请求数/并发用户数)。
•Time per request: 14.477 [ms] (mean, across allconcurrent requests)。
表示服务器平均请求等待时间,计算公式为Time taken for tests/Complete requests,恰好是吞吐率的倒数。也可以这么统计Time per request/Concurrency Level。
•Transfer rate: 126.96 [Kbytes/sec] received。
表示这些请求在单位时间内从服务器获取的数据长度,计算公式:Total trnasferred/ Time taken for tests。这个统计说明服务器的处理能力达到极限时,其出口宽带的需求量。
•Percentage of requests served within a certaintime(ms)。
这部分数据用于描述每个请求处理时间的分布情况,比如以上测试,80%的请求处理时间都不超过177ms,这个处理时间是指前面的Time per request,即对于单个用户而言,平均每个请求的处理时间。
②wrk
wrk是一款简单的HTTP压测工具,它托管在Github上,https://github.com/wg/wrk。wrk的一个很好的特性就是能用很少的线程压出很大的并发量,原因是它使用了一些操作系统特定的高性能I/O机制, 比如select, epoll, kqueue等。它是复用了redis的ae异步事件驱动框架。确切地说ae事件驱动框架并不是redis发明的, 而是至于Tcl的解释器jim, 这个小巧高效的框架, 因为被redis采用而更多的被大家所熟知。
# wrk -t12 -c100 -d30s --latency http://192.168.0.23:8000 Running 30s test @ http://192.168.0.23:8000 12 threadsand 100 connections ThreadStats Avg Stdev Max +/- Stdev Latency 689.04ms 229.05ms 1.57s 71.98% Req/Sec 12.43 9.36 80.00 82.00% LatencyDistribution 50% 736.88ms 75% 852.13ms 90% 933.50ms 99% 1.08s 2391requests in 30.09s, 4.29MB read Requests/sec: 79.46 Transfer/sec: 146.04KB
•--latency。
查看响应时间的分布。
•-t12 -c100 -d30s。
总共12个线程,100个连接(注意:并不是一个线程对应一个连接),持续30秒。
•latency和Req/Sec。
表示单个线程的统计数据,latency代表延迟时间,Req/Sec代表单个线程每秒完成的请求数,都具有平均值、标准偏差、最大值、正负一个标准差占比。
•2391 requests in 30.09s, 4.29MB read。
在30秒之内总共有2391个请求,总共读取4.29MB MB的数据。
•Requests/sec和Transfer/sec。
所有线程平均每秒钟完成了79.46个请求,每秒钟读取146.04KB数据量。
6)分析网络的两个重要工具
① tcpdump
tcpdump工具可以将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。在运行性能测试的时候,可以通过tcpdump抓取,然后进行分析。
# tcpdump -nn udp port 53or host 123.56.135.186 tcpdump: verbose outputsuppressed, use -v or -vv for full protocol decode listening on ens33,link-type EN10MB (Ethernet), capture size 262144 bytes 22:42:01.829302 IP192.168.58.129.39735 > 192.168.58.2.53: 49863+ A? www.3testing.com. (34) 22:42:01.829565 IP192.168.58.129.43751 > 192.168.58.2.53: 24308+ AAAA? www.3testing.com. (34) 22:42:01.960297 IP192.168.58.2.53 > 192.168.58.129.39735: 49863 1/0/0 A 123.56.135.186 (50) 22:42:01.961346 IP192.168.58.2.53 > 192.168.58.129.43751: 24308 0/1/0 (94) 22:42:01.961820 IP192.168.58.129 > 123.56.135.186: ICMP echo request, id 2414, seq 1, length64 22:42:01.996723 IP123.56.135.186 > 192.168.58.129: ICMP echo reply, id 2414, seq 1, length 64 22:42:01.997380 IP192.168.58.129.49101 > 192.168.58.2.53: 29852+ PTR?186.135.56.123.in-addr.arpa. (45) 22:42:02.856462 IP 192.168.58.129.49101> 192.168.58.2.53: 29852+ PTR? 186.135.56.123.in-addr.arpa. (45) 22:42:04.606587 IP192.168.58.129.49101 > 192.168.58.2.53: 29852+ PTR?186.135.56.123.in-addr.arpa. (45) 22:42:07.856421 IP192.168.58.129.49101 > 192.168.58.2.53: 29852+ PTR?186.135.56.123.in-addr.arpa. (45) 22:42:12.008686 IP192.168.58.129 > 123.56.135.186: ICMP echo request, id 2414, seq 2, length64 22:42:12.050959 IP123.56.135.186 > 192.168.58.129: ICMP echo reply, id 2414, seq 2, length 64
•tcpdump -nn udp port 53 or host 123.56.135.186。
Ø-nn。
表示不解析抓包中的域名(即不反向解析)、协议以及端口号。
Øudp port 53。
只显示UDP协议的端口号(包括源端口和目的端口)为53的包。
Øhost123.56.135.186。
只显示 IP 地址(包括源地址和目的地址)为123.56.135.186的包。这两个过滤条件中间的"or"表示或的关系,也就是说,只要满足上面两个条件中的任一个,就可以展示出来。
•22:42:01.829302 IP 192.168.58.129.39735 > 192.168.58.2.53: 49863+A? www.3testing.com. (34)
Ø22:42:01.829302。
时间戳。
ØIP。
协议。
Ø192.168.58.129.39735。
源地址.源端口。
Ø> 。
到。
Ø192.168.58.2.53:。
目的地址.目的端口。
Ø49863+ A?www.3testing.com. (34)。
网络包详细信息。
u49863+。
查询标识值,它也会出现在响应中,加号表示启用递归查询。
uA?。
查询A记录。
uwww.3testing.com.。
表示待查询的域名。
u(34)。
报文长度。
② wireshark
wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。在运行性能测试的时候,首先通过tcpdump工具加上-w 把结果存储在.pcap文件中。
tcpdump -nn host 192.168.58.129 -w web.pcap
然后启动wireshark工具就可以分析软件性能了。如图3-36所示。
图3-36 wireshark
关于wireshark的介绍资料在网上很多,在这里不进行详细介绍。
7)小结
本节所涉及的概念有网络协议栈、Linux 网络栈和网络性能指标。涉及到的命令有ifconfig、ip、sar、ping、性能测试工具:ab和wrk、性能分析工具:tcpdump和wireshark。
5.性能监控工具nmon
Linux性能分析工具nmon请查看第8.4.1节,一般在做性能测试的时候,采用这个工具进行服务器端的监控,而上面进到的命令作为调试的时候使用。
—————————————————————————————————
软件安全测试
https://study.163.com/course/courseMain.htm?courseId=1209779852&share=2&shareId=480000002205486
接口自动化测试
https://study.163.com/course/courseMain.htm?courseId=1209794815&share=2&shareId=480000002205486
DevOps 和Jenkins之DevOps
https://study.163.com/course/courseMain.htm?courseId=1209817844&share=2&shareId=480000002205486
DevOps与Jenkins 2.0之Jenkins
https://study.163.com/course/courseMain.htm?courseId=1209819843&share=2&shareId=480000002205486
Selenium自动化测试
https://study.163.com/course/courseMain.htm?courseId=1209835807&share=2&shareId=480000002205486
性能测试第1季:性能测试基础知识
https://study.163.com/course/courseMain.htm?courseId=1209852815&share=2&shareId=480000002205486
性能测试第2季:LoadRunner12使用
https://study.163.com/course/courseMain.htm?courseId=1209980013&share=2&shareId=480000002205486
性能测试第3季:JMeter工具使用
https://study.163.com/course/courseMain.htm?courseId=1209903814&share=2&shareId=480000002205486
性能测试第4季:监控与调优
https://study.163.com/course/courseMain.htm?courseId=1209959801&share=2&shareId=480000002205486
Django入门
https://study.163.com/course/courseMain.htm?courseId=1210020806&share=2&shareId=480000002205486
啄木鸟顾老师漫谈软件测试
https://study.163.com/course/courseMain.htm?courseId=1209958326&share=2&shareId=480000002205486