学习自[小林coding]学习自小林coding仅用来学习。
网络模型
OSI网络模型:开放式系统互联通信参考模型
使得多种设备能通过网络相互通信,和为了解决各种不同设备在网络互联中的兼容性问题。
TCP/IP模型更为常见。
- 应用层:负责向用户提供一组应用程序,如HTTP\DNS\FTP
- 传输层:负责端到端的通信,如TCP\UDP
- 网络层:负责网络包的封装、分片、路由、转发,如IP\ICMP
- 网络接口层:负责网络包在物理网络中的传输,如网络包的封帧、MAC寻址、差错检测、网卡传输网络帧
Linux网络协议栈
应用数据在每一层的封装格式:
Linux网络协议栈
- 应用层需要通过系统调用来跟Socket层进行数据交互;
- Socket层的下面分别是传输层、网络层、网络接口层
- 随后是网卡驱动程序和硬件网卡设备
Linux接收网络包
1. 网卡:通过DMA 技术,将网络包写入指定的内存地址(Ring Buffer)
2.向CPU发起硬件中断:Linux系统中引入了NAPI机制,它是混合「中断和轮询」的方式来接收网络包,它的核心概念就是不采用中断的方式读取数据,而是首先采用中断唤醒数据接收的服务程序,然后 poll 的方法来轮询数据。
3.发起软中断:
内核中的 ksoftirqd 线程专门负责软中断的处理,当 ksoftirqd 内核线程收到软中断后,就会来轮询处理数据。
ksoftirqd 线程会从 Ring Buffer 中获取一个数据帧,用 sk_buff 表示,从而可以作为一个网络包交给网络协议栈进行逐层处理。
4.进入网络协议栈:网络接口层--网络层--传输层--应用层