收包流程
-
数据包到达网卡NIC
-
非混杂模式的NIC校验Mac地址
- 即目的Mac地址不是本机的数据包直接丢弃,不会处理
- 混杂模式一般适用于存在虚拟机时,虚拟机daemon会把物理网卡设置为混杂模式
- 抓包时也需要混杂模式
-
校验数据帧的校验字段FCS,丢弃校验失败的错误帧
-
NIC通过DMA方式将数据帧放入提前映射好的内存区域
-
NIC等待超时或者接受区满了后出发硬件中断指令
-
CPU执行硬件中断并运行网卡的驱动程序,对网卡进行轮询收包
-
把数据包送入协议栈
-
调用netfilter(iptables对应的内核程序)的PREROUTING链
-
查找路由表,进行转发或者进入本机
-
对进行本机的包调用netfilter的LOCAL_IN链
-
调用四层协议栈,例如tcp_v4_rcv
-
查找到对应的socket,运行TCP状态机
-
通过epoll或者其他轮询方式通知应用程序
-
应用程序读取数据</