最近在做一个网络开源项目,目前要实现的功能是抓取客户端发出的HTTP GET包,解析出其中HTTP、TCP、IP层的大部分信息,根据这些信息构造HTTP返回包,使用户根据我构造的返回包做出反应,而不是根据源站发回的HTTP响应包。
使用C语言 RAW SOCKET 从二层开始逐层构造数据包,源、目的MAC、IP、TCP均为从GET包中提取出并交换位置的,HTTP响应包构造的是302重定向。测试后在用户端抓包,抓到了我构造并发出的数据包,数据包信息没有错,但是wireshark显示我的包还是TCP包,而不是HTTP,同时客户端也没有根据我的HTTP响应包做出反应,而是等之后到达的源站的HTTP响应包到达后才做出原有的响应。
请问是我在这个过程中哪个地方没注意到吗?
我构造的包的源IP、MAC、TCP端口均为用户所请求的内容源,比如www.baidu.com的这些值,目的IP、MAC、TCP端口也为客户端请求时所使用的这些值,HTTP报文信息跟在TCP包之后,作为TCP包的PAYLOAD,带有PAYLOAD的数据包PSH 和 ACK位均置1,发送PAYLOAD之前先发送一个只置为ACK的TCP包,这些流程都是我看着常规的302重定向流程模拟的,但是客户端机器就是不认我发的包。。
有没有大神指点下,真的迷茫了。。
我觉得应该是你拼包的时候漏掉了分隔符。
最简单的http请求,莫过于:
GET / HTTP/1.1
Host: www.baidu.com
注意最后要加两个空行,才表示一个完整的http请求,第一个空行用来标识head和body之间的分隔,第二个空行表明body为空。
也可以加上其他head域,如:
Referer: http://segmentfault/
响应可以为:
HTTP/1.1 200 OK
Server: nginx/0.7.68
Date: Tue, 26 Feb 2013 02:34:44 GMT
Content-Type: text/html; charset=utf-8
Content-Length:35
Connection: keep-alive
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。