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

发布于 2022-09-01 19:55:05 字数 581 浏览 20 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

野生奥特曼 2022-09-08 19:55:05

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

魂牵梦绕锁你心扉 2022-09-08 19:55:05

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文