首页 > 其他 > 详细

协议分析之原始套接字

时间:2021-06-19 23:10:12      阅读:17      评论:0      收藏:0      [点我收藏+]

sniffer 实现

稍稍回顾

前几天了解到流量的实现实际上还是通过通用的协议栈进行解析,将数据包发送接收后,计算机进行了按规定的解析。如Tcp/ip协议栈,就是在将数据头一步步的解开,最后解析到数据再发送到应用层。其原理实际上和pe文件解析类似。

前几天虽然了解了原理,也使用了原始套接字进行了数据的接收和拦截,但是,并没有对数据包进行解析,只是使用了监听数据包。

在定义了结构体后,确实把数据的内容按正确的格式输出出来了,但是还有一点感觉不踏实。

raw socket介绍及内核处理

raw socket

工作在网络层或数据链路。当网卡处于混杂模式下,可以接收所有经过网卡的数据,包括广播的数据包和发向自己的数据包。

内核接收后的处理

  • 工作在网络层上的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给源主机

raw socket创建和使用

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!