也许这个问题有点蠢,但我会问的。我读了很多关于网络中原始套接字的文章,看过几个例子。因此,基本上使用原始套接字,就可以构建自己的头堆栈,比如堆栈= IP + TCP/UDP + OWN_HEADER。我的问题是,是否有可能从linux内核中获得前两种(IP+ TCP/UDP)的现成框架,然后将自己的头附加到它们身上?所讨论的操作系统是linux,语言是C。
我找不到任何函数可以做这样的事情,但可能是我在一个错误的方向挖掘。
发布于 2013-11-07 09:55:21
我将依赖于现有的协议(即,最大努力的UDP协议和可靠的TCP协议),并将自己的头封装在其中。实际上,这意味着在标准的UDP/TCP连接上嵌入您自己的协议。这样,您就可以使用现有的内核和用户级工具.
如果您想做相反的事情(即封装在您自己的头中的UDP/TCP ),您必须在linux内核中设计/实现您自己的协议,这非常复杂。
发布于 2013-11-07 09:56:12
不,这对原始套接字是不可能的。
您可以坐在TCP/UDP之上,在这种情况下,IP堆栈负责处理报头和协议的操作(例如,在TCP中,如何将数据分割成段),
因此,如果您想在TCP或UDP之上添加内容,这就是普通TCP或UDP套接字的用途。
或者你坐在IP上面,在这种情况下,你有责任在IP上制作你想要的任何东西--这就是原始套接字的用途。尽管在这种情况下,您也可以构造IP报头,也可以选择让IP堆栈生成IP报头。
发布于 2013-11-07 10:48:02
我想你不明白原始插座是干什么用的。使用原始套接字(s = socket (AF_INET,SOCK_RAW,IPPROTO_RAW)),您必须自己构建物理层之上的所有内容。
这意味着您构建了IP报头(当然,如果您希望在IP之上构建协议),您可以在这里使用AF_PACKET完成自己的工作。如果您想要TCP,您自己构建TCP报头,并将它添加到IP报头中。在大多数情况下,当您使用原始套接字时,您将开始构建自己的协议而不是TCP或UDP,否则为什么首先使用原始套接字?例如,如果您想构建自己的ICMP或SCTP实现,可以使用原始套接字。
如果您真的想了解这是如何工作的,我建议构建您自己版本的"ping“(换句话说,ICMP回显请求实现)。这很容易做,也很容易测试,这会迫使你的手有点脏。
如果你问我的话,手册页很好地涵盖了整个主题。从插座开始。
https://stackoverflow.com/questions/19832696
复制相似问题