This document is about: PUN 1
SWITCH TO

PUN Classic (v1), PUN 2, Bolt는 휴업 모드입니다. Unity2022에 대해서는 PUN 2에서 서포트하지만, 신기능의 추가는 없습니다. 현재 이용중인 고객님의 PUN 및 Bolt 프로젝트는 중단되지 않고, 퍼포먼스나 성능이 떨어지는 일도 없습니다. 앞으로의 새로운 프로젝트에는 Photon Fusion 또는 Quantum을 사용해 주십시오.

바이너리 프로토콜

Photon과 클라이언트는 통신할 때 고도로 최적화된 바이너리 프로토콜을 이용합니다.
바이너리 프로토콜은 컴팩트 하지만 해석하기 쉽습니다. 이 프로토콜은 내부적으로 처리되는 것이므로 상세하게 알 필요는 없습니다. 상세하게 알고 싶으신 경우를 위하여 이 페이지에서 설명 드립니다.

커뮤니케이션 레이어

Photon 바이너리 프로토콜은 몇개의 레이어로 구성되어 있습니다. 가장 낮은 레벨인 UDP 는 전송하려는 메시지를 담아 나르는데 사용 됩니다. 표준 데이터그램 내에서 몇개의 헤더들은 Photon 의 프로퍼티들을 반영하는데 사용 됩니다: 프로퍼티에는 선택적인 신뢰도, 처리순서, 메시지의 통합, 시간 동기화등이 있습니다.

아래의 차트는 개별 레이어와 어떻게 구성되어 있는지를 보여 줍니다:

Photon Cloud: UDP Layers

words 안에는: 모든 UDP 패키지에는 eNet 헤더와 최소 하나의 명령어가 포함 되어 있습니다. 각 eNet 명령은 메시지들을 운반합니다: 메시지는 오퍼레이션 , 결과 또는 이벤트 입니다. 메시지들은 차례대로 오퍼레이션 헤더와 제공한 데이터로 구성되어 있습니다.

아래에 프로토콜의 각 부분에 대한 목록 테이블과 크기가 나와 있습니다. 이 표를 통해서 데이터 전송에 필요한 대역폭을 결정할 수 있습니다. 원하면 주어진 메시지의 크기가 얼마나 되는지 계산 할 수 도 있습니다.

수고를 덜어드리기 위해서 예를 보여 드리도록 하겠습니다.

예제: "somegame"에 참여하기

Join 이라는 오퍼레이션을 살펴 보도록 하겠습니다(Lite 어플리케이션에서 구현되어 있습니다). 프로퍼티가 없이 Join 은 단일 파라미터를 가진 오퍼레이션 입니다.

"오퍼레이션 파라미터"는 2 + count(parameter-keys) +
size(parameter-values)가 필요 합니다. "somegame" 문자열은 UTF8 인코딩으로 8 바이트를 사용하며 추가적인 문자열 3바이트가 더 필요 합니다(길이와 타입 정보). 합계: 14 bytes

파라미터들은 8 바이트 크기인 오퍼레이션 헤더로 둘러 쌓여 있습니다.
합계: 22 bytes

오퍼레이션 코드는 파라미터로서 인코드 되어 있지 않은 대신에 오퍼레이션 헤더에 존재 합니다.

오퍼레이션과 오퍼레이션 헤더는 eNet의 페이로드로써 "send reliable" 커맨드로 둘러쌓여 있습니다. 이 커맨드는 12 바이트 입니다. 합계: 34 bytes

다른 명령어들이 큐에 쌓이지 않았을 때 이 명령어가 전송된다고 가정하도록 하겠습니다. eNet 패키지 헤더는 12 바이트 입니다. reliable, 순차적 오퍼레이션 인 경우 합계:46 bytes

마지막으로 eNet 패키지는 28 바이트 헤더가 추가되는 UDP/IP 데이터그램에 놓여지게 됩니다. 지금까지 누적된 46 바이트에 비하면 꽤 많은 바이트 수 입니다. 불행하게도 이 46바이트는 뺄 수는 없지만 헤더를 공유시켜주는 통합 커맨드를 통해서 크기를 많이 줄 일 수 있습니다.

완성된 오퍼레이션은 74 바이트를 차지하게 됩니다.

서버는 이 커맨드를 잘 받았다고 응답 해 주어야 합니다. ACK 커맨드는 20 바이트입니다. 패키지내에서 ACK 만 전송 된다면 리턴시 40바이트를 차지 하게 될 것입니다.

Photon Cloud: HexBytes

Enet 채널

