얇지만얇지않은 TCP/IP 소켓프로그래밍 C 2 판 Chap. 5 Sending and Receiving Data
제 5 장데이터의송수신 5.1 정수인코딩 5.2 메시지생성, 프레이밍, 그리고파싱 5.3 마무리
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 도동일한방식으로처리
Encoding Integers by Hand BruteForceCoding.c byte ordering signedness 각함수들내용이해
Wrapping TCP Sockets in Streams FILE stream FILE *fdopen( ) int fclose( ) int fflush( ) size_t fwrite( ) size_t fread( )
Structure Overlays 실제로구조체가어떻게구현되는지이해필요 alignment 를위해필요한 padding 이해
Strings and Text old-fashioned text ASCII internationalizable code C99 extensions wchar_t size_t wcstombs( ) size_t mbstowcs( )
Bit-Diddling : Encoding Booleans C 언어의 bitwise 연산자이해필요 << >> & ~
5.2 Constructing, Framing, Voting Protocol UDP 로구현시 TCP 로구현시 and Parsing 하나의메시지크기 ( 경계 ) 를어떻게판단할것인가하는문제존재 방법 1: delimiter-based 방법 2: Explicit length Text-based Message Encoding Binary Message Encoding
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 에서미리정의된타입은대문자로표기된다.
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 Number Universal, Application, Private and Context Specific 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
태그 (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 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)}
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 } 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)]}
ASN.1 표현 (12) IMPLICIT 기존데이터형 Tag 를치홖 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
ASN.1 표현 (14) COMPONENTS OF 인자들이다른 SEQUENCE 또는 SET 을포함함을표시하기위해사용 CommonParameters ::= SEQUENCE { responserequired requestid BOOLEAN, 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 }