Stomp Design
Simple Text Oriented Messaging Protocol
STOMP 디자인을 이끄는 주요 철학은 단순성과 상호 운용성으로 다양한 언어로 클라이언트와 서버 측 모두에서 쉽게 구현할 수 있는 경량 프로토콜로 설계되었다. 이는 특히 서버 아키텍처에 많은 제약이 없으며 destination naming, reliability, semantics 등의 기능들이 구현에 따라 다르다는 것을 의미한다.
Stomp Frame
STOMP는 신뢰할 수 있는 양방향 스트리밍 네트워크 프로토콜(TCP 등)을 기반으로 하고 프레임에 근거해서 통신하는 프로토콜이다.
클라이언트와 서버는 스트림을 통해 전송된 STOMP 프레임을 사용하여 통신하고 프레임의 구조는 다음과 같다.
COMMAND
header1:value1
header2:value2
Body^@
Body 끝에는 NULL Octet이 온다. 명세 문서에서는 NULL Octet을 ^@ 으로 표현한다.
NULL Octet은 0으로 표현되는 8비트 데이터 블록으로 데이터에서 0x00 또는 바이너리에서 00000000과 같은 8비트 0 값을 가진 옥텟을 나타낸다.
이것은 종종 문자열이나 데이터의 끝을 표시하는 데 사용될 수 있다. 다양한 언어에서 사용되는 이스케이프 시퀀스로 \0, \000, \x00, \z, \u0000 등이 있다.
Encoding
COMMAND와 HEADERS는 UTF-8로 인코딩되고 CONNECT, CONNECTED를 제외한 모든 프레임에서 헤더에 존재하는 캐리지 리턴, 라인 피드, 콜론 문자를 이스케이프 처리한다. 디코딩에도 똑같이 적용되야 하며 정의되지 않은 이스케이프 시퀀스는 치명적인 프로토콜 오류로 처리되어야 한다.
- \r (octet 92 and 114) translates to carriage return (octet 13)
- \n (octet 92 and 110) translates to line feed (octet 10)
- \c (octet 92 and 99) translates to : (octet 58)
- \\ (octet 92 and 92) translates to \ (octet 92)
COMMAND
- Client Frame Command - SEND, SUBSCRIBE, UNSUBSCRIBE, ACK, NACK, BEGIN, COMMIT, ABORT, DISCONNECT
- Server Frame Command - MESSAGE, RECEIPT, ERROR
Body
SEND, MESSAGE, ERROR 프레임만 body를 가진다.
Standard Headers
- content-length
모든 프레임에는 해당 헤더가 포함될 수 있다. body 길이에 대한 옥텟 수를 뜻하고 해당 헤더가 포함된 경우 본문에 NULL 옥텟이 있는지 여부에 관계없이 이 수의 옥텟을 읽어야 한다. 그래도 프레임은 여전히 NULL 옥텟으로 종료되어야 한다.
body가 있는 SEND, MESSAGE, ERROR 프레임은 구문 분석의 용이함을 위해 해당 헤더를 포함하길 권장하고 body에 NULL 옥텟이 포함된 경우 해당 헤더가 반드시 포함되어야 한다. - content-type
해당 헤더가 포함된 경우 body를 MIME 유형으로 간주하고 포함되지 않으면 blob으로 간주한다.
MIME 유형이 text인 경우 기본은 text/UTF-8이다. 다른 인코딩으로 텍스트 기반 MIME 유형을 사용하는 경우 ;charset=<encoding>을 추가해야 한다. 예시로 HTML body를 UTF-16으로 인코딩하여 전송한다면 text/html;charset=utf-16과 같이 명시할 수 있다.
텍스트로 해석될 수만 있다면 application/xml;charset=utf-8(UTF-8로 인코딩된 XML) 같은 MIME 유형도 가능하다
모든 STOMP 클라이언트와 서버는 UTF-8 인코딩 및 디코딩을 지원해야 한다. 따라서 이기종 컴퓨팅 환경에서 상호 운용성을 극대화하려면 텍스트 기반 콘텐츠를 UTF-8로 인코딩하는 것이 좋다. - receipt
CONNECT를 제외한 프레임은 `receipt:임의의 값`을 헤더에 포함할 수 있다. 그러면 서버는 클라이언트 프레임 처리에 대한 ACK를 응답한다. (RECEIPT 프레임으로) (원문 - This will cause the server to acknowledge the processing of the client frame with a RECEIPT frame)
DISCONNECT
receipt:close-1
NULL
Client에서 receipt 헤더 지정해서 DISCONNECT 프레임을 보내면
RECEIPT
receipt-id:disconnect-123
NULL
서버는 위와 같이 RECEIPT 프레임으로 응답한다.
ERROR
message:Session closed.
content-length:0
NULL
receipt 헤더없이 DISCONNECT 한다면 위와 같이 세션 종료 메세지와 함께 ERROR 프레임으로 응답한다.
SEND
destination:/queue/a
receipt:message-12345
hello queueNULL
SEND 프레임에 receipt 헤더는 RECEIPT 프레임 응답이 안보인다. (jmeter 하고 @stomp/stompjs 둘 다 안보임)
spring stomp 기본 설정이 SEND 프레임에만 RECEIPT 응답을 막은건가?
이어서
참고
https://stomp.github.io/stomp-specification-1.2.html
https://en.wikipedia.org/wiki/Null_character
'CS,네트워크' 카테고리의 다른 글
교착상태 Deadlock (0) | 2023.09.18 |
---|---|
stack/heap memory (0) | 2023.09.16 |
TCP/UDP Socket Protocol, Programming (0) | 2023.09.15 |