Pfrex Asked: 2019-05-20 13:18:49 +0800 CST2019-05-20 13:18:49 +0800 CST 2019-05-20 13:18:49 +0800 CST 如何下降到较低的 osi 层? 772 有没有一种方法可以启动更高级别的连接,即 http 连接,然后在某个时候将其“降级”到较低层或 tcp?基本上,一旦与 http 建立连接,我希望能够只获取套接字并将其与我自己的自定义协议一起使用。 http ip 2 个回答 Voted user1686 2019-05-20T14:03:38+08:002019-05-20T14:03:38+08:00 有两种答案,一种针对一般情况,一种针对 HTTP。它还取决于您最初是如何创建 HTTP“连接”的。 大多数操作系统只提供到 TCP/UDP 层的抽象(套接字),上面的所有其他内容(即应用层协议)通常由应用程序处理——等等。因此,当您使用例如 SSH 客户端或 SMTP 客户端或 IRC 客户端时,应用程序始终可以“下拉”到原始 TCP 流,因为这是应用程序首先拥有的。该应用程序本身在操作系统提供的 TCP 连接之上构建所有内容。 如此广泛使用的 HTTP 在某种程度上是一个例外,并且通常具有共享库(例如 libcurl 或 python-requests)甚至操作系统提供的抽象(例如 WinHTTP)。 libcurl 等库作为应用程序的一部分,只是构建在操作系统提供的相同 TCP 套接字之上。其中一些确实允许访问底层套接字;其他人没有。在任何情况下,这些都是可选的——一些程序仍然无缘无故地喜欢使用 HTTP 客户端。 但 HTTP 例外的另一个原因是应用程序通常不会首先启动“HTTP 连接”。HTTP 是一种无状态协议;大多数 HTTP 客户端库使用请求/响应作为抽象,并且只按需打开 TCP 连接。多个请求可能共享底层 TCP 连接,也可能不共享。(协议可能是 HTTP/1.1,也可能是 HTTP/2。) 换句话说,当您请求连接时,通常根本就没有低层连接了。 也有例外。如今,许多浏览器和网站都使用websockets,它们以普通的 HTTP 请求开始,但随后切换到类似 TCP 的双工流连接。(然而,这不一定是原始 TCP——websockets 可能仍然使用 TLS,并且它们可能有自己的框架层。我认为 HTTP/2 上的 websockets 继承了它的框架。) Best Answer Steffen Ullrich 2019-05-20T20:48:43+08:002019-05-20T20:48:43+08:00 基本上,一旦与 http 建立连接,我希望能够获取套接字并将其与我自己的自定义协议一起使用 在这种情况下,您不会“降级”到较低的 OSI 层。相反,您定义自己的应用程序级协议,该协议首先包含类似于 HTTP 的内容,然后是您需要的任何内容。OSI 层只是思想上的抽象(即处理第 4 层 TCP 的字节而不是第 7 层的结构化消息)。 至于使用现有的 HTTP 库实现您自己的协议:这是否可能以及如何完成完全取决于 HTTP 库。有些为自己保留底层 TCP 套接字,有些可能允许开发人员直接处理它。有些允许开发人员将 HTTP 请求创建为字符串并从字符串中解析 HTTP 响应,并将 TCP 套接字的控制权完全交给开发人员。
有两种答案,一种针对一般情况,一种针对 HTTP。它还取决于您最初是如何创建 HTTP“连接”的。
大多数操作系统只提供到 TCP/UDP 层的抽象(套接字),上面的所有其他内容(即应用层协议)通常由应用程序处理——等等。因此,当您使用例如 SSH 客户端或 SMTP 客户端或 IRC 客户端时,应用程序始终可以“下拉”到原始 TCP 流,因为这是应用程序首先拥有的。该应用程序本身在操作系统提供的 TCP 连接之上构建所有内容。
如此广泛使用的 HTTP 在某种程度上是一个例外,并且通常具有共享库(例如 libcurl 或 python-requests)甚至操作系统提供的抽象(例如 WinHTTP)。
libcurl 等库作为应用程序的一部分,只是构建在操作系统提供的相同 TCP 套接字之上。其中一些确实允许访问底层套接字;其他人没有。在任何情况下,这些都是可选的——一些程序仍然无缘无故地喜欢使用 HTTP 客户端。
但 HTTP 例外的另一个原因是应用程序通常不会首先启动“HTTP 连接”。HTTP 是一种无状态协议;大多数 HTTP 客户端库使用请求/响应作为抽象,并且只按需打开 TCP 连接。多个请求可能共享底层 TCP 连接,也可能不共享。(协议可能是 HTTP/1.1,也可能是 HTTP/2。)
换句话说,当您请求连接时,通常根本就没有低层连接了。
也有例外。如今,许多浏览器和网站都使用websockets,它们以普通的 HTTP 请求开始,但随后切换到类似 TCP 的双工流连接。(然而,这不一定是原始 TCP——websockets 可能仍然使用 TLS,并且它们可能有自己的框架层。我认为 HTTP/2 上的 websockets 继承了它的框架。)
在这种情况下,您不会“降级”到较低的 OSI 层。相反,您定义自己的应用程序级协议,该协议首先包含类似于 HTTP 的内容,然后是您需要的任何内容。OSI 层只是思想上的抽象(即处理第 4 层 TCP 的字节而不是第 7 层的结构化消息)。
至于使用现有的 HTTP 库实现您自己的协议:这是否可能以及如何完成完全取决于 HTTP 库。有些为自己保留底层 TCP 套接字,有些可能允许开发人员直接处理它。有些允许开发人员将 HTTP 请求创建为字符串并从字符串中解析 HTTP 响应,并将 TCP 套接字的控制权完全交给开发人员。