前几天了解到流量的实现实际上还是通过通用的协议栈进行解析,将数据包发送接收后,计算机进行了按规定的解析。如Tcp/ip协议栈,就是在将数据头一步步的解开,最后解析到数据再发送到应用层。其原理实际上和pe文件解析类似。
前几天虽然了解了原理,也使用了原始套接字进行了数据的接收和拦截,但是,并没有对数据包进行解析,只是使用了监听数据包。
在定义了结构体后,确实把数据的内容按正确的格式输出出来了,但是还有一点感觉不踏实。
工作在网络层或数据链路。当网卡处于混杂模式下,可以接收所有经过网卡的数据,包括广播的数据包和发向自己的数据包。
工作在网络层上的raw socket不使用udp和tcp协议,所以系统接收到tcp和udp协议的数据包不会发送到工作在网络层上的raw socket。
工作在网络层上的raw socket经常使用ICMP等协议,所以如果系统受到ICMP和EGP等使用IP数据包承载数据又在传输层之下的协议类型的数据包,系统会将这些包复制一份发送给对应协议类型的raw socket 进行处理(即没有使用bind和connect绑定解析则会用raw socket协议解析所有包)
如果工作在网络层上的raw socket使用bind 绑定了,那系统只将受到目的地址位bind所绑定地址的ICMP等传输层之下的协议的数据包发送给raw socket处理
如果工作在网络层上的raw socket使用connect函数远程连接到其他机器地址,那么系统只将该地址和协议为ICMP等传输层之下的协议的数据包发送给raw socket处理
对于不能识别协议类型的数据包,系统会进行必要的校验,然后检查有没有匹配协议类型的raw socket,如果有的话,就复制一份给raw socket,如果没有就丢弃,并返回一个主机不可达的ICMP给源主机
int mSocket = socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);//网络层使用的原始套接字
int mSocket2 = socket(PF_PACKET,SOCK_RAW,htons(ETH_P_IP));//链路层
原文:https://www.cnblogs.com/cc10100100010/p/14904960.html