【问题标题】:How can implement http/3 protocol throuh udp (DTLS) socket in python?如何在 python 中通过 udp (DTLS) 套接字实现 http/3 协议?
【发布时间】:2020-09-13 04:37:40
【问题描述】:

我读到 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))

【问题讨论】:

  • HTTP/3 使用QUIC,这是它自己的协议。您应该改用现有的实现,只需搜索“quic python”。
  • 您需要 Instagram 的速度吗?他们提供哪些时间关键数据?
  • 你基本上是想把一匹马涂成红色,然后称它为法拉利赛车。这不是 HTTP/3 与 HTTP/1 的工作方式。这是完全不同的事情,而且要复杂得多。仅使用 UDP 并不会神奇地加快事情的速度,实际上要获得性能,而不仅仅是从 TCP 切换到 UDP。

标签: python sockets ssl openssl http3


【解决方案1】:

当然可以在 Python 中实现 HTTP/3。已经完成了:查看aioquic

另外,请查看最新的QUICHTTP/3 互联网草稿集。您幼稚的实现是基于错误的假设。

【讨论】:

    【解决方案2】:

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

    我使用hypercorn ASGI Web 服务器创建了一个示例项目here

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

    • 使用 alpn
    • 通过alt-svc 标头。

    hypercorn 服务器使用 header 方法。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 2011-12-17
      • 2011-11-26
      相关资源
      最近更新 更多