如何在 python 中通过 udp (DTLS) 套接字实现 http/3 协议?

How can implement http/3 protocol throuh udp (DTLS) socket in python?

我读到 http/3 使用 UDP 而不是 TCP 发送请求,因此速度更快,而且我真的需要 http/3 的速度,所以我该怎么做才能实现它在 python?. 我根据对协议的理解写了这段代码:

这是一个超文本协议,你使用UDP而不是TCP,将数据包中的http/1.1改为http/3,发送。

我想我错了。

这是我写的代码:

import socket
from OpenSSL import SSL # for DTLS

connection = 'close' # or keep-alive

protocol = 'HTTP/3' # or HTTP/1.1

packet = f'GET / {protocol}\r\nHost: i.instagram.com\r\nConnection: {connection}\r\n\r\n'

def callback(conn, cert, errnum, depth, ok): cert.get_subject(); return ok

# Initialize context
ctx = SSL.Context(SSL.TLSv1_2_METHOD)
ctx.set_verify(SSL.VERIFY_PEER, callback) # Demand a certificate

# Set up client
client = SSL.Connection(ctx, socket.socket(socket.AF_INET, socket.SOCK_DGRAM))
addr = ('i.instagram.com', 443) #using DTLS
client.connect(addr)


buffer = packet.encode()
client.sendall(buffer) # it stuck here
print(sock.recv(4096))

肯定可以在 Python 中实现 HTTP/3。已经完成:查看 aioquic.

此外,请查看最新的一组 QUIC and HTTP/3 Internet 草稿。您天真的实现基于错误的假设。

更简单的方法可能是使用支持 HTTP/3 的 Python ASGI 网络服务器。

我创建了一个示例项目here using the hypercorn ASGI 网络服务器。

服务器可以通过两种方式请求 HTTP/3;

  • 与 alpn
  • 通过 alt-svc header.

hypercorn 服务器使用 header 方法。

我正在使用 Ubuntu 20.04 LTS,我能找到的唯一支持 HTTP/3 使用 alt-svc header 的浏览器是 2020-12-05 FireFox 每晚构建。