운이 좋게도 얇지만 얇지 않은 TCP/IP 소켓 프로그래밍 2판이라는 책이 트위터 이벤트로 당첨되었습니다.


TCP/IP 소켓 프로그래밍 C(2판)
카테고리 컴퓨터/IT
지은이 마이클 도나후 (비제이퍼블릭, 2009년)
상세보기




국내 최초로 IPv6, C++를 다루는 소켓 프로그래밍책이라고 하던데, 어떤 내용인지는 궁금하군요.

국내 소켓프로그래밍(네트워크 소켓 프로그래밍, Network Socket Programming)을 다룬 책이면 Unix라면 C 소켓 책, Windows라면 Winsock2 라이브러리와 MFC로 네트워크 다루던지 아님 Java, C#으로 책이 나왔다고 알고 있습니다.

대부분의 책들을 보면 IPv4에서만 다뤘지 IPv6에 대해선 전혀 다루지도 않았다고 보면 됩니다. 그리고 C++로 이뤄진 소켓프로그래밍 책을 보면 Windows MFC 라이브러리에서 사용하는 것을 생각하시면 될겁니다.


학부때 네트워크프로그래밍을 들으면서 생소한 내용들로 프로그래밍 할때 정말 고생을 많이 했던 기억이 나는데 지금도 네트워크 프로그래밍을 하면서 학부때 배운 것을 제대로 배웠는지 궁금할때가 많았습니다. (학부 2학년때 IPv6에 대해 궁금했고 전자전기공학개론이라는 과목에서 IPv6로 수업 기말 과제까지 했던 사람으로서 IPv6, IPv4를 아직도 제대로 이해하질 못한다.)

현재 MFC로 네트워크 프로그래밍을 하고 Android Platform에서 소켓프로그래밍을 해보면서 아직도 네트워크 프로그래밍이 난해하다고 싶을때, 이 책에 당첨되어서 기쁩니다.

그리고 책에서 IPv6, C++를 다룬다는데 어떤 내용인지는 책을 입수해야 알수 있을듯 합니다.

Buy me a coffeeBuy me a coffee
이번에 컴퓨터공학과 3학년 2학기에 새로 생긴 전공과목인 네트워크 프로그래밍이란 과목을 수강하다가 Process를 이용한 웹서버 구현하는 과제를 하였습니다. 생각보단 어렵지는 안더군요. 예전에 Thread를 이용한 간단한 웹서버 구현한 것이있어서 Process로 바꾸는 데에는 금방 했습니다. (참고로 열혈강의 TCP/IP 소켓 프로그래밍이란 책을 참고했습니다.)

열혈강의 TCP/IP 소켓 프로그래밍
윤성우 지음 / 이한디지털리(프리렉)
나의 점수 : ★★★★★

처음 본 TCP/IP 소켓프로그래밍 책입니다.
소켓프로그래밍 공부하는데 서점에서 무슨 책으로 공부할지 고민을 하다가 이 책이 초보자들에게 괜찮은 듯하고 거기에 무료강의까지 제공해서 선택했습니다.
이 책을 쓰신 윤성우님은 열혈강의 C, 열혈강의 C++란 책으로 아주 유명하신 분이죠. (전 열혈강의 C, 열혈강의 C++를 보질 않았습니다. 그렇게 유명한 책이고 동기들이 다 본 책인데 ㅡㅡ;)
이 책은 다른 책보다 Windows와 Linux 두군데에서 어떻게 소켓프로그래밍 할지 설명이 잘 되어있습니다. 다른 책들을 보면 Linux에서만 돌아가거나 등등.
OS를 가리지 않고 C언어에서 소켓프로그래밍을 설명한 책이라서 학과 커리큘럼상에서 Linux밖에 배우지 않는 것을 커버하는 것이 좋다고 생각한다.
그러나 단점은 JAVA에서의 소켓프로그래밍은 알아서 공부해야겠죠?
이 책을 일주일만에 소스 다 치면서 400페이지 이상 읽었습니다. 정말 책이 술술 읽힌 것 같네요. 윤성우님의 명서라 할수 있습니다. 그러니까 열혈강의 C와 열혈강의 C++도 잘 쓰여졌을것이라 보네요.



