{"action":"created","comment":{"url":"https://api.github.com/repos/quicwg/base-drafts/pulls/comments/190685121","pull_request_review_id":123115593,"id":190685121,"diff_hunk":"@@ -52,46 +52,168 @@ code and issues list for this draft can be found at\n # Introduction\n \n The QUIC transport protocol was designed from the outset to support HTTP\n-semantics, and its design subsumes many of the features of HTTP/2.  QUIC's\n-stream multiplexing comes into some conflict with header compression.  A key\n-goal of the design of QUIC is to improve stream multiplexing relative to HTTP/2\n-by eliminating HoL (head of line) blocking, which can occur in HTTP/2.  HoL\n-blocking can happen because all HTTP/2 streams are multiplexed onto a single TCP\n-connection with its in-order semantics.  QUIC can maintain independence between\n-streams because it implements core transport functionality in a fully\n-stream-aware manner.  However, the HTTP/QUIC mapping is still subject to HoL\n-blocking if HPACK is used directly.  HPACK exploits multiplexing for greater\n-compression, shrinking the representation of headers that have appeared earlier\n-on the same connection.  In the context of QUIC, this imposes a vulnerability to\n-HoL blocking (see {{hol-example}}).\n+semantics, and its design subsumes many of the features of HTTP/2.  HTTP/2 used\n+HPACK ({{!RFC7541}}) for header compression, but QUIC's stream multiplexing\n+comes into some conflict with HPACK.  A key goal of the design of QUIC is to\n+improve stream multiplexing relative to HTTP/2 by reducing head-of-line\n+blocking.  If HPACK were used for HTTP/QUIC, it would induce head-of-line\n+blocking due to built-in assumptions of a total ordering across frames on all\n+streams.\n \n QUIC is described in {{?QUIC-TRANSPORT=I-D.ietf-quic-transport}}.  The HTTP/QUIC\n mapping is described in {{!QUIC-HTTP=I-D.ietf-quic-http}}. For a full\n description of HTTP/2, see {{?RFC7540}}. The description of HPACK is\n {{!RFC7541}}, with important terminology in Section 1.3.\n \n-QPACK modifies HPACK to allow correctness in the presence of out-of-order\n-delivery, with flexibility for implementations to balance between resilience\n-against HoL blocking and optimal compression ratio.  The design goals are to\n-closely approach the compression ratio of HPACK with substantially less\n-head-of-line blocking under the same loss conditions.\n+QPACK reuses core concepts from HPACK, but is redesigned to allow correctness in\n+the presence of out-of-order delivery, with flexibility for implementations to\n+balance between resilience against head-of-line blocking and optimal compression\n+ratio.  The design goals are to closely approach the compression ratio of HPACK\n+with substantially less head-of-line blocking under the same loss conditions.\n \n-QPACK is intended to be a relatively non-intrusive extension to HPACK; an\n-implementation should be easily shared within stacks supporting both HTTP/2 over\n-(TLS+)TCP and HTTP/QUIC.\n+# Header Tables\n \n-## Head-of-Line Blocking in HPACK {#hol-example}\n+Like HPACK, QPACK uses two tables for associating header fields to indexes.  The\n+static table (see {{table-static}}) is predefined and contains common header\n+fields (some of them with an empty value).  The dynamic table (see\n+{{table-dynamic}}) built up over the course of the connection and can be used by\n+the encoder to index header fields repeated in the encoded header lists.\n \n-HPACK enables several types of header representations, one of which also adds\n-the header to a dynamic table of header values.  These values are then available\n-for reuse in subsequent header blocks simply by referencing the entry number in\n-the table.\n+Unlike in HPACK, entries in the QPACK static and dynamic tables are addressed\n+separately.  The following sections describe how entries in each table is\n+addressed.\n \n-If the packet containing a header is lost, that stream cannot complete header\n-processing until the packet is retransmitted.  This is unavoidable. However,\n-other streams which rely on the state created by that packet *also* cannot make\n-progress. This is the problem which QUIC solves in general, but which is\n-reintroduced by HPACK when the loss includes a HEADERS frame.\n+## Static Table {#table-static}\n+\n+The static table consists of a predefined static list of header fields, each of\n+which has a fixed index over time.  Its entries are defined in Appendix A of\n+{{!RFC7541}}. Note that because HPACK did not use zero-based references, there\n+is no value at index zero of the static table.\n+\n+## Dynamic Table {#table-dynamic}\n+\n+The dynamic table consists of a list of header fields maintained in first-in,\n+first-out order.  The dynamic table is initially empty.  Entries are added by\n+instructions on the Encoder Stream (see {{encoder-stream}}).\n+\n+Before a new entry is added to the dynamic table, entries are evicted from the\n+end of the dynamic table until the size of the dynamic table is less than or\n+equal to (maximum size - new entry size) or until the table is empty.\n+\n+If the size of the new entry is less than or equal to the maximum size, that","path":"draft-ietf-quic-qpack.md","position":82,"original_position":82,"commit_id":"2bd45a03a758123324d6888347e240826e9ee37c","original_commit_id":"eade0aab84d87da1e696840ba695fb9e45b4f176","user":{"login":"MikeBishop","id":4273797,"avatar_url":"https://avatars0.githubusercontent.com/u/4273797?v=4","gravatar_id":"","url":"https://api.github.com/users/MikeBishop","html_url":"https://github.com/MikeBishop","followers_url":"https://api.github.com/users/MikeBishop/followers","following_url":"https://api.github.com/users/MikeBishop/following{/other_user}","gists_url":"https://api.github.com/users/MikeBishop/gists{/gist_id}","starred_url":"https://api.github.com/users/MikeBishop/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MikeBishop/subscriptions","organizations_url":"https://api.github.com/users/MikeBishop/orgs","repos_url":"https://api.github.com/users/MikeBishop/repos","events_url":"https://api.github.com/users/MikeBishop/events{/privacy}","received_events_url":"https://api.github.com/users/MikeBishop/received_events","type":"User","site_admin":false},"body":"So inserting a header that's larger than the static table is a hard error?  Works for me.","created_at":"2018-05-24T18:23:24Z","updated_at":"2018-05-24T18:23:24Z","html_url":"https://github.com/quicwg/base-drafts/pull/1357#discussion_r190685121","pull_request_url":"https://api.github.com/repos/quicwg/base-drafts/pulls/1357","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/quicwg/base-drafts/pulls/comments/190685121"},"html":{"href":"https://github.com/quicwg/base-drafts/pull/1357#discussion_r190685121"},"pull_request":{"href":"https://api.github.com/repos/quicwg/base-drafts/pulls/1357"}},"in_reply_to_id":190050765},"pull_request":{"url":"https://api.github.com/repos/quicwg/base-drafts/pulls/1357","id":189137363,"html_url":"https://github.com/quicwg/base-drafts/pull/1357","diff_url":"https://github.com/quicwg/base-drafts/pull/1357.diff","patch_url":"https://github.com/quicwg/base-drafts/pull/1357.patch","issue_url":"https://api.github.com/repos/quicwg/base-drafts/issues/1357","number":1357,"state":"open","locked":false,"title":"Core concepts for QPACK","user":{"login":"MikeBishop","id":4273797,"avatar_url":"https://avatars0.githubusercontent.com/u/4273797?v=4","gravatar_id":"","url":"https://api.github.com/users/MikeBishop","html_url":"https://github.com/MikeBishop","followers_url":"https://api.github.com/users/MikeBishop/followers","following_url":"https://api.github.com/users/MikeBishop/following{/other_user}","gists_url":"https://api.github.com/users/MikeBishop/gists{/gist_id}","starred_url":"https://api.github.com/users/MikeBishop/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MikeBishop/subscriptions","organizations_url":"https://api.github.com/users/MikeBishop/orgs","repos_url":"https://api.github.com/users/MikeBishop/repos","events_url":"https://api.github.com/users/MikeBishop/events{/privacy}","received_events_url":"https://api.github.com/users/MikeBishop/received_events","type":"User","site_admin":false},"body":"Borrows a lot of RFC7540 text into the introduction to make it less critical to fully understand HPACK prior to reading the QPACK spec.  (Note that it's not a goal of this PR to make this spec fully independent of HPACK, but rather to have the core concepts live in QPACK and reference specific sections of RFC7541 for concrete items like the Huffman table, integer encodings, etc.)\r\n\r\nAlso moved the Indexing discussion into the Introduction to live with this text, since it's thematically related.  Along the way, removed the text that QPACK is a \"relatively non-intrusive extension to HPACK\" since, well, it's not.  ;-)","created_at":"2018-05-18T21:18:21Z","updated_at":"2018-05-24T18:23:24Z","closed_at":null,"merged_at":null,"merge_commit_sha":"959ec1b1e522275f7001e355c8815194499144ed","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":843361059,"url":"https://api.github.com/repos/quicwg/base-drafts/labels/-qpack","name":"-qpack","color":"fbca04","default":false},{"id":481871311,"url":"https://api.github.com/repos/quicwg/base-drafts/labels/editorial","name":"editorial","color":"0e8a16","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/quicwg/base-drafts/pulls/1357/commits","review_comments_url":"https://api.github.com/repos/quicwg/base-drafts/pulls/1357/comments","review_comment_url":"https://api.github.com/repos/quicwg/base-drafts/pulls/comments{/number}","comments_url":"https://api.github.com/repos/quicwg/base-drafts/issues/1357/comments","statuses_url":"https://api.github.com/repos/quicwg/base-drafts/statuses/2bd45a03a758123324d6888347e240826e9ee37c","head":{"label":"quicwg:qpack_concepts","ref":"qpack_concepts","sha":"2bd45a03a758123324d6888347e240826e9ee37c","user":{"login":"quicwg","id":22631371,"avatar_url":"https://avatars3.githubusercontent.com/u/22631371?v=4","gravatar_id":"","url":"https://api.github.com/users/quicwg","html_url":"https://github.com/quicwg","followers_url":"https://api.github.com/users/quicwg/followers","following_url":"https://api.github.com/users/quicwg/following{/other_user}","gists_url":"https://api.github.com/users/quicwg/gists{/gist_id}","starred_url":"https://api.github.com/users/quicwg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quicwg/subscriptions","organizations_url":"https://api.github.com/users/quicwg/orgs","repos_url":"https://api.github.com/users/quicwg/repos","events_url":"https://api.github.com/users/quicwg/events{/privacy}","received_events_url":"https://api.github.com/users/quicwg/received_events","type":"Organization","site_admin":false},"repo":{"id":73779599,"name":"base-drafts","full_name":"quicwg/base-drafts","owner":{"login":"quicwg","id":22631371,"avatar_url":"https://avatars3.githubusercontent.com/u/22631371?v=4","gravatar_id":"","url":"https://api.github.com/users/quicwg","html_url":"https://github.com/quicwg","followers_url":"https://api.github.com/users/quicwg/followers","following_url":"https://api.github.com/users/quicwg/following{/other_user}","gists_url":"https://api.github.com/users/quicwg/gists{/gist_id}","starred_url":"https://api.github.com/users/quicwg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quicwg/subscriptions","organizations_url":"https://api.github.com/users/quicwg/orgs","repos_url":"https://api.github.com/users/quicwg/repos","events_url":"https://api.github.com/users/quicwg/events{/privacy}","received_events_url":"https://api.github.com/users/quicwg/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/quicwg/base-drafts","description":" Internet-Drafts that make up the base QUIC specification","fork":false,"url":"https://api.github.com/repos/quicwg/base-drafts","forks_url":"https://api.github.com/repos/quicwg/base-drafts/forks","keys_url":"https://api.github.com/repos/quicwg/base-drafts/keys{/key_id}","collaborators_url":"https://api.github.com/repos/quicwg/base-drafts/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/quicwg/base-drafts/teams","hooks_url":"https://api.github.com/repos/quicwg/base-drafts/hooks","issue_events_url":"https://api.github.com/repos/quicwg/base-drafts/issues/events{/number}","events_url":"https://api.github.com/repos/quicwg/base-drafts/events","assignees_url":"https://api.github.com/repos/quicwg/base-drafts/assignees{/user}","branches_url":"https://api.github.com/repos/quicwg/base-drafts/branches{/branch}","tags_url":"https://api.github.com/repos/quicwg/base-drafts/tags","blobs_url":"https://api.github.com/repos/quicwg/base-drafts/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/quicwg/base-drafts/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/quicwg/base-drafts/git/refs{/sha}","trees_url":"https://api.github.com/repos/quicwg/base-drafts/git/trees{/sha}","statuses_url":"https://api.github.com/repos/quicwg/base-drafts/statuses/{sha}","languages_url":"https://api.github.com/repos/quicwg/base-drafts/languages","stargazers_url":"https://api.github.com/repos/quicwg/base-drafts/stargazers","contributors_url":"https://api.github.com/repos/quicwg/base-drafts/contributors","subscribers_url":"https://api.github.com/repos/quicwg/base-drafts/subscribers","subscription_url":"https://api.github.com/repos/quicwg/base-drafts/subscription","commits_url":"https://api.github.com/repos/quicwg/base-drafts/commits{/sha}","git_commits_url":"https://api.github.com/repos/quicwg/base-drafts/git/commits{/sha}","comments_url":"https://api.github.com/repos/quicwg/base-drafts/comments{/number}","issue_comment_url":"https://api.github.com/repos/quicwg/base-drafts/issues/comments{/number}","contents_url":"https://api.github.com/repos/quicwg/base-drafts/contents/{+path}","compare_url":"https://api.github.com/repos/quicwg/base-drafts/compare/{base}...{head}","merges_url":"https://api.github.com/repos/quicwg/base-drafts/merges","archive_url":"https://api.github.com/repos/quicwg/base-drafts/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/quicwg/base-drafts/downloads","issues_url":"https://api.github.com/repos/quicwg/base-drafts/issues{/number}","pulls_url":"https://api.github.com/repos/quicwg/base-drafts/pulls{/number}","milestones_url":"https://api.github.com/repos/quicwg/base-drafts/milestones{/number}","notifications_url":"https://api.github.com/repos/quicwg/base-drafts/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/quicwg/base-drafts/labels{/name}","releases_url":"https://api.github.com/repos/quicwg/base-drafts/releases{/id}","deployments_url":"https://api.github.com/repos/quicwg/base-drafts/deployments","created_at":"2016-11-15T05:30:30Z","updated_at":"2018-05-24T13:47:59Z","pushed_at":"2018-05-24T14:52:46Z","git_url":"git://github.com/quicwg/base-drafts.git","ssh_url":"git@github.com:quicwg/base-drafts.git","clone_url":"https://github.com/quicwg/base-drafts.git","svn_url":"https://github.com/quicwg/base-drafts","homepage":"https://quicwg.github.io/","size":49625,"stargazers_count":244,"watchers_count":244,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":61,"mirror_url":null,"archived":false,"open_issues_count":133,"license":null,"forks":61,"open_issues":133,"watchers":244,"default_branch":"master"}},"base":{"label":"quicwg:master","ref":"master","sha":"b8d2dae8a632390e86aea336aa89446b191a84ab","user":{"login":"quicwg","id":22631371,"avatar_url":"https://avatars3.githubusercontent.com/u/22631371?v=4","gravatar_id":"","url":"https://api.github.com/users/quicwg","html_url":"https://github.com/quicwg","followers_url":"https://api.github.com/users/quicwg/followers","following_url":"https://api.github.com/users/quicwg/following{/other_user}","gists_url":"https://api.github.com/users/quicwg/gists{/gist_id}","starred_url":"https://api.github.com/users/quicwg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quicwg/subscriptions","organizations_url":"https://api.github.com/users/quicwg/orgs","repos_url":"https://api.github.com/users/quicwg/repos","events_url":"https://api.github.com/users/quicwg/events{/privacy}","received_events_url":"https://api.github.com/users/quicwg/received_events","type":"Organization","site_admin":false},"repo":{"id":73779599,"name":"base-drafts","full_name":"quicwg/base-drafts","owner":{"login":"quicwg","id":22631371,"avatar_url":"https://avatars3.githubusercontent.com/u/22631371?v=4","gravatar_id":"","url":"https://api.github.com/users/quicwg","html_url":"https://github.com/quicwg","followers_url":"https://api.github.com/users/quicwg/followers","following_url":"https://api.github.com/users/quicwg/following{/other_user}","gists_url":"https://api.github.com/users/quicwg/gists{/gist_id}","starred_url":"https://api.github.com/users/quicwg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quicwg/subscriptions","organizations_url":"https://api.github.com/users/quicwg/orgs","repos_url":"https://api.github.com/users/quicwg/repos","events_url":"https://api.github.com/users/quicwg/events{/privacy}","received_events_url":"https://api.github.com/users/quicwg/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/quicwg/base-drafts","description":" Internet-Drafts that make up the base QUIC specification","fork":false,"url":"https://api.github.com/repos/quicwg/base-drafts","forks_url":"https://api.github.com/repos/quicwg/base-drafts/forks","keys_url":"https://api.github.com/repos/quicwg/base-drafts/keys{/key_id}","collaborators_url":"https://api.github.com/repos/quicwg/base-drafts/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/quicwg/base-drafts/teams","hooks_url":"https://api.github.com/repos/quicwg/base-drafts/hooks","issue_events_url":"https://api.github.com/repos/quicwg/base-drafts/issues/events{/number}","events_url":"https://api.github.com/repos/quicwg/base-drafts/events","assignees_url":"https://api.github.com/repos/quicwg/base-drafts/assignees{/user}","branches_url":"https://api.github.com/repos/quicwg/base-drafts/branches{/branch}","tags_url":"https://api.github.com/repos/quicwg/base-drafts/tags","blobs_url":"https://api.github.com/repos/quicwg/base-drafts/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/quicwg/base-drafts/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/quicwg/base-drafts/git/refs{/sha}","trees_url":"https://api.github.com/repos/quicwg/base-drafts/git/trees{/sha}","statuses_url":"https://api.github.com/repos/quicwg/base-drafts/statuses/{sha}","languages_url":"https://api.github.com/repos/quicwg/base-drafts/languages","stargazers_url":"https://api.github.com/repos/quicwg/base-drafts/stargazers","contributors_url":"https://api.github.com/repos/quicwg/base-drafts/contributors","subscribers_url":"https://api.github.com/repos/quicwg/base-drafts/subscribers","subscription_url":"https://api.github.com/repos/quicwg/base-drafts/subscription","commits_url":"https://api.github.com/repos/quicwg/base-drafts/commits{/sha}","git_commits_url":"https://api.github.com/repos/quicwg/base-drafts/git/commits{/sha}","comments_url":"https://api.github.com/repos/quicwg/base-drafts/comments{/number}","issue_comment_url":"https://api.github.com/repos/quicwg/base-drafts/issues/comments{/number}","contents_url":"https://api.github.com/repos/quicwg/base-drafts/contents/{+path}","compare_url":"https://api.github.com/repos/quicwg/base-drafts/compare/{base}...{head}","merges_url":"https://api.github.com/repos/quicwg/base-drafts/merges","archive_url":"https://api.github.com/repos/quicwg/base-drafts/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/quicwg/base-drafts/downloads","issues_url":"https://api.github.com/repos/quicwg/base-drafts/issues{/number}","pulls_url":"https://api.github.com/repos/quicwg/base-drafts/pulls{/number}","milestones_url":"https://api.github.com/repos/quicwg/base-drafts/milestones{/number}","notifications_url":"https://api.github.com/repos/quicwg/base-drafts/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/quicwg/base-drafts/labels{/name}","releases_url":"https://api.github.com/repos/quicwg/base-drafts/releases{/id}","deployments_url":"https://api.github.com/repos/quicwg/base-drafts/deployments","created_at":"2016-11-15T05:30:30Z","updated_at":"2018-05-24T13:47:59Z","pushed_at":"2018-05-24T14:52:46Z","git_url":"git://github.com/quicwg/base-drafts.git","ssh_url":"git@github.com:quicwg/base-drafts.git","clone_url":"https://github.com/quicwg/base-drafts.git","svn_url":"https://github.com/quicwg/base-drafts","homepage":"https://quicwg.github.io/","size":49625,"stargazers_count":244,"watchers_count":244,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":61,"mirror_url":null,"archived":false,"open_issues_count":133,"license":null,"forks":61,"open_issues":133,"watchers":244,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/quicwg/base-drafts/pulls/1357"},"html":{"href":"https://github.com/quicwg/base-drafts/pull/1357"},"issue":{"href":"https://api.github.com/repos/quicwg/base-drafts/issues/1357"},"comments":{"href":"https://api.github.com/repos/quicwg/base-drafts/issues/1357/comments"},"review_comments":{"href":"https://api.github.com/repos/quicwg/base-drafts/pulls/1357/comments"},"review_comment":{"href":"https://api.github.com/repos/quicwg/base-drafts/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/quicwg/base-drafts/pulls/1357/commits"},"statuses":{"href":"https://api.github.com/repos/quicwg/base-drafts/statuses/2bd45a03a758123324d6888347e240826e9ee37c"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"MikeBishop"}}