- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好吧,我意识到这种情况有点不寻常,但我需要仅使用原始套接字(在 C 中,在 Linux 中)建立 TCP 连接(3 次握手)——即我需要构造 IP header 和我自己的 TCP header 。我正在编写一个服务器(所以我必须首先响应传入的 SYN 数据包),并且出于某种原因我似乎无法正确处理它。是的,我意识到 SOCK_STREAM 会为我处理这个问题,但由于我不想讨论的原因,这不是一个选择。
我在网上找到的有关使用原始套接字的教程都描述了如何构建 SYN 泛洪器,但这比实际建立 TCP 连接要容易一些,因为您不必根据原始数据包构建响应。我已经让 SYN 泛洪示例正常工作,并且可以从原始套接字很好地读取传入的 SYN 数据包,但在为来自客户端的传入 SYN 创建有效的 SYN/ACK 响应时仍然遇到问题。
那么,有谁知道关于使用原始套接字的好教程,而不仅仅是创建 SYN 泛滥器,或者有人有一些可以做到这一点的代码(使用 SOCK_RAW,而不是 SOCK_STREAM)吗?我将非常感激。
<小时/>MarkR 是绝对正确的——问题是内核正在发送重置数据包以响应初始数据包,因为它认为端口已关闭。内核比我更快地做出响应,然后连接就中断了。我已经在使用 tcpdump 来监视连接了——我应该更加敏锐地观察并注意到有两个回复,其中一个是导致事情搞砸的重置,以及我的程序创建的响应。天啊!
似乎最有效的解决方案是使用 iptables 规则(如 MarkR 所建议)来阻止出站数据包。但是,有一种比建议的使用标记选项更简单的方法。我只是匹配是否设置了重置TCP标志。在正常连接过程中,这不太可能需要,并且如果我阻止来自正在使用的端口的所有出站重置数据包,这对我的应用程序来说并不重要。这有效地阻止了内核不需要的响应,但不能阻止我自己的数据包。如果我的程序正在监听的端口是 9999,那么 iptables 规则如下所示:
iptables -t filter -I OUTPUT -p tcp --sport 9999 --tcp-flags RST RST -j DROP
最佳答案
您想在用户空间中实现 TCP 堆栈的一部分...这没问题,其他一些应用程序也这样做。
您将遇到的一个问题是内核将对传入数据包发送(通常是负面的、无用的)答复。这会搞砸您尝试发起的任何通信。
避免这种情况的一种方法是使用内核没有自己的 IP 堆栈使用的 IP 地址和接口(interface) - 这很好,但您需要自己处理链路层内容(特别是 arp)。这需要一个低于 IPPROTO_IP、SOCK_RAW 的套接字 - 你需要一个数据包套接字(我认为)。
也可以使用 iptables 规则来阻止内核的响应 - 但我宁愿怀疑这些规则也会以某种方式应用于您自己的数据包,除非您能够设法以不同的方式对待它们(也许应用 netfilter ”标记”到您自己的数据包?)
阅读手册页
socket (7)ip(7)数据包(7)
解释了适用于套接字类型的各种选项和 ioctl。
当然,您需要像 Wireshark 这样的工具来检查正在发生的情况。您将需要多台机器来测试这一点,我建议使用 vmware(或类似的)来减少所需的硬件数量。
抱歉,我无法推荐具体的教程。
祝你好运。
关于linux - 与 SOCK_RAW 套接字的 TCP 握手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44667152/
我正在开发类似 netcat 的工具(主要用于自学)。我想发送带有我通过 SOCK_RAW 套接字构造的 IP 和 UDP header 的数据包。我在 Debian VM 上运行以下代码以通过套接字
我是套接字编程的新手,正在Linux机器(ubuntu)上尝试使用它 我无法理解选项“SOCK_RAW”,并且想要了解它。 “套接字”系统调用中“SOCK_RAW”选项的意义是什么? 最佳答案 原始模
我想做同样的事情,在开源应用程序中将 SOCK_DGRAM 转换为 SOCK_RAW。 在 sendto 函数中,当套接字为 SOCK_DGRAM 类型时,然后仅发送 RTP 像这样的数据 这里,m-
我的问题已被here粗略地讨论过。 而tl; dr解决方案是: iptables -A OUTPUT -p tcp --tcp-flags RST RST -j DROP 您可以修改此设置,以仅阻止您
我做了一个简单的 ping 程序,因为我创建了一个 buffer 并且只有我填充了 IP frame 和 icmp 结构,当我运行该程序时它工作正常。 我查看了 Wireshark 中的执行情况,以太
我正在开发一个开源软件,其中 SOCK_DGRAM 用于发送 RTP 数据包。 像这样: int sock = socket(af, SOCK_DGRAM, 0); 但我应该使用与 SOCK_RAW
我正在尝试实现一个 IPv6 UDP 客户端-服务器应用程序,它将让我获得逐跳扩展 header 的详细信息。因此,为此我想我必须使用 SOCK_RAW 来访问 IPv6 header 信息。 现在在
#include #include #include #include #include #include #include #include #include #include
如果我创建一个类型为 SOCK_RAW 的套接字仅发送一些数据而不接收任何数据,当内核继续接收网络数据包并将其数据报复制到某个缓冲区(应用程序?)时是否有任何问题。也就是说,somebuffer被填满
好吧,我意识到这种情况有点不寻常,但我需要仅使用原始套接字(在 C 中,在 Linux 中)建立 TCP 连接(3 次握手)——即我需要构造 IP header 和我自己的 TCP header 。我
所以我用 socket(AF_INET, SOCK_RAW, IPPROTO_UDP) 创建了一个套接字。然后我有一个无限循环的 recv() 。我知道它可以捕获所有数据报。但它会阻止数据报到达正确的
soc = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));在客户端,运行时,得到== -1错误 如果accept函数只能与UDP和TCP高层协议(prot
我最近一直在研究网络与 c 代码和密码学,在思考随机问题时,我偶然发现了一段用于数据包嗅探的代码,我对函数 中使用的实际套接字有疑问从()接收()。套接字通过以下 sock 函数 rawSock =
好吧,我意识到这种情况有点不寻常,但我需要仅使用原始套接字(在 C 中,在 linux 中)建立 TCP 连接(3 次握手)——即我需要构建 IP header 和我自己的 TCP header 。我
我在 Windows 上创建了一个 ping 实用程序。我正在使用带有 ICMP 协议(protocol)的原始套接字。我是我电脑的本地管理员。 由于代码很多,我不想在这里粘贴,但我找到了一个与我的非
我正在尝试发送数据包(不是 ip 数据包,而是 EAP 请求标识),但是 send() 函数返回 -1。 int sockfd = socket(AF_INET, SOCK_RAW, 0);
大家好,我有个问题,我似乎找不到关于在多播上发送原始数据包的文档,所有示例、解决方案和文档都以 UDP 用法为中心。 我以此为例:http://svn.python.org/projects/stac
在 C 中的 linux 上,设置接口(interface) PROMISC 并使用原始套接字后,我可以通过 read() 读取接口(interface)上的传入数据包。 然而,它并没有得到所有的数据
如果我使用以下参数和默认设置打印出在 RAW 套接字上发送的 IP header 的 header 字段值,我看到协议(protocol)号设置为“2”,属于 IGMP。 sock = socket
我正在尝试在 Linux (Ubuntu 18.04) 上的 C 中创建一个测试程序,该程序使用 SOCK_RAW 通过 AF_PACKET/PF_PACKET 套接字发送一个空的 UDP 数据包.在
我是一名优秀的程序员,十分优秀!