网络 I/O(Input/Output)是指操作系统与网络接口之间的数据传输操作,包括从网络中接收数据和向网络中发送数据。本质上是通过协议栈的“socket接口”实现对远端主机的访问。


基本概念

性能指标

1、带宽

在单位时间内传输的数据量,​理论上的最大传输速率​,单位为bps(比特每秒)。

2、延时

数据传输所经历的时间,单位为ms(毫秒)。

3、吞吐量

网络在特定时间内传输的数据量,是实际达到的数据传输率,受带宽、延时、丢包率等因素的影响。

4、IOPS

I/O per second,即每秒钟可以处理的I/O个数。

TCP建立、关闭连接的相关状态

1、三次握手(建立连接)

(1)LISTENING

服务端监听tcp端口的连接请求。

(2)SYN-SENT

客户端发送请求连接,等待状态。

(3)SYN-RECV

服务端接收连接请求,发送确认状态。

(4)ESTABLISHED

该状态表示连接建立,正在传输数据。

2、四次挥手(关闭连接)

(1)FIN-WAIT1

主动发起关闭端(客户端)发出FIN请求时,进入的状态。

(2)FIN-WAIT2

主动发起关闭端(客户端)接收到ACK回复后,进入该状态(半关闭状态)。此时应用程序可以接收数据,无法发送数据。

(3)CLOSE-WAIT

被动关闭端(服务端)接收到FIN,回复ACK后进入的状态。

(4)LAST-ACK

被动关闭端(服务端)传输完所有数据后,发送FIN并进入的状态。

(5)TIME-WAIT(​2MSL状态​)

主动发起关闭端(客户端)接收到FIN,发送ACK后进入的状态。

(6)CLOSED

被动关闭端(服务端)接收ACK后,进入closed的状态。

注:

1、客户端SYN-SENT状态非常短暂,如果服务器出现大量该状态,排查一下是不是线路不好或存在扫描网段的病毒工具。

2、服务端SYN-RECV状态也非常短暂,存在大量该状态检查一下服务器是否被攻击。


常用分析工具

netstat

netstat命令用于显示网络连接、路由表、接口统计等信息。

# 显示tcp、udp的网络连接状态、进程
netsta -antup

ss

ss命令用于显示系统中socket的统计信息。与netstat类似,但更加详细且处理大量连接时​更高效​。

ss -tunpa

sar

sar命令用于收集、报告系统活动信息,包括CPU、内存、I/O、进程活动等。

# 统计网卡接口的网络流量
sar -n DEV 1 10

IFACE:网络接口的名称。
rxpck/s:每秒钟接收的数据包数量。
txpck/s:每秒钟发送的数据包数量。
rxkB/s:每秒钟接收的字节数(以KB为单位)。
txkB/s:每秒钟发送的字节数(以KB为单位)。
rxcmp/s:每秒钟接收的压缩数据包数量。
txcmp/s:每秒钟发送的压缩数据包数量。
rxmcst/s:每秒钟接收的多播(组播)数据包数量。
%ifutil:网络接口利用率百分比(忙碌程度)。

总结

关于网络I/O,开发人员更需要理解I/O模型、协议栈等,本文从运维的角度简述网络的几个重要指标、tcp连接状态以及服务器出现网络问题时如何定位分析。

网络I/O问题的排查思路

1、使用ifconfig/ip命令查看网卡接口是否产生了大量错误,排查是否存在硬件问题

2、确认网络设备中的流量类型,是否有进程处理该类型的流量?进一步找到该进程的套接字socket。(​软件问题​)

网络 I/O工具

ping:测试连通性
ifconfig/ip:配置和查看网络接口
netstat/ss:统计网络连接和端口
ifstat:监控网络流量
tcpdump:抓包分析
traceroute:追踪网络路径,
nmap:扫描网络
sar:收集系统活动信息
iperf/netperf:测试网络带宽
dtrace/strace:跟踪系统调用