代码之家  ›  专栏  ›  技术社区  ›  John

APNs中的HPACK压缩是什么

  •  1
  • John  · 技术社区  · 7 年前

    谢谢你阅读我的问题。我阅读了大量关于HTTP/2的文档,并试图理解用Java构建APNs服务器端API的最重要概念。

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

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

    如果我理解正确,我需要使用哈夫曼编码进行头部压缩。如果我在这方面错了,请纠正我。

    :path值应编码为文本标头字段,不带 编制索引

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

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

    apns id、apns到期、, 和apns collapse id请求标头根据是否 是初始或后续后期操作的一部分,如下所示:

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

    后续发送这些标头时,请将其编码为文字标头 没有索引的字段

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

    再次感谢您阅读问题,请帮我解答!!

    1 回复  |  直到 4 年前
        1
  •  1
  •   sbordet    7 年前

    我认为您最好使用一个为您提供HTTP/2的Java库。

    码头 HttpClient (免责声明,我是维护者)正是这样做的,请参见 here .

    如果您想实现HPACK是因为您想玩得开心,那么您必须慢慢来,仔细阅读RFC 7541。 作为实现它的起点,您可以阅读HPACK的许多Java实现,从 Jetty's 去内蒂家、Undertow家等。

    您要问的所有问题(例如,“什么是‘无索引的文字标题字段’”)都在RFC的相应章节中进行了详细说明。

    很粗略地说,HPACK定义了一个将数字映射到字符串的映射表。 这两个对等方同步维护此表,以便这两个表始终包含相同的数据(静止时)。

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

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