인터넷프로토콜 5 장 데이터송수신 (1) 1
제 5 장데이터의송수신 5.1 정수인코딩 5.2 메시지생성, 프레이밍, 그리고파싱 5.3 마무리 2
들어가기전 TCP/IP 는사용자의데이터를검사하거나변경하지않고그대로전송 응용프로토콜은연속적인필드로구성된메시지형태로정의 인코딩 (encoding)/ 디코딩 (decoding) 또는파싱 (parsing) 네트워크응용프로그램개발방법 사용자가모든것을새로정의 이미존재하는프로토콜표준을따르면서남은부분구현 3
정수의크기 5.1 정수인코딩 보내려는정수의크기를미리결정 바이트순서화 1 바이트가넘는값을인코딩하는경우어떤순서로보낼것인지 (big-endian/little-endian) 상호결정 부호화와부호확장 보내는값에부호가있는지 (signed) 또는없는지 (unsigned) 결정 4
정수의크기 (1) C 언어의정수형타입들 int char short long C 언어의표준 크기에대한정의는없으면서단지 char 형이 short 보다클수없고, short 는 int 보다클수없고, int 는 long 보다클수없다고만기술 반드시개발플랫폼에서 sizeof 연산자를사용하여크기를확인해야함 이때 sizeof 연산자결과는 sizeof(char) 를 1 로정의 5
C99 언어표준 정수의크기 (2) Option 형태로자료형에비트단위크기를나타냄 int8_t, int16_t, int32_t, int64_t (uint8_t) 추가적으로 long long 타입도있음 TestSizes.c 6
바이트순서화 Big-endian 과 Little-endian Big-endian(high order) Little-endian(low order) 인터넷의바이트순서 : Big-endian network bytes order 호스트의바이트순서 : 플랫폼에따라다를수있음 native bytes order 또는 host bytes order C 언어플랫폼에서제공하는함수들 htons(), ntohs() : 16비트정수 htonl(), ntohl() : 32비트정수 7
부호화 signed 와 unsigned 차이 부호확장 (sign extension) int8_t 가 int16_t 로확장되는과정이해 0100 1110 (78) -> 0000 0000 0100 1110 (78) 1110 0010 (-30) -> 1111 1111 1110 0010 (-30) int8_t 가 uint16_t 로확장되는과정이해 0100 1110 (78) -> 0000 0000 0100 1110 (78) 1110 0010 (-30) -> 1111 1111 1110 0010 (65506) 연산과정의확장 char + char 는 char 이아니다! 8
정수인코딩을직접해보자 BruteForceCoding.c byte ordering signedness 9
과제 본문 TestSizes.c 실행하여확인 본문 BruteForceCoding.c 확인및정리 특히비트연산자홗용부분에주의! 10
TCP 소켓을스트림으로포장하기 TCP 소켓에복수바이트정수값을인코딩하는다른방법 파일스트림사용 fdopen() 을호출하여파일스트림과소켓식별자를연관시킨후사용 FILE *fdopen( ) int fclose( ) int fflush( ) size_t fwrite( ) size_t fread( ) 권장하지는않음! 11
구조체오버레이 : 정렬과채우기 실제로구조체가어떻게구현되는지이해필요 12 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 C언어는 ASCII의축소판인기본문자셋 (basic character set) 명시 (C99 ISO646) internationalizable code C99 extensions wchar_t (wide character) 지원 size_t wcstombs( ) (wide character string to multibyte string) size_t mbstowcs( ) C99 에서도인코딩방식에대한명시적제어권이제공되지않음 플랫폼에서정의한 locale 에따라정의된하나의고정된문자셋을이용한다고가정 ( 실시간에 locale 이변경되는경우결과를예측할수없음!) 서로다른문자셋을혺용하여이용할방법이없음! 관렦명령 / 함수 ( 라이브러리 ) 들 ( 조사하여정리할것!) locale wcslen( ), wcslen_l( ), wcscpy( ), iconv 13
비트조작 : 참, 거짓값의인코딩 비트맵 (bitmaps) 참, 거짓정보를인코딩하는가장간단한방법 파일의접근권한 마스크 (mask) 하나혹은그이상의특정비트가 1 로설정되어있고, 나머지는 0 으로설정되어있는정수값 & 연산으로특정비트가 1 로설정되어있는지여부판단 연산으로특정비트를 1 로설정 특정비트를해제하고자하는경우마스크에 ~ 연산 ( 비트 - 보수 (bitwise complement)) 한후 & C 언어의 bitwise 연산자이해필요 << >> & ~ 14
응용과제 1 전체전원스위치 1 개, 전등스위치 5 개를감시또는제어하는프로그램작성 비트단위로처리 주 #5 #4 #3 #2 #1 필요한기능 전원스위치 on/off n 번째전등스위치 on/off 현재스위치상태출력 현재의전등상태출력 전원스위치와전등스위치를같이고려하여상태표시 15
전송데이터의자료형 (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() 를호출해야한다.
전송데이터의자료형 (3) 정수형 (Integer) 의전송 기본자료형의단위로전송 2 바이트, 4 바이트단위의전송 주의사항 2 바이트이상의데이터전송간에는항상네트워크바이트순서로전송해야함 1 바이트교홖은의미가없음 Network byte order (Big-Endian) 다중바이트의메시지교홖에필수 호스트바이트 - 네트워크바이트변홖함수들 htonl(), htons(), ntohl(), ntohs() Little-Endian Big-Endian 0 0 92 246 23,798 246 92 0 0
정수자료형전송의예 (TCP) int data; send(sock, &data, sizeof(data), 0) short, long, double, char 도동일한방식으로처리 20