preface :

  HTTP2 The binary framing layer is introduced , Will normal request / response , Decomposing into frames to realize the concurrency of request and response .HTTP2 Yes 10 Frames of type in . This article will focus on this 10 Summarize the types of frames .

Frame structure :
    All frames contain a 9 byte Frame header of + Text that can be long is different . Depending on the type of frame , The structure of the text is also different .
    Frame header :
bypte): Represents the body part of the frame Payload Length of . Initially set to 2^14(16384), If you want to send a larger frame length , Must receive settings with SETTINGS_MAX_FRAME_SIZE. Of
    SETTING frame. Frame header 9 byte It doesn't count length Within the calculation range of .   Type(1
byte): only 0h-Ah Effective , If you do type Out of range , This frame must be ignored .   Flags(1 bype): Marker bit , frequently-used flag
Yes END_STREAM, Indicates that the frame is the last frame of the data stream .   Stream Identifier(31 bit): Frame id, Indicates which data stream the frame belongs to

  DATA frame :

  DATA: Variable length , It's application data . Length is affected by Length, Window Size Control of .   Pad Length:
  One 8bit field , It means Padding The length of the field .   Padding
:*padding Fill in several 0x0 Bit , from padding To control whether to verify . If verification is required , On the contrary 0 Part of the response PROTOCAL_ERROR abnormal .padding The length of the flow
controll within      DATA frame Of flag There can be :   END_STREAM
(0x1): When the setting is changed to ,stream Will be transformed into half-closed perhaps closed state .   PADDED: This bit is set , that bit 3 Indicates that Pad
Length field And the text needs to be filled in . payload = Padding Length + Data + Padding
  Abnormal situation :   1, every last DATA All frames must be subordinate to a data stream . If you receive one DATA frame its stream id
by 0x0, So throw out one PROTOCAL_ERROR error .  
2, If padding Is longer than payload, Then it has to be seen as a mistake , And throw it out PROTOCAL_ERROR   
  HEADER frame :
  Pad Length:1 btye, indicate padding The length of the field . stay flag Set in PADDED(00001000) It works when it's a bit .   E: 1
bit, Indicates whether the stream dependency is private , Only if the PRIORITY Only when it works .   Stream Dependency:
Indicates which data flow the requested resource depends on . The receiver responds preferentially to the data stream of the dependent resource .   Weight: No stream
dependency When , When the resource is already dependent or responded to .weight The bigger it is , More priority response .   Header Block Fragment:
Header information for transmitting differences
  header Of flag There can be :    END_STREAM:
(0000001B), Used to close the data stream , If the receiver receives the flag bit , Then flow in half-close
perhaps close Status of . But it can still be accepted CONTINUATION frame . Because theoretically ,CONTIUATION Frame belongs to HEADER Part of .  
 END_HEADERS:(00000100B), express header block fragment Contains all of them header
block. Not after that CONTIUATION frame.    PADDED:(00001000B), Indicates whether the body needs to be filled padding*    
PRIORITY: (00010100B), The fifth digit indicates E, So it needs to be stream dependency and weight Bit valid .
  Abnormal situation :   1, Received header No frames stream id, Then throw it out PROTOCAL_ERROR  
 2,padding If the domain exceeds length Length of , Then it will be thrown out PROTOCAL_ERROR

   E: indicate stream dependency and weight Effective .   Stream Dependency:
Indicates which data flow the requested resource depends on . The receiver responds preferentially to the data stream of the dependent resource .   Weight: No stream
dependency When , Or when the dependent resource has been responded to .weight The bigger it is , More priority response .
  priority There is no flag bit . Can be in stream idle perhaps closed When to send . It is used to determine the receiving order at the receiving end . however PRIORITY
Frames may be in stream Received when it has been processed . This is the time , this PRIORITY Will not be valid .      Abnormal situation :   1,PRIORITY
Frames must be subordinate to a stream, without steam id, Then it will be thrown out PROTOCAL_ERROR   2,PRIORITY If the frame length exceeds 5
byte, Then it will be thrown out FRAME_SIZE_ERROR

  RST_STREAM frame
  received RST_STREAM The frame will close immediately stream. And contains the ending error code , The error code contains why to end the data stream . After receiving the frame , Cannot send any stream. But the sender can accept the frame still on the channel . Because it is necessary to ensure that the frames that have been sent out are processed correctly .
      Abnormal situation :   1, If RST_STREAM No, stream id, Then it will be thrown out PROTOCAL_ERROR error .  
