amphp/quic

维护者

详细信息

github.com/amphp/quic

源代码

问题

资助包维护!
amphp

dev-master 2024-02-24 23:48 UTC

This package is auto-updated.

Last update: 2024-08-25 01:04:58 UTC


README

AMPHP 是一个针对 PHP 设计的事件驱动库集合,考虑到纤维和并发。 amphp/quic 是一个用于建立 quic 连接的库。它为客户端和服务器提供了套接字抽象。它抽象了 cloudflare/quiche 库的低级别。

MIT License

安装

此包可以作为 Composer 依赖项安装。

composer require amphp/quic

需求

amphp/quic 实现了 amphp/socket 的基本服务器和客户端接口。它需要已安装的 FFI 扩展。

TLS

由于 QUIC 需要 TLS,因此服务器端必须有一个有效的证书。另外,必须指定一个或多个应用层协议名称 (ALPN)。

注意:不支持指纹识别并将其忽略。要使用自签名证书,需要禁用对等验证或拥有适当的自定义根 CA。

连接到服务器

最简单的方式是提供目标和 ALPN 协议。

$quicConnection = \Amp\Quic\connect("example.com:1234", ["alpn protocol"]);

处理连接

每个 QUIC 连接都是多路复用流。 QuicConnection 允许创建和接受新的流。

使用 accept() 等待新的流 (QuicSocket),类似于 Amp\Socket\ServerSocket。使用 openStream() 创建新的流。还可以使用 sendDatagram()receiveDatagram() 在连接上发送和接收数据报。

QUIC 流实现了 Amp\Socket\Socket 以发送和接收数据。

通过 close() (或丢失所有对该对象的引用) 立即终止所有流。

服务器

amphp/quic 允许通过 UDP 监听传入的 QUIC 连接。与客户端类似,它需要一个 ALPN 协议。另外,还需要有效的 TLS 证书。

$tls = (new ServerTlsContext)
    ->withDefaultCertificate(new Certificate(__DIR__ . "/cert.pem", __DIR__ . "/key.pem"))
    ->withApplicationLayerProtocols(["test"]);

$quicServerSocket = \Amp\Quic\bind(["0.0.0.0:1234", "[::]:1234"], $tls);

注意:不支持基于 SNI 的证书区分。必须通过 ServerTlsContext::withDefaultCertificate() 提供一个证书。

接受连接

可以在 QuicServerSocket 上使用 accept(),但这将直接返回一个 QuicSocket。当连接没有特定意义且流是你感兴趣的一切时,推荐使用此模式。

要实际获取 QuicConnection,请使用 acceptConnection()

while ($quicConnection = $quicServerSocket->acceptConnection()) {
    async(function() use ($quicConnection) {
        // handle the connection, open and accept new streams, send and receive datagrams
    })
}

配置

虽然大多数 Amp\Socket\ConnectContextAmp\Socket\BindContext 的配置被理解和应用,但还有由 QuicConfig、相应的子类 QuicClientConfigQuicServerConfig 提供的特定于 QUIC 的配置,这些配置分别由 connect()bind() 函数接受。

请注意,QUIC 接口通常接受各种类型的通信,即单向流、双向流和数据报,同时还有空闲超时以实现及时连接超时,并且每隔一段时间发送一个 ping 以防止活动连接超时。特别是,QUIC 服务器可能希望调整这些设置。

安全性

如果您发现任何与安全相关的问题,请通过电子邮件 me@kelunik.com 反馈,而不是使用问题跟踪器。

许可证

MIT 许可证 (MIT)。有关更多信息,请参阅 LICENSE