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



我读到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}rnHost: i.instagram.comrnConnection: {connection}rnrn'
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))

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

我在这里创建了一个使用hypercorn ASGI web服务器的示例项目。

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

  • 与alpn
  • 通过CCD_ 1报头

hypercorn服务器使用头方法。

我使用的是Ubuntu 20.04 LTS,截至2020-12-05年,我能找到的唯一支持使用alt-svc标头的HTTP/3的浏览器是FireFox夜间版本。

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

另外,请看一下最新的QUIC和HTTP/3互联网草稿。你天真的实现是基于错误的假设。

最新更新