Linux网络基础与性能优化

来源:入门小站

网络模型:

常见的有 OSI 网络模型、TCP/IP 网络模型、五层协议网络模型:

Linux网络基础与性能优化

OSI 七层网络模型:将传统的五层 TCP 模型中的应用层分为应用层、表示层、会话层

  • 应用层:负责为应用程序提供统一的接口
  • 表示层:负责把数据转换成兼容接收系统的格式
  • 会话层:负责维护计算机之间的通信连接,即负责在网络中的两节点之间建立、维持和终止通信
  • 传输层:负责为数据加上传输表头,形成数据包
  • 网络层:负责数据的路由和转发
  • 数据链路层:负责 MAC 寻址、错误侦测和改错
  • 物理层:负责在物理网络中传输数据帧

Linux 上使用的是 TCP/IP 网络模型,即四层网络模型:

  • 应用层,负责向用户提供一组应用程序,比如 HTTP、FTP、DNS 等
  • 传输层,负责端到端的通信,比如 TCP、UDP 等
  • 网络层,负责网络包的封装、寻址和路由,比如 IP、ICMP 等
  • 网络接口层,负责网络包在物理网络中的传输,比如 MAC 寻址、错误侦测以及通过网卡传输网络帧等

在 TCP/IP 模型下,网络数据将逐层传递并处理:

Linux网络基础与性能优化
  • 对于发送方发送数据包而言,数据包由顶向下,逐层增大:
  • 应用层:应用程序调用 Socket API 发送网络包,把数据包放到 Socket 发送缓冲区中
  • 网络协议栈从 Socket 发送缓冲区中,取出数据包;再按照 TCP/IP 栈,从上到下逐层处理
  • 传输层:增加 TCP 头
  • 网络层:增加 IP 头和执行路由查找确认下一跳的 IP,并按照 MTU 大小进行分片
  • 数据链路层:分片后的网络包,再送到数据链路层,进行物理地址寻址,以找到下一跳的 MAC 地址,并且添加帧头和帧尾,放到发包队列中
  • 驱动程序通过 DMA ,从发包队列中读出网络帧,并通过物理网卡把它发送出去
  • 对于接收方接收数据包而言:
  • 当一个网络帧到达网卡后,网卡会通过 DMA 方式,把这个网络包放到收包队列中;然后通过硬中断,告诉中断处理程序已经收到了网络包
  • 网卡中断处理程序会为网络帧分配内核数据结构(sk_buff),并将其拷贝到 sk_buff 缓冲区中;然后再通过软中断,通知内核收到了新的网络帧
  • 内核协议栈从缓冲区中取出网络帧,并通过网络协议栈,从下到上逐层处理这个网络帧
    • 数据链路层:在数据链路层检查报文的合法性,找出上层协议的类型,去掉帧头、帧尾,然后交给上一层网络层
    • 网络层:网络层取出 IP 头,判断网络包下一步的走向,比如是交给上层处理还是转发。当网络层确认这个包是要发送到本机后,就会取出上层协议的类型(比如 TCP 还是 UDP),去掉 IP 头,再交给传输层处理
    • 传输层:传输层取出 TCP 头或者 UDP 头后,根据 源 IP、源端口、目的 IP、目的端口 四元组作为标识,找出对应的 Socket,并把数据拷贝到 Socket 的接收缓存中。
    • 应用层:应用程序就可以使用 Socket 接口,读取到新接收到的数据

网络性能

常用的网络[性能指标]:
  • 带宽:表示链路的最大传输速率,单位通常为 b/s (比特 / 秒)
  • 吞吐量:表示单位时间内成功传输的数据量,单位通常为 b/s(比特 / 秒)或者 B/s(字节 / 秒)
  • 延时:表示从网络请求发出后,一直到收到远端响应,所需要的时间延迟。在不同场景中,这一指标可能会有不同含义。比如,它可以表示,建立连接需要的时间(比如 TCP 握手延时),或一个数据包往返所需的时间(比如 RTT)
  • PPS:Packet Per Second(包 / 秒),表示以网络包为单位的传输速率。PPS 通常用来评估网络的转发能力基于 Linux 服务器的转发,则容易受网络包大小的影响。
  • 网络的可用性:网络正常通信
  • 并发连接数:TCP 可以连接多少
  • 丢包率:丢包占总包的比重
  • 重传率:重新传输的网络包比例
常用的网络性能监控工具:
  • netstat:用于显示与 IP、TCP、UDP 和 ICMP 协议相关的统计数据,核心是显示套接字状态
  • ifconfig:用于显示或配置网络设备(网络接口卡)信息
  • route:用于显示和操作 IP 路由表,通过目标地址 ip 和子网掩码可以分析出发包路径
  • sar -n DEV:显示网络信息,用 sar 分析网络更多的是用于流量和包量的检测和异常发现
  • nmap:用于网络探测和安全审核的工具
  • ss:查询网络的连接信息
  • ping:检测网络连通性

