首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >原始套接字linux

原始套接字linux
EN

Stack Overflow用户
提问于 2013-11-07 09:50:52
回答 3查看 1.2K关注 0票数 0

也许这个问题有点蠢,但我会问的。我读了很多关于网络中原始套接字的文章,看过几个例子。因此,基本上使用原始套接字,就可以构建自己的头堆栈,比如堆栈= IP + TCP/UDP + OWN_HEADER。我的问题是,是否有可能从linux内核中获得前两种(IP+ TCP/UDP)的现成框架,然后将自己的头附加到它们身上?所讨论的操作系统是linux,语言是C。

我找不到任何函数可以做这样的事情,但可能是我在一个错误的方向挖掘。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-07 09:55:21

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

如果您想做相反的事情(即封装在您自己的头中的UDP/TCP ),您必须在linux内核中设计/实现您自己的协议,这非常复杂。

票数 3
EN

Stack Overflow用户

发布于 2013-11-07 09:56:12

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

您可以坐在TCP/UDP之上,在这种情况下,IP堆栈负责处理报头和协议的操作(例如,在TCP中,如何将数据分割成段),

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

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

票数 2
EN

Stack Overflow用户

发布于 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回显请求实现)。这很容易做,也很容易测试,这会迫使你的手有点脏。

如果你问我的话,手册页很好地涵盖了整个主题。从插座开始。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19832696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档