【问题标题】:Creating a basic protocol stack创建基本协议栈
【发布时间】:2013-07-10 11:16:48
【问题描述】:

我想编写一个应用层协议,它使用 TCP 在发送 GET 请求时返回特定的 ASCII 文本。我阅读了第一个HTTP specificationthe SMTP specification,但仍然不清楚如何编写连接两台计算机本身的协议。我怎么能用C写这个?有什么教程或例子可以看吗?

【问题讨论】:

  • "如何使用 C 对 HTTP 0.9 进行逆向工程?" - 我不太确定这个问题是什么意思。 HTTP 规范是对必须通过网络传输才能完成某事的数据的描述。你不需要“逆向工程”一个规范,你只是让你的程序符合规范概述的规则。
  • 我想做一个协议,可以向另一台计算机请求数据,计算机可以返回ASCII文本。
  • 那么你应该从指定协议开始。单个“消息”是什么样的?它可以包含哪些数据,如何判断它是否有效?是否有几种“类型”的消息?他们必须按照特定的顺序吗? (例如 SMTP 或 SSL 中的身份验证/设置握手。)
  • 如果所有这些听起来都含糊不清,那是因为这伴随着你可以任意灵活地做某事。没有一个简明的指南告诉你“如何从头开始发明一个协议”,有很多问题需要考虑,这就是为什么只使用一堆人已经敲定的现有协议几乎总是更好的原因。跨度>
  • @millimoose 我应该如何重组我的问题以及我应该包括哪些具体内容?

标签: c http protocols network-protocols


【解决方案1】:

任何通信协议的核心是接口控制文档(ICD),它将描述允许的消息结构,例如标头的大小、数据、crc 字段等。它来自您创建的此文档C 结构。通常人们使用位域来适当地封装消息域。当您使用现有的通信方法时,例如以太网,您可以使用 TCP 或 UDP 套接字来发送和接收数据。您可以在其中编码您的消息。如果您想开发一种新的通信协议,那么您必须创建自己的逻辑并将其嵌入到现有媒体中并继续。

【讨论】:

    【解决方案2】:

    实际上,最好使用现有的 TCP 堆栈(例如 tcp(7) socket 实现,至少在 Linux 上),然后使用上面的一些 HTTP 服务器库,例如libonion。重新设计 TCP 堆栈和 HTTP 服务器层需要一年多的时间。

    【讨论】:

      【解决方案3】:

      你问了两个问题。您的第一个问题是“我如何创建一个新的通信协议”,您的第二个问题是“我如何在 C 中实现它”。

      根据本论坛的章程,这些问题都太笼统了,不能成为好问题。

      正如millimoose 已经指出的那样,“如何创建新的通信协议”的答案很简单:协议是指定实体如何通信的一组规则的文档。确定对话应该是什么样子,从“你好”或等价词开始,指定每个可能的请求和每个可能的响应,以及每个可能的错误响应,直到如何说再见(以及如何处理被丢弃的连接)说再见),然后写下来。事实上,SMTP protocol 实际上就是一个很好的例子。 (基于 TCP 的 Internet 协议通常还会指定一个默认 TCP 端口来操作该协议。)

      既然你有一个完全指定的协议,那么“我如何在 C 中实现这个”的答案与“我如何在 Java 中实现这个”、“我如何在 REBOL 中实现这个”的答案相同”,或“我如何在 TCL 中实现这一点”:编写一个基本的服务器应用程序,它讲协议的服务器部分和一个基本的客户端应用程序,讲协议的客户端部分。

      (当然,你可能实际上一直想问“不管具体协议如何,我如何用 C 编写一个服务器和客户端相互通信?”。这也是一个过于笼统的问题,它可以通过在谷歌上明智的搜索来回答。)

      【讨论】:

      • 如果这个答案对你有用,请考虑accepting it
      • 我应该在我的协议中使用this for my serverthis for my client 吗?
      • 这些也许是合理的起点,但它们是 (a) 古老的,并且 (b) 不是很健壮。我说它们很古老,因为它们使用 bzero() 和 bcopy() 函数,它们在很久以前就被弃用了(甚至没有在当前的 POSIX 文档中列出),应该被 memset() 和 memcpy 替换()/内存移动()。我说它们并不健壮,因为它们使用 atoi() 将命令行参数转换为数值,并且没有处理 atoi() 失败的情况(无论如何都是 Undefine Behavior.. .) 始终使用 strtol() 并处理错误。
      猜你喜欢
      • 1970-01-01
      • 2020-05-22
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 2011-03-19
      • 2023-03-18
      相关资源
      最近更新 更多