【问题标题】:What is HPACK Compression in APNs什么是 APN 中的 HPACK 压缩
【发布时间】:2023-03-19 07:39:01
【问题描述】:

感谢您阅读我的问题。我阅读了许多有关 HTTP/2 的文档,并试图了解用 Java 构建 APNs 服务器端 API 的最重要概念。

  • 到目前为止,我有一个用于创建 Payload 和使用 APN 启动 ssl 握手的工作代码。
  • 我一直在想办法向 APN 发送推送通知,特别是向 Apple 服务器发送 HTTP/2 POST 请求。

APN 需要使用 HPACK(HTTP/2 的标头压缩),它 防止重复的标题键和值。 APNs 维护一个小的 HPACK 的动态表。帮助避免填满 APNs HPACK 表 并且需要丢弃表数据,在 以下方式——尤其是在发送大量流时:

如果我理解正确的话,我需要使用 Huffman Encoding 进行标头压缩。如果我在这方面有错误,请纠正我。

:path 值应该被编码为文字头字段,没有 索引

授权请求标头(如果存在)应编码为 没有索引的文字头字段

我为此阅读了 RFC 7541,但不知道他们在说什么。请注意,我试图通过这篇文章了解系统和要求以获取知识,而不仅仅是对具体问题的回答。

为 apns-id、apns-expiration 使用的适当编码, 和 apns-collapse-id 请求标头根据是否 是初始或后续 POST 操作的一部分,如下所示:

第一次发送这些标头时,使用增量对其进行编码 索引以允许将标题名称添加到动态表中

您随后发送这些标头,将它们编码为文字标头 没有索引的字段

当他们说“使用增量索引对它们进行编码以允许将标头名称添加到动态表中”和“随后发送这些标头时,将它们编码为不带索引的文字标头字段”是什么意思。我想理解带/不带索引的两个文字标头字段之一将有助于我更好地理解这一点。

再次感谢您阅读这个问题,请帮我解决这个问题!

【问题讨论】:

    标签: java apple-push-notifications http2


    【解决方案1】:

    我认为您最好使用为您执行 HTTP/2 的 Java 库。

    Jetty HttpClient(免责声明,我是维护者)正是这样做的,请参阅 here

    如果您想实现 HPACK 是因为您想玩得开心,那么您必须花时间仔细阅读 RFC 7541。 作为实现它的起点,您可以阅读 HPACK 的许多 Java 实现,从 Jetty's 到 Netty、Undertow 等。

    您所问的所有问题(例如“什么是'没有索引的文字头字段')都在 RFC 的各自部分中进行了详细说明。

    非常粗略地说,HPACK 定义了一个将数字映射到字符串的映射表。 两个对等点都保持此表同步,因此这两个表始终包含相同的数据(静态)。

    当一个对等体发送一个HPACK块时,它会发送数字,以便接收对等体可以使用这些数字访问HPACK表以获取字符串。

    对于新的/自定义标头(想想 cookie),发送端发送数字和字符串,以便接收端可以更新其 HPACK 表。第一次没有压缩,但第二次发送相同的标头时,发送端只发送数字,因为它知道另一个对端已经映射了字符串,这可以很好地压缩 HTTP 标头.

    【讨论】:

    • 非常感谢您抽出宝贵时间回答我的问题。 Java 9 怎么样?我看过一些博客说Jetty的ALPN已经嵌入Java 9,开发者可以用JDK 9发送HTTP/2请求。我目前正在看jdk.incubator.httpclient。再次感谢您的帮助:)
    • JDK 9 中的 HTTP/2 客户端是您可能想要尝试的另一个选项,尽管它的 API 可能会因为它仍在孵化中而发生变化。 Jetty 的 ALPN 没有嵌入的是 JDK 9; JDK 9 有一个 ALPN 实现,在机制上类似于 Jetty,但在 API 上有所不同。如果您使用 Jetty 的 HTTP/2 客户端或 JDK 9 HttpClient,则无需担心 ALPN,因为实现会处理它。
    • 非常感谢!!!我只是想学习如何为教育目的编写 ALPN。在解决这个问题之前,我似乎需要获得更多关于 ISO 7 层的知识。我不太擅长阅读和理解提供的文档,因为它们都需要先验知识。如果您可以的话,能否用您的话解释一下 ALPN(比文档更短的版本)?再次感谢您抽出时间帮助我:)
    猜你喜欢
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 2012-03-08
    相关资源
    最近更新 更多