Lua Nginx 模块中的 TCP socket 是什么?

在 Lua Nginx 模块文档中关于 ngx.socket.tcp() (链接) 中,它说道:

创建并返回一个 TCP 或流式 Unix 域套接字对象(也称为“cosock”对象)

这个 TCP socket 可以用于连接到远程主机,但在 Unix domain socket 的维基百科中 (链接):

Unix domain socket 或 IPC socket(进程间通信套接字)是一种在 同一台主机操作系统 上执行的进程之间交换数据的数据通信端点

这引发了一些问题:

  1. 这个 TCP socket 是 Unix domain socket 的另一种类型吗?这个 TCP socket 到底是什么?
  2. 文档中提到的 cosocket 是什么?我在谷歌上找不到它
  3. TCP 协议也被用于 TCP/IP 模型的传输层,这个 API 允许直接在传输层编程,绕过应用层吗?
点赞
用户2060502
用户2060502

问题一

这个 TCP socket 是另一种 Unix 域 socket 吗?这个 TCP socket 到底是什么?

TCP 和 Unix 域 socket 都是流 socket。你可以使用 ngx.socket.tcp() API 创建这两种 socket 类型。操作系统 socket 的类型由 connect 方法定义,有两种不同的语法:

  • 如果使用 tcpsock:connect(host, port, options_table?) 语法连接,则 socket 将是 TCP socket。
  • 如果使用 tcpsock:connect("unix:/path/to/unix-domain.socket", options_table?) 语法连接,则 socket 将是 Unix 域 socket。但是你不能用 Unix 域 socket 进行网络通信。

问题二

文档中提到的 cosocket 是什么?我在 Google 上找不到。

Cosocket 是 OpenResty 生态系统的术语。如果使用 ngx.socket.tcp() API 创建一个对象,那么你就创建了一个 cosocket 对象。

问题三

TCP 协议也用于 TCP/IP 模型的传输层,这个 API 是否允许直接编程传输层,绕过应用层?

完全正确。

2018-08-13 14:09:11