前面我们讲了CPU、内存、磁盘IO,下面我们来看网络这部分,网络处理的流程最复杂,跟我们前面讲到的进程调度、中断处理、内存管理以及 I/O 等都密不可分。
OSI的网络七层模型,以及TCP/IP的四层or五层模型,如下:
TCP/IP网络栈
有了linux根据tcp/ip模型,我们的网络栈的收发数据实际上就是按照这4层模型对数据层层进行处理,对上层发送发送来的数据进行分析,然后将本层的数据进行封装发给下层
- 应用层–>数据
- 传输层–>TCP头+数据
- 网络层–>IP头+TCP头+数据
网络接口层–>根据MTU切分数据包 and 帧头+IP头+TCP头+数据+栈帧
下图是整个网络栈
TCP/IP的手法
接收网络包
- 网卡通过DMA获取网络数据,放到待接收队列
- 系统的硬中断程序通知系统接收网络数据,并且申请sk_buff,并且将数据放入到sk_buff中
- 通过系统的软中断开始处理网络数据
- 网络接口层校验包完整性,去掉帧头和帧尾,数据传递给网络层
- 网络层根据IP信息确定吓一跳是本机还是转发,如果是本机,数据传递给传输层
- 传输层解析TCP头,找到4元祖通过套接字发送给程序
发送网络包
和接收相反
- 程序通过系统内核调用套接字的sendMsg发送网络包
- 传输层封装TCP头信息,发送给IP层
- IP层根据IP找到吓一跳的地址封装IP头,传递给网络接口层
- 网络接口层根据MTU对包进行切分,添加帧头、帧尾等信息
- 拆分好的包进行物理寻址找到对应的MAC地址,之后将自己添加到待发送队列
- 系统的软中断通知系统有网络包待发送
- 之后网卡驱动会通过DMA,将待发送队列的数据通过网卡发送出去
如图:
查看网络情况的基础指标和工具
查看网卡信息
ifconfig or ip
1 | $ ifconfig eth0 |
- 网络接口的状态标志。ifconfig 输出中的 RUNNING ,或 ip 输出中的 LOWER_UP ,都表示物理网络是连通的,即网卡已经连接到了交换机或者路由器中。如果你看不到它们,通常表示网线被拔掉了。
- MTU 的大小。MTU 默认大小是 1500,根据网络架构的不同(比如是否使用了 VXLAN 等叠加网络),你可能需要调大或者调小 MTU 的数值。
- 网络接口的 IP 地址、子网以及 MAC 地址。这些都是保障网络功能正常工作所必需的,你需要确保配置正确。
- 网络收发的字节数、包数、错误数以及丢包情况,特别是 TX 和 RX 部分的 errors、dropped、overruns、carrier 以及 collisions 等指标不为 0 时,通常表示出现了网络 I/O 问题。其中:
- errors 表示发生错误的数据包数,比如校验错误、帧同步错误等;
- dropped 表示丢弃的数据包数,即数据包已经收到了 Ring Buffer,但因为内存不足等原因丢包;
- overruns 表示超限数据包数,即网络 I/O 速度过快,导致 Ring Buffer 中的数据包来不及处理(队列满)而导致的丢包;
- carrier 表示发生 carrirer 错误的数据包数,比如双工模式不匹配、物理电缆出现问题等;
- collisions 表示碰撞数据包数。
查看套接字信息
netstat or ss
1 |
|
- 当套接字处于连接状态(Established)时,
- Recv-Q 表示套接字缓冲还没有被应用程序取走的字节数(即接收队列长度)。
- Send-Q 表示还没有被远端主机确认的字节数(即发送队列长度)。
- 当套接字处于监听状态(Listening)时,
- Recv-Q 表示全连接队列的长度。
- Send-Q 表示全连接队列的最大长度。
统计协议栈信息
1 |
|
查看网络的吞吐等指标
sar
1 | # 数字1表示每隔1秒输出一组数据 |
连通性和RTT
ping
1 |
|