如何编写自己的IP协议?(假设TCP和UDP不适用)

7
假设您已确定对于特定的细分市场,TCP或UDP均不理想,那么您将如何编写自己的基于IP的协议?
例如,如果您正在Linux上开发,您会在内核中的哪里查找以“挂钩”您的协议?
您会从哪里开始?

3
@Ignacio 我会学不到任何东西的,对吧?有时候你需要实验和尝试新的想法,即使只是为了发现它本来就是个非常糟糕的想法。我已经写了几个简单的基于TCP和UDP的协议,但我的当前挑战对它们都不是完美的选择。由于我以前没有直接在这个低级别上工作过,所以我想寻求一些建议 :) - PeterM
只是好奇,TCP或UDP如何不符合您的要求? - jdt141
还有其他已经建立的协议,比如SCTP。我敢打赌,一定有一个现有的协议适合你的需求。 - Keith
3个回答

9
你可以通过内核模块来实现这一点。我建议你先阅读 arp 协议的工作原理,因为它是一个比较简单的协议,因为用户空间不直接发送数据包。

创建新的网络协议的入口点是 dev_add_pack,arp 的代码可以在这里找到。

这正是我要找的内容。由于某种原因,我的 Fedora 系统上,net/ipv4 目录下只有 netfilter 子目录。我猜我应该在发布帖子之前从 kernel.org 检查了内核源代码 :) - PeterM

5

如果您的协议可以直接在IP之上实现,那么它也可以被包装在UDP数据包中进行实现 - 后者具有优势,可以通过现有的NAT设备和防火墙传输,并且不会丢弃您的自定义协议。


1
+1,尤其是对于实验来说,这比编写真正的基于IP的协议更容易:它可以在纯用户空间中完成。 - Joachim Sauer

2

学习UNIX套接字和网络知识。这不是“钩入”内核,而是打开套接字并通过它发送二进制数据。


@Matty 我想我可以使用原始套接字,但如果我想要协议的内置支持,我认为我需要更多的东西 :) - PeterM
@PeterM 内置支持?你不需要创建内核模块来支持协议。你只是按照预定格式交换位。你需要在一端有一个监听器(服务器),在另一端有一个理解你的协议的客户端。我会使用原始套接字。我不确定还有其他什么方式可以实现。 - Matty
@Matty 单个应用程序没有自己的 TCP 或 UDP 栈。例如,如果你 ping 一台机器,响应是由内核处理而不是实际运行的应用程序处理的。 - PeterM
@PeterM ICMP在OSI层上的操作与TCP/UDP不同,如果我没记错的话。看看像nginx这样的东西 - 当它运行时,它会打开一个监听套接字并等待连接。例如,没有任何东西被编译到内核中。 - Matty
@PeterM - 哦,不好意思,我误解了你。我以为你想构建一个应用层协议,而不是传输层协议。你的协议不能在应用层吗?有特定的原因吗? - Matty
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接