데이터 송수신
인터넷 프로토콜 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
TCP/IP
byte stream
Application
TCP/IP
byte stream
Here are some bytes. I don’t
know what they mean.
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
M o m \n
3 77 111 109
0 77 0 111 0 109 0 10
char string[strBuffSize];
send(sock, string, strBuffSize, 0)
문자열 전송의 예(TCP)
 주의점 : 버퍼의 크기
 TCP는 운영체제에 의존적인 TCP 버퍼가 있으
며 이 보다 작은 크기로 send()를 호출해야 한
다.
전송 데이터의 자료형
정수형(Integer)의 전송
기본 자료형의 단위로 전송 2바이트, 4바이트 단위의 전송
주의 사항 2바이트 이상의 데이터 전송간에는 항상 네트워크 바이트 순서로 전송해야 함
 1바이트 교환은 의미가 없음
Network byte order (Big-Endian)-
다중 바이트의 메시지 교환에 필수-
호스트 바이트-네트워크 바이트 변환 함수들 htonl(), htons(), ntohl(), ntohs()
0 0 92 246 23,798
246 92 0 0 Big-Endian
Little-Endian
int data;
send(sock, &data, sizeof(data), 0)
정수 자료형 전송의 예(TCP)
 ‘short’, ‘long’, ‘double’, ‘char’도 동일한 방식
으로 처리
정수 인코딩을 직접 해보자
 BruteForceCoding.c
 byte ordering
 signedness
 각 함수들 내용 이해
TCP 소켓을 스트림으로 포장하기
 FILE stream
 FILE *fdopen( )
 int fclose( )
 int fflush( )
 size_t fwrite( )
 size_t fread( )
구조체 오버레이 : 정렬과 채우기
 실제로 구조체가 어떻 게 구현되는지 이해 필 요
 alignment를 위해 필요 한 padding 이해
 구조체와 메모리 할당 이해
최대한 정렬 2
바이트 이상인 경우 시 작주소는 항상 2로 나누 어져야 한다struct addressInfo {
uint16_t streetAddress;
int16_t aptNumber;
uint32_t postalCode;
} addrInfo;
streetAddress
aptNumber
postalCode
struct integerMessage { uint8_t oneByte;
uint16_t twoBytes;
uint32_t fourBytes;
uint64_t eightBytes;
};
struct integerMessage2 { uint8_t oneByte;
uint8_t padding;
uint16_t twoBytes;
uint32_t fourBytes;
uint64_t eightBytes;
};
문자열과 텍스트
 old-fashioned text
 ASCII
 “internationalizable” code
 C99 extensions
 wchar_t
 size_t wcstombs( )
 size_t mbstowcs( )
비트 조작 : 참 , 거짓 값의 인코딩
 C 언어의 bitwise 연산자 이해 필요
 <<
 >>
 |
 &
 ~
5.2 Constructing, Framing, and Parsing
 Voting Protocol
 UDP로 구현시
 TCP로 구현시
 하나의 메시지 크기(경계)를 어떻게 판단할 것인가 하는 문제 존재
방법 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)
메시지 구성을 위한 자료형 정의
구조체 사용이 바람직함
저지르기 쉬운 실수
구조체 내부의 포인터 변수
값을 전달해야지 위치를 전달하는 것은 무의미
패딩, 정렬 문제
항상은 아니지만 가끔 일어나며 디버깅 어렵게 함채우기(padding)의 문제
 시스템은 내부 정렬 규칙에 따라 채우기를 수행
 해결 방법
 구조체 멤버를 재배치
 명시적인 강제 채우기
struct tst { short x;
int y;
short z };
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
 서버: 해당 파일은 서버의 실행파일이 존재하는 디
렉토리에 동일한 이름으로 저장되도록 한다.
좀 더 복잡한 메시지 구성
메시지 구성
 파일 전송의 예
