12.3 XP SP2对raw socket所做的改动 https://scz.617.cn/windows/200609051043.txt Q: 在XP SP2上raw socket发包,得到10004号错误: A blocking operation was interrupted by a call to WSACancelBlockingCall. A: microsoft XP SP2仍支持raw socket的接收,但raw socket的发送被限制了: 1) 不能通过raw socket发送TCP报文 2) 不能通过raw socket发送伪造源IP的UDP报文。被发送UDP报文的源IP必须是本机某个 网络接口上配置的IP,否则这个UDP报文被默默丢弃。 D: 据他人说法,关闭XP SP2自带PFW,同时关闭相关服务即可解决该问题。 Internet Connection Firewall (ICF) / Internet Connection Sharing (ICS) sc stop SharedAccess 或 net stop SharedAccess XP SP2上的raw socket我没试过。不过即使在XP SP1上,如果自带PFW开着的话,raw socket发包也是有影响的,所以测试raw socket时,都先去网络属性里关闭自带PFW。 D: Robin Keir 2005-04-12 XP SP2推出时明确指出"不能通过raw socket发送TCP报文"。2005-04-12之前很容易 绕过这个限制,"net stop SharedAccess"即可。但是,安装MS05-019/KB893066之后, 这个绕过方案不再有效。 当时maillist上语带嘲讽地提到,安装过MS05-019/KB893066的2003"意外地"也不能 通过raw socket发送TCP报文,后来MS被告知这个"BUG",随即在2003 RC2中修正。 下面是一些总结: 2000的raw socket依然是全功能的。 尽管可以通过raw socket发送TCP报文,XP SP0也应该"net stop SharedAccess"。有 个Application Layer Gateway Service/ALG服务,与PFW联系紧密,用raw socket向 21、389、1002、1720/TCP发包时,可能会受ALG服务的干挠。停止SharedAccess服务 时会自动停止ALG服务。 未安装MS05-019/KB893066的XP SP1情形类似XP SP0。 安装过MS05-019/KB893066的XP SP1应该关闭PFW(在本地连接的属性里),但不要停止 SharedAccess服务,通过raw socket发送TCP报文时需要SharedAccess服务。ALG服务 可能会干挠发向某些端口的报文,由于SharedAccess服务依赖ALG服务,这次没法停 止ALG服务。XP SP1缺省没有打开PFW,SharedAccess服务也未启用。参看KB897656。 未安装MS05-019/KB893066的XP SP2应该"net stop SharedAccess"。但这不能解决并 发半开出连接数的限制,惟一已知解决方案是修理tcpip.sys。 安装过MS05-019/KB893066的XP SP2彻底禁止通过raw socket发送TCP报文,无论是否 启用SharedAccess服务。 2003情形类似XP SP0。但是这次ALG服务与SharedAccess服务不再有依赖关系,因此 可以"net stop ALG"。注意,这里说的2003,至少是2003 RC2及其后续版本,或者未 安装MS05-019/KB893066(MS有一个看似无意鬼知道是不是有意的BUG在这个Hotfix里) 的所有版本。 D: scz@nsfocus 2006-09-05 今天亲自在一台打满了最新补丁的英文版XP SP2上测试,证实前述关闭PFW的解决方 案不再有效。 此刻tcpip.sys版本号是5.1.2600.2892,ipnathlp.dll版本号是5.1.2600.2180。如 下三个补丁都修改了tcpip.sys: MS05-019/KB893066 MS06-007/KB913446 MS06-032/KB917953 如果试图卸载MS05-019/KB893066恢复通过raw socket发送TCP报文的能力,势必同时 卸载后续两个补丁,这不是一个好主意。 可以考虑动用NDIS Protocol Driver,比如: Raw Ethernet Packet Sending - miahrugger [2003-10-25] http://www.codeproject.com/cs/internet/sendrawpacket.asp http://www.codeproject.com/cs/internet/SendRawPacket/SendRawPacket.zip 也可以考虑剁了tcpip.sys、ipnathlp.dll(不推荐)。