构造HTTP响应包时TCP层的具体工作流程

最近在做一个网络开源项目,目前要实现的功能是抓取客户端发出的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重定向流程模拟的,但是客户端机器就是不认我发的包。。
有没有大神指点下,真的迷茫了。。

阅读 5.5k
2 个回答

TCP需要三次握手,然后连接的吧?客服端应该是从连接里读取数据的

我觉得应该是你拼包的时候漏掉了分隔符。
最简单的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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题