2, No more flow idle When you accept it RST_STREAM, Otherwise, it will be thrown PROTOCAL_ERROR error .  
3, If RST_STREAM Is longer than 4byte, Then it will be thrown out FRAME_SIZE_ERROR error .

  SETTINGS frame
       This frame carries the configuration information , These information will affect the communication process of the data stream . In general, the HEADERS frame Send before sending SETTINGS
frame , But it is also allowed to be sent during communication SETTINGS frame . Can send multiple SETTINGS frame , The frames are processed in order , The value set later will override the previous value .  
because SETTINGS Frames are configuration information , With high priority , So it needs to be sent by the receiver ack Guarantee each SETTINGS Frames arrive correctly .  
A lot of times SETTINGS Frames are oriented to the entire connection , Instead of a single stream . under these circumstances ,Stream id Set to 0.
  Identifier-value: Setting parameters - Setting value . Here's the situation :( every last setting Sets a set of values for each frame )  
SETTINGS_HEADER_TABLE_SIZE(0x1): Allow sender to notify receiver header Maximum length of . The initial value is 4096 byte  
SETTINGS_ENABLE_PUSH(0x2): Allow the server to actively push messages to the client . If the disable, Then the server cannot send PUSH_PROMISE
frame.0 Yes ,1 It's not allowed  
SETTINGS_MAX_CONCURRENT_STREAM(0x3): Indicates the current connection Can be established at the same time stream Maximum number of . Initially 100  
SETTINGS_INITIAL_WINDOW_SIZE(0x4): Indicates the initial window size of the sender , The initial value is 2^16 -1  
SETTINGS_MAX_FRAME_SIZE(0x5): Maximum frame length . set up DATA Maximum allowed length of frame , Maximum cannot exceed 2^24-1  
SETTINGS_MAX_HEADER_LIST_SIZE(0x6): Indicates what the sender wants to accept header Maximum length of . And this length is not compressed before . include name,value
+ For each header domain 32byte.       flags:   ACK:
SETTINGS Must be processed in the order in which they were sent . Once all the value It's all dealt with , The recipient must send a SETTINGS, Contains a ack. After that, the sender can continue to send .  
  Abnormal situation :  1,SETTINGS It's about the overall situation connection Of , therefore stream id It has to be 0, Otherwise, it will be thrown PROTOCAL_ERROR error .
 2,SETTINGS Will affect connection state , An unfinished one , Or something wrong SETTINGS Must be regarded as error, Throw out PROTOCAL_ERROR
 3,SETTINGS If the length exceeds 6 byte, Then a FRAME_SIZE_ERROR
 4, If SETTINGS_ENABLE_PUSH Set to 1, But the server sent it PUSH_PROMISE, Then it will be thrown out PROTOCAL_ERROR
 5, If SETTINGS_INITIAL_WINDOW_SIZE: More than 2^31-1, Then it will be thrown out FLOW_CONTROL_ERROR
 6, If sent SETTINGS, Never received it ack, Then it will be thrown out SETTINGS_TIMEOUT

     PUSH_PROMISE Frame is when the server sends data to the client actively , Used to open this one stream Request frame for . The effect is similar to that of HEADERS
frame. Only when SETTING_ENABLE_PUSH Set to 0 When , Can be sent PUSH_PROMISE.      Pad Length:padding Length of
 R: Reserved bit   Promise Stream Id: Open this group stream Time stream id. This is the frame header stream
id It refers to which group of requests is this group of active push ( data stream ) Active messaging .   Header Block Fragment: Difference part of request header field   Padding:
Filling bit      flags:   END_HEADERS:(0x4) When the flag, So the second one bit express Header Block
Fragment Contains all the request headers .   PADDED:(0x8), third bit express Pad Length and Padding Effective
PUSH_PROMISE Must be in stream It can only be sent when it has been opened or half closed . If the receiver wants to reject PUSH_PROMISE, Can be sent RST_STREAM frame . One PUSH_PROMISE The frame changes in two ways stream. The first is PUSH_PROMISE
Of header block fragment It will change header
compress . The second is sending PUSH_PROMISE A new flow is created . The sender must confirm that the flow has been established , After sending DATA frame.
  Abnormal state :   1,PUSH_PROMISE Must be subordinate to a data stream , So if stream id by 0, Then it must be reported PROTOCAL_ERROR error  
2, Only in SETTINGS_ENABLE_PUSH Set to 0 When , To allow sending PUSH_PROMISE, Otherwise, it will be reported PROTOCAL_ERROR error  
3, If the dependent stream is not open
perhaps half-closed state , But I did PUSH_PROMISE frame , Then the frame must be treated as an error , Throw out PROTOCAL_ERROR error . But send out RST_STREAM The end of the must first process the received PUSH_PROMISE, Because it might actually be sent RST Previously issued .
  4, If PUSH_PROMISE Of stream id The stream pointed to is illegal , Then it must be reported PROTOCAL_ERROR error .

  PING frame
