본문 바로가기

HTTP2.0

[HTTP2.0] DATA 프레임

6.1.  DATA

DATA 프레임(type=0x0)은 가변 길이의 유저 데이터를 전송하는 역할을 담당합니다. (Http의 리퀘스트나 리스폰스의 페이로드 등).
한번의 요청이나 응답에 대해서 DATA프레임은 여러번 전송될 수 있습니다.


또한 DATA프레임에는 패딩이 붙을 수 있습니다. 패딩은 DATA 프레임 끝에 추가되어 전체 데이터의 크기가 얼마나 되는지 예측하기 어렵게 합니다. 더 자세한 내용은 아래 섹션을 참조해 주세요.
https://tools.ietf.org/html/rfc7540#section-10.7



    +---------------+

    |Pad Length? (8)|

    +---------------+-----------------------------------------------+

    |                            Data (*)                                     ...

    +---------------------------------------------------------------+

    |                           Padding (*)                                 ...

    +---------------------------------------------------------------+


                       Figure 6: DATA Frame Payload



프레임의 각 필드에 대한 설명

Pad Length : 뒤의 패딩 데이터가 얼마나 붙어있는지를 나타내는 8비트 숫자값입니다. 이 필드는 PADDED 플래그가 설정되어 있을 경우에만 존재하며, 이외에는 존재하지 않습니다.


Data : 실제 유저 데이터 영역입니다. Data 영역의 실제 크기는 헤더에 포함된 payload 길이에서 패딩 관련 부분을 빼서 구할 수 있습니다. 만약 패딩이 없다면 payload 길이를 그대로 사용합니다.


Padding : 패딩은 특정한 의미가 있는 데이터를 담지 않습니다. 전송자는 항상 패딩 영역을 0으로 채워서 보내야 하고 / 수신자는 패딩 영역을 검사해야 할 의무는 없지만 0이 아닌 패딩이 감지되면 프로토콜 에러로 연결을 닫아버릴 가능성은 있습니다.




프레임이 가질 수 있는 플래그들에 대한 설명

END_STREAM (0x1) : 설정되어 있을 경우 송신자가 현재 스트림에 대해서 이번 프레임이 마지막이라는걸 알려주는 역할을 합니다. 이 플래그를 설정한 후에 "half-closed" 상태 혹은 "closed" 상태가 될 수 있습니다.


PADDED (0x8) : 설정되어 있을 경우 패딩이 포함됨을 나타냅니다. 이 경우에 Pad Length 필드와 Padding 필드가 존재합니다.




기타

* DATA 프레임은 반드시 특정한 스트림과 연관되어야 합니다. 만약 송신자가 스트림 아이디가 0인 DATA 프레임을 받았다면 반드시 프로토콜 에러와 함께 연결을 종료해야 합니다.


* DATA 프레임은 반드시 플로우컨트롤상에서 "open" 또는 "half-closed (remote)" 상태에서 보내져야 합니다. 만약 그렇지 않다면 수신측은 반드시 STREAM_CLOSED 와 함께 에러로 응답해야 합니다.


* Padding의 크기는 Pad Length필드 값에 의해서 결정됩니다. 만약 실제 패딩영역의 길이가 전체 payload 길이보다 크거나 같다면 수신자는 PROTOCOL_ERROR 와 함께 연결을 종료해야 합니다.


* Pad Length 필드가 0인 경우에도 해당 필드를 표현하기 위해 전체 payload가 1바이트 추가됩니다.