작업 메시지 형식
Action Message Format이 글은 검증을 위해 인용구가 추가로 필요하다. – · · · · (2017년 12월 (이 템플릿 |
| 인터넷 미디어 유형 | 응용 프로그램/옥텟 스트림 |
|---|---|
| 개발자 | 어도비 시스템즈 |
| 형식 유형 | 데이터 교환 형식 |
| 컨테이너: | 구조화된 데이터 |
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과 같은 전송 장치 외부의 메시지 전송을 위한 것이다.
| 길이 | 이름 | 유형 | 체납 |
|---|---|---|---|
| 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 프로토콜은 애플리케이션 개발자가 설치하고 통합해야 하는 라이브러리 및 서비스의 형태로, 많은 서버측 언어와 기술에 의해 지원된다.
플랫폼:
- 콜드퓨전 [4]-
- Hxe - Hxe 원격 설정 hxformat
- Java - Adobe BlazeDS, Adobe LiveCycle Data Services(이전 명칭: Flex Data Services), Exadel Flamingo, RED 5, Cypon, OpenAMF, Pimento, Grangel, Java용 WebORB
- .NET - WebORb for .NET, FluorineFx(LGPL), DotAmf(MS-PL), AMF.NET(개발 중지됨)
- PHP - AmfPHP, SabreAMF, PHP용 WebORb, Zend_Amf, php-amf3 확장, Bagette AMF(php 확장)
- Python - 빠른
- Perl - AMF::Perl, 저장 가능:AMF, AMF::연결
- 컬링 - 데이터 서비스 컬링
- Ruby - RubyAMF, WebORb for Rails, Rocket AMF
- 얼랑 - 얼랑-AMF
- ActionScript - Flash Player ByteArray(내장), CourseVector 라이브러리
- JavaScript - JSAMF CourseVector Library CourseVector .minerva
- 루아 - 루아암프3
- ABAP - ABAP AMF(초기 단계)
- Delphi - kBMMW(추가 AMF0/AMF3 지원)
- iOS - 코코아AMF
- PowerShell - Powershell AMF
프레임워크:
- AMF 및 RemoteObject와 Apache Royale 통신 - Apache Royale
- Ruby on Rails - RubyAMF
- Zend 프레임워크 - Zend_AMF
- OSGi 프레임워크 - OSGi용 AMF3
- 장고 - 장고 AMF
- CakePHP - CakeAMFPHP
- 그레일(프레임워크) - 블레이즈DS
- Trac - TracRpcProtocols플러그인. XmlRpcPlugin 버전 1.1.0 이상 필요.
- Web2py - PyAMF
참고 항목
참조
- ^ "Action Message Format -- AMF 3" (PDF). January 2013. Retrieved 2021-05-01.
- ^ "Action Message Format -- AMF 0" (PDF). 2007. Retrieved 2021-05-01.
- ^ "Adobe opens up AMF, liberates source for remoting framework used in rich web apps". Ars Technica. Retrieved 2017-12-31.
- ^ Adobe ColdFusion 9 Standard 기능
GB