PING Frames are used to test an idle connection Is there still a valid frame . It can be emitted from either end . Count Reg 8byte. If the receiver does not receive ACK Of PING frame , Must send a ACK Of PING
Back to sender . also PING Frames should have higher priority         flags:     1,ACK(0x1):bit 0 indicate PING frame It's a PING
response. The receiver must receive the PING After frame , Returns a set of ack Of PING frame
    Abnormal situation :    1,PING Frames cannot depend on any stream , If PING There is stream id, Then you have to report an error .Protocal_ERROR  
 2, If PING Frame length exceeds 9 byte, Then it must be reported FRAME_SIZE_ERROR error

  GOAWAY frame  
GOAWAY The role of the frame is for the whole connection Not individually stream Of . It acts as a notification to both parties to close one connection, After receiving the frame , No new data stream can be created , But the established data stream should be processed . Because there is a situation , It's one end of the line GOAWAY before , Another build was sent stream Of header
frame, So in the GOAWAY One is designed on the frame Last-Stream-ID field , This is used to identify the connection On the largest frame, If a party receives a higher stream
id Of frame Time , The frame is ignored . Received GOAWAY One end of the frame can no longer be in the conncetion Create a new stream, But you can build new ones connection.    
  The terminal is shutting down connection When , Should be sent GOAWAY frame , So the other person can know which one stream And its previous data streams are being processed . But if something goes wrong , Then the terminal will choose not to send GOAWAY Just set up one connection.
    A terminal can send back multiple messages GOAWAY
frame , If the environment changes . for instance , A terminal wants to close the link , But there was no error . It may send one first NO_ERROR Of frame. after , We have another mistake , It needs to be done immediately shutdown The frame , This is the time , Will send an error code GOAWAY
frame .     Last-Stream-ID:   Identify the connection The last thing you can handle stream. If you receive it again stream
id Higher frame, It will be ignored .     Error Code: If you close the link because of an error , Put the error code in this position .         flags
: No, flags position          Abnormal situation :     1, Must be specified Last-Stream-ID: If the bit is 0, Need to report PROTOCOL_ERROR    
2,GOAWAY Frame your own stream id Must be 0, Otherwise PROTOCOL_ERROR
           The purpose of this frame is to tell the other party , How much more can you accept byte Data for . act on DATA
frame. If one end is receiving a sliding window , Found that the number of bytes that can be sent becomes negative , Then you have to wait until you receive one WINDOW_UPDATE
frame , Make the window size positive , To continue sending DATA
frame. This frame can also be used as ack, There is one delter position , How many signs have just been confirmed byte Data for , One end is sending DATA
frame after , Wait until you get it WINDOW_UPDATE, Confirm that the previous data has been received , To send the next one DATA frame             
Window Size Increment: Indicates the current acceptable byte size         Abnormal situation :    
 1, If the receiver cannot accept any frame , When the frame is received , To respond FLOW_CONTROL_ERROR      2, If the receiver receives window size
increment by 0, Then it must be reported PROTOCOL_ERROR error      3, If WINDOW_UPDATE
Is longer than 4type, Then it must be reported FRAME_SIZE_ERROR error

       The frame is subordinate to a HEADER ,PUSH_PROMISE frame . Used to send in HEADER PUSH_PROMISE I can't put it in request
header field . There is no limit to the length .
    flags:     END_HEADERS: (00000010B), express stream id Corresponding data flow ,request header
It's already sent .         Abnormal situation :    1, If stream id Not current stream id Or is it 0, Then it must be reported PROTOCOL_ERROR error
   2, send out CONTUATION The frame must be sent before HEADERS, PUSH_PROMISE frame , And the previous frames are not set END_HEADERS
Marker bit , Otherwise, it will be reported PROTOCOL_ERROR error .

©2019-2020 Toolsou All rights reserved,
One is called “ Asking for the train ” A small village Finally got the train Spring Boot Lesson 16 :SpringBoot Implementation of multithreading with injection class Chrome OS, For programmers and Windows What does it mean ? Internet Marketing JAVA Convert a string to a numeric type I've been drinking soft water for three years ? What is the use of soft water and water softener You don't know ——HarmonyOS Talking about uni-app Page value transfer problem JavaScript Medium Call and ApplySparkSQL Achieve partition overlay write Character recognition technology of vehicle license plate based on Neural Network