Tuesday, July 13, 2010

chapter 3 (주소체계와 데이터 정렬)

IP : internet protocol, 데이터의 송수신을 위해 컴퓨터에 부여하는 값
PORT 번호 : 프로그램에서 생성되는 소켓을 구분하기 위해 소켓에 부여되는 번호

-소켓에 할당되는 IP주소와 PORT번호-


인터넷 주소(Internet Address, IP 주소) : IPv4 (4바이트 주소 체계), IPv6 (6 바이트 주소체계), IPv6는 IP가 부족할것을 고려해 만든 체계이나 아직 IPv4가 대세. IPv4는 그림과 같이 A~E 클래스로 분류된다. E 클래스는 일반적이지 않고 예약되어 있다. 그림에서 나오는 네트워크 주소 (network ID) 란 네트워크 구분의 위한 IP주소의 일부. 예를 들어 데이터를 203.211.172.103의 컴퓨터로 전송한다고 할때 우선은 IP주소의 네트워크 ID (여기서는 203.211.172)로 데이터를 보내고 라우터(네트워크 안의 호스트와 외부의 데이터 송수신을 위한 물리적 장치)가 나머지 호스트 ID (여기서는 172)로 데이터를 전송한다.


IP 주소의 클래스 구분법 : 
클래스 A 의 첫 바이트 범위 0 ~ 127
클래스 B 의 첫 바이트 범위 128 ~ 191
클래스 C 의 첫 바이트 범위 192 ~ 223


소켓의 구분에 활용되는 PORT번호 : IP는 컴퓨터를 구분하기 위한 값이다. 이런 IP를 보고 전달된 데이터는 컴퓨터의 수많은 프로그램 중에 어떤 프로그램에 사용되어야 하는지 구분되어지기 위해 사용되는 것이 PORT번호이다. 이 PORT번호를 통해 운영체제가 해당 소켓에 데이터를 분배한다. 즉 하나의 운영체제 내에서 소켓을 구분하기 위한것이 PORT 번호이다. 16 비트 (0~65535)이다. 중복되어선 안되며 0~1023는 well-known PORT라고 해서 특정 프로그램에 할당되어져 있기에 이를 제외해서 사용한다.



-주소정보의 표현-


IPv4 기반의 주소표현을 위한 구조체 : 주소정보에는 프로토콜 체계 (예: IPv4), IP 주소, PORT 번호가 들어가 있어야 한다.
오른쪽 구조체에 사용된 자료형과 멤버는 책을 참조. 매우 중요




-네트워크 바이트 순서와 인터넷 주소 변환-


이부분의 위의 주소정보표현의 구조체인 sockaddr_in의 멤버 sin_port와 sin_zero를 위한 것이다.
CPU마다 메모리에 데이터를 저장하고 해석하는 방식이 다르다(호스트 바이트 순서).
빅 엔디안 (Big Endian) : 상위 바이트의 값을 작은 번지수에 저장하는 방식
리틀 엔디안 (Little Endian) : 상위 바이트의 값을 큰 번지수에 저장하는 방식, 대표적으로 intel 계열의 CPU
그래서 CPU마다 다른 방식으로 데이터 저장 방식(호트스 바이트 순서)이 다르므로 이를 통일하고 한것이 "네트워크 바이트 순서"로 빅 엔디안을 뜻한다.
바이트 순서를 변환해주는 함수:
unsigned short htons(unsigned short);
unsigned short ntons(unsigned short);
unsigned long htonl(unsigned long);
unsigned long ntonl(unsigned long);
htons 에서 h는 host를 s는 short를 의미, 즉 htons(h to n s)는 PORT번호(short형 데이터) 를 호스트 바이트 순서에서 네트워크 바이트 순서로 변환하라는 의미



-인터넷 주소의 초기화와 할당-


다음은 코드 설명이 많으므로 책 참조
문자열 정보를 네트워크 바이트 순서의 정수로 변환하기 : 우리가 익숙한 IP 주소는 점이 찍힌 십진수 표현 방식 (Dotted-Decimal Notation)으로 이를 32비트 정수형으로변환해주는 함수가 필요한데 이것이 inet_addr와 inet_aton이다. 차이점은 inet_addr는 성공시 in_addr_t (unsigned 32 bit int)를 실패시 INADDR_NONE을 반환하는 반면,  inet_aton은 성공시 1을 실패시 0을 반환하고 매개변수로 구조체인 in_addr의 주소를 받아서 성공시 그곳에 변환된 값을 넣는다.
inet_aton과 반대 역활, 그러니까 32비트 정수형으로 되어 있는 IP를 Dotted-Decimal Notation으로 변환해 주는 함수가 inet_ntoa이다.


