美文网首页
监控网络

监控网络

作者: wayyyy | 来源:发表于2020-07-19 22:40 被阅读0次

    Linux 网络收发流程

    网络包的接收

    当一个网络帧到达网卡后,网卡会通过 DMA 方式,把这个网络包放到收包队列中;然后通过硬中断,告诉中断处理程序已经收到了网络包。

    网卡中断处理程序会为网络帧分配内核数据结构(sk_buff),并将其拷贝到 sk_buff 缓冲区中;然后再通过软中断,通知内核收到了新的网络帧。

    接下来,内核协议栈从缓冲区中取出网络帧,并通过网络协议栈,从下到上逐层处理这个网络帧

    • 在链路层检查报文的合法性,找出上层协议的类型(比如 IPv4 还是 IPv6),再去掉帧头、帧尾,然后交给网络层。
    • 网络层取出 IP 头,判断网络包下一步的走向,比如是交给上层处理还是转发。当网络层确认这个包是要发送到本机后,就会取出上层协议的类型(比如 TCP 还是 UDP),去掉 IP 头,再交给传输层处理。
    • 传输层取出 TCP 头或者 UDP 头后,根据 < 源 IP、源端口、目的 IP、目的端口 > 四元组作为标识,找出对应的 Socket,并把数据拷贝到 Socket 的接收缓存中。
    image.png
    网络包的发送

    应用程序调用 Socket API(比如 sendmsg)发送网络包。由于这是一个系统调用,所以会陷入到内核态的套接字层中。套接字层会把数据包放到 Socket 发送缓冲区中。

    网络协议栈从 Socket 发送缓冲区中,取出数据包;再按照 TCP/IP 栈,从上到下逐层处理。比如,传输层和网络层,分别为其增加 TCP 头和 IP 头,执行路由查找确认下一跳的 IP,并按照 MTU 大小进行分片。

    分片后的网络包,再送到网络接口层,进行物理地址寻址,以找到下一跳的 MAC 地址。然后添加帧头和帧尾,放到发包队列中。这一切完成后,会有软中断通知驱动程序:发包队列中有新的网络帧需要发送。

    最后,驱动程序通过 DMA ,从发包队列中读出网络帧,并通过物理网卡把它发送出去。


    性能指标

    带宽
    吞吐量
    延时
    PPS

    是 Packet Per Second(包 / 秒)的缩写,表示以网络包为单位的传输速率。PPS 通常用来评估网络的转发能力


    测量TCP带宽

    • 服务端开启监听

      nc -l [server_port]
      
    • 客户端发送数据

      dd if=/dev/zero bs=1MB count=1000 | nc [server_ip] [server_port]
      

    查看网卡速度

    ethtool 网卡接口
    
    7304940-023aae37d72611de.png

    sar 命令

    给 sar 增加 -n 参数就可以查看网络的统计信息,比如网络接口(DEV)、网络接口错误(EDEV)、TCP、UDP、ICMP 等等

    sar -n DEV 1 1 
    
    image.png
    • rxpck/s txpck/s 每秒钟 接收/发送 的数据包
    • rxKB/s txkB/s 每秒钟接受/发送的数据包大小,单位为KB
    • %ifutil 是网络接口的使用率,即半双工模式下为 (rxkB/s+txkB/s)/Bandwidth,而全双工模式下为 max(rxkB/s, txkB/s)/Bandwidth。
    统计socket连接信息
    sar -n SOCK 1 1
    
    image.png
    • totsck 当前被使用的socket总数
    • tcpsck 当前正在被使用的TCP的socket总数
    • udpsck 当前正在被使用的UDP的socket总数
    • rawsck 当前正在被使用于RAW的skcket总数
    • if-frag 当前的IP分片的数目
    • tcp-tw TCP套接字中处于TIME-WAIT状态的连接数量

    查看套接字发送和接收缓冲区大小

    • 发送缓冲区
      /proc/sys/net/ipv4/tcp_wmem

      min:为TCP socket预留用于发送缓冲的内存最小值。每个tcp socket都可以在建议以后都可以使用它。默认值为4096(4K)。
      default:为TCP socket预留用于发送缓冲的内存数量,默认情况下该值会影响其它协议使用的net.core.wmem_default 值,一般要低于net.core.wmem_default的值。默认值为16384(16K)。
      max: 用于TCP socket发送缓冲的内存最大值。该值不会影响net.core.wmem_max,"静态"选择参数SO_SNDBUF则不受该值影响。默认值为131072(128K)。(对于服务器而言,增加这个参数的值对于发送数据很有帮助,在我的网络环境中,修改为了51200 131072 204800)

    • 接收缓冲区
      /proc/sys/net/ipv4/tcp_rmem


    相关文章

      网友评论

          本文标题:监控网络

          本文链接:https://www.haomeiwen.com/subject/ajkrkktx.html