그래서 과제를 하다가 World Wide Web을 오랬동안 쓴 저 조차도, HTTP Protocol에 대해선 전혀 모르고 써왔구나를 느꼈습니다.
(저는 하이텔부터 쓴 사람이라서^^, 국민학교 3학년때 아부지 회사였던 테헤란로 K**란 회사에 가서 인터넷이라는 것을 알게 되었다지요. 그때 인터넷 접속할때에는 DOS에서 win를 쳐서 Windows 3.1를 실행시키고, Winsock이란 프로그램을 띄우고 나서 전화선 모뎀으로 접속해야했던 과거 ^^ - 오덕의 기운이 초등학교때부터 시작 ㅡㅡ;)

현재 우리나라에서는 HTTP Protocol가 어떻게 정의되었는지에 대한 책들을 찾기 힘들더군요, 그래서 학교 도서관에서 HTTP The Definitive Guide란 책을 빌려서 보고 있습니다 :D

책 내용이 2002년 9월달에 나왔지만, 변하는 내용은 아니니까. 책을 보면서 당연하게 느낀 것들도 어떻게 정의되었는지를 알게 되었을때 재미가 있네요. 공부가 재미있다는 것이 이런건가? -_-;;

Process를 이용한 웹서버 과제를 하고 나서 HTTP를 사용해서 서버 정보를 가져와 파일로 저장하는 프로그램도 짜봤습니다만, 자주 쓰는 웹서비스도 이해를 안하고 썼다는 것에 충격.


1. HTTP Protocol이란?
HTTP는 Hyper-Text Transfer Protocol의 약자로 WWW(World Wide Web)에서 사용되는 Protocol이다. HTTP/1.0은 RFC1945, HTTP/1.1은 RFC2068, RFC2616에 명시되어 있습니다.
일반적으로 포트번호는 80을 사용합니다.
실제로 쓰는 웹서버들은 포트번호를 명시해주어야 합니다. 예를 들어 네이버 주소는 원칙적으로 쓰면 http://www.naver.com:80/ 이렇게 포트번호 80를 명시해주면서 접속을 해야한다만 http://www.naver.com/ 이런식으로 표현하는 것도 포트번호가 80을 쓴다는 것을 암묵적으로 알기때문입니다.

자세한 내용은 RFC 문서를 읽으시는 것이 좋을 듯 합니다. 블로그에 포스팅하긴 엄청나게 방대한 양이라서요^^
HTTP/1.0 RFC1945 : rfc1945.txt.pdf
HTTP/1.1 RFC2068 : rfc2068.txt.pdf
HTTP/1.1 RFC2616 : rfc2616.txt.pdf

2. 웹서버를 이해하기
웹서버란? HTTP Protocol을 기반으로 해서 웹 페이지가 들어있는 파일을 클라이언트에게 전송해주는 프로그램이라고 보면 됩니다.
지금, 이 글을 보는 여러분들은 인터넷 브라우저인 FireFox나 Internet Explorer를 사용하고 계실 것입니다. 이 인터넷 브라우저는 클라이언트 소켓프로그램에 해당됩니다. 임의의 사이트에 접속을 하려고 할때, 브라우저도 내부적으로 TCP/IP소켓을 생성하기 때문입니다. 다만 인터넷 브라우저가 지니는 특징은, 서버가 전송해주는 HTML문으로 이루어진 문서를 그대로 보여주지 않고 HTML문법에 맞게 변환해 준다는 것이죠.

3. 간단한 HTTP 실행과정
HTTP는 클라이언트와 서버가 일정하고 예측 가능한 방식으로 정보를 교환하고 상호작용을 할수 있도록 허용하는 Method와 header의 집합을 정의하고 있습니다.
웹에서 볼수 있는 각 XHTML파일은 웹과 관련된 URL(Universal Resource Locator)을 가지고 있습니다. URL은 사용자가 접속하고자 하는 리소스(대부분 웹 페이지)에 브라이저가 접속할 수 있도록 하는 정보를 포함하고 있습니다.
예를 들면, http://www.dal.kr/data/index.html

