본문 바로가기
Programming/ASN.1

ASN.1 정리 ㄱㄱ

by Pendine 2021. 9. 30.
728x90
| E | Send(**.**.***.***) : [305E800101815530538000810101820100A300A447A245800C544553545F434C49454E5400810C544553545F534552564552008209746573745F757365728309746573745F70617373A4040602510185012886010A8701018802100082028E80] | ASNPacketCodec  
| D | [(36 | 0-36)30 22 80 01 01 81 19 30 17 80 00 81 01 00 82 01 01 A3 00 A4 0B A9 09 80 01 01 A1 04 80 02 51 01 82 02 A3 3E ] | ASNPacketCodec  
| received Packet | 3022800101811930178000810100820101A300A40BA909800101A104800251018202A33E | ASNPacketCodec  
| D | Datex Data(c2c) Hex | 30178000810100820101A300A40BA909800101A10480025101 | ASNPacketCodec  
| D | C2C | C2C | 0x | DXP(0) | PDU(accept | 9) | ASNPacketCodec

보기만해도 아찔해지는 구조

 

대충 인코딩 디코딩할때

오브젝트 시스템즈의 프로그램과 해당 프로그램이 돌아가는 컴퓨터별 라이센스가 필요하다

(https://www.obj-sys.com/)

 

참고했던 사이트

https://luca.ntop.org/Teaching/Appunti/asn1.html

 

==========================================

겪었던 오류 사항 원인

 

1. 일단 ASN.1 통신할때 난감했던게 asn.1 파일이 달랐던것.

이부분은 크게 설명하지 않지만 어쨋든 무난하게 해결하여 다시 asn.1파일을 컴파일하였음.

-----------------------------------------------------------------------

 

2. 허겁지겁 만든 디코딩 뷰어가 역시 제대로 작동안함.

 asn.1 에서 사용하는 태그나 길이 설정이 어떻게 되는지 정확하게 알아보지도 않고 만들어버렸기 때문에 발생한 상황. 

어쨌거나 저쨋거나 별로 도움안될거라 예상했기 때문에 손디코딩 했음.

-----------------------------------------------------------------------

 

3. 사용해야하는 라이브러리 사용 미숙. (핵심적인 이유)

 3-1. 데이터의 유형은 비어있지 않지만 길이를 0으로 설정해서 전송해야함.

연결 유지를 위해서는 Fred 패킷을 송수신해줘야하는데 이건 클라이언트에서는 큰 할일이 아니었으니 문제가 아니었음

하지만 이부분을 간과해서 내가 서버로부터 응답을 받았을때 ACK패킷에 해당하는 데이터를 송신해줘야함.

분명히 null을 넣어주고 실행할때만 해도 아무런 오류가 없는데, 응답전송을 수행할때만 그냥 아무런 동작을 안함.

패킷을 송신하는 로그도 안보이고 와이어샤크로 확인해봐도 안보임.

asn.1통신을 위해 사용하는 라이브러리 숙련도 미숙으로 인해서 asn.1 라이브러리에서 asn.1 에 맞는 null객체를 사용해야 했으나 이걸 몰라 그냥 null을 사용하였기 때문에 '어? 맞는데 왜 안되냐?' 라는 현상으로 인해 테스트 기간이 좀 길어졌다.

 

 

 3-2. 데이터를 송수신할때 사용하는 PDU, Datex 구분 : 프로그램과 문서의 차이.

( 내가 갖고있는 ASN.1 파일과 라이브러리에서 ASN.1 메시지생성시의 차이점...

  두괄식으로 줄이고싶은데 못줄이겟음. 어휘력이 부족하다.. )

데이터를 송수신 할때 pdu를 확인하고 datex를 확인하는데

pdu부분을 확인할때 받는 데이터가 두종류로 Accept, Publication 으로 두개가 있었는데

Accept => 서버가 클라이언트의 요청한 정보를 제대로 수신했음을 확인함

Publication => 서버가 클라이언트에서 요청한 정보를 전달함.

Subscription => 클라이언트가 서버에 대해 정보를 요청함.

 클라이언트가 정보 요청을 할때 일련의 과정.

1) 클라이언트가 서버로 정보를 요청하고

2) 서버는 요청받은 정보에 대해서 응답을 한 뒤,

3) 클라이언트는 서버에게 받은 정보가 중간에 깨지진 않았는지 검증하고 정확하면 Ack , 부정확하거나 요청한 정보에 대해서 수신된 결과가 일정시간 초과하면 Nck를 송신한다.

4) 서버는 클라이언트의 수신 상황을 확인한다.

 

Publication 에 관련된 정보는 어떤 정보를 요청했느냐에 따라 각 정보별 구조에 따른 응답을 해주기 때문에

각 요청 정보별 디코딩시 오류가 발생한다면 오류원인을 찾기위해 손으로 잘라줘야함.

손 디코딩시 디코딩 속도가 느려지는 이유는 일정 길이 단위로 패킷을 자르는게 아니라서

같은 정보를 요청을 한다고 해도 값이 달라질경우 

전체 길이가 달라질수 있고

전체 길이가 달라진다면 손디코딩으로 일정 길이로 대강대강 잘라 확인하면 오류가 발생할 수 있기 때문이다.

 

그리고 단순한 응답 송수신이라면 문제 없었는데 

응답 송수신때 정보가 너무많이 필요하고 asn.1 파일 구조에 맞게끔 만들어주는 메시지를 만들때 너무나도 많은 인,디코딩 클래스들이 필요하며 라이브러리에 정의된 객체들이 asn.1 구조에 맞게끔 만들어주기위해서는 여러 단계를 거쳐야하기 때문에 메시지가 제대로 생성이 안되거나 오류가 발생했음.

각 패킷별 번호,

요청시 필요한 정보( 위에서도 서술했듯 값이 들어있지 않아야한다면 asn에 맞는 null 객체 삽입등 라이브러리 사용시 필요한 정보) ,

이 패킷의 생명주기,

패킷의 우선순위

등등... 

적고보니 이것도 asn 규약을 몰라서 그런것같다.

 

-----------------------------------------------------------------------

 

4. asn.1 규약 미숙달 (디코딩 뷰어 관련)

이건 근데 내잘못인지 잘 모르겠음.

프로토콜 계속 검색하다보니 관련 서적? 규약? 같은게 나와서 구매해서 보려니 유로가격을 환전해보니 가격이 무시할 수준이 아니라서 쉽게 살 생각도 안들고

이거 어째 느낌이 다 죽어가는 프로토콜 같은 것 같은데.. 라는 느낌도 들어서 걍 이미 개발되있는거에서 뭐 어찌어찌 잘해보면 돼겠지 했었는데... 

태그값이 뭐냐에 따라서 이 부분의 데이터가 어떤건지 정확하게 설명이 되있는게 없음.

다 어딜봐도 뭐 뭉뚱그려서 설명 대강대강 하고 끝임

ITU 가서 확인해도 asn.1 파일의 구조만 설명하지 정확한 패킷 내용은 잘 못찾겠음.

어떤 비트로 유니버셜인지 아닌지 확인하는거 알았던것같은데

잠깐 다른 프로그램 만든다고 두어달 안보니 다 까먹은것같음.

이 데이터가 정수인지 문자인지 실수인지 어캐 구분하는지 명확하게 정리된게 있었나. 전혀 없어서 계속 찾다가 그냥 라이브러리에서 결과 나온다고 마무리 했던 것 같은데

지금 굳이 다시 해보라고 한다면 asn.1에 관련된 정보들을 대체로 수집해야함

길이를 만드는 방법은 파악햇으니 하다못해 태그관련 정보라도.

 

728x90

'Programming > ASN.1' 카테고리의 다른 글

ASN 패킷 BER 디코딩 뷰어 개편2  (0) 2021.12.16
ASN 패킷 BER 디코딩 뷰어 개편  (1) 2021.11.02
DSRC 분석중  (0) 2021.06.30
ASN.1 BER 허겁지겁 만든 디코딩 뷰어  (1) 2021.05.25
ASN.1  (0) 2021.05.07

댓글