C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[22095] Re:SNMP 프로토콜 구현...
빌더(TWx) [builder] 6218 읽음    2012-11-16 19:46
카라얀 님이 쓰신 글 :
: SNMP 프로토콜에 대해서 잘알고 있거나 구현해보신 분 계신가요.
: RFC 파일 다운 받아 읽어봐도 감을 못잡겠습니다 ㅡㅡ 원거리에 몇개씩 설치되어있는 장비인데요.
:
: 엔터프라이즈 OID로 1.3.6.1.4.1.56789를 쓰고, WarmStart 값으로 1, Specific 값으로 0x3963 을 사용해서 TCP로 SNMP 패킷을 조합해서 보내주면 장비가 리부트 하게 되있으니까, 패킷을 조합해서 전송하는 코드를 구현하라는 지시가 떨어졌는데 어떤 식으로 패킷을 조합해서 보내야 할지 전혀 감을 못 잡고있습니다. 네트웍 프로토콜 잘 아시는 분 도와주세요. ㅜㅜ
:
: OID 가 잘못 적혔네요. 정확하게 1.3.6.1.4.1.56789.129 이고, 커뮤니티는 'DPass1567Environment' 입니다.





답변)



SNMP 프로토콜 레벨에서 패킷을 처리하는 방법을 물으셨는데...

질문에서 요구되는 조건을 만족하기 위해선... Sequence 형식으로 SNMP 패킷을 조합해서 보내야 합니다...


그리고 하나의 Sequence 블럭은...


SEQUENCE 임을 나타내는 Sequence Signature(0x30), Version Number, Community Octet, PDU Chunk 로 구성되게 됩니다...

여기서 PDU Chunk 는... OID, IP Address, Generic Type, Specific Type, Time Stamp 로 세분화 되게 됩니다....



SNMP 프로토콜 레벨에서 각기 Chunk의 패킷 구조를 살펴 보면...




OID 처리 부터 살펴 보죠...



1.3.6.1.4.1.56789.129

위와 같은 OID가 있다고 할 때... 1과 3을 각기의 바이트 형태 그대로 보내지 않고..

처음 두개의 OID 넘버는.. (1 * 40) + 3 = 43(0x2B) 식으로...

첫번째 값에 40을 곱하고, 두번째 값을 더해서 보내게 되는데..


Root(1) 로 시작하는 OID 넘버에서 앞 부분은 작은 수로 시작하기 때문에...

위와 같은 식으로 처리하면 전송되는 패킷을 한바이트로 줄일 수 있기 때문 입니다..


앞부분 두개를 제외한 나머지는 7bit 형식으로 묶는 방식으로 패킷을 조합하게 됩니다.

위에서... 6, 4 같은 경우는 그값 그대로 사용하면 되지만...


예를 들어서 ...

1.3.1.4.1.311 과 같은 OID가 있다고 할 때....

311의 경우 Hex 값으로 표현하면 값이 0x0137 이죠..


이 경우...

Leftmost 값인 0x01 의 최상위 비트를 1로 하고... Rightmost 값인 0x37의 최상위 비트는 무시한 후...

Leftmost 값의 하위 4비트 Nibble을 왼쪽으로 1비트씩 쉬프트 해서 패킷을 7비트 형식으로 표현하게 됩니다.

결과 값은 0x8237 이 됩니다.



위와 같은 방식을 적용하게 되면...


'1.3.6.1.4.1.56789.129' OID의 변환된 패킷 형태는 

'2B 06 01 04 01 83 BB 55 81 01' 이 됩니다 (Hex 값) 10개 (0x0A)


여기에 OID 데이타 타입을 나타내는 Signature 로 0x06 이 사용되고...

Length 값인 10 이 하나로 묶여서 SNMP OID 패킷형태의 Chunk 가 완성되어야 하므로 전체적인 값은...

'06 0A 2B 06 01 04 01 83 BB 55 81 01' (Hex 값) 이 됩니다.





IP Address의 경우...


Agent로 패킷을 보내는 쪽의 IP가 "192.168.123.124"라고 가정할 때...

Hex 값으로 표현하면.. 'C0 A8 7B 7C'이니까...

