原文地址 cloud.tencent.com
最近使用 tcpdump 的时候突然想到这个问题。因为我之前只存在一些一知半解的认识:比如直接镜像了网卡的包、在数据包进入内核前就获取了。但这些认识真的正确么?针对...
最近使用 tcpdump 的时候突然想到这个问题。因为我之前只存在一些一知半解的认识:比如直接镜像了网卡的包、在数据包进入内核前就获取了。但这些认识真的正确么?针对这个问题,我进行了一番学习探究。
先说结论:通过 PF_PACKET 这个特殊的套接字协议,直接接收来自链路层的帧。数据包并非没有进入内核,而是在进入内核后直接跳过了内核中三层 / 四层的协议栈,直达套接字接口,被应用层的 tcpdump 所使用。实际上,在网卡驱动程序通知内核接受到数据帧的时候,数据包就已经进入了内核处理流程。具体的区别,可以见下图。
内核网络协议栈示意图