Linux网络基础与性能优化
文章目录
网络模型:
常见的有OSI网络模型、TCP/IP网络模型、五层协议网络模型:
OSI七层网络模型:将传统的五层TCP模型中的应用层分为应用层、表示层、会话层
- 应用层:负责为应用程序提供统一的接口
- 表示层:负责把数据转换成兼容接收系统的格式
- 会话层:负责维护计算机之间的通信连接,即负责在网络中的两节点之间建立、维持和终止通信
- 传输层:负责为数据加上传输表头,形成数据包
- 网络层:负责数据的路由和转发
- 数据链路层:负责 MAC 寻址、错误侦测和改错
- 物理层:负责在物理网络中传输数据帧
Linux上使用的是TCP/IP网络模型,即四层网络模型:
- 应用层,负责向用户提供一组应用程序,比如 HTTP、FTP、DNS 等
- 传输层,负责端到端的通信,比如 TCP、UDP 等
- 网络层,负责网络包的封装、寻址和路由,比如 IP、ICMP 等
- 网络接口层,负责网络包在物理网络中的传输,比如 MAC 寻址、错误侦测以及通过网卡传输网络帧等
在TCP/IP模型下,网络数据将逐层传递并处理:
对于发送方发送数据包而言,数据包由顶向下,逐层增大:
- 应用层:应用程序调用 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 表示显示进程信息
#使用netstat查看tcp和udp的套接字信息
[root@jessy /] netstat -antu
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 172.30.0.39:46522 169.254.0.55:5574 ESTABLISHED
tcp 0 36 172.30.0.39:22 163.177.68.30:3199 ESTABLISHED
udp 0 0 0.0.0.0:68 0.0.0.0:*
udp 0 0 0.0.0.0:68 0.0.0.0:*
udp 0 0 172.30.0.39:123 0.0.0.0:*
udp 0 0 127.0.0.1:123 0.0.0.0:*
udp 0 0 0.0.0.0:50844 0.0.0.0:*
udp6 0 0 fe80::5054:ff:fed2::123 :::*
udp6 0 0 ::1:123 :::*
#使用ss也可以达到同样的效果
[root@jessy /] ss -ant
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
ESTAB 0 0 172.30.0.39:46522 169.254.0.55:5574
ESTAB 0 36 172.30.0.39:22 163.177.68.30:3199
用netstat查看更为详细的协议栈信息更加直观和详细:
[root@jessy /] netstat -s
Ip:
16250019 total packets received
0 forwarded
0 incoming packets discarded
16249365 incoming packets delivered
17150794 requests sent out
1784 dropped because of missing route
Icmp:
3568568 ICMP messages received
87 input ICMP message failed.
ICMP input histogram:
destination unreachable: 339
timeout in transit: 107
echo requests: 3567914
echo replies: 202
timestamp request: 2
3568477 ICMP messages sent
0 ICMP messages failed
ICMP output histogram:
destination unreachable: 109
echo request: 420
echo replies: 3567914
timestamp replies: 2
....
Tcp:
14