linux探测类工具(网络)

可用性探测(ICMP/TCP/UDP探测)

ping命令

默认情况下,Linux系统的TTL值为64或255,WindowsNT/2000/XP系统的TTL值为128,Windows98系统的TTL值为32,UNIX主机的TTL值为255。
    因此一般TTL值:
        100~130ms之间,Windows系统 ;
        240~255ms之间,UNIX/Linux系统。

ping 请求错误分析

    ping 的时候通常会返回不同的提示信息,这里对不同提示进行分析原因。
    (1) Request timed out (包从主机出去了)
        主要是主机路由表中具有到达目标的路由,且arp广播,最终有找到arp到达路由的下一跳mac地址,而因为其他中间原因不可到达或者目标设置防火墙等原因没有回应,这时候会出现超时。
        可能情况:
            1.对方已关机,或者网络上根本没有这个地址。
          2.对方与自己不在同一网段内,通过路由也无法找到对方,但有时对方确实是存在的,当然不存在也是返回超时的信息。
          3.对方确实存在,但设置了ICMP数据包过滤(比如防火墙设置)。
              怎样知道对方是存在,还是不存在呢,可以用带参数 -a 的Ping命令探测对方,如果能得到对方的NETBIOS名称,则说明对方是存在的,是有防火墙设置,如果得不到,多半是对方不存在或关机,或不在同一网段内。
          4.错误设置IP地址

    (2) Destination host Unreachable (包无法从主机出去)
        主要是路由表中具有到达目标的路由,且arp广播,最终没有找到arp到达路由的下一跳mac地址,则会出现目标不可达。
        可能情况:
          1.对方与自己不在同一网段内,而自己又未设置默认的路由。
          2.网线 出了故障
      “destination host unreachable”和 “time out”的区别:
            如果所经过的路由器的路由表中具有到达目标的路由,而目标因为其他原因不可到达,这时候会出现“time out”,
            如果路由表中连到达目标的路由都没有,那就会出现“destination host unreachable”。

    (3) Network is unreachable
        主要是路由表中没有到达目标的路由,一般是缺少默认路由出现的。

    (4) Bad IP address
        这个信息表示您可能没有连接到DNS服务器,所以无法解析这个IP地址,也可能是IP地址不存在。

    (5) Source quench received
        这个信息比较特殊,它出现的机率很少。它表示对方或中途的服务器繁忙无法回应。

    (6) Unknown host (不知名主机)
        这种出错信息的意思是,该远程主机的名字不能被域名服务器(DNS)转换成IP地址。
        故障原因:
            1.域名服务器有故障,
            2.输入域名不正确,
            3.或者网络管理员的系统与远程主机之间的通信线路有障。

  (7) No answer——无响应
      这种故障说明本地系统有一条通向中心主机的路由,但却接收不到它发给该中心主机的任何信息。
        故障原因可能是下列之一:
            1.中心主机没有工作;
            2.本地或中心主机网络配置不正确;
            3.本地或中心的路由器没有工作;
            4.通信线路有故障;
            5.中心主机存在路由选择问题。
    
    (8) no rout to host:网卡工作不正常。
    (9) transmit fai led ,error code:10043网卡驱动不正常。
    (10) Ping 127.0.0.1:127.0.0.1是本地循环地址
      如果本地址无法Ping通,则表明本地机TCP/IP协议不能正常工作。
ping命令

 

