开发者社区> 问答> 正文

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

a123456678 2016-06-08 21:05:49 1099

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

分享到
取消 提交回答
全部回答(1)
  • a123456678
    2019-07-17 19:32:45

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

    0 0