작업 메시지 형식

Action Message Format
AMF(Action Mess Message Format(AMF)
인터넷 미디어 유형
응용 프로그램/옥텟 스트림
개발자어도비 시스템즈
형식 유형데이터 교환 형식
컨테이너:구조화된 데이터

AMF(Action Message Format)는 ActionScript 개체 및 XML과 같은 개체 그래프를 직렬화하거나 Adobe Flash 클라이언트와 원격 서비스(일반적으로 Flash Media 서버 또는 타사 대체 서비스) 간에 메시지를 보내는 데 사용되는 이진 형식이다. Actionscript 3 언어는 AMF 형식에서 인코딩 및 디코딩을 위한 클래스를 제공한다.

이 포맷은 종종 어도비의 RTMP와 함께 사용되어 스트리밍 미디어의 전달을 위한 연결 및 제어 명령을 설정한다. 이 경우 AMF 데이터는 메시지 길이 및 유형("ping", "명령" 또는 미디어 데이터 등)을 정의하는 헤더가 있는 청크로 캡슐화된다.

형식 분석

AMF는 Flash Player 6과 함께 도입되었으며, 이 버전을 AMF0이라고 한다. 새로운 데이터 유형과 언어 기능이 AMF3라고 불리는 업데이트를 유발했을 때 Flash Player 9와 ActionScript 3.0이 출시되기 전까지는 변함이 없었다.[1] Flash Player 10은 2013년 1월 개정 사양에 문서화된 벡터 및 사전 데이터 유형을 추가했다.

어도비 시스템즈는 2007년[2][3] 12월 AMF 바이너리 데이터 프로토콜 규격을 발표했으며 개발자 커뮤니티가 이 프로토콜을 모든 주요 서버 플랫폼에서 사용할 수 있도록 지원하겠다고 발표했다.

AMF 자급제 패킷

다음의 amf-packet은 정의된 Adobe/Macromedia 컨테이너 또는 Flash Video 또는 Real Time Messaging Protocol과 같은 전송 장치 외부의 메시지 전송을 위한 것이다.

amf-filency-filency.
길이 이름 유형 체납
16비트 버전 움스브프 0이나 3
16비트 헤더 카운트 움스브프 0
헤더-카운트*56비트 머리글형식. 이진의 자유형
16비트 메시지 수 움스브프 1
메시지 수*64비트 이상 메세지 타입의 문자 이진의 자유형
머리글형식.
길이 이름 유형 체납
16비트 헤더 이름 길이 움스브프 0
헤더 이름 길이*8비트 헤더 이름 문자열 UTF-8 텅 빈
8비트 필수의 움스브프 0
32비트 머리글 길이 심스브프 가변의
헤더 길이*8비트 AMF0 또는 AMF3 이진의 자유형
메세지 타입의 문자
길이 이름 유형 체납
16비트 표적우리길이의 움스브프 가변의
대상-우리 길이*8비트 표적 유리 끈 UTF-8 가변의
16비트 반응우리길 움스브프 2
응답-우리 길이*8비트 반응 유리 끈 UTF-8 "/1"
32비트 메시지 길이 심스브프 가변의
메시지 길이*8비트 AMF0 또는 AMF3 이진의 자유형

머리글 길이 또는 메시지 길이를 알 수 없는 경우 -1 또는 0xFFFFFF로 설정됨

uimsbf: 부호 없는 정수, 가장 중요한 비트 먼저

Simsbf: 서명된 정수, 가장 중요한 비트 우선

AMF0

형식은 데이터를 인코딩하는 데 사용할 수 있는 다양한 데이터 유형을 지정한다. Adobe는 AMF가 주로 키 값 쌍의 형태로 명명된 속성을 포함하는 개체 그래프를 나타내기 위해 사용되며, 여기서 키는 문자열로 인코딩되며 값은 어레이 및 기타 개체뿐만 아니라 문자열이나 숫자와 같은 모든 데이터 유형일 수 있다고 말한다. XML은 네이티브 유형으로 지원된다. 각 유형은 실제 데이터 앞에 있는 단일 바이트로 표시된다. 해당 바이트의 값은 다음과 같다(AMF0의 경우).

  • 번호 - 0x00(IEEE 64비트 이중 정밀 부동소수 번호로 인코딩됨)
  • 부울 - 0x01(0x00 또는 0x01의 단일 바이트로 인코딩됨)
  • 문자열 - 0x02(UTF-8 문자열이 있는 16비트 정수 문자열 길이)
  • 개체 - 0x03(키/값 쌍 집합)
  • Null - 0x05
  • ECMA 어레이 - 0x08(32비트 항목 수)
  • 개체 끝 - 0x09(빈 16비트 문자열 길이로 미리 지정됨)
  • 엄격한 어레이 - 0x0a(32비트 항목 수)
  • 날짜 - 0x0b(16비트 정수 시간대 오프셋을 사용하여 IEEE 64비트 이중 정밀 부동소수로 인코딩됨)
  • 긴 문자열 - 0x0c(UTF-8 문자열이 있는 32비트 정수 문자열 길이)
  • XML 문서 - 0x0f(UTF-8 문자열이 있는 32비트 정수 문자열 길이)
  • 입력된 개체 - 0x10(UTF-8 이름의 16비트 정수 이름 길이, 항목 뒤에 있음)
  • AMF3 - 0x11로 전환

AMF 개체는 (0x03) 다음에 키-값 쌍 집합으로 시작하고 (0x09) 값으로 (빈 키 항목으로 0x00 0x00으로 사전 설정됨)로 종료한다. 키는 (0x02) '유형 정의' 바이트가 함축되어 있는 문자열로 인코딩된다(메시지에는 포함되지 않음). 값은 다른 개체를 포함한 모든 유형의 값이 될 수 있으며 전체 개체 그래프는 이러한 방식으로 직렬화될 수 있다. 객체 키와 문자열 모두 그 길이를 바이트 수로 나타내는 2바이트가 선행된다. 이는 문자열 앞에 0x02 타입 바이트를 포함한 총 3바이트가 있다는 것을 의미한다. null 형식은 형식 정의(0x05)만 포함한다. 숫자는 이중정밀 부동소수로 인코딩되며 8바이트로 구성된다.

예를 들어, 아래의 객체를 작업서 3 코드에서 인코딩하는 경우.

시합을 하다 사람:오브젝트 = {이름을 붙이다:'마이크', 나이를 먹다:'30', 가명:'마이크'}; 시합을 하다 물줄기가 흐르다:바이트 배열 = 새로운 바이트 배열(); 물줄기가 흐르다.objectEncoding = ObjectEncoding.AMF0; // ByteArray 기본값은 AMF3이다. 물줄기가 흐르다.writeObject(사람); 

ByteArray에 저장된 데이터:

16진법 ASCII
03 00 04 6e 61 6d 65 02 00 04 4d 69 6b 65 00 03 61 67 65 00 40 3e 00 00 00 00 00 00 00 05 61 6c 69 61 73 02 00 04 4d 69 6b 65 00 00 09

. . . n a m e . . . M i k e . . a g e . @ > . . . . . . . . a l i a s . . . M i k e . . .

참고: 개체 속성은 작업 설명서에 배치되는 속성과는 다른 순서로 정렬할 수 있다. 색칠/마킹은 아래 범례를 참조하십시오.

위의 코드는 다음과 같은 기본 제공 클래스에 대해서만 작동함 Object. 사용자 지정 클래스를 직렬화 및 직렬화 해제하려면 classAlias register를 사용하여 사용자 지정 클래스를 선언해야 하며 그렇지 않으면 플레이어가 오류를 발생시킬 수 있다.

// 가상 클래스 사용자용 등록ClassAlias("PersonTypeAlias", 사람); 

엄밀히 말하면 AMF는 데이터 인코딩 형식에 불과하지만, 대개 RTMP 메시지나 Flex RPC 호출로 캡슐화된 형태로 발견된다. 전자의 예는 아래에서 찾을 수 있다(플래시 클라이언트에서 보낸 "연결" 명령에 응답하여 반환된 "_결과" 메시지).

16진법 ASCII
03 00 00 00 00 01 05 14 00 00 00 00 02 00 07 5F 72 65 73 75 6C 74 00 3F F0 00 00 00 00 00 00 03 00 06 66 6D 73 56 65 72 02 00 0E 46 4D 53 2F 33 2C 35 2C 35 2C 32 30 30 34 00 0C 63 61 70 61 62 69 6C 69 74 69 65 73 00 40 3F 00 00 00 00 00 00 00 04 6D 6F 64 65 00 3F F0 00 00 00 00 00 00 00 00 09 03 00 05 6C 65 76 65 6C 02 00 06 73 74 61 74 75 73 00 04 63 6F 64 65 02 00 1D 4E 65 74 43 6F 6E 6E 65 63 74 69 6F 6E 2E 43 6F 6E 6E 65 63 74 2E 53 75 63 63 65 73 73 00 0B 64 65 73 63 72 69 70 74 69 6F 6E 02 00 15 43 6F 6E 6E 65 63 74 69 6F 6E 20 73 75 63 63 65 65 64 65 64 2E 00 04 64 61 74 61 08 00 00 00 01 00 07 76 65 72 73 69 6F 6E 02 00 0A 33 2C 35 2C 35 2C 32 30 30 34 00 00 09 00 08 63 6C 69 65 6E 74 49 64 00 41 D7 9B 78 7C C0 00 00 00 0E 6F 62 6A 65 63 74 45 6E 63 6F 64 69 6E 67 00 40 08 00 00 00 00 00 00 00 00 09 . . . . . . . . . . . . . . . _ r e s u l t . ? . . . . . . . . . . f m s V e r . . . F M S / 3 , 5 , 5 , 2 0 0 4 . . c a p a b i l i t i e s . @ ? . . . . . . . . m o d e . ? . . . . . . . . . . . . . l e v e l . . . s t a t u s . . c o d e . . . N e t C o n n e c t i o n . C o n n e c t . S u c c e s s . . d e s c r i p t i o n . . . C o n n e c t i o n s u c c e e d e d . . . d a t a . . . . . . . v e r s i o n . . . 3 , 5 , 5 , 2 0 0 4 . . . . . c l i e n t I d . A . . x . . . . . . o b j e c t E n c o d i n g . @ . . . . . . . . . .

범례: 개체 시작/종료 개체개체ecma_array

AMF 메시지는 다음과 같이 시작한다. 0x03 헤더 유형이 0인 RTMP 패킷을 의미하므로 12바이트가 뒤따를 것으로 예상된다. 메시지 유형 0x14로, 값 "_result"와 두 개의 직렬화된 객체의 문자열 형태로 명령을 인수로 나타낸다. 메시지는 다음과 같이 디코딩할 수 있다.

(명령하다) "_vmx" (거래 id) 1 (가치를 매기다) [1] { fmsVer: "FMS/3,5,2004"         능력: 31.0         모드: 1.0 }, [2] { 수평을 이루다: "상태",         부호를 붙이다: "넷커넥션.연결하다성공",         설명: "연결 성공.",         자료: (배열하다) {                버전: "3,5,5,2004" },         clientId: 1584259571.0,         objectEncoding: 3.0 } 

여기서는 한 멤버가 있는 '데이터' 키의 값으로 배열(터키색)을 볼 수 있다. objectEncoding 값이 3인 것을 볼 수 있다. 이는 후속 메시지가 0x11 메시지 유형으로 전송됨을 의미하며, 이는 AMF3 인코딩을 의미한다.

AMF3

프로토콜의 최신 버전은 더 압축된 포맷을 허용하는 중요한 변경을 명시한다. 데이터 마커는 다음과 같다.

  • 정의되지 않음 - 0x00
  • Null - 0x01
  • 부울 거짓 - 0x02
  • 부울 참 - 0x03
  • 정수 - 0x04(확장 가능한 8+비트 정수)
  • 이중 - 0x05(IEEE 64비트 이중 정밀 부동 소수점 번호로 인코딩됨
  • 문자열 - 0x06(UTF-8 문자열로 8비트 정수 문자열 길이 확장 가능)
  • XMLDoment - 0x07(UTF-8 문자열로 확장 가능한 8비트 정수 문자열 길이 및/또는 플래그)
  • 날짜 - 0x08(EEEE 64비트 이중 정밀 부동소수점 UTC 오프셋 시간으로 확장 가능한 8비트 정수 플래그)
  • 어레이 - 0x09(확장 가능한 8비트 정수 입력 수 및/또는 UTF-8 이름의 8비트 정수 이름 길이(선택 사항) 플래그)
  • 개체 - 0x0A(확장 가능한 8비트 정수 입력 수 및/또는 확장 가능한 8비트 정수 이름 길이(UTF-8 이름)를 가진 플래그)
  • XML - 0x0B(8비트 정수 플래그 확장 가능)
  • ByteArray - 0x0C(옵션 8비트 길이의 확장 가능한 8비트 정수 플래그)

처음 4가지 유형은 어떠한 데이터도 따르지 않는다(부레안은 AMF3에 두 가지 유형이 있다).

Flash Player 10에서 사용하는 추가 마커(형식은 여전히 AMF3)는 다음과 같다.

  • VectorInt - 0x0D
  • 벡터UInt - 0x0E
  • 벡터더블 - 0x0F
  • VectorObject - 0x10
  • 사전 - 0x11

AMF3는 더 많은 압축을 목표로 하며, 이를 달성하는 방법 중 하나는 모든 새 문자열을 검사하는 배열로 저장하여 문자열 중복을 방지하는 것이다. 문자열 마커를 따르는 바이트는 더 이상 순수 길이를 나타내지 않지만, 가장 작은 비트인 'inline'(1) 즉, 문자열이 'inline'인지, 즉 배열의 인덱스가 저장된 'reference'(0)인지를 나타내는 복잡한 바이트다. 이 표에는 키와 값이 포함되어 있다.

이전 버전의 Flash Player에는 64비트 이중 정밀 인코딩인 'Number'라는 숫자 유형이 있었다. 최신 릴리즈에서는 AMF3에 별도 유형으로 포함된 int와 uint가 있다. 숫자 유형은 AMF0 인코딩과 동일하며, Integer는 1~4바이트의 가변 길이를 가지며, 여기서 바이트 1-3의 가장 중요한 비트는 다른 바이트가 뒤따른다는 것을 나타낸다.

AMF 지원

다양한 AMF 프로토콜은 애플리케이션 개발자가 설치하고 통합해야 하는 라이브러리 및 서비스의 형태로, 많은 서버측 언어와 기술에 의해 지원된다.

플랫폼:

프레임워크:

참고 항목

참조

  1. ^ "Action Message Format -- AMF 3" (PDF). January 2013. Retrieved 2021-05-01.
  2. ^ "Action Message Format -- AMF 0" (PDF). 2007. Retrieved 2021-05-01.
  3. ^ "Adobe opens up AMF, liberates source for remoting framework used in rich web apps". Ars Technica. Retrieved 2017-12-31.
  4. ^ Adobe ColdFusion 9 Standard 기능

GB