范围扫描工具:fping命令;nmap命令
=====================================================================================
Fping程序类似于ping(ping是通过ICMP(网络控制信息协议InternetControl Message Protocol)协议回复请求以检测主机是否存在)。Fping与ping不同的地方在于,fping可以在命令行中指定要ping的主机数量范围,也可以指定含有要ping的主机列表文件。
    -a 显示可ping通的目标
    -A 将目标以ip地址的形式显示
    -b ping 数据包的大小。(默认为56)
    -c <num> ping每个目标的次数 (默认为1)
    -e 显示返回数据包所费时间
    -f <file> 从文件获取目标列表( - 表示从标准输入)(不能与 -g 同时使用)
    -g 通过指定开始和结束地址来生成目标列表(例如:./fping –g 192.168.1.0 192.168.1.255)或者一个IP/掩码形式(例如:./fping –g 192.168.1.0/24-u 显示不可到达的目标
    -l 循环发送ping
示例:
    fping -g 10.0.0.0/24
    fping -g 10.0.0.0 10.0.0.255

https://blog.csdn.net/wz_cow/article/details/80967255
-------------------------------------------------------------------------
nmap扫描当前主机开放端口默认是1-10000
    nmap   192.168.1.0
    
sP ping 扫描
    nmap -sP 10.149.1.0-255 -n   2>/dev/null
    nmap -sP 10.149.1.0/24 -n   2>/dev/null

    nmap -sP 10.149.1.0/24 -n   2>/dev/null |grep address

sU UDP扫描
    nmap -sU 192.168.1.0

sS SYN半开放扫描
    最大的好处是不会进行三次握手,只需要发送SYN即可获取对方主机信息,不会留下日志信息,默认是TCP syn
    nmap -sS 192.168.1.0
    
https://blog.csdn.net/MOONYOUS/article/details/106555986
范围扫描工具:fping命令;nmap命令

 

链路探测工具:tracepath命令;traceroute命令;tracert与traceroute工作原理对比;
==================================================================
tracepath命令
    traceroute比tracepath功能更强大。
    tracepath比traceroute更基础,某些设备仅安装了tracepath,同时tracepath不需要root权限
------------------------------------------------------------------
traceroute命令

命令格式:
    traceroute[参数][主机]
    默认四层使用UDP协议发送探测数据包

命令参数:
    -I 使用ICMP回应取代UDP资料信息。
    -T  --tcp    Use TCP SYN for tracerouting (default port is 80)
    -p port  --port=port        Set the destination port to use.
    -i 指定网络接口,对于多个网络接口有用。比如 -i eth1 或-i ppp1等;
    -m 把在外发探测试包中所用的最大生存期设置为max-ttl次转发,默认值为30次;
    -n 显示IP地址,不查主机名。当DNS不起作用时常用到这个参数;
    -p port 探测包使用的基本UDP端口设置为port ,默认值是33434
    -q n 在每次设置生存期时,把探测包的个数设置为值n,默认时为3;
    -r 绕过正常的路由表,直接发送到网络相连的主机;
    -w n 把对外发探测包的等待响应时间设置为n秒,默认值为3秒;
    -d 使用Socket层级的排错功能。
    -f 设置第一个检测数据包的存活数值TTL的大小。
    -F 设置勿离断位。
    -g 设置来源路由网关,最多可设置8个。
    -s 设置本地主机送出数据包的IP地址。
    -t 设置检测数据包的TOS数值。
    -v 详细显示指令的执行过程。
    -x 开启或关闭数据包的正确性检验。

实例1:traceroute 用法简单、最常用的用法
traceroute www.baidu.com 

实例二:一些参数的用法示例;
    traceroute -m 10 jb51.net           把跳数设置为10次;
    traceroute -n jb51.net              注:显示IP地址,不查主机名。
    traceroute -p 6888 jb51.net         注:探测包使用的基本UDP端口设置6888
    traceroute -q 4 jb51.net            注:把探测包的个数设置为值4;
    traceroute -r jb51.net              注:绕过正常的路由表,直接发送到网络相连的主机;
    traceroute -w 5 jb51.net            注:把对外发探测包的等待响应时间设置为5秒;
    traceroute -T www.baidu.com         #使用tcp进行trace
    traceroute -T -p 443 www.baidu.com  #trace 443端口

    traceroute 180.101.49.12 #默认使用udp
    traceroute 180.101.49.12 -I #指定icmp
    traceroute 180.101.49.12 -T #指定tcp,默认80端口
    traceroute -T -p 443 180.101.49.12 #指定tcp,端口443

-----------------------------------------------------------------------------
tracert和traceroute都是用来探测数据包经过网络路径的工具。
tracert是windows下的测试工具
traceroute是linux下的测试工具

tracert工作原理及过程
    1.tracert向目的地址发送ICMP request报文,且第一个ICMP request的TTL值为1;中间的路由设备收到报文后,因为TTL值为0,返回ICMP超时报文;本机由此获得下一跳信息。
    2.逐步增加TTL,获取到过路路由的全部IP。
    3.ICMP request报文到达目的地址,目的地址设备回复ICMP replay。


traceroute工作原理及过程
    1.traceroute向目的地址的某端口(大于30000)发送UDP报文,第一个报文的TTL值为1;中间的路由设备收到报文后,因为TTL值为0,返回ICMP超时报文;本机由此获得下一跳信息。
    目的端口从33434开始,每一个报文会把目的端口增加1,直到33534,目的是为了区分返回的报文对应哪个发出的报文。
    2.逐步增加TTL,获取到过路路由的全部IP。
    3.UDP报文到达目的地址,目的地址回复ICMP端口不可达报文。


共同点:基本原理都是利用IP报文的TTL字段。
不同点:tracert是使用ICMP Echo Request报文去实现;traceroute是使用UDP报文去实现,所以最后一跳设备返回的报文也不同:tracert返回ICMP replay;traceroute返回的则是ICMP 端口不可达
链路探测工具:tracepath命令;traceroute命令;tracert与traceroute工作原理对比;
链路探测+统计;mtr命令;
------------------------------------------------------------------
MTR 是一个强大的网络诊断工具,管理员能够用它诊断和隔离网络错误,并向上游提供商提供有关网络状态的有用报告。

MTR参数:
    -n no-dns(或简写为-n)        #不对IP地址做域名解析
    -s                          #用来指定ping数据包的大小
    -i                          #使用这个参数来设置ICMP返回之间的要求默认是1秒
    -a                          #来设置发送数据包的IP地址 这个对一个主机由多个IP地址是有用的
    -r/-–report                 #报告模式显示(仅显示结果,不动态显示)
    -c                          #每秒发送多少包,默认为10个。英文是(–report-cycles COUNT)
    -w                          #选项标志使用长版本的主机名,您可以看到每个跳的完整主机名(–report-wide的缩写)
    -4                          #IPv4
    -6                          #IPv6
    mtr 默认使用ICMP协议发送探测数据包。
    若使用TCP或者UDP 发送数据包。需另外指定指定可选项
    -u   --udp                  #Use UDP datagrams instead of ICMP ECHO.
    -T   --tcp                  #Use TCP SYN packets instead of ICMP ECHO. PACKETSIZE is ignored, since SYN packets can not contain data.
    -P PORT    --port PORT      #The target port number for TCP traces.

常用示例:
    mtr -i 0.1 -n -c 100 www.baidu.com              #每0.1秒返回一次结果,ping100次,并且不对IP地址做域名解析
    mtr -rwc 50 -i 0.2 www.baidu.com   
    mtr -i 0.1 -n -c 100 -T www.baidu.com 
    mtr -i 0.1 -rn -c 100 -T www.baidu.com            #使用tcp进行探测
    mtr -i 0.1 -rn -c 100 -T -P 443 www.baidu.com   #探测tcp 443端口
    输出参数的解释:
        Loss% – 丢包率,单位是”%”;
        Snt – sent包的数量
        Last – 最后一个包的延时
        Avg – 所有包的平均延时
        Best – 延时最小的包
        Wrst – 延时最大的包
        StDev – 标准偏差


分析MTR报告
    [root@yefeng ~]# mtr -rc 100 -i 0.1 www.baidu.com
    Start: Sun Jul 25 11:54:03 2021
    HOST: yefeng                      Loss%   Snt   Last   Avg  Best  Wrst StDev
    1.|-- 10.4.20.114                0.0%   100    0.7   0.6   0.3   1.3   0.0
    2.|-- 10.4.20.25                29.0%   100    0.7   1.1   0.6   7.8   1.1
    3.|-- 10.54.235.121              0.0%   100    0.4   1.7   0.3  20.7   3.6
    4.|-- 10.54.234.166              0.0%   100    1.9   1.9   1.6   6.4   0.5
    5.|-- 45.112.222.246             0.0%   100    1.6   1.7   1.6   2.6   0.0
    6.|-- 115.238.21.114            22.0%   100    1.6   1.6   1.6   2.6   0.0
    7.|-- 220.191.199.33             0.0%   100    2.1   2.4   2.0  19.3   2.2
    8.|-- 202.97.101.146            44.0%   100   10.5   6.9   6.7  10.5   0.5
    9.|-- 58.213.94.114             87.0%   100    8.1   8.4   8.1   9.7   0.3
    10.|-- 58.213.94.122             91.0%   100   10.4  10.4  10.4  10.5   0.0
    11.|-- 58.213.96.86               0.0%   100   10.4  10.6  10.0  28.2   2.1
    12.|-- ???                       100.0   100    0.0   0.0   0.0   0.0   0.0
    13.|-- ???                       100.0   100    0.0   0.0   0.0   0.0   0.0
    14.|-- ???                       100.0   100    0.0   0.0   0.0   0.0   0.0
    15.|-- 180.101.49.11              0.0%   100   10.1  10.1  10.0  10.1   0.0

    数据丢包:以后面的结果为准,测试显示到达目标ip的丢包率为0。而中间过程部分设备发生不同程度的丢包
        数据包全丢:设备禁止icmp超时报文:错误类型为Time-to-live exceeded的ICMP数据包
        数据包部分丢失:设备设置了ICMP 速率限制,导致部分丢包
    网络延迟:因为存在往返路径不一致的可能,所以某一跳的延迟高并不意味着去向的线路问题,也有可能是返程线路导致的!
        ICMP速率限制还可以产生类似延迟的现象:看到中间的某一跳延迟挺高,但是后续的设备的响应延迟却相对低的多。


    超时可能因为路由器丢弃用于QoS(服务质量)的分组,或者可能存在导致超时的返回路由的某些问题。
    有时建议收集双向的MTR报告
 
https://www.cnblogs.com/xzkzzz/p/7413177.html
链路探测+统计;mtr命令;
tracepath、traceroute、mtr发送数据包的区别
------------------------------------------------------------------
tracepath、traceroute、mtr发送数据包的区别

mtr 默认使用ICMP协议发送探测数据包。
    若使用TCP或者UDP 发送数据包。需另外指定指定可选项
    -u   --udp                  #Use UDP datagrams instead of ICMP ECHO.
    -T   --tcp                  #Use TCP SYN packets instead of ICMP ECHO. PACKETSIZE is ignored, since SYN packets can not contain data.
    -P PORT    --port PORT      #The target port number for TCP traces.

traceroute 默认四层使用UDP协议发送探测数据包
    如果使用TCP或者ICMP协议数据包探测路径需加选项
    -I --icmp Use ICMP ECHO for tracerouting
    -T --tcp Use TCP SYN for tracerouting (default port is 80)
    -p port  --port=port  Set the destination port to use. It is either initial udp port value for "default" method (incremented by each probe, default is 33434), or initial seq for "icmp" (incremented as well, default from 1), or some constant destination port for other methods (with default of 80 for "tcp", 53 for "udp", etc.)

tracepath只支持UDP协议数据包探测路径
    tracepath的好处就是非root用户也能执行?

https://www.cnblogs.com/zhangmingda/p/13704945.html
tracepath、traceroute、mtr发送数据包的区别

traceroute -T --sport=30000 www.baidu.com -q 10 -n  #执行tcp测试,源端口30000,测试10个,不进行反向解析 

教程指定源端口的测试,是使用nc工具,而不是traceroute工具

综合类工具 Netcat命令(nc命令):功能1:端口扫描;功能10:指定源端口;
================================================================================
Netcat命令(nc命令)
netcat 是网络工具中的瑞士军刀,它能通过 TCP 和 UDP 在网络中读写数据。通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它。
Usage: ncat [options] [hostname] [port]
参数:
    -d   脱离命令窗口,在后台运行,常用于后门建立过程。
    -e   执行某个程序,常用于后门建立过程
    -G gateway  设置网关,常用于突破内网限制
    -g num  路由跳数
    -i sec  设置发送每一行数据的时间间隔
    -l  设置netcat处于监听状态等待连接。
    -L 设置netcat处于监听状态等待连接,当客户端断开,服务端依旧回到等待状态。
    -n 设置netcat只识别ip地址,不在进行DNS解析。
    -o file 设置传输十六进制的数据。
    -p port 设置本地监听的端口号。
    -r  设置netcat随机化的端口号。
    -s addr 设置netcat源地址。
    -t 回复telnet的请求数据包。
    -u 设置netcat使用UDP模式
    -v 显示错误提示信息
    -w secs  设置连接超时秒数。
    -z 设置扫描模式,表示发送的数据包中不包含任何payload。
    对于端口的设置可以是个人定制的或者是一个迭代范围 m-n

功能1:端口扫描
    nc -z -v -n 172.31.100.7 21-25       #连接超时?
    nc -nvz 180.101.49.11 80            #测试成功
    nc -vz www.baidu.com 443
    可以运行在 TCP 或者 UDP 模式,默认是 TCP,-u 参数调整为 UDP。
    -z    参数告诉netcat使用 0 I/O,连接成功后立即关闭连接, 不进行数据交换
    -v    参数指使用冗余选项(译者注:即详细输出)
    -n    参数告诉netcat 不要使用DNS反向查询IP地址的域名

功能2:Chat Server
netcat 提供了这样一种方法,你只需要创建一个 Chat 服务器,一个预先确定好的端口,这样子他就可以联系到你了。
    nc -l 1567        #netcat 命令在 1567 端口启动了一个 TCP 服务器,所有的标准输出和输入会输出到该端口。输出和输入都在此 Shell 中展示。
    nc 172.31.100.7 1567    #nc client使用这条命令连接到nc server

功能3:文件传输
    nc -l 1567 < file.txt                #使用nc命令,启动作为server端,导入文件
    nc -n 172.31.100.7 1567 > file.txt    #使用nc命令连接到server端,获取文件并进行保存

    nc -l 1567 > file.txt                #当然也可以反过来操作
    nc 172.31.100.23 1567 < file.txt

功能4:目录传输
发送一个文件很简单,但是如果我们想要发送多个文件,或者整个目录,一样很简单,只需要使用压缩工具 tar,压缩后发送压缩包。
    tar -cvf – dir_name | nc -l 1567            #server端,先打包,再发送
    nc -n 172.31.100.7 1567 | tar -xvf -        #client端,先接收,再解压

    tar -cvf – dir_name| bzip2 -z | nc -l 1567            #增加了一步压缩命令
    nc -n 172.31.100.7 1567 | bzip2 -d |tar -xvf -        

功能5:加密你通过网络发送的数据
    nc localhost 1567 | mcrypt –flush –bare -F -q -d -m ecb > file.txt        #使用 mcrypt 工具加密数据。
    mcrypt –flush –bare -F -q -m ecb < file.txt | nc -l 1567                #使用 mcrypt 工具解密数据。

功能6:流视频
    虽然不是生成流视频的最好方法,但如果服务器上没有特定的工具,使用 netcat,我们仍然有希望做成这件事。
    cat video.avi | nc -l 1567
    nc 172.31.100.7 1567 | mplayer -vo x11 -cache 3000 -
    
功能7:克隆一个设备
    克隆 Linux PC 很简单,假如你的系统在磁盘 /dev/sda上
    dd if=/dev/sda | nc -l 1567
    nc -n 172.31.100.7 1567 | dd of=/dev/sda
功能8:远程打开一个 Shell
    适用于未安装telnet和ssh的场景
    nc -l 1567 -e /bin/bash -i        #假设你的 netcat 支持 -c -e 参数(默认 netcat)
    nc 172.31.100.7 1567
    
    mkfifo /tmp/tmp_fifo
    cat /tmp/tmp_fifo | /bin/sh -i 2>&1 | nc -l 1567 > /tmp/tmp_fifo        #假如 netcat 不支持 -c 或者 -e 参数(OpenBSD Netcat),我们仍然能够创建远程 Shell
    
    
    nc -n 172.31.100.7 1567        #client端执行还是简单
    
功能9:反向 Shell
功能10:指定源端口
    nc -l 1567
    nc 172.31.100.7 1567 -p 25    #-p 选项指定源端口
    nc -p 30000 -w 5 -vz 10.111.1.111 3306
    
功能11:指定源地址


Linux Netcat 命令——网络工具中的瑞士军刀    https://www.jianshu.com/p/9f7963a67c95
综合类工具 Netcat命令(nc命令):功能1:端口扫描;功能10:指定源端口;

 

telnet命令;telnet报错解析
========================================================
telnet因为采用明文传送报文,安全性不好,很多Linux服务器都不开放telnet服务,而改用更安全的ssh方式了。但仍然有很多别的系统可能采用了telnet方式来提供远程登录,因此弄清楚telnet客户端的使用方式仍是很有必要的。
telnet命令还可做别的用途,比如确定远程服务的状态,比如确定远程服务器的某个端口是否能访问。
1.命令格式:
    telnet[参数][主机]

2.命令功能:
    执行telnet指令开启终端机阶段作业,并登入远端主机。

3.命令参数:
    -8 允许使用8位字符资料,包括输入与输出。
    -a 尝试自动登入远端系统。
    -b<主机别名> 使用别名指定远端主机名称。
    -c 不读取用户专属目录里的.telnetrc文件。
    -d 启动排错模式。
    -e<脱离字符> 设置脱离字符。
    -E 滤除脱离字符。
    -f 此参数的效果和指定"-F"参数相同。
    -F 使用Kerberos V5认证时,加上此参数可把本地主机的认证数据上传到远端主机。
    -k<域名> 使用Kerberos认证时,加上此参数让远端主机采用指定的领域名,而非该主机的域名。
    -K 不自动登入远端主机。
    -l<用户名称> 指定要登入远端主机的用户名称。
    -L 允许输出8位字符资料。
    -n<记录文件> 指定文件记录相关信息。
    -r 使用类似rlogin指令的用户界面。
    -S<服务类型> 设置telnet连线所需的IP TOS信息。
    -x 假设主机有支持数据加密的功能,就使用它。
    -X<认证形态> 关闭指定的认证形态。


使用实例
    实例1:远程服务器无法访问
        [root@localhost ~]# telnet 192.168.120.209
        Trying 192.168.120.209...
        telnet: connect to address 192.168.120.209: No route to host
        telnet: Unable to connect to remote host: No route to host
        处理这种情况方法:
            (1)确认ip地址是否正确?
            (2)确认ip地址对应的主机是否已经开机?
            (3)如果主机已经启动,确认路由设置是否设置正确?(使用route命令查看)
            (4)如果主机已经启动,确认主机上是否开启了telnet服务?(使用netstat命令查看,TCP的23端口是否有LISTEN状态的行)
            (5)如果主机已经启动telnet服务,确认防火墙是否放开了23端口的访问?(使用iptables-save查看)
    实例2:域名无法解析
        [root@localhost ~]# telnet www.baidu.com
        www.baidu.com/telnet: Temporary failure in name resolution
        处理这种情况方法:
            (1)确认域名是否正确
            (2)确认本机的域名解析有关的设置是否正确(/etc/resolv.conf中nameserver的设置是否正确,如果没有,可以使用nameserver 8.8.8.8)
            (3)确认防火墙是否放开了UDP53端口的访问(DNS使用UDP协议,端口53,使用iptables-save查看)

    实例3:Connection refused
        [root@localhost ~]# telnet 192.168.120.206
        Trying 192.168.120.206...
        telnet: connect to address 192.168.120.206: Connection refused
        telnet: Unable to connect to remote host: Connection refused
        处理这种情况:
            (1)确认ip地址或者主机名是否正确?
            (2)确认端口是否正确,是否默认的23端口

    实例4:启动telnet服务
        service xinetd restart
        [root@localhost ~]# cd /etc/xinetd.d/
        [root@localhost xinetd.d]# ll
        [root@localhost xinetd.d]# cat krb5-telnet 

    实例5:正常telnet
        telnet 192.168.120.204
        说明:一般情况下不允许root从远程登录,可以先用普通账号登录,然后再用su -切到root用户。

    --------------------------------------------------------------------------
    #telnet 10.0.0.1 22
    Trying 10.0.0.1...
    Connected to 10.0.0.1. #健康检查是正常情况下,命令会返回类似“Connected to [$IP]”的信息,说明后端服务器上健康检查端口处于正常工作(监听)状态。
    Escape character is '^]'.
    SSH-2.0-OpenSSH_7.4
    ---------------------------------------------------------------------------------------------------
    #telnet 10.0.0.18
    Trying 10.0.0.18...
    telnet: connect to address 10.0.0.18: Connection refused #命令会返回类似“telnet: connect to address [$IP]: Connection refused”的信息,即系统提示无法连接到该主机,连接被拒绝

    #telnet 10.0.0.153
    Trying 10.0.0.153...
    telnet: connect to address 10.0.0.153: Connection timed out
telnet命令;telnet报错解析

openssl工具

实验 1:对 HTTP 发送不合规的请求(telnet工具发送http请求);实验 2:对 HTTPS 发送不合规的请求(openssl工具发送https请求)
==============================================================================================================
实验 1:对 HTTP 发送不合规的请求(telnet工具发送http请求)

一边用 telnet 模拟发送 HTTP 请求,一边用 tcpdump 的 -X 参数,展示抓取的报文里面的文本细节。

[root@centos7 ~]# telnet 180.101.49.11 80
Trying 180.101.49.11...
Connected to 180.101.49.11.
Escape character is '^]'.
GET / HTTP/1.1
Authorization           #两次回车就表示这次请求发送结束

HTTP/1.1 400 Bad Request    #由于请求不合规,目标站点立刻回复了 HTTP 400 Bad Request。

Connection closed by foreign host.

#在输入 Authorization 时,后面加上“: Basic”,会收到 HTTP 500。这是因为服务端认为 Authorization: Basic 这个格式本身是正确的,只是后面缺少了真正的凭据(Credential),所以报告了 HTTP 500。

Authorization 后面直接回车,就表示它并没有带上 <auth-scheme>,所以属于不合规,应该回复 HTTP 400。
Authorization: Basic 后直接回车,它的 Authorization 头部有 <auth-scheme>,但是没有带上有效的凭据,应该回复 HTTP 500。


    [root@centos7 ~]# telnet www.163.com 80
    Trying 36.25.241.115...
    Connected to www.163.com.
    Escape character is '^]'.
    GET / HTTP/1.1
    Authorization:Basic

    HTTP/1.1 400 Bad Request                #没有出现预期的500错误
    Server: nginx
    Date: Sun, 31 Jul 2022 13:46:48 GMT
    Content-Type: text/html
    Content-Length: 207
    Connection: close

    <html>
    <head><title>400 Bad Request</title></head>
    <body>
    <center><h1>400 Bad Request</h1></center>
    <hr><center>dx-zhejiang-huzhou-11-36-25-241-29</center>
    <hr><center>nginx</center>
    </body>
    </html>
    Connection closed by foreign host.


################################################################################################################################
实验 2:对 HTTPS 发送不合规的请求(openssl工具发送https请求)

对方站点是 HTTPS 的话,如果还是用 telnet,会遇到 TLS 握手,这一关就过不去了
我们可以用 openssl 命令。执行openssl s_client -connect 站点名:443

    [root@centos7 ~]# openssl s_client -connect www.baidu.com:443
    CONNECTED(00000003)
    depth=3 C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CA
    verify return:1
    depth=2 OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
    verify return:1
    depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign RSA OV SSL CA 2018
    verify return:1
    depth=0 C = CN, ST = beijing, L = beijing, OU = service operation department, O = "Beijing Baidu Netcom Science Technology Co., Ltd", CN = baidu.com
    verify return:1
    ---
    Certificate chain
     0 s:/C=CN/ST=beijing/L=beijing/OU=service operation department/O=Beijing Baidu Netcom Science Technology Co., Ltd/CN=baidu.com
       i:/C=BE/O=GlobalSign nv-sa/CN=GlobalSign RSA OV SSL CA 2018
     1 s:/C=BE/O=GlobalSign nv-sa/CN=GlobalSign RSA OV SSL CA 2018
       i:/OU=GlobalSign Root CA - R3/O=GlobalSign/CN=GlobalSign
     2 s:/OU=GlobalSign Root CA - R3/O=GlobalSign/CN=GlobalSign
       i:/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA
    ---
    Server certificate
    -----BEGIN CERTIFICATE-----
    MIIKEjCCCPqgAwIBAgIMRBfOhu+C7GkhzG9oMA0GCSqGSIb3DQEBCwUAMFAxCzAJ
    ……………………………………………………
    Cs1X1NAVNn661QMlJ0W0YM0uAsEPCudBb1hpIJ6tR1IatebljR0=
    -----END CERTIFICATE-----
    subject=/C=CN/ST=beijing/L=beijing/OU=service operation department/O=Beijing Baidu Netcom Science Technology Co., Ltd/CN=baidu.com
    issuer=/C=BE/O=GlobalSign nv-sa/CN=GlobalSign RSA OV SSL CA 2018
    ---
    No client certificate CA names sent
    Peer signing digest: SHA512
    Server Temp Key: ECDH, P-256, 256 bits
    ---
    SSL handshake has read 5452 bytes and written 415 bytes
    ---
    New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
    Server public key is 2048 bit
    Secure Renegotiation IS supported
    Compression: NONE
    Expansion: NONE
    No ALPN negotiated
    SSL-Session:
        Protocol  : TLSv1.2
        Cipher    : ECDHE-RSA-AES128-GCM-SHA256
        Session-ID: 9F4721B25880B05DA79A676D810AAFF08F136E204C87CEB68D409F08E8494C83
        Session-ID-ctx:
        Master-Key: 826FDFCCD5D01C16CA5E18F2A62C7B16F97DFDB9DEA83AEF7B2D5CC3BEF165B1C9851BF606575B79BC47E449BE1FC833
        Key-Arg   : None
        Krb5 Principal: None
        PSK identity: None
        PSK identity hint: None
        TLS session ticket:
        0000 - fe ed 46 0f 70 0c c0 74-2d 97 1b 47 f5 84 cb 2c   ..F.p..t-..G...,
        0010 - 83 df f5 70 30 59 1b 76-01 38 e3 f6 be dd f3 5a   ...p0Y.v.8.....Z
        0020 - 1b 49 19 22 1e 3c 9a 34-bf 65 b5 f3 eb 29 c1 d5   .I.".<.4.e...)..
        0030 - 24 16 65 38 af 76 a1 89-ca 7e a8 13 98 4a 61 ac   $.e8.v...~...Ja.
        0040 - 44 df 49 f9 1c 56 82 c8-70 ff 84 c9 9c da 32 3c   D.I..V..p.....2<
        0050 - 45 79 fa a2 c9 d5 e0 3e-9a aa 18 8b 5b 95 30 54   Ey.....>....[.0T
        0060 - 78 73 44 69 42 ab 21 92-8f 07 c9 0a 0c 38 84 1b   xsDiB.!......8..
        0070 - f6 01 aa 44 d4 f1 57 0c-13 c0 92 72 d4 93 84 c8   ...D..W....r....
        0080 - 6a 1f 30 e0 a0 90 f6 0c-f5 e5 8e 2f bc 2a ab b9   j.0......../.*..
        0090 - 96 eb fb 89 03 e4 bb c3-ca c4 2e 1a 82 ae c9 61   ...............a

        Start Time: 1659275361
        Timeout   : 300 (sec)
        Verify return code: 0 (ok)
    ---
    GET / HTTP/1.1              #跟 telnet 一样,直接键入 HTTP 请求就好了!
    Authorization

    HTTP/1.1 400 Bad Request

    closed
实验 1:对 HTTP 发送不合规的请求(telnet工具发送http请求);实验 2:对 HTTPS 发送不合规的请求(openssl工具发送https请求)

压力测试类探测工具

网络接口层和网络层的性能测试:pktgen工具
==========================================================================================================
网络接口层和网络层,它们主要负责网络包的封装、寻址、路由以及发送和接收。
    在这两个网络协议层中,最重要的性能指标:每秒可处理的网络包数 PPS

hping3 作为一个测试网络包处理能力的性能工具。

Linux 内核自带的高性能网络测试工具 pktgen
pktgen 作为一个内核线程来运行,需要你加载 pktgen 内核模块后,再通过 /proc 文件系统来交互。下面就是 pktgen 启动的两个内核线程和 /proc 文件系统的交互文件:
    $ modprobe pktgen       #如果 modprobe 命令执行失败,说明你的内核没有配置 CONFIG_NET_PKTGEN 选项。这就需要你配置 pktgen 内核模块(即 CONFIG_NET_PKTGEN=m)后,重新编译内核,才可以使用。
    $ ps -ef | grep pktgen | grep -v grep
    root     26384     2  0 06:17 ?        00:00:00 [kpktgend_0]
    root     26385     2  0 06:17 ?        00:00:00 [kpktgend_1]
    $ ls /proc/net/pktgen/
    kpktgend_0  kpktgend_1  pgctrl

pktgen 在每个 CPU 上启动一个内核线程,并可以通过 /proc/net/pktgen 下面的同名文件,跟这些线程交互;而 pgctrl 则主要用来控制这次测试的开启和停止。
在使用 pktgen 测试网络性能时,需要先给每个内核线程 kpktgend_X 以及测试网卡,配置 pktgen 选项,然后再通过 pgctrl 启动测试。
一个发包测试的示例
    # 定义一个工具函数,方便后面配置各种测试选项
    function pgset() {
        local result
        echo $1 > $PGDEV
        result=`cat $PGDEV | fgrep "Result: OK:"`
        if [ "$result" = "" ]; then
             cat $PGDEV | fgrep Result:
        fi
    }
    # 为0号线程绑定eth0网卡
    PGDEV=/proc/net/pktgen/kpktgend_0
    pgset "rem_device_all"   # 清空网卡绑定
    pgset "add_device eth0"  # 添加eth0网卡
    # 配置eth0网卡的测试选项
    PGDEV=/proc/net/pktgen/eth0
    pgset "count 1000000"    # 总发包数量
    pgset "delay 5000"       # 不同包之间的发送延迟(单位纳秒)
    pgset "clone_skb 0"      # SKB包复制
    pgset "pkt_size 64"      # 网络包大小
    pgset "dst 172.17.63.253" # 目的IP
    pgset "dst_mac ee:ff:ff:ff:ff:ff"  # 目的MAC
    # 启动测试
    PGDEV=/proc/net/pktgen/pgctrl
    pgset "start"

稍等一会儿,测试完成后,结果可以从 /proc 文件系统中获取。
    测试前:
    [root@centos7 ~]# cat /proc/net/pktgen/eth0
    Params: count 1000000  min_pkt_size: 64  max_pkt_size: 64
         frags: 0  delay: 5000  clone_skb: 0  ifname: eth0
         flows: 0 flowlen: 0
         queue_map_min: 0  queue_map_max: 0
         dst_min: 172.17.63.253  dst_max:
            src_min:   src_max:
         src_mac: 00:16:3e:1b:ae:12 dst_mac: ee:ff:ff:ff:ff:ff
         udp_src_min: 9  udp_src_max: 9  udp_dst_min: 9  udp_dst_max: 9
         src_mac_count: 0  dst_mac_count: 0
         Flags:
    Current:
         pkts-sofar: 0  errors: 0
         started: 0us  stopped: 0us idle: 0us
         seq_num: 0  cur_dst_mac_offset: 0  cur_src_mac_offset: 0
         cur_saddr: 0.0.0.0  cur_daddr: 172.17.63.253
         cur_udp_dst: 0  cur_udp_src: 0
         cur_queue_map: 0
         flows: 0
    Result: OK: dstmac ee:ff:ff:ff:ff:ff
    测试后:
    [root@centos7 ~]# cat /proc/net/pktgen/eth0
    Params: count 1000000  min_pkt_size: 64  max_pkt_size: 64       #测试选项 Params部分的数据无变化
         frags: 0  delay: 5000  clone_skb: 0  ifname: eth0
         flows: 0 flowlen: 0
         queue_map_min: 0  queue_map_max: 0
         dst_min: 172.17.63.253  dst_max:
            src_min:   src_max:
         src_mac: 00:16:3e:1b:ae:12 dst_mac: ee:ff:ff:ff:ff:ff
         udp_src_min: 9  udp_src_max: 9  udp_dst_min: 9  udp_dst_max: 9
         src_mac_count: 0  dst_mac_count: 0
         Flags:
    Current:                                                        #Current数据有变化
         pkts-sofar: 1000000  errors: 0             #packts so far(pkts-sofar)表示已经发送了 100 万个包,也就表明测试已完成。
         started: 7771818462020us  stopped: 7771835418066us idle: 654254us  #started/stopped时间
         seq_num: 1000001  cur_dst_mac_offset: 0  cur_src_mac_offset: 0
         cur_saddr: 172.17.22.136  cur_daddr: 172.17.63.253
         cur_udp_dst: 9  cur_udp_src: 9
         cur_queue_map: 0
         flows: 0
    Result: OK: 16956046(c16301791+d654254) usec, 1000000 (64byte,0frags)
      58976pps 30Mb/sec (30195712bps) errors: 0                     #测试结果:包含测试所用时间、网络包数量和分片、PPS、吞吐量以及错误数。 约58kpps

作为对比,你可以计算一下千兆交换机的 PPS。
交换机可以达到线速(满负载时,无差错转发),它的 PPS 就是 1000Mbit 除以以太网帧的大小,即 1000Mbps/((64+20)*8bit) = 1.5 Mpps(其中,20B 为以太网帧前导和帧间距的大小)。



倪朋飞 《Linux 性能优化实战》 36 | 套路篇:怎么评估系统的网络性能?
网络接口层和网络层的性能测试:pktgen工具
hping3工具;功能:防火墙测试、端口扫描、DOS/DDOS
==============================================================================================================
hping3 host [options]

  -h  --help            显示帮助
  -v  --version         显示版本
  -c  --count           发送数据包的数目
  -i  --interval        发送数据包间隔的时间 (uX即X微秒, 例如: -i u1000)
      --fast            等同 -i u10000 (每秒10个包)
      --faster          等同 -i u1000 (每秒100个包)
      --flood           尽最快发送数据包,不显示回复
  -n  --numeric         数字化输出,象征性输出主机地址
  -q  --quiet           安静模式
  -I  --interface       网卡接口 (默认路由接口)
  -V  --verbose         详细模式
  -D  --debug           调试信息
  -z  --bind            绑定 ctrl+z 到 ttl (默认为目的端口)
  -Z  --unbind          取消绑定 ctrl+z 键
      --beep            对于接收到的每个匹配数据包蜂鸣声提示
  
模式选择  
  default mode          默认模式是TCP
  -0  --rawip           RAW IP模式,原始IP模式。在此模式下Hping3会发送带数据的IP头。即裸IP方式。使用RAWSOCKET方式
  -1  --icmp            ICMP模式,此模式下Hping3会发送IGMP应答报,你可以用 --icmptype,--icmpcode 选项发送其他类型/模式的ICMP报文
  -2  --udp             UDP模式,默认Hping3会发送UDP报文到主机的0端口,你可以用 --baseport,--destport,--keep 选项指定端口
  -8  --scan            扫描模式,扫描指定的端口
                        Example: hping3 --scan 1-30,70-90 -S www.target.host
  -9  --listen          监听模式
    
IP 模式  
  -a  --spoof           源地址欺骗。伪造自身IP,对目的进行攻击,防火墙就不会记录你的真实IP了,当然回应的包你也接收不到了
        --rand-dest       随机目的地址模式,详细使用 man 命令
      --rand-source     随机源地址模式,详细使用 man 命令
  -t  --ttl             指定 ttl 值 (默认 64)
  -N  --id              hping3 中的 ID 值,缺省为随机值
  -W  --winid           使用 win* id 字节顺序,针对不同的操作系统。UNIX,WINDIWS的id回应不同,这选项可以让你的ID回应和WINDOWS一样
  -r  --rel             相对id字段(用于评估主机流量)  //更改ID的,可以让ID曾递减输出,详见HPING-HOWTO
  -f  --frag            将数据包拆分成更多的frag,可能通过弱访问控制列表(acl)    //分段,可以测试对方或者交换机碎片处理能力,缺省16字节
  -x  --morefrag        设置更多的分段标志    //大量碎片,泪滴攻击
  -y  --dontfrag        设置不分段标志    //发送不可恢复的IP碎片,这可以让你了解更多的MTU PATH DISCOVERY
  -g  --fragoff         set the fragment offset    //设置断偏移
  -m  --mtu             设置虚拟最大传输单元,当大于MTU时分段;如果数据包大于MTU,等同于使用 --frag 选项
  -o  --tos             tos字段,服务类型,缺省值为0x00,通过 hping3 --tos help 命令查看详细
  -G  --rroute             记录IP路由,并显示路由缓冲
      --lsrr            松散源路由并记录路由 (loose source routing and record route)
      --ssrr            严格源路由并记录路由 (strict source routing and record route)
  -H  --ipproto         设置IP协议字段,仅在RAW IP模式下使用
  
ICMP 模式
  -C  --icmptype        icmp类型,默认回显(echo)请求
  -K  --icmpcode        icmp代号,默认0
      --force-icmp      发送所有icmp类型(默认仅发送支持的类型)
      --icmp-gw         设置ICMP重定向网关地址(默认0.0.0.0)
      --icmp-ts         等同 --icmp --icmptype 13 (ICMP 时间戳)
      --icmp-addr       等同 --icmp --icmptype 17 (ICMP 地址子网掩码)
      --icmp-help       显示其他icmp选项帮助
  
UDP/TCP 模式
  -s  --baseport        设置源端口,默认为随机源端口
  -p  --destport        设置目的端口,默认端口为0
  -k  --keep            保持源端口不变
  -w  --win             win的滑动窗口。windows发送字节(默认64)
  -O  --tcpoff          set fake tcp data offset(instead of tcphdrlen / 4)    //设置伪造tcp数据偏移量(取代tcp地址长度/4)
  -Q  --seqnum          仅显示tcp序列号
  -b  --badcksum        (尝试)发送具有错误IP校验和的数据包,所以你会得到错误UDP/TCP校验和。但是许多系统会修复发送数据包的IP校验和
  -M  --setseq          设置TCP序列号
  -L  --setack          set TCP ack,不是 TCP 的 ACK 标志位
  -F  --fin             set FIN flag  
  -S  --syn             set SYN flag  
  -R  --rst             set RST flag  
  -P  --push            set PUSH flag  
  -A  --ack             set ACK flag,设置 TCP 的 ACK 标志位
  -U  --urg             set URG flag      //一大堆IP报头的设置
  -X  --xmas            set X unused flag (0x40)
  -Y  --ymas            set Y unused flag (0x80)
      --tcpexitcode     使用last tcp->th_flags 作为退出码
      --tcp-mss         使用给定的值启用TCP MSS选项
      --tcp-timestamp   启用TCP时间戳选项来猜测HZ/uptime
  
通用设置  
  -d  --data            发送数据包的大小,默认为0
  -E  --file            发送指定文件内的数据
  -e  --sign            添加“签名”
  -j  --dump            转储为十六进制数据包
  -J  --print           转储为可打印字符
  -B  --safe            启用“安全”协议
  -u  --end             告诉你什么时候--file达到EOF并防止倒回
  -T  --traceroute      traceroute模式(等同使用 --bind 且 --ttl 1)
      --tr-stop         在traceroute模式下,收到第一个非ICMP报文时退出
      --tr-keep-ttl     保持源TTL固定,仅用于监视一跳
      --tr-no-rtt       不要在traceroute模式下计算或显示RTT信息

ARS packet description (new, unstable)
      --apd-send        发送用APD描述的数据包(参见docs/APD.txt)

----------------------------------------------------------------------------------------------------------------
1 防火墙测试
    hping3 -S -c 1000000 -a 10.10.10.10 -p 21 10.10.10.10   #以 LandAttack 方式测试目标防火墙 (Land Attack 是将发送源地址设置为与目标地址相同,诱使目标机与自己不停地建立连接):

2 端口扫描
    hping3 -I eth0 -S 192.168.10.1 -p 80        #探测目标机的80端口是否开放

3 Idle扫描
    Idle 扫描 (Idle Scanning) 是一种匿名扫描远程主机的方式,该方式也是由 Hping3 的作者 Salvatore Sanfilippo 发明的,目前 Idle 扫描在 Nmap 中也有实现。
    该扫描原理是:寻找一台 idle 主机 (该主机没有任何的网络流量,并且 IPID 是逐个增长的),攻击端主机先向 idle 主机发送探测包,从回复包中获取其 IPID。冒充 idle 主机的 IP 地址向远程主机的端口发送 SYN 包 (此处假设为 SYN 包),此时如果远程主机的目的端口开放,那么会回复 SYN/ACK,此时 idle 主机收到 SYN/ACK 后回复 RST 包。然后攻击端主机再向 idle 主机发送探测包,获取其 IPID。那么对比两次的 IPID 值,我们就可以判断远程主机是否回复了数据包,从而间接地推测其端口状态。

4 拒绝服务攻击DOS
    hping3 -I eth0 -a 192.168.10.99 -S 192.168.10.33 -p 80 -i u1000 #对目标机发起大量 SYN 连接,伪造源地址为 192.168.10.99,并使用1000微秒的间隔发送各个 SYN 包
    hping3 -S -p 80 -i u1 192.168.1.160         

5 DDOS攻击 (分布式拒绝服务攻击)
    hping3 -c 10000 -d 120 --udp -w 64 -p 80 --flood --rand-source www.baidu.com        #UDP ddos攻击
    hping3 -c 10000 -d 120 --icmp -w 64 -p 80 --flood --rand-source www.baidu.com       #ICMP ddos攻击
    hping3 -c 10000 -d 120 -S -w 64 -p 80 --flood --rand-source www.baidu.com           #SYN ddos攻击
    hping3 -c 10000 -d 120 -A -w 64 -p 80 --flood --rand-source www.baidu.com           #ACK ddos攻击

6 木马功能
    如果 Hping3 能够在远程主机上启动,那么可以作为木马程序启动监听端口,并在建立连接后打开 shell 通信。与 netcat 的后门功能类似。

7 文件传输
    Hping3 支持通过 TCP/UDP/ICMP 等包来进行文件传输。相当于借助 TCP/UDP/ICMP 包建立隐秘隧道通讯。实现方式是开启监听端口,对检测到的签名 (签名为用户指定的字符串) 的内容进行相应的解析。


https://blog.csdn.net/hexf9632/article/details/103698141
hping3工具;功能:防火墙测试、端口扫描、DOS/DDOS

 TCP性能压测

Iperf工具;iperf测试实例udp模式、tcp模式;iperf与iperf3的区别
=====================================================================================================
Iperf 是一个 TCP/IP 和 UDP/IP 的性能测量工具,通过调谐各种参数可以测试TCP的最大带宽,并报告带宽、延迟,最大段和最大传输单元大小等统计信息。

带宽测试通常采用UDP模式,因为能测出极限带宽、时延抖动、丢包率。在进行测试时,首先以链路理论带宽作为数据发送速率进行测试,
例如,从客户端到服务器之间的链路的理论带宽为100Mbps,先用 -b 100M进行测试,然后根据测试结果(包括实际带宽,时延抖动和丢包率),再以实际带宽作为数据发送速率进行测试,会发现时延抖动和丢包率比第一次好很多,重复测试几次,就能得出稳定的实际带宽。


Iperf工作原理
    Iperf主要的功能是测试基于特定路径的TCP连接的性能,我们知道TCP连接调整最基本的措施是调整TCP窗口的大小,窗口大小控制在任何节点网络中可以存在的数据大小。如果该值太小,发送者将会在某段时间处于空闲状态,从而影响发送的性能。TCP窗口大小的理论值为链路瓶颈带宽与往返时延的乘积:

    TCP_Window=Bottleneck_Bandwidth*Round_Trip_Time
    例如链路瓶颈带宽为45Mbps,往返时延为42ms(可以通过ping来测试),那么窗口的理论值为:
    45Mbps*42ms=(45*e6)*(42*e-3)=1890000 bits=230KByte
    调节窗口大小即可以理论值为基准,在该值上慢慢增大或减少,即可获得最好的结果。

Iperf测试TCP带宽的原理:
    在客户端和服务器端建立连接(三次握手)后,客户端发送一定大小的数据报,并记下发送的时间, 或者客户端在一定的时间内发送数据,并记下发送的总数据。带宽的大小等于发送的总数据除以发送的总时间。对服务器端来说,就是在连接建立时间内,接收的总数据除以所花时间即为服务器端所测得的带宽。MSS的大小通过TCP内核接口函数直接获得。

Iperf测试UDP的性能:
    客户端可以指定UDP数据流的速率。客户端发送数据时,将根据客户提供的速率计算数据报发送之间的时延。另外客户还可以指定发送数据报的大小。每个发送的数据报包含一个ID号,用来惟一地标识该报文。服务器端则根据该ID号来确定数据报丢失和乱序。当把UDP报文大小设置可以将整个报文放入IP层的包(packet)内时,那么UDP所测得的报文丢失数据即为IP层包的丢失数据。这提供了一个有效的测试包丢失情况的方法。数据报传输延迟抖动 (Jitter)的测试由服务器端完成,客户发送的报文数据包含有发送时间戳,服务器端根据该时间信息和接收到报文的时间戳来计算传输延迟抖动。传输延迟抖动反映传输过程中是否平滑。由于它是一个相对值,所以并不需要客户端和服务器端时间同步。


-------------------------------------------------------------------------------------------------
iperf参数:
    server端参数:
        -s  指定server端
        -p 指定端口(要和客户端一致)
        -B 绑定ip地址 
        -u  udp协议,,默认是tcp协议
        -i sec 以秒为单位显示报告间隔。#iperf是client端向server端发送数据;server端显示的是接收速率
        -o 将报告和错误信息输出到文件eg:iperf -c 222.35.11.23 -o c:/iperflog.txt
        
    client端参数:
        -c 指定client端
        -p 指定端口(要和服务器端一致)
        -B 绑定客户端的ip地址
        -4 指定ipv4
        -f 格式化带宽数输出
        -n 指定传输的字节数
        -b 使用带宽数量 
        -u 指定udp协议
        -w TCP滑动窗口的大小
        -i sec 以秒为单位显示报告间隔。client 显示的是发送速率

------------------------------------------------------------------------------------------------
1、UDP 模式
    服务器端配置
        iperf -u -s

    客户端配置 
        iperf -u -c 192.168.1.1 -b 100M -t 60        #在udp模式下,以100Mbps为数据发送速率,客户端到服务器192.168.1.1上传带宽测试,测试时间为60秒。
        iperf -u -c 192.168.1.1 -b 5M -P 30 -t 60    #客户端同时向服务器端发起30个连接线程,以5Mbps为数据发送速率。
        iperf -u -c 192.168.1.1 -b 100M -d -t 60    #以100M为数据发送速率,进行上下行带宽测试。

------------------------------------------------------------------------------------------------
2、TCP模式
    服务器端配置    
        iperf -s

    客户端
        iperf -c 192.168.1.1 -t 60                    #在tcp模式下,客户端到服务器192.168.1.1上传带宽测试,测试时间为60秒。
        iperf -c 192.168.1.1 -P 30 -t 60            #客户端同时向服务器端发起30个连接线程。
        iperf -c 192.168.1.1 -d -t 60                #进行上下行带宽测试。

------------------------------------------------------------------------------------------------
iperf与iperf3的区别
    iperf3不支持双工模式测试
Iperf工具;iperf测试实例udp模式、tcp模式;iperf与iperf3的区别
iperf3工具
============================================================================================================
TCP 和 UDP 的性能测试方法
iperf 和 netperf 都是最常用的网络性能测试工具,测试 TCP 和 UDP 的吞吐量。它们都以客户端和服务器通信的方式,测试一段时间内的平均吞吐量。
特别是现在的云计算时代,在你刚拿到一批虚拟机时,首先要做的,应该就是用 iperf ,测试一下网络性能是否符合预期。

启动 iperf 服务端
$ iperf3 -s -i 1 -p 10000   # -s表示启动服务端,-i表示汇报间隔,-p表示监听端口

iperf 客户端
$ iperf3 -c 192.168.1.150 -b 1G -t 15 -P 2 -p 10000
    # -c表示启动客户端,192.168.1.150为目标服务器的IP
    # -b表示目标带宽(单位是bits/s)
    # -t表示测试时间
    # -P表示并发数,-p表示目标服务器监听端口


[root@yefeng ~]# iperf3 -c 192.168.1.150 -b 1G -t 15 -P 2 -p 10000
    Connecting to host 192.168.1.150, port 10000
    [  4] local 192.168.1.88 port 33498 connected to 192.168.1.150 port 10000
    [  6] local 192.168.1.88 port 33504 connected to 192.168.1.150 port 10000
    [ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
    [  4]   0.00-1.00   sec   111 MBytes   932 Mbits/sec   84    748 KBytes
    [  6]   0.00-1.00   sec   110 MBytes   925 Mbits/sec   54    830 KBytes
    [SUM]   0.00-1.00   sec   221 MBytes  1.86 Gbits/sec  138
    - - - - - - - - - - - - - - - - - - - - - - - - -
    ……………………………………
    - - - - - - - - - - - - - - - - - - - - - - - - -
    [  4]  14.00-15.00  sec   119 MBytes  1.00 Gbits/sec    0    998 KBytes
    [  6]  14.00-15.00  sec   121 MBytes  1.01 Gbits/sec   15    687 KBytes
    [SUM]  14.00-15.00  sec   240 MBytes  2.01 Gbits/sec   15
    - - - - - - - - - - - - - - - - - - - - - - - - -
    [ ID] Interval           Transfer     Bandwidth       Retr
    [  4]   0.00-15.00  sec  1.74 GBytes   995 Mbits/sec  220             sender
    [  4]   0.00-15.00  sec  1.74 GBytes   995 Mbits/sec                  receiver
    [  6]   0.00-15.00  sec  1.74 GBytes   996 Mbits/sec  114             sender
    [  6]   0.00-15.00  sec  1.74 GBytes   996 Mbits/sec                  receiver
    [SUM]   0.00-15.00  sec  3.48 GBytes  1.99 Gbits/sec  334             sender
    [SUM]   0.00-15.00  sec  3.48 GBytes  1.99 Gbits/sec                  receiver  #这台机器 TCP 接收的带宽(吞吐量)为 1.99 Gb/s;因为测试目标带宽1G,并发2;说明实际性能可以达到2Gb/s,甚至超过2Gb/s

    iperf Done.
[root@yefeng ~]# iperf3 -c 192.168.1.150 -b 10G -t 15 -P 2 -p 10000
    Connecting to host 192.168.1.150, port 10000
    [  4] local 192.168.1.88 port 44990 connected to 192.168.1.150 port 10000
    [  6] local 192.168.1.88 port 45000 connected to 192.168.1.150 port 10000
    [ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
    [  4]   0.00-1.00   sec   295 MBytes  2.48 Gbits/sec   41    713 KBytes
    [  6]   0.00-1.00   sec   255 MBytes  2.14 Gbits/sec   42    891 KBytes
    [SUM]   0.00-1.00   sec   550 MBytes  4.62 Gbits/sec   83
    - - - - - - - - - - - - - - - - - - - - - - - - -
    ……………………………………
    - - - - - - - - - - - - - - - - - - - - - - - - -
    [  4]  14.00-15.00  sec   271 MBytes  2.27 Gbits/sec   31    807 KBytes
    [  6]  14.00-15.00  sec   272 MBytes  2.28 Gbits/sec   24    993 KBytes
    [SUM]  14.00-15.00  sec   543 MBytes  4.55 Gbits/sec   55
    - - - - - - - - - - - - - - - - - - - - - - - - -
    [ ID] Interval           Transfer     Bandwidth       Retr
    [  4]   0.00-15.00  sec  4.16 GBytes  2.38 Gbits/sec  180             sender
    [  4]   0.00-15.00  sec  4.15 GBytes  2.38 Gbits/sec                  receiver
    [  6]   0.00-15.00  sec  3.86 GBytes  2.21 Gbits/sec  180             sender
    [  6]   0.00-15.00  sec  3.85 GBytes  2.21 Gbits/sec                  receiver
    [SUM]   0.00-15.00  sec  8.01 GBytes  4.59 Gbits/sec  360             sender
    [SUM]   0.00-15.00  sec  8.01 GBytes  4.59 Gbits/sec                  receiver  #测试结果显示带宽为4.59 Gb/s,达不到测试目标20G

    iperf Done.
iperf3工具

Netperf 网络性能测试

HTTP性能压测

应用层压测工具ab
==========================================================================================================================
    -n(常用)        发出x个请求
    -c(常用)        并发一次发出的多个请求数,也就是模拟x个并发
    -t(常用)        将花费在基准测试上的时间限制为最长秒,在x秒内发请求
    -s(常用)        等待每个响应的最大超时秒数,默认30秒
    -p(常用)        发送POST请求时需要上传的文件,此外还必须设置-T参数。
    -u(常用)        发送PUT请求时需要上传的文件,此外还必须设置-T参数。
    -T(常用)        内容类型用于POST/PUT数据的内容类型标题,默认值为text/plain。例如:application/x-www-form-urlencoded,
    -k(常用)        使用HTTP KeepAlive功能
    -b        TCP发送/接收缓冲区的窗口大小(字节)
    -B        地址进行传出连接时要绑定到的地址
    -v        打印版本号并退出
    -w        在HTML表格中打印结果
    -i        使用HEAD而不是GET
    -x        要作为表属性插入的字符串
    -y        要作为tr属性插入的字符串
    -z        要作为td或th属性插入的字符串
    -C        添加cookie,例如“Apache=1234”。(可重复)
    -H        添加任意标题行,例如“接受编码:gzip”
    -A        添加基本的WWW身份验证,属性是以冒号分隔的用户名和密码。
    -P        添加基本代理身份验证,属性是以冒号分隔的用户名和密码。
    -X        要使用的代理服务器和端口号
    -V        打印版本号并退出
    -d        不要在表格中显示已送达的百分位数。
    -S        不显示服务于表格的百分位数。不显示置信度估计器和警告。
    -q        执行超过150个请求时不显示进度
    -l        接受可变文档长度(用于动态页面)
    -g        将收集的数据输出到gnuplot格式文件。
    -e        输出提供百分比的CSV文件
    -r        套接字接收错误时不退出。
    -m        方法名
    -h        显示帮助信息




    -n      要执行请求数,默认会执行一个请求
    -c      一次执行多个请求的数量,默认是一次一个请求。
    -t      用于基准测试的最大秒数,使用它在固定的总时间内对服务器进行基准测试。默认情况下,没有时间限制。
    -s      超时之前等待的最大秒数。 默认值是30秒。
    -b      TCP发送/接收缓冲区的大小,以字节为单位。
    -B      进行传出连接时要绑定的地址。
    -p      包含数据到POST的文件。 还请记住设置-T。
    -u      包含PUT数据的文件。 还请记住设置-T 。
    -T      Content-type用于POST / PUT数据的内容类型内容类型标题,例如:'application/x-www-form-urlencoded' 默认是'text/plain'
    -v      verbosity 要打印多少个疑难解答信息,设置详细级别 - 4和以上打印标题信息,3和以上打印响应代码(404,200等),2和以上打印警告和信息。
    -w      在HTML表格中打印结果。
    -i      使用HEAD代替GET。
    -x      用作<table>的属性的字符串。 属性被插入<table here>-y      用作<tr>的属性的字符串。
    -z      用作<td>的属性的字符串。
    -C      将cookie添加到请求。 参数通常采用名称=值对的形式。 这个字段是可重复的。
    -H      attribute 例如 ‘Accept-Encoding: gzip’ 插入所有普通标题行之后。(重复)
    -A      添加基本的WWW认证,该属性是一个冒号分隔的用户名和密码,auth-username:password
    -P      添加基本代理验证,属性是一个冒号分隔的用户名和密码,proxy-auth-username:password
    -X      使用代理服务器和端口号。
    -V      打印版本号并退出。
    -k      使用HTTP KeepAlive功能。
    -d      不要显示百分点服务表。
    -S      不要显示信心估计和警告。
    -q      做超过150个请求时不要显示进度。
    -g      将收集的数据输出到gnuplot格式文件。
    -e      输出提供百分比的CSV文件。
    -r      不要退出套接字接收错误。
    -h      显示使用情况信息(此消息)。
    -Z      密码套件指定SSL / TLS密码套件(请参阅openssl密码)
    -f      指定SSL / TLS协议 (SSL3, TLS1, TLS1.1, TLS1.2 or ALL)




    发送get请求
        ab -n1 -c1 "http://192.168.32.46:8081/"
            -n 要执行请求数,默认会执行一个请求
            -c 一次执行多个请求的数量,默认是一次一个请求。
        ab -n 200 -c 20 -k http://127.0.0.1:8080/mai?id=101


    发送Post请求
        ab -n 2000 -c 200 -k -p ~/postfile -T application/x-www-form-urlencoded http://127.0.0.1:8080/test
            发送post请求,要把参数存到一个文件里,这个文件叫postfile(这个文件名字可以随便取,没有扩展名),然后写-p 后面跟文件的路径。

        ab -n1 -c1   -p "/root/gzf/ab_test/post.txt" -T "application/json" "http://192.168.32.76:81/tokenServer/get/token"
            post.txt文件内容
                &clientId=098f6bcd4621d373cade4e832627b4f6&userName=admin&password=123456
            
        ab -n100 -c100 -t 900 -v4 -p "C:\Apache24\parameter\browse_getPage.txt" -T "application/x-www-form-urlencoded; charset=UTF-8" -H “Cookie: Hm_lvt_6b1cbafa30155b9daeb173be8dc6476b=1525749629,1525768065,1525772656,1525827834; 80e9091559d17e2f58a5956172b00223=557d09269486be42f25c255a7cc2f26f; 4ec65e89eca3bfb0931cdef9658e0fed=aad85e8637ba2d2dd102915939661bec; Hm_lpvt_6b1cbafa30155b9daeb173be8dc6476b=1525846910” http://localhost/Browse/getPage
            -p 包含数据到POST的文件。 还请记住设置-T
            -T Content-type用于POST / PUT数据的内容类型内容类型标题,例如:'application/x-www-form-urlencoded' 默认是'text/plain'

    https://www.cnblogs.com/wxinyu/p/8929924.html


====================================================================================================================================
ab 是 Apache Benchmark 的缩写,它的用途就是对 HTTP 服务端发起测试,以获得性能指标(Benchmark)。
ab 本身不是独立安装的,而是在 apache2-utils 工具包里,所以你可以这样来安装它:
    apt install apache2-utils

ab 是一个轻量级的工具,因为相对其他重量级的工具比如 LoadRunner 或者 JMeter 来说,ab 只要一行命令就可以发起压测了
    ab -c 100 -n 10000 目标URL
    -c 100 这个参数,让 ab 发起了 100 个并发的请求,
    -n 10000 指定了总共发送的请求量。
    补充:这里有一个小的注意点。如果目标 URL 只是站点名本身,还是需要在结尾处加上“>/”,要不然 ab 会报这个错误:ab: invalid URL
    
    ab -k -c 100 -n 10000 目标URL
        -k 参数是启用长连接
    

用下面这条 ab 命令,对一个著名网站发起“压测”,当然我的参数选择的很小,只有 10 个并发,一共 100 次请求,尽量避免打扰到这个网站。我们可以看一下输出:
    $ ab -c 10 -n 100 https://www.baidu.com/abc
    This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Licensed to The Apache Software Foundation, http://www.apache.org/
    Benchmarking www.baidu.com (be patient).....done
    Server Software:        Apache
    Server Hostname:        www.baidu.com
    Server Port:            443
    SSL/TLS Protocol:       TLSv1.2,ECDHE-RSA-AES128-GCM-SHA256,2048,128
    Server Temp Key:        ECDH P-256 256 bits
    TLS Server Name:        www.baidu.com
    Document Path:          /abc
    Document Length:        201 bytes
    Concurrency Level:      10
    Time taken for tests:   9.091 seconds
    Complete requests:      100
    Failed requests:        0
    Non-2xx responses:      100
    Total transferred:      34600 bytes
    HTML transferred:       20100 bytes
    Requests per second:    11.00 [#/sec] (mean)
    Time per request:       909.051 [ms] (mean)
    Time per request:       90.905 [ms] (mean, across all concurrent requests)
    Transfer rate:          3.72 [Kbytes/sec] received
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:      141  799 429.9    738    4645
    Processing:    19   67 102.0     23     416
    Waiting:       17   67 101.8     23     416
    Total:        162  866 439.7    796    4666
    Percentage of the requests served within a certain time (ms)
      50%    796        #第 50 个请求(因为总数是 100 个)的耗时小于等于 796 毫秒,另外 50 个请求大于 796 毫秒。
      66%    877
      75%    944
      80%   1035
      90%   1093
      95%   1339
      98%   1530
      99%   4666
     100%   4666 (longest request)  #耗时最长的那个就是排最后一名的 4666,它的耗时是 4666 毫秒。

    《网络排查案例课》22 | 为什么压力测试TPS总是上不去?
应用层压测工具 ab(Apache Benchmark)

 应用程序的实际性能压测:wrk、TCPCopy、Jmeter、LoadRunner等工具

应用负载性能测试 wrk工具
=================================================================================================
当你用 iperf 或者 ab 等测试工具,得到 TCP、HTTP 等的性能数据;但这些数据不能表示应用程序的实际性能
    比如,你的应用程序基于 HTTP 协议,为最终用户提供一个 Web 服务。
    这时,使用 ab 工具,可以得到某个页面的访问性能,但这个结果跟用户的实际请求,很可能不一致。
    因为用户请求往往会附带着各种各种的负载(payload),而这些负载会影响 Web 应用程序内部的处理逻辑,从而影响最终性能。

为了得到应用程序的实际性能,就要求性能工具本身可以模拟用户的请求负载,可以用 wrk、TCPCopy、Jmeter 或者 LoadRunner 等实现这个目标。


 wrk工具
    -t:需要模拟的线程数
    -c:需要模拟的连接数
    -d:测试的持续时间
    --timeout 或 -T:超时的时间 
    --latency:显示延迟统计
    -s 或 --script:      lua脚本,使用方法往下看
    -H, --header:      添加http header, 比如. "User-Agent: wrk"


wrk测试示例:
    $ wrk -c 1000 -t 2 http://192.168.0.30/    # -c表示并发连接数1000,-t表示线程数为2
    Running 10s test @ http://192.168.0.30/
      2 threads and 1000 connections
      Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency    65.83ms  174.06ms   1.99s    95.85%
        Req/Sec     4.87k   628.73     6.78k    69.00%
      96954 requests in 10.06s, 78.59MB read
      Socket errors: connect 0, read 0, write 0, timeout 179
    Requests/sec:   9641.31
    Transfer/sec:      7.82MB

    #这里使用 2 个线程、并发 1000 连接,重新测试了 Nginx 的性能。你可以看到,每秒请求数为 9641,吞吐量为 7.82MB,平均延迟为 65ms,比前面 ab 的测试结果要好很多。
    #这说明,性能工具本身的性能,对性能测试也是至关重要的。不合适的性能工具,并不能准确测出应用程序的最佳性能。


    wrk -t10 -c30 -d 2s -T5s --latency http://www.baidu.com

    Running 2s test @ http://www.baidu.com
      10 threads and 30 connections
                                                         平均值            标准差        最大值      正负一个标准差占比
    线程状态  Thread Stats                   Avg              Stdev           Max         +/- Stdev
    响应时间  Latency                        168.45ms       265.72ms     1.48s          87.68%
    每线程每秒完成请求数Req/Sec     25.78          26.22          120.00        86.55%         
      Latency Distribution      延迟统计
         50%   31.15ms           有50%的请求执行时间是在31.15ms内完成
         75%  243.14ms          有75%的请求执行时间是在243.14ms内完成
         90%  479.94ms          有90%的请求执行时间是在479.94内完成
         99%    1.31s               有99%的请求执行时间是在1.31s内完成
      365 requests in 2.01s, 5.55MB read      2秒执行了365个请求,读了5.55MB数据

    Socket errors: connect 29, read 2, write 0, timeout 0     错误    : 连接错误:29     读错误:2
    Requests/sec:    182.02        每秒请求数(也就是QPS)
    Transfer/sec:      2.77MB      每秒钟读取2.77兆数据量
-------------------------------------------------------------------------------
wrk 最大的优势,是其内置的 LuaJIT,可以用来实现复杂场景的性能测试。wrk 在调用 Lua 脚本时,可以将 HTTP 请求分为三个阶段,即 setup、running、done
在 setup 阶段,为请求设置认证参数
    -- example script that demonstrates response handling and
    -- retrieving an authentication token to set on all future
    -- requests
    token = nil
    path  = "/authenticate"
    request = function()
       return wrk.format("GET", path)
    end
    response = function(status, headers, body)
       if not token and status == 200 then
          token = headers["X-Token"]
          path  = "/resource"
          wrk.headers["X-Token"] = token
       end
    end

在执行测试时,通过 -s 选项,执行脚本的路径:
    $ wrk -c 1000 -t 2 -s auth.lua http://192.168.0.30/

wrk 需要你用 Lua 脚本,来构造请求负载。这对于大部分场景来说,可能已经足够了 。不过,它的缺点也正是,所有东西都需要代码来构造,并且工具本身不提供 GUI 环境。
像 Jmeter 或者 LoadRunner(商业产品),则针对复杂场景提供了脚本录制、回放、GUI 等更丰富的功能,使用起来也更加方便。
应用负载性能测试 wrk工具

 网络性能指标:延迟、bps、pps、qps、丢包率、并发数等等

网络性能指标:延迟、bps、pps、qps、丢包率、并发数等等
=======================================================================================================
延迟  ping  hping3  ab工具
带宽 iperf 
bps     pktgen工具    iperf   ab工具    sar工具
pps     pktgen工具    wrk工具    sar工具
qps     ab工具        wrk工具

连接数     netstat/ss

连接跟总数   conntrack

==================================================================================================
网络性能指标

响应时间(RT),延迟,延时
    响应时间是指系统对请求作出响应的时间。
延时,表示从网络请求发出后,一直到收到远端响应,所需要的时间延迟。在不同场景中,这一指标可能会有不同含义。比如,它可以表示,建立连接需要的时间(比如 TCP 握手延时),或一个数据包往返所需的时间(比如 RTT)。

----------------------------------------------------------------------------------------
带宽,表示链路的最大传输速率,单位通常为 b/s (比特 / 秒)。
吞吐量,表示单位时间内成功传输的数据量,单位通常为 b/s(比特 / 秒)或者 B/s(字节 / 秒)。吞吐量受带宽限制,而吞吐量 / 带宽,也就是该网络的使用率。
流量/bps:bps 比特率,是指单位时间内传送的比特(bit)数,单位为bps(bit per second)

---------------------------------------------------------------------------------------
PPS,是 Packet Per Second(包 / 秒)的缩写,表示以网络包为单位的传输速率。
PPS 通常用来评估网络的转发能力,比如硬件交换机,通常可以达到线性转发(即 PPS 可以达到或者接近理论最大值)。而基于 Linux 服务器的转发,则容易受网络包大小的影响。
---------------------------------------------------------------------------------------
CPS 秒新建连接数
    每秒新建连接数-Connection Per Second (CPS)
    每秒新建连接数定义了新建连接的速率。当新建连接的速率超过规格定义的每秒新建连接数时,新建连接请求将被丢弃。


---------------------------------------------------------------------------------------
QPS每秒查询率(Query Per Second)
每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准.
在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。

例子说明:
    每秒请求量。假如每秒请求量10万,假如机器为16核,那么启16个线程同时工作, 那么每个线程同时的请求量= 10万/ 16核 = 6250QPS。
    按照二八原则,一天24小时,忙时=24*0.2 = 4.8小时。
    则平均一天总请求量=4.8 * 3600 *10万QPS = 172亿8千万。
    那么每秒请求10万并发量,每天就能达到172亿的PV。



---------------------------------------------------------------------------------------
丢包率
如果客端端发10万请求,服务端只处理了8万,那么就丢了2万。丢包率=2/10 = 20%。丢包率是越小越好,最好是没有。
去除,网络丢包,那么就要考虑内核里的丢包 问题,因此要考虑网卡的吞吐量,同一时间发大多请求过来,内核会不会处理不过来, 导致丢包。

---------------------------------------------------------------------------------------
重传率(重新传输的网络包比例)
---------------------------------------------------------------------------------------
并发用户数
并发用户数是指系统可以同时承载的正常使用系统功能的用户的数量。


---------------------------------------------------------------------------------------
高并发连接
高并发连接指的是连接的数量。

对服务端来说,一个套接字对就是一个连接,连接和本地 文件描述符无关,不受本地文件描述符限制,只跟内存有关,假设一个套接字占用服务器8k内存,那么1G内存=1024*1024/8 = 131072。因此连接数跟内存有关。

1G = 10万左右连接,当然这是理论,实际要去除内核占用,其他进程占用,和本进程其他占用。

假哪一个机器32G内存,那个撑个100万个连接是没有问题的。

如果是单个进程100万连,那就更牛B了,但一般都不会这么做,因为如果此进程宕了,那么,所有业务都影响了。所以一般都会分布到不同进程,不同机器,一个进程出问题了,不会影响其他进程的处理。


---------------------------------------------------------------------------------------
PV : 每天的总访问量pave view,
PV = QPS * (24*0.2) * 3600 (二八原则)
网络性能指标:延迟、bps、pps、qps、丢包率、并发数等等

图:网络性能工具---倪朋飞 《Linux 性能优化实战》网络性能篇

 

posted @ 2022-08-18 22:23  雲淡風輕333  阅读(404)  评论(0编辑  收藏  举报