IP 어드레스임을 나타내는 Signature(40)과 Lengh(04)를 포함해서 표현하면..

'40 04 C0 A8 7B 7C'로 하나의 Chunk 단위 패킷이 완성 됩니다.

IP Address의 경우... Multi Session Agent를 구현할 때... 이용 되기도 합니다..



Community 의 경우...


"DPass1567Environment" 를 Hex로 표현하면...

'44 50 61 73 73 31 35 36 37 45 6E 76 69 72 6F 6E 6D 65 6E 74' 입니다 (20개 0x14)

Community 의 데이타 타입임을 나타내는 Octet의 Signature(04)와 Lengh(14)를 포함해서...

하나의 Chunk 로 표현하면...

'04 14 44 50 61 73 73 31 35 36 37 45 6E 76 69 72 6F 6E 6D 65 6E 74'가 됩니다...




Time Stamp 의 경우...

10 mSec 단위의 시스템 경과 시간을 나타내는 Stamp로 사용되는데... 0 이라고 가정한다면..

TimeStamp의 Signature인 '43'과 Length(1), 값(0) 을 하나의 Chunk 로 묶어서 표현할 경우...

'43 01 00' 이 되겠죠... 컴으로 부터 시스템 경과 시간을 알아내서 Time Stamp로 쓸 경우...

값을 보정해서 처리해주면 됩니다...



그리고...

질문 내용을 보면...

WarmStart 값과... Specific 값... 둘다 언급하고 있는데...


Agent를 구현할 때...

Generic Type(WarmStar)이 사용되면... Specific Type은 정의를 하지 않고 사용하거나...

또는.. Specific Type을 사용하면 Generic Type를 정의하지 않고 사용하는 게 일반적인

구현 방법 입니다..

따라서... Generic Type(WarmStar)만 사용하던가.. 아니면 Specific Type만 사용하든가

하는 식으로 둘중에 하나의 방법을 선택해야 합니다...



Sub Chunk 단위를 하나의 Sequence 로 패킷을 조합해서 전송해야 하므로...

위에서 구한 각기 Chunk 단위의 패킷들을... 묶어서...

Sequence Signature(30) + Length + PDU Chunk + Sequnce Signature(30) 형태로 패킷을 조합하면...


1. Generic Type(WarmStar)을 사용할 때의 전체 패킷구조는...


30 38 02 01  00 04 14 44  50 61 73 73  31 35 36 37 

45 6E 76 69  72 6F 6E 6D  65 6E 74 A4  1D 06 0A 2B

06 01 04 01  83 BB 55 81  01 40 04 C0  A8 7B 7C 02

01 01 02 01  00 43 01 00  30 00


으로 되어야 하고...



2. Specific Type(0x3963)을 사용할 때는... Specific Type Signature(6) 과 함께 패킷이 조합되어야

하므로 전체 패킷 구조는...



30 39 02 01  00 04 14 44  50 61 73 73  31 35 36 37

45 6E 76 69  72 6F 6E 6D  65 6E 74 A4  1E 06 0A 2B

06 01 04 01  83 BB 51 81  01 40 04 C0  A8 7B 7C 02

01 06 02 02  39 63 43 01  00 30 00


으로 되어야 합니다...



각기 Chunk 단위의 Length 는 128(0x80)이 넘는 경우... 최상위 비트를 1로 한 상태에서...

나머지 비트스트림을 길이로 표현하는...Long Form 형식의 변환 방법은 간단하니까 생략 합니다...


그리고...

SNMP 프로토콜을 구현할 때... 보통 UDP 방식이 많이 사용되기는 하지만, SNMP 프로토콜 스펙에서

반드시 UDP 를 사용해야 한다고 강제하고 있지 않기 때문에... TCP 방식이 사용될 수도 있습니다...

TCP를 사용하든 아니면 UDP를 사용하든 상관 없습니다... Agent가 TCP로 구현되어 있으면...

패킷을 보낼 때... TCP로 보내면 그만인 거죠...


v3 레벨도 구현해야 한다면... 암호화 처리를 위한 DES 알고리즘도 구현해야 하고..

SNMP 프로토콜 수준에서 Agent 를 구현하기 위해선... 프로토콜 전반에 대해서 세부적으로 숙지하고 있어야 합니다...