Server Client
FileName FileSize File Contents
send(sock, FileName, 256, 0) send(sock, FileSize, 4, 0) while(feof(fd)) {
Send(sock, FileBuffer, 1024,0) }
char FileName[256];
int FileSize;
char FileBuffer[1024];
recv(clntSock, FileName, 256, 0) recv(clntSock, FileSize, 4, 0) while(notRecvfullFile()) {
recv(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
서버의 입장에서 클라이언트의 서비스 요청이 에코요청인지 파일업로드인지 구분할 수 있 는 방법은?
서비스 타입(에코 요청, 파일업로드) 필드를 준비하고 클라이언트를 이를 통해 서버에게 서비스 종류 를 알림FileName FileSize File Contents string
Server Client
Echostring
Server Client
MsgType
바이너리 프로토콜 설계
 EchoString
 File Upload
FileName FileSize File Contents string
Server Client
Echostring
Server Client
MsgType
MsgType
MsgType
MsgType
/* Message Type */
#define EchoReq 01
#define FileUpReq 02
#define EchoRep 11
#define FileAck 12
char MsgType;
클라이언트 핵심 코드 (바이너리 프로토콜)
/* 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 {
fprintf(stderr, "Usage: %s <Server IP> <operation><operand> <Echo Port>\n", argv[0]);
exit(1);
}
string MsgType
FileName FileSize File Contents
MsgType
서버 핵심 코드
(바이너리 프로토콜)
/* 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”)
string MsgType
FileName FileSize File Contents
MsgType
문자열 프로토콜 설계
 EchoString
 File Upload
FileName FileSize File Contents string
Server Client
Echostring
Server Client
MsgType
MsgType
MsgType
MsgType
/* Message Type */
#define EchoReq “EchoReq”
#define FileUpReq “FileUpReq”
#define EchoRep “EchoRep”
#define FileAck “FileAck”
char MsgType[10];
클라이언트 핵심 코드 (문자열 프로토콜)
/* 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)
…
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);
}
string MsgType
FileName FileSize File Contents
MsgType
서버 핵심 코드 (문자열 프로토콜)
/* 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”)
string MsgType
FileName FileSize File Contents
MsgType
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)
Application component
data transfer component (e.g, TCP, OSI
session) data transfer
component (e.g, TCP, OSI
session) Application component Local storage
(e.g, MIB)
Local storage (e.g, MIB)
User User
local mapping
user presentation mapping
user presentation mapping
Abstract Syntax (e.g., ASN.1)
local mapping
encoding rules
encoding rules
Transfer
Syntax
(e.g., BER)
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
ENUMERATED
SEQUENCE SEQUENCE OF GeneralizedTime
IA5String
BMPString
UTF8String
BER(Basic Encoding Rules)(1)
 BER 은 전송되는 데이터가 어떻게 인코딩 되
어야 하는지를 기술
 기기특성, 프로그래밍 언어, 에플리케이션 표 현방법과 독립적
Application 1 02 01 06 Application 2
Age ::= INTEGER (0..7) firstGrade Age ::= 6
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은 전송 시 대역폭을 보다 적게 사용하기 위한 목적으로 정의되었
으며, 소리와 영상을 전송하는 인터넷, 공중파 통신과 같이 대역폭이 중요한 곳이라면 어느 곳이라도 유용하게 사용
Application 1 110 Application 2
Age ::= INTEGER (0..7) firstGrade Age ::= 6
total length of 3 bits
XER-XML Encoding Rules
 BER, PER과 마찬가지로 , 전송하기 위한 데이터의 장치의 종류, 프로그래밍 언
어 또는 어플리케이션 프로그램의 표현에 대해 독립적
축소된 규칙과는 달리 곧바로 읽기 쉽다.
좀 더 읽기 쉽게 하는데 목적이 있다.
추가 대역폭을 필요로 한다. BCN 등 대규모 대역폭을 갖는 환경에 적합하다.
Application 1 <Age>6</Age> Application 2
Age ::= INTEGER (0..7) firstGrade Age ::= 6
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에서 미리 정의된 타입은 대문
자로 표기된다.
ASN.1 데이터 타입(2)
 BIT STRING
 비트의 임의의 스트링
 BOOLEAN
 True/False
 OCTET STRING
 8진수 스트링
 IA5STRING
 ASCII 스트링
 INTEGER
 임의의 정수
 REAL
 임의의 실수
 NULL
 널값
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으로 구성1~5 비트 : 태그 번호
6비트 : P/C (0 : 기본요소, 1: 구조화) 7~8비트 : 태그 클래스(00, 01, 10, 11)
8비트 7비트 6비트 5비트 4비트 3비트 2비트 1비트
태그(Tags)(4)
 BER-계속
 Identifier Octets의 Encoding –계속
태그 번호가 31보다 크면 ID. Octet은 하나 이상의 다음 Octet이 따르는 선행 Octet 의로 구성0 1
1 1
11111 P/C
태그클래스
선두 Octet
연속 Octet
태그 번호
태그(Tags)(5)
 BER –계속
 Length Octet
 단형길이
 Contents Octet의 길이를 encode하며, 최대 127개 까지 나타낼 수 있음
 장형길이
 초기는 길이 Octet의 길이를 나타내며, 길이 Octet은 내용 Octet의 길이를 니타 냄
 불확정 길이
 Contents Octets이 EOT에 의해 끝남
ID. Octets 0 길이
Contents Octets
ID. Octets 1 초기
길이 Octet Contents Octets
00 00
10000000 ID. Octets
Contents Octets EOT
태그(Tags)(6)
 BER- 계속
Contents Octets
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 SNMPv1
protocol
SNMPv2
protocol ASN.1 Tag Tag Number
Tag Value
INTEGER/Integer32 OCTET STRING
NULL
OBJECT IDENTIFIER SEQUENCE
IpAddress
Counter/Counter32 Gauge/Gauge32
TimeTicks Opaque Counter64
UNIVERSAL 2 UNIVERSAL 4 UNIVERSAL 5 UNIVERSAL 6 UNIVERSAL 16
APPLICATION 0 APPLICATION 1 APPLICATION 2 APPLICATION 3 APPLICATION 4 APPLICATION 6
0x02 0x04 0x05 0x06 0x10 0x00 0x01 0x02 0x03 0x04 0x06
0x02 0x04 0x05 0x06 0x30 0x40 0x41 0x42 0x43 0x44 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)}
ASN.1 표현(3)
 ENUMERATED
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)}
ASN.1 표현(6)
 OCTET STRING
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
}
ASN.1 표현(9)
 SEQUENCE OF
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 }