目录
一、TCP/IP 模型与 ISO模型
内核中使用的是TCP/IP 模型,把网络互联的框架分为应用层、传输层、网络层、网络接口层等四层。
- 应用层,负责向用户提供一组应用程序;
- 传输层,负责端到端的通信;
- 网络层,负责网络包的封装、寻址和路由;
- 网络接口层,负责网络包在物理网络中的传输。
二、内核中分层模型的结构
三、数据帧的封装
四、协议栈收发包流程
1、网络包接收流程
- 当一个网络帧到达网卡后,网卡会通过 DMA 方式,把这个网络包放到收包队列中;
- 通过硬中断,处理硬中断处理程序,(在处理硬中断时先关闭CPU中断,等处理完硬中断再开启CPU中断),一些耗时的处理交给软中断softirq处理。
- 网卡中断处理程序会为网络帧分配内核数据结构(sk_buff),并将其拷贝到 sk_buff 缓冲区中,再通过软中断,通知内核收到了新的数据帧
- 内核协议栈从缓冲区中取出网络帧,并通过网络协议栈,从下到上逐层处理这个网络帧。
- 网络层取出 IP 头,判断网络包下一步的走向,交给上层处理还是转发。当网络层确认这个包是要发送到本机后,就会取出上层协议的类型(比如 TCP 还是 UDP),去掉 IP 头,再交给传输层处理。
- 传输层取出 TCP 头或者 UDP 头后,根据 < 源 IP、源端口、目的 IP、目的端口 >,找出对应的 socket,并把数据拷贝到 scket 的接收缓存中。
- 应用层就可以使用 socket 接口,读取到新接收到的数据。
2、网络包发送流程
- 应用调用发送函数产系统调用
- 套接字层会把数据包放到 socket 发送缓冲区中
- 网络协议栈从 socket 发送缓冲区取出数据;再按照 TCP/IP 栈,从上到下逐层处理
- 传输层和网络层,分别为其增加 TCP 头和 IP 头,执行路由查找确认下一跳的 IP,并按照 MTU 大小进行分片
- 网络接口层,进行物理地址寻址,以找到下一跳的 MAC 地址。然后添加帧头和帧尾,放到发包队列中
- 软中断通知驱动程序,发包队列中有新的网络帧需要发送
- 通过 DMA ,从发包队列中读出网络帧,并通过物理网卡把它发送出去