인터넷 주소의 초기화 : 아래 그림 참조


클라이언트의 주소정보 초기화 : 클라이언트의 connet 함수 역시 구조체 sockaddr_in를 사용하나 IP와 PORT의 대상이 다르다. 서버 bind 함수의 경우 서버의 IP와 PORT를, 클라이언트의 connect 함수의 경우 서버의 IP와 PORT를 넣어야 한다.
서버의 경우 "IP 211.217.168.13 PORT 9190으로 들어오는 데이터는 내게 보내라"
클라이언트의 경우 "IP 211.217.168.13 PORT 9190으로 연결해라" 라는 의미


INADDR_ANY : 위에서 처럼 매번 bind 함수에 IP를 넣는 것이 귀찮기 때문에 자동화로 IP를 받을 수 있다. 위에 그림에서 serv_ip를 선언하지 말고 addr.sin_addr.s_addr=inet_addr(serv_ip); 대신 
addr.sin_addr.s_addr=htonl(INADDR_ANY); 라고 하면 자동으로 IP가 할당된다.


서버소켓 초기화 과정 : 소켓선언과 함께 위 내용을 최종 정리하면 다음 그림과 같다(1장에서 3장까지의 내용 총괄).

chapter 2 (소켓의 타입과 프로토콜의 설정)

-소켓의 프로토콜과 그에 따른 데이터 전송 특성-


프로토콜(protocol)이란?
컴퓨터 상호간의 대화에 필요한 통신 규약... 너무 식상한 답변이다. 와닿지 않는다.

소켓(socket) 함수?
인자로 domain (소켓이 사용할 프로토콜 체계 정보 전달), type (소켓의 데이터 전송 방식에 대한 정보 전달), protocol (두 컴퓨터 간 통신에 사용되는 프로토콜 정보 전달) 을 받고 호출 성공시 파일 디스크립터, 실패시 -1 return.

프로토콜 체계(protocol family)? PF_INET, PF_INET6, PF_LOCAL, PF_PACKET, PF_IPX (자세한건 책 참조)

소켓의 타입(type)? 소켓의 데이터 전달 방식. 프로토콜 체계가 정해졌다고 해도 그 안에서 둘 이상의 전송 방식이 있으므로 선택해야 한다. 대표적으로 연결지향형 소켓과 비 연결지향형 소켓.
1. 연결지향형 소켓(SOCK_STREAM) : 독립된 별도의 라인을 통해서 데이터를 전달하는 방식으로 라인상 문제가 없다면; 중간에 데이터 소멸이 없다. 전송 순서대로 데이터가 수신된다. 전송 데이터의 경계가 없다. 소켓 대 소켓의 연결은 반드시 1 대 1이어야 한다.
2. 비 연결지향형 소켓(SOCK_DGRAM) : 전송 순서에 상관없이 가장 빠른 전송을 지향한다. 전송되는 데이터의 손실 및 파손의 우려가 있다. 데이터의 경계가 존재한다. 한번에 전송하는 데이터의 크기가 제한된다.
*데이터 경계가 있다 없다는 데이터 전송을 두번했으면 수신도 두번해야 할경우 경계가 있는것이고 전송 횟수에 상관없이 수신횟수가 있는것을 경계가 없다고 한다.

프로토콜의 최종 선택? 소켓 함수의 세번째 인자.이미 첫번째와 두번째 인자로 충분하기에 세번째 인자가 0이어도 상관이 없으니 특별한 경우 세번째 인자가 필요하다.
"하나의 프로토콜 체계 안에 데이터의 전송 방식이 동일한 프로토콜이 둘 이상 존재할 경우" 전송 방식이 동일한 프로토콜일 경우 이를 좀 더 구체화 해야 한다.

TCP 소켓 :  프로토콜 체계는 IPv4인 PF_INET 이고 데이터 전송 방식은 연결지향형인 SOCK_STREAM 인 유일한 소켓.
UDP 소켓 : PF_INET 이고 SOCK_DGRAM 인 유일한 소켓.

chapter 1 (네트워크 프로그래밍과 소켓의 이해)

소켓 프로그래밍은 다른말로 하면 네트워크 프로그래밍이다. 인터넷이라는 거대한 네트워크 망에 데이터를 주고 받기 위해서는 소켓이라는 꼭다리가 필요하다. 