http://는 웹 브라우저가 HTTP를 이용해 리소스를 요청해야한다는 것을 나타냅니다. 중간부분의 www.dal.kr은 서버 호스트 이름입니다. 호스트 이름은 리소스가 위치에 있는 컴퓨터의 이름인데, 이 컴퓨터가 보통 리소스를 간직하고 유지하기 때문에 호스트(Host)라고 합니다.
요청된 리소스 이름 /data/index.html (HTML문서)는 URL의 나머지 부분입니다. URL에서 이 부분은 리소스 이름(index.html)과 경로 (/data)를 확실해 구분해줍니다. 이 경로(path)는 웹 서버 파일 시스템에 있는 실제 Directory를 나타냅니다. 그렇지만 보안상의 이유로 경로는 대부분 가상 디렉토리(Virtual Directory)를 나타냅니다. 이 경우에, 서버는 해당 경로를 서버의 실제 위치로 해석하기 때문에 자원의 정확한 위치를 숨길수 있습니다. (Apache에서 VirtualHost인가 설정하면 해당 경로를 해석해서 표현합니다^^)

주어진 URL에 대해서 브라우저가 웹 페이지를 표현하기 위한 HTTP 트랜젝현을 어떻게 수행될까요?
아래 올려진 그림에서 잘 보여줍니다.
http://www.dal.kr/data/index.html를 접속한다고 생각합니다.
브라우저는 서버로 HTTP요청을 보냅니다. 그 요청은 이렇게 나타냅니다.
GET/data/index.html HTTP/1.1
host : www.dal.kr

GET이라는 단어는 리소스를 검색하고자 하는 클라이언트를 나타내는 HTTP Method입니다. 나머지 요청에서는 리소스의 이름 및 경로 그리고 프로토콜 이름과 버전 번호(HTTP/1.1)를 제공합니다.
(실험한 사이트들이 HTTP/1.0 을 써서 난감 ㅡㅡ;)

클라이언트가 서버에게 메시지를 주면 서버는 클라이언트에 요청 결과를 보내줍니다.
서버는 우선 한 줄로된 HTTP 버전과 그 뒤에 트랜잭션의 상태를 나타내는 숫자 코드와 구(phase)로 응답합니다.
HTTP/1.1 200 OK는 성공, HTTP/1.1 501 Method Not Implemented 는 요청을 처리하는데 필요한 기능이 구현되지 않았음, HTTP/1.1 404 Not found 는 특정한 위치에서 서버 자원을 찾을 수 없다는 응답을 알려줍니다.

아래는 제가 HTTP정보를 얻는 프로그램을 작성해서 돌려본 결과입니다. 제가 가는 사이트 마다 HTTP/1.1 지원하는 사이트가 없군요 ㅡㅡ; 다만 제가 일하고 싶은 오픈마루스튜디오는 HTTP/1.1를 지원하고 있었습니다 ㅠㅠ
host : www.dal.kr, path : /data/index.html
Get /data/index.html HTTP/1.0

HTTP/1.1 501 Method Not Implemented
Date: Sun, 23 Sep 2007 15:01:44 GMT
Server: Apache
Allow: GET, HEAD, OPTIONS, TRACE
Connection: close
Content-Type: text/html; charset=iso-8859-1

host : www.http-guide.com, path : /index.html
Get /index.html HTTP/1.0

HTTP/1.1 501 Method Not Implemented
Date: Sun, 23 Sep 2007 15:10:04 GMT
Server: Apache/1.3.37 Ben-SSL/1.57 (Unix) PHP/4.4.2 FrontPage/5.0.2.2624 DAV/1.0.3
Allow: GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, PATCH, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK, TRACE
Connection: close
Content-Type: text/html; charset=iso-8859-1

host : www.openmaru.com, path : /index.php
Get /index.php HTTP/1.0

HTTP/1.1 200 OK
Date: Sun, 23 Sep 2007 15:24:31 GMT
Server: Apache/2.2.3 (Unix) PHP/5.1.6 mod_python/3.2.10 Python/2.4.3 DAV/2
X-Powered-By: PHP/5.1.6
Set-Cookie: TSSESSION=2039b9c23de52f6d7b8713126cf3b9b4; path=/; domain=openid.or.kr
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Connection: close
Content-Type: text/html; charset=utf-8
서버는 클라이언트에게 보내는 데이터에 관한 정보를 제공하는 하나 또는 그 이상의 HTTP헤더를 보냅니다. 위에 제가 HTTP정보를 얻는 프로그램을 작성해서 돌려본 결과를 보면 그 예를 볼수 있습니다.
Content-Type: text/html; charset=iso-8859-1
Content-Type: text/html; charset=utf-8
Content-Type헤더의 정보는 MIME(Multipurpose Internet Mail Extension) 타입의 컨텐츠를 확인합니다. 서버에서 보내진 각 데이터 타입은 MIME타입을 가지며 이 MINE타입을 통해 브라우저는 받은 데이터를 어떻게 처리할 것인지를 결정합니다.

