http2 - frame - HEADER

4633 단어 http-2http
HEADERS 프레임 헤더 프레임
헤더 프레임 (유형 = 0x1) 은 하나의 흐름 을 열 고 머리 조각 을 휴대 할 수 있 습 니 다.헤더 프레임 은 흐름 이 열 리 거나 반 폐쇄 (원 격) 상태 에서 보 낼 수 있 습 니 다.
머리 조각 (Header Block Fragment) 은 이름 이 기괴 하고 무 섭 기도 하지만 실제로는 더 좋 은 표현 방법 이 없다.우리 가 약간의 인내심 을 가지 고 한 걸음 한 걸음 이해 해 야 한다.
chrome 접근 을 사용 할 때https://ietf.org/chrome 개발 도구 에서 볼 수 있 습 니 다. chrome 은 다음 과 같은 스타일 로 서버 에 요청 합 니 다.
Accept:text/html,application/xhtml+xml,...
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,...
Connection:keep-alive
Host:ietf.org
RA-Sid:...
RA-Ver:2.8.9
User-Agent:Mozilla/5.0 (Windows NT 6.1; ...

그 중의 모든 줄 은 키 값 이 맞 는 맵 을 헤드 필드 (head field) 라 고 합 니 다.하나의 헤드 필드 와 함께 하나의 헤드 필드 시트 (head field list) 를 구성 하고 직렬 화 와 압축 을 통 해 하나 또는 몇 프레임 으로 변 합 니 다.
이렇게 하면 하나의 헤드 필드 표 는 http 2 의 장면 에서 효율 적 인 전송 을 위해 직렬 화 되 고 압축 된 후에 여러 프레임 으로 깨 지고 각 프레임 은 하나의 조각 이 있다.수신 자 는 이 조각 들 을 조립, 반 압축, 반 직렬 화 를 통 해 원시 적 인 헤드 시트 로 만든다.이것 이 바로 머리 조각 이라는 이름 의 유래 다.
완전한 헤드 블록 (head block) 은 다음 과 같은 두 가지 상황 으로 구성 된다.
o 하나의 단독 HEADERS 또는 PUSHPROMISE 프레임 (END HEADERS 로고 설정)
o 하나의 단독 HEADERS 또는 PUSHPROMISE 프레임 (END HEADERS 로고 가 설정 되 지 않 음) 에 하나 이상 의 CONTINUATION 프레임 을 추가 하고 마지막 으로 CONTINUATION 은 END 를 설정 합 니 다.HEADERS 로고
  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |Pad Length? (8)|
 +-+-------------+-----------------------------------------------+
 |E|                 Stream Dependency? (31)                     |
 +-+-------------+-----------------------------------------------+
 |  Weight? (8)  |
 +-+-------------+-----------------------------------------------+
 |                   Header Block Fragment (*)                 ...
 +---------------------------------------------------------------+
 |                           Padding (*)                       ...
 +---------------------------------------------------------------+

필드
  • Pad Length: 바이트 길이 필드 를 채 웁 니 다.8 bit.선택 할 수 있다.Flags: PADDED 설정 후 이 필드 가 필요 합 니 다
  • E: 1 비트 의 표 시 는 표지 흐름 의존 이 전용 인지 아 닌 지 에 사용 된다.선택 할 수 있다.플래그: PRIORITY 설정 후 이 필드
  • Stream Dependency : StreamID.31 위 흐름플래그: PRIORITY 설정 후 이 필드
  • Weight: 흐름 의 8 비트 가중치 표시.흐름 의 가중치 를 저장 하기 위해 1 - 256 의 값 을 추가 합 니 다.이 필드 는 선택 할 수 있 으 며 우선 순위 태그 설정 에서 만 나타 납 니 다.
  • Header Block Fragment: 헤더 조각.
  • 패 딩: 바이트 채 우기
  • Stream Dependency, Weight * * 필드 는 흐름 의존, 흐름 우선 순위, 고급 화제 에 속 하 며 미래 에 소개 합 니 다.
    표지
  • END_STREAM (0x1): 비트 1 은 송신 단 이 정확 한 흐름 을 보 내 는 마지막 헤더 블록 임 을 표시 합 니 다. 이 표 시 를 설정 하면 흐름 을 반 폐쇄 상태 로 들 어가 게 합 니 다
  • .
  • END_SEGMENT (0x2): 비트 2 는 현재 엔 드 의 마지막 프레임 임 을 나타 낸다.중개 단 은 절대 세 션 을 넘 어 프레임 을 합병 할 수 없고 프레임 을 전송 할 때 세 션 의 경 계 를 유지 해 야 합 니 다.
  • END_HEADERS (0x4): 비트 3 은 프레임 이 전체 헤더 블록 을 포함 하고 뒤에 프레임 을 연장 하지 않 았 음 을 나타 낸다.
  • PADDED (0x8): 비트 4 는 Pad Length 필드 가 나타 납 니 다.
  • PRIORITY (0x8): 비트 6 지시 전용 태그 설정 (E)
  • 헤더 프레임 의 주 체 는 헤더 조각 을 포함한다.헤더 블록 이 헤더 프레임 보다 큰 것 은 연속 프레임 에서 계속 전 송 될 것 이다.
    오류 처리
    헤더 프레임 은 반드시 하나의 흐름 과 연결 되 어야 한다.스 트림 표시 0 x0 의 헤더 프레임 을 받 으 면 수신 단 은 프로 토 콜 오류 로 인 한 연결 오류 에 응답 해 야 합 니 다.
    코드 정의
    Serializer.HEADERS = function writeHeadersPriority(frame, buffers) {
      if (frame.flags.PRIORITY) {
        var buffer = new Buffer(5);
        assert((0 <= frame.priorityDependency) && (frame.priorityDependency <= 0x7fffffff), frame.priorityDependency);
        buffer.writeUInt32BE(frame.priorityDependency, 0);
        if (frame.exclusiveDependency) {
          buffer[0] |= 0x80;
        }
        assert((0 <= frame.priorityWeight) && (frame.priorityWeight <= 0xff), frame.priorityWeight);
        buffer.writeUInt8(frame.priorityWeight, 4);
        buffers.push(buffer);
      }
      buffers.push(frame.data);
    };
    
    Deserializer.HEADERS = function readHeadersPriority(buffer, frame) {
      var dataOffset = 0;
      var paddingLength = 0;
      if (frame.flags.PADDED) {
        paddingLength = (buffer.readUInt8(dataOffset) & 0xff);
        dataOffset = 1;
      }
    
      if (frame.flags.PRIORITY) {
        var dependencyData = new Buffer(4);
        buffer.copy(dependencyData, 0, dataOffset, dataOffset + 4);
        dataOffset += 4;
        frame.exclusiveDependency = !!(dependencyData[0] & 0x80);
        dependencyData[0] &= 0x7f;
        frame.priorityDependency = dependencyData.readUInt32BE(0);
        frame.priorityWeight = buffer.readUInt8(dataOffset);
        dataOffset += 1;
      }
    
      if (paddingLength) {
        frame.data = buffer.slice(dataOffset, -1 * paddingLength);
      } else {
        frame.data = buffer.slice(dataOffset);
      }
    };
    

    좋은 웹페이지 즐겨찾기