本人在windows下用raw socket来捕获包,结果发现整个局域网的包都能获得。
这个结果想不通,socket不是工作在网络层得吗,按理不是应该只收到源地址或目标地址是本机的IP包吗?
请教各位了:)

解决方案 »

  1.   

    原始套接口本来就没有什么标准规范,各操作系统想怎么做就怎么做,
    能捕获所有IP报文也不足为奇,我想windows也是把网卡设为混杂模式实现的吧。
    windows的raw socket做的怪怪的,SOCK_RAW 要想接收数据包,
    只能配IPPROTO_ICMP和IPPROTO_IP( 好像还有IPPROTO_RAW? ),
    用IPPROTO_TCP和IPPROTO_UDP根本收不到任何包,
    而 linux 我记得就可以使用 IPPROTO_UDP 收原始的UDP包。
    所以,还是操作系统实现的不同吧。
      

  2.   

    协议栈的实现,并不一定非要一条线向上解包传递数据,也可以有分支呀。
    比如windows把网卡设成混杂模式,收到以太包后,如果存在有原始套接口监听,
    则分成两个拷贝去处理,一份拷贝 过滤目的MAC->链路层->网络层->传输层,
    另一份拷贝直接拆分链路层,滤出IP包,再传递给原始套接口。
    当然windows实际可能不是这样实现的。我的理解就这么多了,如果有高手知道详情,还请补充。