연결요청을 수락하는 기능의 프로그램을 가르켜 '서버' 라고 하며 기본적으로 다음과 같은 소켓의 생성 과정을 갖는다.
1.소켓 생성 (socket)
2.IP 주소와 PORT번호 할당 (bind)
3.연결요청 가능상태로 변경(listen)
4.연결요청에 대한 수락(accept)


연결요청을 진행하는 프로그램을 가르켜 '클라이언트'라고 이 클라이언트 소켓은 connect 함수로 생성한다.


리눅스는 소켓을 파일의 일종으로 구분한다. 반면 윈도우는 파일과 소켓을 구분하기에 별도의 데이터 송수신 함수를 참조해야 한다 (윈도우 내용은 생략한다).


리눅스에서 소켓을 파일의 일종으로 취급하기에 저수준 파일 입출력 함수(저수준이란 ANSI 표준에서 정의한 함수가 아닌 운영체제가 독립적으로 제공하는 함수)인 open, close, write, read 함수로 처리가 된다.


-파일 디스크립터 : 스트림에 할당한 번호로 운영체제에서 스트림을 편하게 구분하기 위해 붙인 숫자. 윈도우에서는 '파일 핸들'이라고도 한다.

Monday, July 12, 2010

synthetic biology

Synthetic biology is a big issue in these days. Craig Venter, George Church, and Kristala Prather who are the most famous in biology field spoke about synthetic biology to a presidential commission(http://www.genomeweb.com//node/944858?hq_e=el&hq_m=762062&hq_l=4&hq_v=37b0a0cbd3). Then what is synthetic biology? Actually what I know is very little thing. So I make opportunity to know this concept.


In 1912, the French chemist Stephane Leduc was first to use the term 'synthetic biology'.
In 1978, Szybalski and Skalka quote the term as closer meaning in today.

top-down approach

bottom-up approach

engineering principles considered in synthetic biology, In 2005 Drew Endy's paper are 
standardization, decoupling, abstraction.

application of synthetic biology, example is artemisinin, a drug against malaria produced from plant, can be produced in genetically engineer yeasts.

Although there are big differences in synthetic biology(more normalized, standardized and concrete), I accept the concept of synthetic biology as one of the way to comprehend the biology. From the past scientist have tried to modify organism for interrogating biological knowledge and producing what they want more efficiently. Synthetic biology is a part of this movement. 

Sunday, July 11, 2010

human epigenome project

As I try to study epigenomics, investigating global movement such as epigenome project to check available data is also important as much as studying biological investigation. And in that sense, I will introduce human epigenome project.

In 2003, scientists from UK's Sanger Institute and Epigenomics, Inc formed the Human Epigenome Project (http://science.howstuffworks.com/genetic-science/human-epigenome-project1.htm). According to website ( http://www.epigenome.org/index.php), The human epigenome project (HEP) is a collaboration run by the members in the Human Epigenome Consortium. One of the aims of the HEP is to generate tissue-specific DNA methylation reference profiles of the human genome. They use sodium bisulfite treatment, find MVPs (methylation variable positions) and release these data.
So far, two papers were published from here.
The first paper is "DNA methylation profiling of the human major histocompatibility complex: a pilot study for the human epigenome project" (http://www.ncbi.nlm.nih.gov/pubmed/15550986?dopt=Abstract)
and the second one is "DNA methylation profiling of human chromosomes 6, 20 and 22"

releasing date from this is stopped in 2006. I am not sure whether their activities stopped.

Monday, July 5, 2010

essential utility (make)

make는 파일 관리 유틸리티이다. 파일 간 종속 관계를 파악하여 기술 파일(Makefile)에 기술된 대로 컴파일 명령이라던지 쉘 명령을 내린다.

make

make는 기술 파일(makefile)에 내용대로 명령을 수행하므로 makefile 작성법과 make 특징만 알면 된다.

-make의 기본 동작-

Sunday, July 4, 2010

essential utility (gcc)

컴파일의 의미와 과정, 그리고 binutils 패키지 활용 방법에 대해 알아본다.


gcc


-컴파일의 의미-

컴파일이란? 형식언어(C, C++) 를 기계어로 번역하는 것.
그럼 기계어(machine instruction)란? 이진수로 되어 있는 숫자로써 CPU의 종류마다 고유하며, 특정 행동을 취하게 하기 위한 코드 (예로 01010101은 i386 CPU에서 'ebp레지스트를 현재의 스택에 push 해라'). 어셈블리 언어와 1대 1 매치.
그럼 어셈블리 언어란? 기계어를 사람이 일상 생활에서 사용하는 자연어에 가깝게 1~6개의 문자로 기호화해서 나타낸 것.

C 소스 파일 컴파일시 -g 옵션을 넣어주고 컴파일 한뒤에 실행 파일을 objdump 명령어로 보면 디버깅 심벌과 기계어, 그리고 어셈블리 코드를 볼수 있다. 기계어는 사람이 보기 좋게 16진수로 되어 있다 (gcc -g -o like like.c --> objdump -S like).
책에 CPU의 0과 1값을 받는 것에 대한 설명이 그림과 함께 잘 나타나 있으나 생략한다.


-C 소스 컴파일 과정-


gcc 는 GNU에서 만든 C 컴파일러이다 (사실 C, Fortran, ada 등도 컴파일 가능하다). 실제로 gcc는 실제 컴파일을 하는 것이 아니라 전처리기(cpp0), C 컴파일러(cc1), 어셈블러(as), 링커(ld 혹은 collect2)를 호출하는 역할을 한다 (*오른쪽 그림 참조*).

컴파일 과정을 gcc -v --save-temps 으로 확인할 수 있다 (-v 는 컴파일 과정을 화면에 출력하라, --save-temps는 컴파일 과정의 파일을 지우지 마라 라는 의미). 위 결과 전처리 후 생기는 *.i 파일 등을 이용하여 에러 수정에 도움이 된다.

1.cpp0에 의한 전처리 과정: /usr/lib/gcc/x86_64-redhat-linux/3.4.6/specs에는 gcc가 호출하는 프로그램의 기본적인 옵션들이 들어 있다. 전처리 과정은 크게 헤더 파일 삽입매트로의 치환및 적용으로 이루어진다. 헤더파일 삽입은 include 한 자리에 파일의 내용이 붙게 된다. 매크로 치환은 define으로 된 내용을 찾아 치환이 일어난다.


2.cc1에 의한 어셈블리 소스 파일로 컴파일 :
1.어휘분석 : 스캐너가 소스를 토큰(문법적으로 의미있는 최소 단위)으로 나눔
2.구문분석 : 파서가 토큰을 받아서 문법적 오류가 있는지 확인
3.의미분석 : 의미상 오류 검사(변수 선언검사, 자료형 불일치 검사등등).
4.중간언어생성 : 이해 안됨
5.최적화 : 중간 코드 최적화(공통부분식 제거, 연산 강도 경감, 상수 계산. 예, var=5+3을 var=8로바꿈)와 목적 코드 최적화(최대한 레지스터를 사용)로 나뉨.
6.목적코드생성 : 목적코드란 어셈블리 언어를 뜻한다.

3.as에 의한 기계어 코드 생성 : as에 의해서, cc1에 의해 생긴 *.s 파일의 기계어와 데이터가 들어있는*.o 파일을 생성한다. *.o 파일은 ELF 바이너리 포멧(바이너리 파일의 구조를 결정짓는 규약)의 바이너리 파일이다. readelf -a *.o 를 통해 ELF 포멧 바이너리의 정보를 알 수 있다. xxd like.o 명령으로도 전체를 볼 수 있다.

4.collect2에 의한 링킹 과정 : printf와 같은 함수를 사용하기 위해 정적 라이브러리 내지는 공유 라이브러리를 ELF 포멧의 바이너리 파일과 링크 시키다.
정적라이브러리란? 미리 만들어진 함수나 변수들의 묶음으로 미리 컴파일 된 *.o 파일이 하나의 파일 lib[라이브러리 이름].a 형식으로 묶여있는 형태를 뜻한다. 이렇게 묶인 오브젝트들은 컴파일 과정에서 각 바이너리와 링크되어 삽입된다. 그러나 이렇게 되면 링크가 중복되고 파일크기도 커져 공유라이브러리를 사용한다.
공유라이브러리(동적라이브러리)란? 설명이 굉장히 복잡하기에 대략적으로 설명하기로 한다. 공유 라이브러리가 존재하면 링크 과정에서 정적라이브러리 링크 하듯이 하지 않고 단순히 오브젝트 파일에 공유라이브러리를 사용하겠다고 표시만 해놓게 된다. 컴파일이 마쳐져서 프로그램이 실행되어지면 공유라이브러리를 사용한다는 표시를 보고 프로그램과 함께 동적 링크도 같이 로드하고 동적 링크는 로드된 동적 라이브러라와 프로그램 상의 라이브러리를 매핑한다.

책에는 gcc에서 호출하는 프로그램들(cpp0, cc1, as, collect2)의 옵션설명이 자세히 나와있으며 바이너리를 조작하거나 정보를 보기 위한 바이너리 유틸리티들에 대한 설명이 있으나 이는 생략한다.