헤더 다음의 빈줄은 서버가 HTTP 헤더 전공을 끝냈다는 것을 클라이언트에게 알려주는 것입니다. 그리고 나서 서버는 요청된 리소스의 내용들을 보냅니다. 리소스 전송이 완료되면 연결이 종료됩니다. 클라이언트 측 브라우저는 받은 문서를 해석하고 결과를 화면에 출력또는 전달해줍니다.
아래 그림은 웹 서버랑 브라우저랑 어떻게 연결하는지 보여주는 그림입니다 :D
책내용은 HOW TO C++ PROGRAMMING Forth Edition - Deitel 형제가 쓴 책 내용의 일부분 참조했습니다.

아 생각보다 방대한 양들이군요. HTTP/1.1로 구현한 웹서버는 기능을 많이 뺀 것이라 간단하게 프로그래밍 했다만, 제대로 구현하려면 몇줄을 작성해야할까 걱정이 되군요 ㅡㅡㅋ
이왕에 MFC로 윈도우즈에도 써볼까? -_-;;(그러다 밤샐래!)

자세한 내용은 위에 있는 RFC문서를 참조하시기 바랍니다. 영어 해석이 어렵다면 네이버 지식즐을 참조하시길 :D

'컴퓨터 > Web' 카테고리의 다른 글

나만의 도메인으로 gmail를 쓰게 되었음.  (0) 2008.02.01
IE7로 업그레이드하다.  (0) 2008.01.26
sungdh86님의 노트  (1) 2007.09.01
여태까지 이런 기능이 없었다니  (6) 2007.08.01
PHP 이메일 체크 함수  (2) 2007.01.22
Buy me a coffeeBuy me a coffee
수업시간마다 교수님께서는 이런 말씀을 하시더군요
"추석 잘 보내시기 바랍니다 :D"

그러면서 교수님들께선 추석맞이 선물을 학생들에게 항상 챙겨주시더군요. 교수님들께서 선물을 주시니 너무 좋습니다.
2교시 네트워크프로그래밍 시간
이번에 새로오신 박모 교수님, 첫번째 과제인 Process로 HTTP/1.1형식으로 웹서버 구현하기 (그건 예전에 책보고 구현했던 것이라 금방 다할것 같음-_-;;) 를 내주시고, 어떻게 과제하라고 한다음, 또 두번째 과제를 내시더군요.
두번째 과제는 Multi-Threading을 이용해서 HTTP proxy 서버 구현하기이더군요. 교수님이 두번째 과제에 대해서 설명하시는데 전혀 이해 불가 -_-;; 저는 TCP/IP소켓 프로그래밍 공부를 살짝 했다만 두번째 과제는 정말 난이도가 있더군요, 학생들의 수준을 너무 높게 잡았습니다 ㅠㅠ 그래봤자 추석때 하면 되겠지 OTL

네트워크프로그래밍 과제때문에 추석은 저 멀리로~


5교시 운영체제
IBM에서 오신 김모교수님께서는 수업만 나갔습니다. 추석 잘보내라는 말과 함께. 수업시간에 했던 내용 이해 못해서 수업끝나고 나서 교수님께 질문많이했군요 -_-;;
OS는 과제 다해서 project2만을 기대하고 있었는데 과제가 안나왔더군요. 다행입니다.

6교시 오토마타
91년도에 오셨다는 정모교수님, (클랴님 학교 다니실때 오셨다고 하시더군요) 과제 5개 추석선물이라고 하면서 과제를 하라고 하더군요. -_-;;

8교시 기초데이터베이스
이번에 새로오신 김모교수님께서 과제 추석연휴때 다 하라고 하더군요. ㅠㅠ 그래봤자 E-R다이어그램이라만 추석때 어떻게 설계하리오?

실용영어(초급), 과제도 추석때 해야하고 -_-;; 추석연휴가 연휴같지 않군요.

과제하기 싫어요 ;ㅁ;

Buy me a coffeeBuy me a coffee

+ Recent posts