网卡通信原理详解
[toc]
# 引言
Hi,我是 sharkChili ,是个不断在硬核技术上作死的技术人,是 CSDN的博客专家 ,也是开源项目 Java Guide 的维护者之一,熟悉 Java 也会一点 Go ,偶尔也会在 C源码 边缘徘徊。写过很多有意思的技术博客,也还在研究并输出技术的路上,希望我的文章对你有帮助,非常欢迎你关注我的公众号: 写代码的SharkChili 。
因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注 “加群” 即可和笔者和笔者的朋友们进行深入交流。
# 网卡数据收发原理与网络通信发展
# 网卡基础工作原理
网卡(Network Interface Card, NIC)是计算机与网络物理连接的关键硬件设备,负责将计算机中的数字信号转换为可在网络介质(如网线、光纤)中传输的电信号或光信号。网卡工作在OSI模型的物理层和数据链路层,主要功能包括:
- 数据帧的封装与解封装
- MAC地址识别与过滤
- 物理信号的发送与接收
- CRC校验与错误检测
# 集线器时代与网卡数据收发
发展初期的网络通信是通过集线器(Hub)的方式进行的,所有计算机通过集线器构成一个星形结构,彼此进行通信。因为集线器是无状态的物理层设备,所以当计算机需要发送数据给目标主机时,会以类似广播的形式发布消息到网线上,各个主机比对网络数据帧的MAC地址确认是否是自己的,如果是则直接接收并处理,反之直接丢弃。也正是因为这种通信机制,使得集线器时代的网络数据包容易被窃听:

# CSMA/CD机制与冲突检测
由于集线器采用共享介质的通信方式,在同一冲突域内同一时间只能有一个设备发送数据,否则会发生数据冲突。为了解决这一问题,引入了CSMA/CD(Carrier Sense Multiple Access with Collision Detection)策略,其核心原则包括:
- 载波监听(Carrier Sense):发送数据前先监听线路是否空闲
- 冲突检测(Collision Detection):发送过程中持续检测是否发生冲突
- 随机退避(Random Backoff):检测到冲突后随机等待一段时间再重试
即在同一时间内,多台计算机在Hub网络上发送数据时,如果在网络数据帧完全发送完成前检测到冲突信号,则立即停止发送并随机等待一段时间后重新尝试:

这种设计方案必须保证主机在发送最后一个字节的数据时能够感知到冲突,从而执行随机退避后重发数据帧。按照10Mbps以太网标准,相关参数如下:
- 网络支持的最大传输距离为2500m
- 信号在线路上的传播时延约为25.6微秒(往返时间51.2微秒)
- 网络传输速率为10Mbps
综上所述,为了确保发送方能在发送完数据前检测到可能发生的冲突,数据帧的传输时间必须大于等于信号传播时延。以太网将这一时间设定为51.2微秒(称为时隙时间),对应的最小数据帧长度计算如下:
- 传输时间 = 数据长度 / 传输速率
- 51.2微秒 = 数据长度 / 10Mbps
- 数据长度 = 51.2微秒 × 10Mbps = 512bit = 64字节
同时考虑到数据帧包含8字节的前导码和帧开始定界符,以太网规定最小数据帧总长度为64字节(不包括前导码),这样才能确保冲突检测机制正常工作。
# 网卡数据收发过程与潜在安全问题
以太网数据帧的结构组成如下:
- 前导码和帧开始定界符(8字节):用于同步发送方和接收方的时钟
- 目标MAC地址(6字节):接收方网卡的物理地址
- 源MAC地址(6字节):发送方网卡的物理地址
- 类型/长度字段(2字节):标识上层协议类型或数据字段长度
- 数据字段(46-1500字节):上层协议数据单元
- 帧校验序列FCS(4字节):用于检测传输错误的CRC校验值

因为网络层使用IP地址进行通信,而数据链路层(集线器)只能通过MAC地址识别设备,所以当源主机不知道目标主机MAC地址时,就会通过ARP协议广播寻找目标主机。ARP请求的执行步骤为:
- 设置好自己的源IP地址和源MAC地址
- 目标IP地址设置为要查询的IP地址
- 目标MAC地址设置为全F(广播地址)
这就是ARP广播请求,所有主机收到广播包后,如果发现请求的IP地址是自己的,则回复一个ARP响应包,源主机就可以基于此响应建立IP地址和MAC地址的映射关系并将其缓存。然而,此时就可能出现ARP欺骗的安全问题,即某些主机开启混杂模式,收到ARP请求后假冒目标主机发送虚假的ARP响应,从而与源主机建立通信并窃取消息:

# 交换机的诞生与网卡技术发展
为了解决集线器的广播风暴和安全问题,交换机应运而生。交换机是数据链路层设备,内部维护MAC地址与端口的映射表,通过不断学习和更新ARP解析结果来维护这个映射表。当收到网络数据帧时,交换机只需基于映射表将数据帧转发到指定端口,从而实现点对点通信。
在交换机的基础上引入了全双工通信设计理念,使得数据收发可以同时进行而不冲突。由于交换机为每个端口提供了独立的带宽,并且支持全双工通信,CSMA/CD机制终于退出了历史舞台。网络传输速度也从原来的10Mbps提升到100Mbps、1000Mbps,甚至更高。
现代网卡还支持多种硬件加速功能,如:
- TCP分段卸载(TSO):将TCP分段工作交给网卡硬件处理
- 接收端缩放(RSS):多CPU环境下优化数据包分发
- 大段卸载(LSO):支持发送更大的数据段
- VLAN支持:硬件级虚拟局域网处理
# 小结
通过本文我们了解了网卡数据收发的基本原理,以及计算机网络通信从集线器到交换机的发展历程。我们学习了集线器时代的广播通信机制及其缺陷,掌握了CSMA/CD冲突检测机制的工作原理,理解了ARP地址解析协议及其潜在的安全风险。最终,我们看到了交换机如何通过MAC地址表和全双工通信解决了这些问题,并了解了现代网卡的硬件加速功能。希望这些内容对你理解网络通信原理有所帮助。
Hi,我是 sharkChili ,是个不断在硬核技术上作死的技术人,是 CSDN的博客专家 ,也是开源项目 Java Guide 的维护者之一,熟悉 Java 也会一点 Go ,偶尔也会在 C源码 边缘徘徊。写过很多有意思的技术博客,也还在研究并输出技术的路上,希望我的文章对你有帮助,非常欢迎你关注我的公众号: 写代码的SharkChili 。
因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注 “加群” 即可和笔者和笔者的朋友们进行深入交流。
# 参考
《趣话计算机底层技术》