Enet 채널은 연속적인 여러 개의 독립적인 command-sequences를 사용 할 수 있습니다.
단일 채널 에서는 모든 커맨드가 순차적으로 전송되고 해석됩니다. reliable 커맨드가 누락 되었다면 수신측에서는 변경사항을 받지 못하여 지연이 발생 됩니다.

만약 특정 이벤트(그리고 오퍼레이션)들이 서로 독립적이라면 분리된 채널에 넣을 수가 있습니다.
예: 채팅 방의 메시지는 reliable 이어야 하지만 메시지가 늦게 도착 하면 일시적으로 메시지가 누락된 것처럼 보이게 되므로 메시지의 순서를 변경하여 지연되지 않은 것처럼 보이게 하는 것 입니다.

Photon은 기본적으로 두 개의 채널이 있으며 제로 채널은 오페레이션을 전송하는 기본 채널 입니다. Join 오퍼레이션과 Leave 오퍼레이션은 항상 제로 채널로 전송(단순함을 위해)됩니다. "백그라운드" 채널 255가 있는데 연결과 연결해제 메시지를 위해서 내부적으로 사용됩니다.
채널 255는 채널 수에 포함되지 않습니다.

채널들은 우선순위가 있습니다: 채널 번호가 낮을 수록 우선순위가 높습니다.
높은 채널 번호에 있는 데이터는 UDP 패키지가 꽉 차 있으면 나중에 전송 됩니다.

오퍼레인션 내용 - 직렬화 타입

type (C#) 크기 [bytes] 설명
byte
2
8 bit
boolean
2
true 또는 false
short
3
16 bit
int
5
32 bit
long
9
64 bit
float
5
32 bit
double
9
64 bit
string
3 + size( UTF8.GetBytes(string) )
< short.MaxValue length
byte-array
5 + 1 * length
< int.MaxValue length
int-array
5 + 4 * length
< int.MaxValue length
array of <type>
4 + size(entries) - count(entries)
< short.MaxValue length
hashtable
3 + size(keys) + size(values)
< short.MaxValue pairs
operation parameters


2 + count(parameter-keys) + size(parameter-values)
< short.MaxValue pairs
해시 테이블의 특별한 케이스 - 아래 참조

클라이언트 측에서는 오퍼레이션 파라미터들과 값들이 해시테이블로 통합됩니다. 각 파라미터들은 바이트 키와 유사하며 오퍼레이션 요청들은 간결하고 "일반적인" 해시테이블 보다 적은 바이트를 사용 합니다.

오퍼레이션과 이벤트에 대한 결과들은 오퍼레이션 파라미터들이 인코드되는 방식과 동일 합니다. 오퍼레이션 결과는 다음 사항을 항상 포함 하고 있습니다:opCode, returnCode 와 디버그 문자열. 이벤트들은 다음을 항상 포함하고 있습니다:evCode,acorNr 와 event data 해시테이블.

Enet 커맨드

이름 크기 전송주체 설명
connect
44
클라이언트
신뢰, 연결 마다
연결 검증
44
서버
신뢰, 연결 마다
init message
57
클라이언트
신뢰, 연결마다 (어플리케이션 선택사항)
init 응답
19
서버
신뢰, init 마다
ping
12
둘다
신뢰, 주기별로 호출 됨 (아무것도 신뢰 할 수 없으면)
페치 타임스탬프
12
클라이언트
즉시 응답되는 ping
ack
20
둘다
비신뢰, 신뢰 명령어 마다
disconnect
12
둘다
신뢰, 타임아웃의 경우에 비신뢰가 될 수 있습니다
신뢰 전송
12 + 페이로드
둘다
신뢰, 오퍼레이션,응답 또는 이벤트를 가지고 갑니다
비신뢰 전송
16 + 페이로드
둘다
비신뢰, 오퍼레이션,응답 또는 이벤트를 가지고 갑니다
단편화
32 + payload
둘다
신뢰, 페이로드가 단일 데이터그램에 맞지 않을 때 사용 됩니다

UDP Packet 내용 - 헤더

이름 크기 [bytes] 설명
udp/ip
28 + size(optional headers)
IP + UDP 헤더.

선택적인 헤더들은 40 바이트 보다 작습니다.

enet 패킷 헤더
12
최대 byte.MaxValue 까지 명령어가 포함할 수 있습니다
(see above)
오퍼레이션 헤더
8
명령 내 (신뢰, 비신뢰 또는 단편화)
오퍼레이션 파라미터들이 들어 있습니다
(상기 참조)
Back to top