TCP/IP 服务器如何处理端口和 URI 方案?

TCP/IP 服务器如何处理端口和 URI 方案?

我正在嵌入式设备上使用 lwip tcp/ip 堆栈,并试图了解它的工作原理。我一直在查看文档和代码,但我对 tcp/ip 堆栈如何处理端口和 URI 方案感到困惑。

第一个让人困惑的是,它们似乎都定义了一个协议。这是否是多余的?

对于 lwip,要建立 tcp 连接,需要创建一个“协议控制块”(PCB)。它由本地 IP 地址和端口定义。这似乎很有道理 - 此 PCB 监听指定端口。那么 URI 方案如何发挥作用呢?此 PCB 是否接收任何 uri 方案?我也没有看到 URI 方案被传递给回调函数以接收数据包。

如果我想更改协议,例如将 HTTP 连接升级为 Websocket 连接,该如何操作?如果初始握手是通过 HTTP:端口 80 完成的,那么进一步的通信是如何通过 WS:端口 X 完成的?

作为示例,下面是在 lwip 中绑定 PCB 的函数签名(使用 C 代码):

tcp_bind(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)

这会将 PCB 绑定到 IP 地址和端口号。但是,未指定 URI 方案。因此,我假设 PCB 与 URI 方案无关。如果我们查看用于接收数据包的回调原型:

err_t (* accept)(void *arg, struct tcp_pcb *newpcb, err_t err)

同样,URI 方案没有出现。我还有一个使用 lwip 实现 HTTP 服务器的源代码。URI 方案没有出现。那么 IP 堆栈如何处理不同的 URI 方案呢?我找不到它作为参数传递到处理 IP 流量的回调中的位置。我想我一定是错过了一些基本的东西。

任何帮助都将不胜感激!

答案1

TCP 是一种通用流协议,用于在 IP 网络(例如互联网)中的两个端点之间按序可靠地传输数据。

HTTP 是在 TCP 上运行的协议。其他使用 TCP 的协议包括 FTP、SSH、SSL 等。

您描述的功能通常用于处理 TCP 连接。

你应该读http://www.w3.org/Protocols/rfc2616/rfc2616.html学习HTTP协议。

简要概述如何发出 HTTP 请求。此示例基于 HTTP 1.0,因为它更简单。

当你告诉浏览器连接到http://superuser.com,后台发生的情况如下:

  1. 浏览器通过 DNS 查找来superuser.com找出服务的 IP 地址。
  2. 浏览器打开与服务器的 TCP 连接以superuser.com
  3. GET /浏览器向服务器发送HTTP 请求。
  4. 服务器发回该/位置对应的文件。

所以,服务器在这里不需要知道任何有关 URI 方案的信息。服务器只需要了解 HTTP 协议原语(GET、POST、HEAD 等),并通过 TCP 套接字将相应的资源返回给客户端。

相关内容