...
카라얀 [lovekorea]   2012-11-16 20:48 X
역시 볼랜드포럼 최강 고수이신 빌더님께서 답변해주시네요. 감사합니다 ^^
카라얀 [lovekorea]   2012-11-16 20:50 X
패킷구조를 자세하게 설명해주셔서 이제 감을 좀 잡히는거 같습니다. 타임스탬프 값을 시스템 타임으로 보정해주면 된다고 설명해주셨는데요. 이 부분이 아직 감이 안옵니다. 어떤 식으로 보정을 해야한다는건지 잘 모르겠습니다. ^^;;;;
카라얀 [lovekorea]   2012-11-16 21:17 X
아 ~~ 마지막 부분, 전체 조합된 패킷에서 패킷이 밀린건가요? 숫자가 붙어있어서요.
빌더(TWx) [builder]   2012-11-16 21:51 X
수치 값이 붙어있었네요... 본문 수정했습니다...
부팅이 요구되는 Emergency 상황에서 Time Stamp 값이 엄밀하게 정의되어 있을 필요는 없습니다...
굳이 정의 해서 보내겠다면... 시스템 타임을 읽어서... 1/100 sec 단위로 보정해서 보내주면 된다는 의미 입니다...
빌더(TWx) [builder]   2012-11-16 21:54 X
만약 1/100sec 단위인 Time Stamp 값을 1000으로 보낸다면...
0으로 했을 때의 ... '43 01 00' 이 아닌... '43 02 03 E8'으로 패킷을 만들어서 보내면 되겠죠...
카라얀 [lovekorea]   2012-11-17 18:16 X
하나 더 여쭙니다. generic 타입 이용할 때하고, specific 타입 이용할 때요. 세번째 줄 패킷에서 C0  A8 7B 7C 가 아이피 어드레스인것과 43 01 00 이 타임스템프인건 알겠는데요. generic 타입일 때는 02 01 01 02 01  00 가 되고, specific 타입일 때는 02 01 06 02 02  39 63 이라고 하셧는데요. 이 부분이 정확하게 이해가 되지 않습니다.
카라얀 [lovekorea]   2012-11-17 18:20 X
02 01 01 02 01 00 에서 02 01 01 이면 될거 같은데,  02 01 00 이 다시 나오는 거도 그렇구요
빌더(TWx) [builder]   2012-11-19 13:28 X
SNMP 프로토콜에서... Generic 으로 사용될 때도... Specific 필드는 더미로라도 있어야 합니다...
따라서... Generic으로 사용할 경우... 정수를 나타내는 Signature(2), Lenght(1), WarmStart 값(1)..과..
더미로 사용된... Specific 값(0)... 정수 Signature(2), Lenght(1), Specific 값(0) 이 묶여서 패킷이 구성되어야 합니다...
빌더(TWx) [builder]   2012-11-19 13:32 X
Specific Type으로 사용할 경우에는...
정수 Signature(2), Length(1), Specific Type(6) 과... 정수 Signature(2), Lenght(2), Specific 값(39, 63) ..으로 패킷이 구성되어야 하죠...

Genric Type과 Specific Type은 각기 옵션으로 사용될 수 있는 필드가 아니고... 두개의 필드 다.. mandatory 입니다...
빌더(TWx) [builder]   2012-11-19 14:54 X
SNMP Aget 에서 패킷을 파싱할 때... Generic Type이 Specific Type(6)으로 되어 있지 않으면...
Specific Type에 해당하는 데이타 값을... 무시해서 처리한다는 거죠...
카라얀 [lovekorea]   2012-11-19 17:47 X
빌더님 감사합니다 ^^ 언제 기회되면 제가 크게 한턱 쏘겠습니다 ^_^

+ -

관련 글 리스트
22089 SNMP 프로토콜 구현해보신 분~ 카라얀 5202 2012/11/15
22095     Re:SNMP 프로토콜 구현... 빌더(TWx) 6218 2012/11/16
22100         감사합니다 ^^ 빌더님 도움으로 일을 마쳤습니다 ^^ 카라얀 4686 2012/11/19
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.