什么是APN中的HPACK压缩

时间:2018-01-08 20:49:18

标签: java apple-push-notifications http2

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

  • 到目前为止,我有一个工作代码,用于创建Payload并启动与APN的ssl握手。
  • 我很难找到一种向APN发送推送通知的方法,特别是向Apple服务器发送HTTP / 2 POST请求。
  

APN需要使用HP​​ACK(HTTP / 2的头压缩)   防止重复的标题键和值。 APN维持小规模   HPACK的动态表。帮助避免填写APNs HPACK表   并且需要丢弃表数据,编码表中的标题   以下方式 - 特别是在发送大量流时:

如果我理解正确,我需要使用Huffman Encoding进行标头压缩。如果我错了,请纠正我。

  

:path值应编码为文字头字段而不用   索引

     

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

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

  

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

     

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

     

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

当他们说,"使用增量索引对它们进行编码以允许将标题名称添加到动态表格时,它们意味着什么?和"随后您发送这些标题,将它们编码为文字标题字段而不编制索引"然后。我想用两个带有/ out索引的文字头字段中的一个理解将有助于我更好地理解它。

再次感谢您阅读此问题,请帮助我!!

1 个答案:

答案 0 :(得分:0)

我认为你最好使用一个为你做HTTP / 2的Java库。

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

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

您要问的所有问题(例如“什么是没有索引的文字标题字段”)都在RFC的各自部分详细说明。

非常简单,HPACK定义了一个将数字映射到字符串的映射表。 两个对等体都保持该表同步,因此这两个表总是包含相同的数据(静止)。

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

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