zoukankan      html  css  js  c++  java
  • Linux 性能优化实战网络笔记

    网络模型

    OSI 网络模型

    应用层,负责为应用程序提供统一的接口。

    表示层,负责把数据转换成兼容接收系统的格式。

    会话层,负责维护计算机之间的通信连接。

    传输层,负责为数据加上传输表头,形成数据包。

    网络层,负责数据的路由和转发。

    数据链路层,负责 MAC 寻址、错误侦测和改错。

    物理层,负责在物理网络中传输数据帧。

    TCP/IP 模型

    应用层,负责向用户提供一组应用程序,比如 HTTP、FTP、DNS 等。

    传输层,负责端到端的通信,比如 TCP、UDP 等。

    网络层,负责网络包的封装、寻址和路由,比如 IP、ICMP 等。

    网络接口层,负责网络包在物理网络中的传输,比如 MAC 寻址、错误侦测以及通过网卡传输网络帧等。

    网络包的接收流程

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

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

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

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

    最后,应用程序就可以使用 Socket 接口,读取到新接收到的数据了。

     

    如何衡量系统的网络性能?

      • 带宽 -> ethtool

        • ethtool eth0 | grep Speed
      • 吞吐量 -> sar -n DEV 1

      • pps -> sar -n DEV 1

      • 延时 -> ping

        • 通常指应用请求到收到响应的时间 (RTT)
        • 也可能指tcp连接建立的时间
      • 连通性 -> ping

      • 丢包率/重传率 -> ifconfig

    • 如何查看网卡/网络配置信息

      • ifconfig <网卡>
      • ip -s addr show dev <网卡>
    • 如何查看系统当前连接(socket)信息

      • 查看连接信息即查看socket信息,一个socket对应一个唯一的5元祖
        • <protocol, source_ip, source_port, target_ip, target_port>
      • 查看当前监听状态的tcp socket及其所属进程
        • netstat -ntlp
        • ss -ntlp
      • 查看协议栈的统计信息
        • netstat -s
        • ss -s
    • 如何理解netstat或ss输出的两个队列含义(Recv-Q和Send-Q)

      • 可以参考这篇文章:
        • 半连接队列(sync队列) -> 第一次握手(sync)后将连接放入sync队列
        • 全连接队列(accept队列) -> 第三次握手(ack) 后将连接放入accept队列
          • Recv-Q 表示当前队列长度
          • Send-Q 表示配置的最大长度
            • 例如nginx默认是511
          • Recv-Q > Send-Q 时,说明队列饱和,将发生overFlows
            • netstat -s 可查看sync或accept队列溢出信息
      • 半连接队列饱和
        • 常见与sync flood攻击, 导致连接一直无法建立并影响正常连接
      • 全连接队列饱和
        • 如果Send-Q设置过小(例如java NIO 默认50),在并发连接较大时容易发生
          • 饱和后默认丢弃ack包,客户端将按策略重传,超过一定时间关闭连接
        • netty如何设置全连接队列长度? -> BACKLOG
          • .option(ChannelOption.SO_BACKLOG, 1024)

     

     

  • 相关阅读:
    【Java8新特性】你知道Java8为什么要引入Lambda表达式吗?
    你说你懂计算机网络,那这些你都知道吗
    程序员需要了解的硬核知识之控制硬件
    程序员需要了解的硬核知识之汇编语言(全)
    真的,Kafka 入门一篇文章就够了
    程序员需要了解的硬核知识之汇编语言(一)
    带你涨姿势的认识一下 Kafka 消费者
    程序员需要了解的硬核知识之操作系统和应用
    详解Kafka Producer
    程序员需要了解的硬核知识之操作系统入门
  • 原文地址:https://www.cnblogs.com/fzzf/p/13205399.html
Copyright © 2011-2022 走看看