使用原始套接字和WinPcap发送HTTP请求

时间:2010-11-20 00:35:12

标签: c http sockets winpcap

作为我项目的一部分,我正在尝试向Google发送包含HTTP请求的IP数据包。我正在使用Winpcap库和VC ++。目前,我已经完成了TCP三向握手数据包,但是在发送TCP ACK数据包之后,我仍然坚持发送实际的HTTP请求数据包。当我使用wireshark捕获数据包时,此数据包被标记为“重组PDU的TCP段”。协议列是'TCP'而不是'HTTP'。怎么了?我将如何以这种方式发送HTTP数据包?

4 个答案:

答案 0 :(得分:2)

你不一定做错了。

默认情况下,Wireshark将TCP数据交给更高级别的协议处理程序 - 在这种情况下,尝试重新组合整个HTTP请求和响应。它将重组的消息附加到序列中的 final 数据包,并使用“重新组装的PDU的TCP段”标记其他数据包:

alt text

您可以禁用此重组功能以检查各个数据包:

  • 编辑 - >偏好 - >协议 - > TCP
  • 取消选中“允许子网段重新组合TCP流”

答案 1 :(得分:1)

为什么使用WinPCap发送数据包?你应该使用普通的套接字。更好的是,使用为您实现HTTP协议的套接字库,例如curl,甚至是Microsoft自己的WinInet或WinHTTP API。

答案 2 :(得分:1)

如果您计划扩展此功能,我强烈建议您在尝试此操作之前先了解HTTP协议的基础。混乱做原始套接字并抛出获取请求;阅读一些源代码。

但是,我不会真正看到pcap的观点。如果您不想对实际套接字进行编码,则应该能够使用Wininet库:Wininet lib

但是,如果您想编写原始套接字,我会继续使用winsocks。有些人难以理解HTTP和TCP之间的区别; HTTP基于TCP,因此它们在技术上都是相同的,TCP用于数以千计的应用程序。您计算机上的大多数连接都是TCP。

如果您尝试使用pcap程序拦截连接作为MITM攻击来发送HTTP请求,我可能会在Pcap中学习一些编程。有很多教程,例如this one

PS:查看winsocks教程,因为初学者很难理解。此外,并非所有系统都支持winpcap,并且可能(在某些情况下)安装很麻烦。老实说,使用winsocks来做这件事会更好。 Wininet有更多的支持,我(不要抱我这个)相信所有的W2K +版本都有wininet,所以对于兼容性(我真的不认为对你来说是个问题)问题我会使用wininet或者是winsocks。

答案 3 :(得分:1)

可能您没有使用\r\n两次完成请求。

如果发送GET / HTTP/1.0\r\n字符串,则不会收到任何数据包。

您必须发送此字符串:GET / HTTP/1.0\r\n\r\n