简单介绍下各种工具的使用:(更详细的命令建议 man 手册查看)

netstat

用于显示与 IP、TCP、UDP 和 ICMP 协议相关的统计数据,核心是显示套接字状态

参数:-a 显示所有套接字 -n 不解析 DNS 名字 (解析 DNS 会比较慢) -t 过滤出 TCP 相关的网络套接字 -p 显示进程 / 程序名 -s 显示出协议栈中相关的一些统计信息

tips:现在常用 ss 替代,ss 的速度更快一些 -t 表示只显示 TCP 套接字 -n 表示显示数字地址和端 -p 表示显示进程信息

int listen(int sockfd, int backlog);

TCP 建立连接过程:服务器收到客户端 SYN 包, 发送 SYN+ACK 包后, 在内存创建一个状态为 SYN_RCVD 的连接, 放入未完成队列, 这个队列的大小可通过 / proc/sys/net/ipv4/tcp_max_syn_backlog 设置. 服务器收到客户端的 ACK 包后, 该连接的状态由 SYN_RCVD 改为 ESTABLISHED, 并移到已完成队列.

服务器程序调用 accept 后, 该连接移除已完成队列, 由内核交给程序控制.

(在第二次握手完成后服务器已经将该连接放入了半连接队列,当第三次握手成功后放入了全连接队列,当 accept 进程被调用后,该连接被调走由内核管理)

backlog 就是指定全连接队列的大小,如果全连接队列队列满了并且 tcp_abort_on_overflow 是 0 的话,server 过一段时间再次发送 syn+ack 给 client,如果 client 超时等待比较短,就会很容易导致异常。(tcp_abort_on_overflow 为 0 表示如果三次握手第三步的时候全连接队列满了那么 server 扔掉 client 发过来的 ack), 因此如果 backlog 太小的话会导致全连接队列容易满,从而 TCP 连接建立失败。

Linux网络基础与性能优化

设置 backlog 后,系统会和 / proc/sys/net/core/somaxconn 比较,取较小值作为真正的 backlog

当已连接队列满后,如果设置 tcp_abort_on_overflow 为 0 表示如果三次握手第三步的时候全连接队列满了那么 server 扔掉 client 发过来的 ack

当半连接队列满后,如果启用 syncookies (net.ipv4.tcp_syncookies = 1), 新的连接不进入未完成队列, 不受影响. 否则, 服务器不在接受新的连接.

SYN 洪水攻击 (syn flood attack)

通过伪造 IP 向服务器发送 SYN 包, 塞满服务器的未完成队列, 服务器发送 SYN+ACK 包 没回复, 反复 SYN+ACK 包, 使服务器不可用. 启用 syncookies 是简单有效的抵御措施. 仅未完成队列满后才生效.

SYN 洪水攻击导致被攻击服务器保持大量 SYN_RECV 状态的 “半连接”,并且会重试默认 5 次回应第二个握手包,塞满 TCP 等待连接队列,资源耗尽(CPU 满负荷或内存不足),让正常的业务请求连接不进来

性能优化思路

从网络 I/O 的角度来说,有如下思路:

  • I/O 多路复用技术 epoll,主要用来取代 select 和 poll
  • 异步 I/O 技术。异步 IO 允许应用程序同时发起很多 I/O 操作,而不用等待这些操作完成,等到 I/O 完成后,系统会用事件通知的方式,告诉应用程序结果

从进程的工作模型来说,有如下思路:

  • 主进程 + 多个 worker 子进程。其中,主进程负责管理网络连接,而子进程负责实际的业务处理
  • 监听到相同端口的多进程模型,即负载均衡策略。所有进程都会监听相同接口,并且开启 SO_REUSEPORT 选项,由内核负责,把请求负载均衡到这些监听进程中去

应用层的网络协议优化思路:

  • 在每秒请求次数较多时并且连接通常是连续时,使用长连接取代短连接,可以显著降低 TCP 建立连接的成本
  • 使用内存等方式,来缓存不常变化的数据,可以降低网络 I/O 次数,同时加快应用程序的响应速度
  • 使用 Protocol Buffer 等序列化的方式,压缩网络 I/O 的数据量,可以提高应用程序的吞吐
  • 使用 DNS 缓存、预取、HTTPDNS 等方式,减少 DNS 解析的延迟,也可以提升网络 I/O 的整体速度


Linux网络基础与性能优化

本篇文章来源于微信公众号:Linux技术迷

原创文章,作者:software,如若转载,请注明出处:https://www.sldh123.com/650.html

(0)
上一篇 6月 29, 2022 3:32 上午
下一篇 6月 30, 2022 3:45 上午

相关推荐

发表回复

您的电子邮箱地址不会被公开。