繁体   English   中英

原始套接字Linux

[英]Raw sockets linux

可能这个问题有点愚蠢,但我会问。 我阅读了很多有关网络中原始套接字的信息,并看到了一些示例。 因此,基本上,使用原始套接字可以构建自己的标头堆栈,例如stack = IP + TCP / UDP + OWN_HEADER。 我的问题是,是否有可能从Linux内核中获得某种形式的前两个(IP + TCP / UDP)就绪框架,然后仅将自己的标头附加到它们? 有问题的操作系统是linux,语言是C。

我找不到任何可以执行此操作的函数,但可能是我在错误的方向进行挖掘。

我将依靠现有协议(例如,UDP为最大努力而TCP为可靠)并将我自己的标头封装在其中。 实际上,这意味着在标准UDP / TCP连接上嵌入您自己的协议。 这样,您可以使用现有的内核和用户级工具。

如果您想采用其他方法(例如,将UDP / TCP封装在自己的标头中),则必须在Linux内核中设计/实现自己的协议,这非常复杂。

不,原始套接字是不可能的。

您可以坐在TCP / UDP的顶部,在这种情况下,IP堆栈负责报头和协议的操作(例如,在TCP的情况下,如何将数据切成段),

因此,如果您想在TCP或UDP之上添加内容,这就是常规TCP或UDP套接字的用途。

或者,您坐在IP之上,在这种情况下,您有责任在IP之上制作任何想要的东西-这就是原始套接字的用途。 尽管在这种情况下,您也可以构造IP标头,或者也可以选择让IP堆栈生成IP标头。

我认为您不了解RAW插槽的用途。 使用RAW套接字(s =套接字(AF_INET,SOCK_RAW,IPPROTO_RAW)),您必须自己构建物理层之上的所有内容。

这意味着您要构建IP标头(当然,如果您想在IP之上构建协议),则可以在此处使用AF_PACKET做自己的事情。 如果需要TCP,则可以自己构建TCP标头,然后将其添加到IP标头中。 在大多数情况下,使用RAW套接字时,您将在这里开始构建自己的协议来代替TCP或UDP,否则为什么要首先使用RAW套接字? 例如,如果您要构建自己的ICMP或SCTP实现,则可以使用RAW套接字。

如果您真的想了解这是如何工作的,我建议您构建自己的“ ping”版本(换句话说就是ICMP回显请求实现)。 它易于操作且易于测试,将迫使您弄脏手。

如果您问我,手册页很好地涵盖了整个主题。 从套接字开始。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM