인터넷프로토콜 5 장 데이터송수신
목차 제 5 장데이터의송수신 5.1 정수인코딩 5.2 메시지생성, 프레이밍, 그리고파싱 5.3 마무리
5.1 정수인코딩 정수의크기 보내려는정수의크기를미리결정해야 TestSizes.c 바이트순서화 Big-endian Little-endian 부호화와부호확장 signed 와 unsigned Bruteforcecoding.c
TCP/IP 바이트전송 TCP/IP 프로토콜은바이트 (bytes) 를전송함 응용프로그램끼리의미를부여할뿐, TCP/IP 는단지단위데이터를전송 택배기사는내용물에큰의미를부여하지않으며단지택배박스를원하는곳으로전달할뿐 Application Application byte stream TCP/IP Here are some bytes. I don t know what they mean. byte stream TCP/IP I ll pass these to the app. It knows what to do.
전송데이터의자료형 (1) 문자열 (String) 전송 : 가변길이전송 장점 사람이읽기쉬움 메시지의확장이용이하며무제한 단점 전송량대비전송내용비효율, 수신루틴비효율, 연산비효율 상호협의할내용 문자코드페이지 ASCII, Unicode, UTF 메시지경계구분 ( 프레이밍 : framing) 길이명시방식 : 전송할문자열의크기를고정크기의자료형에담아서전송. 수신자는크기를미리파악하고정확한문자열만큼수신구분자방식 : 널문자혹은임의의문자를메시지의경계에삽입. 수신자는바이트단위로읽다가구분자가나오면메시지의끝으로확인
전송데이터의자료형 (2) 문자열 (String) 전송 숫자전송의예 49 55 57 57 56 55 48 10 1 7 9 9 8 7 0 \n 문자전송의예 0 77 0 111 0 109 0 10 M o m \n 3 77 111 109
문자열전송의예 (TCP) char string[strbuffsize]; send(sock, string, strbuffsize, 0) 주의점 : 버퍼의크기 TCP 는운영체제에의존적인 TCP 버퍼가있으며이보다작은크기로 send() 를호출해야한다.
전송데이터의자료형 정수형 (Integer) 의전송 기본자료형의단위로전송 2바이트, 4바이트단위의전송 주의사항 2바이트이상의데이터전송간에는항상네트워크바이트순서로전송해야함 1바이트교환은의미가없음 Network byte order (Big-Endian) - 다중바이트의메시지교환에필수 - 호스트바이트-네트워크바이트변환함수들 htonl(), htons(), ntohl(), ntohs() Little-Endian 0 0 92 246 23,798 Big-Endian 246 92 0 0
정수자료형전송의예 (TCP) int data; send(sock, &data, sizeof(data), 0) short, long, double, char 도동일한방식으로처리
정수인코딩을직접해보자 BruteForceCoding.c byte ordering signedness 각함수들내용이해
TCP 소켓을스트림으로포장하기 FILE stream FILE *fdopen( ) int fclose( ) int fflush( ) size_t fwrite( ) size_t fread( )
구조체오버레이 : 정렬과채우기 실제로구조체가어떻게구현되는지이해필요 struct addressinfo { uint16_t streetaddress; int16_t aptnumber; uint32_t postalcode; } addrinfo; streetaddress aptnumber postalcode struct integermessage2 { uint8_t onebyte; uint8_t padding; uint16_t twobytes; uint32_t fourbytes; uint64_t eightbytes; }; alignment 를위해필요한 padding 이해 struct integermessage { uint8_t onebyte; uint16_t twobytes; uint32_t fourbytes; uint64_t eightbytes; }; 구조체와메모리할당이해 최대한정렬 2 바이트이상인경우시작주소는항상 2 로나누어져야한다
old-fashioned text ASCII 문자열과텍스트 internationalizable code C99 extensions wchar_t size_t wcstombs( ) size_t mbstowcs( )
비트조작 : 참, 거짓값의인코딩 C 언어의 bitwise 연산자이해필요 << >> & ~
Voting Protocol UDP 로구현시 TCP 로구현시 5.2 Constructing, Framing, and Parsing 하나의메시지크기 ( 경계 ) 를어떻게판단할것인가하는문제존재 방법 1: delimiter-based 방법 2: Explicit length Text-based Message Encoding Binary Message Encoding
메시지구성 (Message Composition) 메시지구성이란? 응용프로그램끼리의미있는데이터교환을위한형식정의 응용프로토콜과같은의미 일반적으로프로토콜헤더 + 데이터로구성 프로토콜 ( 메시지 ) 필드란? 메시지내부에서단위의미를가지는데이터영역 예 ) 파일전송을위한메시지구성 파일을상대방에게전송하기위해서는파일내용도중요하지만파일이름, 크기등과같은파일특성도전달이되어야함 파일전송을위한프로토콜헤더구성 아래와같은 3 개의필드로구성이가능 ( 정의에따라고정혹은가변크기 ) 파일이름, 파일크기, 파일퍼미션 파일전송을위한프로토콜데이터구성 파일의내용 ( 항상가변 )
메시지구성 (Message Composition) 고정길이필드 정수형자료형으로구성 메시지처리가쉬우며일반적으로크기가작음 가변길이필드 문자열로구성 Human-readable 하며확장성이좋으나처리가불편하고크기가클수있음 고정길이필드 integer short short 가변길이필드 M i k e 1 2 \n
메시지구성을위한자료형정의 구조체사용이바람직함 struct file_header { int filesize; char filename[256]; } sndfilehdr; send(sock, &sndfilehdr, sizeof(sndfilehdr), 0) 저지르기쉬운실수 구조체내부의포인터변수 값을전달해야지위치를전달하는것은무의미 패딩, 정렬문제 항상은아니지만가끔일어나며디버깅어렵게함
struct tst { short x; int y; short z }; 채우기 (padding) 의문제 x [pad] y z [pad] 시스템은내부정렬규칙에따라채우기를수행 해결방법 구조체멤버를재배치 명시적인강제채우기
파일전송메시지구성예제 ( 고정크기메시지 ) 전송방식 : 고정크기 ( 바이너리전송 ) 필요한전송정보 파일이름 ( 최대 255 자 => 255byte 의메모리공간필요 ) 파일크기 (4byte 의경우최대 4GB 크기의파일처리가능 ) 파일내용 ( 가변길이, 0~4GB 크기 ) 메시지구성 FileName (255bytes) FileSize (4bytes) Filecontents (0~4GB) 메시지헤더 메시지데이터 struct msghdr { char filename[255]; unsigned int filesize; }
파일전송메시지구성예제 ( 문자열메시지 ) 전송방식 : 가변길이 ( 문자열전송방식 ) 필요한전송정보 구분자 (!$ : 임의로결정, 단파일이름이나길이에나오지않아야함 ) 파일이름 ( 크기제한없음, 필드의크기는파일이름에따라가변 ) 파일크기 ( 크기제한없음, 필드의크기는파일크기에따라가변 ) 파일내용 ( 가변길이, 0~4GB 크기 ) 메시지구성 (255bytes 의 helloworld.c 를전송할경우 ) Helloworld.c!$255!$ Filecontents (0~4GB) 메시지헤더 메시지데이터
파일내용의전송 파일크기가소켓버퍼의크기보다크므로아래와같이순차적전송 #define BUFSIZE 1024 char filebuf[bufsize]; fp = fopen( test.txt", "r"); if(fp == NULL) DieWithError ("File open error"); while(1){ len=fread(filebuf, sizeof(char), BUFSIZE, fp); send(sock, filebuf, len, 0); if(feof(fp)) break; }
파일내용의수신 #define BUFSIZE 1024 char filebuf[bufsize]; recvfilesize=0; fp = fopen( test.txt", w"); if(fp == NULL) DieWithError ("File open error"); while(origfilesize>recvfilesize) { } if ((recvmsgsize = recv(clntsock,filebuf,bufsize, 0)) < 0) DieWithError("recv() failed"); recvfilesize+=recvmsgsize; fwrite(filebuf, sizeof(char), BUFSIZE, fp);
과제 기존에코프로그램을수정하여다음의기능을가지는프로그램을작성하라 클라이언트 : 클라이언트명령어의두번째인자를에코문자열대신파일이름으로받아들여파일을서버에전송하라 Ex) FileClient lily.mmu.ac.kr test.txt 5000 서버 : 해당파일은서버의실행파일이존재하는디렉토리에동일한이름으로저장되도록한다.
좀더복잡한메시지구성
파일전송의예 메시지구성 char FileName[256]; int FileSize; char FileBuffer[1024]; Server FileName FileSize File Contents Client recv(clntsock, FileName, 256, 0) recv(clntsock, FileSize, 4, 0) while(notrecvfullfile()) { recv(sock, FileBuffer, 1024,0) } send(sock, FileName, 256, 0) send(sock, FileSize, 4, 0) while(feof(fd)) { Send(sock, FileBuffer, 1024,0) }
에코와파일전송을모두지원하는 상황 프로토콜 클라이언트는서버에게 string 혹은파일을업로드할수있다. 서버는 string 을받을경우 echo 를해주고파일을받을경우, 디스크에저장을한후잘받았다는메시지를 (acknowledge) 회신한다 클라이언트는 echo 메시지를수신한경우,echo 메시지를출력하고, file ack 를받을경우 file ack 를출력한다 예 client lily.mmu.ac.kr upload test.txt 5000 // 파일전송 client lily.mmu.ac.kr echo hello 5000 // 에코메시지
메시지 ( 프로토콜 ) 설계 서버와클라이언트는동일프로그램으로두개의다른상황을모두만족해야함 EchoString File Upload string Server Client Echostring FileName FileSize File Contents Server Client 서버의입장에서클라이언트의서비스요청이 MsgType 에코요청인지파일업로드인지구분할수있는방법은? 서비스타입 ( 에코요청, 파일업로드 ) 필드를준비하고클라이언트를이를통해서버에게서비스종류를알림
바이너리프로토콜설계 /* Message Type */ #define EchoReq 01 #define FileUpReq 02 #define EchoRep 11 #define FileAck 12 char MsgType; EchoString Server MsgType string Echostring MsgType Client MsgType FileName FileSize File Contents Server File Upload MsgType Client
클라이언트핵심코드 ( 바이너리프로토콜 ) /* Message Type */ #define EchoReq 01 #define FileUpReq 02 #define EchoRep 11 #define FileAck 12 char MsgType; char * operation; //client 203.252.164.144 upload test.txt 5000 operation=argv[2] If (!strcmp(operation, upload )) MsgType=FileUpReq send(sock, &MsgType, 1,0) else if (!strcmp(operation, echo )) MsgType=EchoReq send(sock, &MsgType,1,0) else { } MsgType MsgType FileName FileSize File Contents string fprintf(stderr, "Usage: %s <Server IP> <operation><operand> <Echo Port>\n", argv[0]); exit(1);
/* Message Type */ #define EchoReq 01 #define FileUpReq 02 #define EchoRep 11 #define FileAck 12 char MsgType; recv(clntsock, &MsgType,1,0) 서버핵심코드 ( 바이너리프로토콜 ) if (MsgType==FileUpReq) { recv(clntsock, FileName, MsgType=FileAck; send(clntsock, &MsgType, 1,0); } else if(msgtype==echoreq) { recv(clntsock, EchoString, MsgType=EchoRep; send(clntsock, EchoString, ); } else fprintf(stderr, Bad request ) MsgType MsgType FileName FileSize File Contents string
문자열프로토콜설계 /* Message Type */ #define EchoReq #define FileUpReq #define EchoRep #define FileAck char MsgType[10]; EchoReq FileUpReq EchoRep FileAck EchoString Server MsgType string Echostring MsgType Client Server File Upload MsgType FileName FileSize File Contents MsgType Client
클라이언트핵심코드 ( 문자열프로토콜 ) /* Message Type */ #define EchoReq EchoReq #define FileUpReq FileUpReq #define EchoRep EchoRep #define FileAck FileAck #define Delimeter char msgtype[10]; char * operation; //client 203.252.164.144 upload test.txt 5000 operation=argv[2] If (!strcmp(operation, upload )) strcpy(msgtype, FileUpReq); send(sock, msgtype, strlen(msgtype),0) MsgType else if (!strcmp(operation, echo )) strcpy(msgtype, EchoReq); send(sock, msgtype,strlen(msgtype,0) else { fprintf(stderr, "Usage: %s <Server IP> <operation><operand> <Echo Port>\n", argv[0]); exit(1); } MsgType FileName FileSize File Contents string
서버핵심코드 ( 문자열프로토콜 ) /* Message Type */ #define EchoReq EchoReq #define FileUpReq FileUpReq #define EchoRep EchoRep #define FileAck FileAck #define Delimeter char msgtype[10], recvchar; int i=0; while(i<10) { recvchar=recv(clntsock, msgtype[i],sizeof(char),0); if (msgtype[i]==delimeter) break; } if (!(strcmp(msgtype,filereq)) { recv(clntsock, FileName, strcpy(msgtype,fileack); send(clntsock, msgtype, strlen(msgtype),0); } else if(!(strcmp(msgtype, EchoReq)) { recv(clntsock, EchoString, strcpy(msgtype,echorep);; send(clntsock, msgtype, strlen(msgtytpe),0); } else fprintf(stderr, Bad request ) MsgType MsgType FileName FileSize File Contents string
ASN.1 소개 (1) a machine independent data description language CCITT (X.208) and ISO (ISO 8824) standard define abstract syntax of application data define the structure of application and presentation protocol data units (PDUs) define SNMP, VOIP and IEC61850 MMS
ASN.1 소개 (2) User User Local storage (e.g, MIB) user presentation mapping user presentation mapping Local storage (e.g, MIB) local mapping Application component Abstract Syntax (e.g., ASN.1) Application component local mapping encoding rules encoding rules data transfer component (e.g, TCP, OSI session) Transfer Syntax (e.g., BER) data transfer component (e.g, TCP, OSI session)
ASN.1 소개 (3) Application Entity 에대한규격표현에주로사용 Application Entity 정보의의미 (sematics) 에만의미를두고정보의표현형식 (syntax) 에는무관함 추상구문을기술하기위한기법 Application/Presentation Layer PDU(Protocol Data Unit) 표현 다양한인터페이스나통신매체를통하여전송되어야할정보를기술하기위한 INL(Interface Notation Language) 로사용
ASN.1 소개 (4) 다양한데이터타입들의표현 BOOLEAN INTEGER BIT STRING OCTET STRING NULL REAL SEQUENCE SEQUENCE OF GeneralizedTime IA5String BMPString UTF8String ENUMERATED
BER(Basic Encoding Rules)(1) BER 은전송되는데이터가어떻게인코딩되어야하는지를기술 기기특성, 프로그래밍언어, 에플리케이션표현방법과독립적 Age ::= INTEGER (0..7) firstgrade Age ::= 6 Application 1 02 01 06 Application 2 Value Length Tag } 전체 24 bits
BER(2) CCITT (X.209) and ISO (ISO 8825) standard based on the use of a type-length-value (TLV) structure Type Length Value
PER-Packed Encoding Rules BER 과마찬가지로전송되는데이터가기기의종류, 프로그래밍언어, 어플리케이션프로그램의표현방법과는독립적으로어떻게인코드되어야하는지를기술 BER 과는달리기본적으로태그는전송안됨그리고 length 와 value 가종단간에이미약속이되어있다면전송되지않음 PER 은전송시대역폭을보다적게사용하기위한목적으로정의되었으며, 소리와영상을전송하는인터넷, 공중파통신과같이대역폭이중요한곳이라면어느곳이라도유용하게사용 Age ::= INTEGER (0..7) firstgrade Age ::= 6 Application 1 110 Application 2 total length of 3 bits
XER-XML Encoding Rules BER, PER 과마찬가지로, 전송하기위한데이터의장치의종류, 프로그래밍언어또는어플리케이션프로그램의표현에대해독립적 축소된규칙과는달리곧바로읽기쉽다. 좀더읽기쉽게하는데목적이있다. 추가대역폭을필요로한다. BCN 등대규모대역폭을갖는환경에적합하다. Age ::= INTEGER (0..7) firstgrade Age ::= 6 Application 1 <Age>6</Age> Application 2 total length of 12 octets
ASN.1/ 인코딩규칙표준문서 ITU-T Rec. X.680 ISO/IEC 8824-1 - Basic ASN.1 Notation ITU-T Rec. X.681 ISO/IEC 8824-2 - Information Object Classes ITU-T Rec. X.682 ISO/IEC 8824-3 - Constraints ITU-T Rec. X.683 ISO/IEC 8824-4 - Parameterization ITU-T Rec. X.690 ISO/IEC 8825-1 Basic Encoding Rules (BER) Canonical Encoding Rules (CER) Distinguished Encoding Rules (DER) ITU-T Rec. X.691 ISO/IEC 8825-2 Packed Encoding Rules (PER)
ASN.1 데이터타입 (1) 프로그래밍언어와같이미리정의된몇가지타입을가진다. 사용자는 ASN.1 이제공하는기본타입외에새롭게정의된타입을사용할수있다. 타입정의를위한일반적인형식 <typereference> ::= <type> 타입의이름은반드시대문자로시작해야한다. 대부분의 ASN.1 에서미리정의된타입은대문자로표기된다.
BIT STRING 비트의임의의스트링 BOOLEAN True/False OCTET STRING 8 진수스트링 IA5STRING ASCII 스트링 INTEGER 임의의정수 REAL 임의의실수 NULL 널값 ASN.1 데이터타입 (2)
ASN.1 데이터타입 (3) PrintableString 프린트가능한스트링 OCTET IDENTIFIER 객체를식별하는정수값의연속 SEQUENCE 서로다른 ASN.1 데이터타입들의순서적집합 SEQUENCE OF 동일한타입의순서적집합 SET 서로다른 ASN.1 데이터타입들의비순서적집합 SET OF 동일한타입의비순서적집합
태그 (Tags)(1) 정의된모든타입들은태그를지정받는다. 태그는 ASN.1 에서표준으로지정될수도있고, 사용자가지정할수도있고 태그는두개의부분으로구성된다 Class Universal, Application, Private and Context Specific Number non-negative integer of arbitrary size 태그는 PER 에의해인코딩되지않는다
태그 (Tags)(2) Universal Class 세계적으로유일하게지정되지않으면안되는클래스 Application Class 어떤특정 ASN.1 모듈속에유일하게정의되지않으면안되는클래스 해당클래스의데이터형은어떤특정한응용속에서만사용될태그 Context-Specific Class 구조형의 ASN.1 데이터형속에유일하게지정되지않으면클래스 해당클래스태그는정의되어있는데이터형속에의미를가지며, 외부에서는의미를갖지않음 Private Class 상호합의되어있는어떤특정기업및단체에속에서유일하게지정할수있는클래스
태그 (Tags)(3) BER 4개의구성요소로구성 Identifier Octets Contents Octets End of Contents(EOT) Length Octets Identifier Octets의 Encoding 데이터값의형식에대한태그값을 encoding 태그번호의범위가 0~30이면 ID Octet은단일 Octet으로구성 8 비트 7 비트 6 비트 5 비트 4 비트 3 비트 2 비트 1 비트 1~5 비트 : 태그번호 6 비트 : P/C (0 : 기본요소, 1: 구조화 ) 7~8 비트 : 태그클래스 (00, 01, 10, 11)
태그 (Tags)(4) BER- 계속 Identifier Octets 의 Encoding 계속 태그번호가 31 보다크면 ID. Octet 은하나이상의다음 Octet 이따르는선행 Octet 의로구성 연속 Octet 태그클래스 P/C 11111 1 1 1 0 선두 Octet 태그번호
태그 (Tags)(5) BER 계속 Length Octet 단형길이 Contents Octet의길이를 encode하며, 최대 127개까지나타낼수있음 ID. Octets 0 길이 장형길이 Contents Octets 초기는길이 Octet 의길이를나타내며, 길이 Octet 은내용 Octet 의길이를니타냄 ID. Octets 1 초기 불확정길이 길이 Octet Contents Octets 이 EOT 에의해끝남 Contents Octets ID. Octets 10000000 00 00 Contents Octets EOT
BER- 계속 Contents Octets 태그 (Tags)(6) O 또는하나이상의 Octet 으로구성되며 ASN.1 데이터값을 encode BOOLEAN 값 encode ID. Octets : 1 부호화형 : 기본요소 Contents Octet : 단일 Octet 내용값 : FALSE(0), TRUE(1) 정수값 encode ID. Octet : 2 부호화형 : 기본요소 Contents : 하나이상의 Octet 으로구성되며, 2 의보수로표시함
태그 (Tags)(7) Type INTEGER/Integer32 SNMPv1 protocol SNMPv2 protocol ASN.1 Tag UNIVERSAL 2 Tag Number 0x02 Tag Value 0x02 OCTET STRING UNIVERSAL 4 0x04 0x04 NULL UNIVERSAL 5 0x05 0x05 OBJECT IDENTIFIER UNIVERSAL 6 0x06 0x06 SEQUENCE UNIVERSAL 16 0x10 0x30 IpAddress APPLICATION 0 0x00 0x40 Counter/Counter32 APPLICATION 1 0x01 0x41 Gauge/Gauge32 APPLICATION 2 0x02 0x42 TimeTicks APPLICATION 3 0x03 0x43 Opaque APPLICATION 4 0x04 0x44 Counter64 APPLICATION 6 0x06 0x46
ASN.1 표현 (1) BOOLEAN Values true or false Tag UNIVERSAL 1 Type Notation Married ::= BOOLEAN ValueAvailable ::= BOOLEAN
ASN.1 표현 (2) INTEGER Values 숫자로구성양수또는음수, 크기제한없음 Tag UNIVERSAL 2 Type Notation Size ::= INTEGER Color ::= INTEGER {red(0), blue(1), yellow(2)}
ENUMERATED ASN.1 표현 (3) Values 음수가아닌정수값으로구성됨 Tag UNIVERSAL 10 Type Notation Color ::= ENUMERATED { red(0), blue(1), yellow(2)} Color ::= ENUMERATED {red, blue, yellow}
ASN.1 표현 (4) REAL Values 실수값 ( 부동소수점 ) 숫자들 Tag UNIVERSAL 9 Type Notation PoundsPerSquareInch ::= REAL
ASN.1 표현 (5) BIT STRING Values 비트의문자열, 길이제한없음 암호화 /FAX 데이터 Tag UNIVERSAL 3 Type Notation DigitizedVoice ::= BIT STRING Color ::= BIT STRING {red(0), blue(1), yellow(2)}
OCTET STRING ASN.1 표현 (6) Value 옥텟 (8-bit bytes) 으로구성된문자열 Tag UNIVERSAL 4 Type Notation TransparentType ::= OCTET STRING BinaryFile ::= OCTET STRING
ASN.1 표현 (7) NULL Values 널 (NULL) Tag UNIVERSAL 5 Type Notation PlaceHolder ::= NULL
ASN.1 표현 (8) SEQUENCE Values 순서가있는값들의나열 Tag UNIVERSAL 16 Type Notation PersonnelRecord ::= SEQUENCE { name OCTET STRING, location INTEGER {homeoffice(0), fieldoffice(1), roving(2)}, age INTEGER OPTIONAL }
SEQUENCE OF ASN.1 표현 (9) Values 순서가있는값들의반복 Tag UNIVERSAL 16 Type Notation PersonnelRecord ::= SEQUENCE { name OCTET STRING, location INTEGER {homeoffice(0), fieldoffice(1), roving(2)}, age INTEGER OPTIONAL } PersonnelFile ::= SEQUENCE OF PersonnelRecord
ASN.1 표현 (10) SET Values 순서없는값들의목록 Tag UNIVERSAL 17 Type Notation Building ::= SET { address OCTET STRING, occupied BOOLEAN } PersonnelRecord ::= [0] IMPLICIT SET { name [0] IMPLICIT OCTET STRING, location [1] IMPLICIT INTEGER {homeoffice(0), fieldoffice(1), roving(2)} OPTIONAL, age [2] IMPLICIT INTEGER OPTIONAL }
ASN.1 표현 (11) Seq :: = SEQUENCE { } one [1] INTEGER OPTIONAL two [2] INTEGER OPTIONAL SeqVal ::= Seq { one 10 } IMPLICIT SeqVal이 T(SEQ),L,[T(1),L,V(10)] 로인코딩위와같은경우를 IMPLICIT 인코딩이라고함 IMPLICIT이의미하는것은 [1] 의 tag 정보만으로실제의 type을알수있기때문에굳이실제의 type을사용하지않는다는것을의미 EXPLICIT Tag 의정보를사용하고실제 Type 의정보또한보내도록하는 Option 을사용할수있음 이경우 EXPLICIT TAG 라고함 T(SEQ),L,{T(1),L,[T(INTEGER),L,V(10)]}
IMPLICIT 기존데이터형 Tag 를치환 ASN.1 표현 (12) EncryptionKey ::= [UNIVERSAL 30] IMPLICIT OCTET STRING 기존데이터형이옥텟스트링형의태그를새로지정한태그 [UNIVERSAL 30] 으로치환하는경우 EXPLICIT 기존데이터형의태그를치환하지않음
ASN.1 표현 (13) SET OF Values 순서없이반복된값들 Tag UNIVERSAL 17 Type Notation PersonnelRecord ::= [0] IMPLICIT SET { name [0] IMPLICIT OCTET STRING, location [1] IMPLICIT INTEGER {homeoffice(0), fieldoffice(1), roving(2)} OPTIONAL, age [2] IMPLICIT INTEGER OPTIONAL } PersonnelFile ::= SET OF PersonnelRecord
COMPONENTS OF ASN.1 표현 (14) 인자들이다른 SEQUENCE 또는 SET 을포함함을표시하기위해사용 CommonParameters ::= SEQUENCE { responserequired BOOLEAN, requestid INTEGER} ResponsePDU1 ::= SEQUENCE { COMPONENTS OF CommonParameters, result OCTET STRING} --equivalent to ResponsePDU2 ::= SEQUENCE { responserequired BOOLEAN, requestid INTEGER, result OCTET STRING}
ASN.1 표현 (15) CHOICE Values Tag Type Notation 기술된요소중에하나를선택선택된요소에따라결정 MessageType ::= CHOICE { text OCTET STRING, codednumeric INTEGER} Division ::= CHOICE { manufacturing [0] IMPLICIT SEQUENCE { plantid INTEGER, majorproduct OCTET STRING}, r-and-d [1] IMPLICIT SEQUENCE { labid INTEGER, currentproject OCTET STRING}, unassigned [2] IMPLICIT NULL }