Tech Study/Network2024. 12. 10. 18:04

 

STUN Methods

TURN은 STUN의 확장이므로, ChannelData를 제외한 모든 기능은 STUN확장메소드로 제공

0x003 (Allocate)

0x004 (Refresh)

0x006 (Send)

0x007 (Data)

0x008 (CreatePermission)

0x009 (ChannelBind)

STUN Attributes

TURN 메시지에 쓰이는 속성들의 나열 (마찬가지로 STUN 확장 속성)

CHANNEL-NUMBER (0x000C)

채널 번호를 명시할 때 쓰임
4바이트 고정이며 첫 두바이트만 쓰이고, 나머지는 RFFU(Reserved For Future Use)로 0으로 채워야 함

LIFETIME (0x000D)

'할당'의 수명을 초 단위로 나타낸 속성. 크기는 4바이트.

XOR-PEER-ADDRESS (0x0012)

peer의 주소를 RFC8489의 XOR-MAPPED-ADDRESS와 동일한 형태로 저장/사용하는 속성
https://datatracker.ietf.org/doc/html/rfc8489#section-14.2

DATA (0x0013)

Send / Data 메소드가 이용될 때 전송/수신할 진짜 데이터가 기록된 속성
STUN과 마찬가지로 length가 4의 배수가 아니면 padding 발생

XOR-RELAYED-ADDRESS (0x0016)

TURN서버에서 릴레이를 위해 할당한 주소를 RFC8489의 XOR-MAPPED-ADDRESS와 동일한 형태로 저장/사용하는 속성

REQUESTED-ADDRESS-FAMILY (0x0017)

TURN서버에서 XOR-RELAYED-ADDRESS를 발급할 때 원하는 family로 발급 받길 원할 때 사용
4바이트 속성이며 첫 바이트만 사용되고, 나머지는 RFFU로 0으로 채워야 함
첫 바이트가 0x01이면 IPv4, 0x02이면 IPv6

EVEN-PORT (0x0018)

RTP 등 과거 프로토콜의 하위 호환성을 위한 속성
'Allocate'를 요청할 때 이 속성이 포함되면 짝수 포트를 할당해야 하고, 속성 값에 따라 추가 액션이 있음
속성 값은 1바이트이며 0번 비트(R비트)만 쓰이고, 나머지는 RFFU로 0으로 채워야 함
R비트가 1이면 할당한 짝수 포트의 다음 가장 작은 가용 포트를 예약해 둬야 함
STUN 속성은 모두 4의 배수이므로 3바이트가 무조건 패딩됨

REQUESTED-TRANSPORT (0x0019)

'할당'에서 사용할 프로토콜을 정의
4바이트이며, 첫 바이트(Protocol)만 이용하고 나머지는 RFFU로 0으로 채워야 함
Protocol 필드 값은 [PROTOCOL-NUMBERS]를 따름
Allocate 메소드에는 항상 포함되어야 하지만, 현재는 17(UDP)만 규격 범위임

DONT-FRAGMENT (0x001A)

UDP 이용 시 IP 헤더의 Flag 필드에 DF bit를 세팅할지 여부를 정하는 속성
속성 포함 유무로 flagging을 하므로 value length는 0

RESERVATION-TOKEN (0x0022)

서버에 기요청하여 예약된 주소를 받아올 때 사용하는 토큰 속성
길이는 8바이트이며 토큰이므로 내용은 중요하지 않음

ADDITIONAL-ADDRESS-FAMILY (0x8000)

'할당' 생성 시 IPv4 주소를 할당하면서 추가로 IPv6 주소도 생성하길 원할 때 사용
포맷은 REQUESTED-ADDRESS-FAMILY와 동일하나, IPv6 추가 요청 시에만 사용하므로 무조건 0x02만 설정 가능

ADDRESS-ERROR-CODE (0x8001)

'할당'은 성공 했으나 특정 주소 family의 바인딩이 실패했을 때 그 사유를 담기 위한 속성
[RFC8489 - ERROR-CODE ]와 한가지를 빼고 동일
다른 한가지는 -> Reserved 필드의 첫 8비트를 Family 필드로 전용 (0x01 IPv4, 0x02 IPv6)

ICMP (0x8004)

서버에서 UDP 데이터가 전송되지 못하고 ICMP 에러를 받았을 때, 클라이언트에 알려주기 위한 속성
8바이트로 구성되어 있고 순서대로 아래의 포맷임
16비트 : Reserved
7비트 : ICMP Type
9비트 : ICMP Code
32비트 : Error Data
next-hop의 MTU 사이즈를 기재하기 위한 필드
MTU 기재하는 경우
 - ICMPv6 type/code -> 2/4
 - ICMPv4 type/code -> 3/4
그 외에는 0으로 채워야 함

STUN Error Response Codes

'할당' 섹션 참조

Posted by JMAN