학습목표 : TCP & UDP 프로토콜에 대한 이해 필요
               소켓 옵션에 대한 이해 필요
               파일 입출력에 대한 이해 필요
               파일 전송 프로그램 구현

<용어정리>
데이터 : 우리가 실제로 전달하고자 하는 내용
유저 데이터그램 : 데이터가 일정한 단위를 가지는 것을 데이터그램이라 하는데 UDP에서는 특별히 데이터를 유저가 나눴다고 해서 유저 데이터그램이라 한다.
세그먼트 : 데이터들이 조각으로 나눠진 부분들
세그먼트화 : 세그먼트를 만드는 행위, 구획을 나누는 행위
단편 : 원래 완성된 원본 데이터의 일부분
단편화 : 원래 데이터를 재조합하기 위해서 단편화를 한다.
데이터 원형을 보존하는지 안하는지에 따라 차이가 있다.
세그먼트화는 데이터 원래 모양에는 전혀 관심없고 구획만 나누는 것
패킷 : 실제로 네트워크 구간에서 전송되어지는 형태

소켓버퍼
소켓이 생성되면 버퍼가 자동으로 만들어진다. 수신버퍼와 송신버퍼가 생기고 TCP, UDP 모두 가지고 있다.
이 두 소켓의 버퍼의 의미는 약간 다르다. 소켓 버퍼의 크기는 시스템의 안전성과 속도 양측에 모두 영향을 미치게 된다. 버퍼가 큰 것은 시스템 자원의 소비가 크다는 것을 의미하므로 소켓의 효율 저하와 시스템 자원 부족현상을 가져올 수 있으므로 데이터분절 크기와 전송 지연을 고려하여 잘 잡아야 한다 ~

단편화와 재조합
데이터를 통째로 전송하기에는 무리가 있다. 만일 통째로 보내면 파일 손상의 우려가 있기 때문이다. (전송파일의 크기가 클 수록 오류확률이 커진다. 그래서 작은 확률로 여러개를 보내게 되면 오류 난 부분만 새로 보내면 되기 때문에 효율적이다.) 이렇게 데이터를 잘게 쪼개는 과정을 단편화라고 하고 상대편에서 전송되어진 뒤에 다시 조립되는 과정을 재조합이라고 한다. 데이터 크기는 MTU(Maximum Transfer Unit) 크기를 기준으로 쪼개어진다.

TCP는 미리 세그먼트화를 하기 때문에 데이터가 커도 단편화가 일어나지 않고 UDP에서는 단편화가 발생하게 된다.
사용자 삽입 이미지
                                                            Picture] IP Header



사용자 삽입 이미지
                                                           Picture] TCP Header

사용자 삽입 이미지
사용자 삽입 이미지

                                                          Picture] UDP Header



사용자 삽입 이미지

주 부트로더(MBR에 설치됨)로 사용하거나 2차 부트로더(부팅 가능한 파티션에 설치됨)로 사용할 수 있다. 파티션에 위치하게 되면 이를 불러올 무언가가 MBR에 위치해야 한다. Linux, FreeBSD(Berkeley Software Distribution), NetBSD, OpenBSD는 LILO와 GRUB을 모두 지원하며, 설정 파일을 통해서 윈도우 XP에서도 사용할 수 있다. 두 가지 모두 루트 사용자의 싱글유저모드로 부팅하는 기능을 제공한다.

LILO는 특정 파일 시스템에 의지하지 않는다.
플로피 디스크와 하드 디스크에서 가능하다.(OS 시동)
바이오스(BIOS) 드라이버를 통해 하드웨어와 접근 가능하다.
예전의 배포판의 대부분이 LILO를 기본 부트로더로 사용했다.



GRUB의 가장 큰 특징은 파일시스템과 커널 포맷을 이해한다는 점이다.
따라서 디스크상에서 커널의 물리적인 위치를 알 필요 없이 단지 파일명과 커널이 위치하고 있는 파티션만 알고 있으면 커널을 로드할 수 있다. LILO의 경우 부트로더가 커널의 하드디스크상의 물리적인 위치를 알고 있어야 한다. 따라서 커널을 다시 설치할 때마다 ‘lilo’를 실행해 부트로더를 다시 심어 주어야 하지만, GRUB의 경우 파일명만 알면 되기 때문에 파일명이 바뀌지 않는 한 다시 실행해 줄 필요가 없다.

현재 GRUB은 다음과 같은 기능들을 제공한다.

1. a.out 포맷과 ELF 포맷의 커널을 읽어들일 수 있다.
2. Linux, FreeBSD, NetBSD, OpenBSD등 비-멀티부트 커널을 지원한다.
3. 멀티플 모듈을 로드할 수 있다.
4. 텍스트 형식의 설정 파일을 제공한다.
5. 메뉴 인터페이스를 제공한다.
6. 유연한 커맨드라인 인터페이스를 제공한다.
7. BSD FFS, FAT16, FAT32, Minix, ext2 그리고 ReiserFS 파일시스템을 지원한다.
8. gzip으로 압축된 파일을 다룰 수 있다.
9. BIOS에서 인식되는 모든 장치에 엑세스할 수   있다.


GRUB에도 장점만 있는 것은 아니다. 먼저, 윈도우 등 “chainloader”를 사용해야 하는 운영체제가 첫 번째 하드디스크 외의 다른 하드디스크, 예를 들어 “hdb”에 설치되어 있을 경우 GRUB을 사용해서는 이 운영체제로 부팅할 수 없다. 다음으로, 플로피 디스크나 CD-ROM 부팅을 지원하지 않는다. 마지막으로 다른 부트로더에 비해 덩치가 상당히 크다. 특히 GRUB 플로피디스크를 이용하여 부팅할 때에는 stage2가 로드되는 동안 GRUB 자체를 부팅하는 듯한 느낌이 들 정도다. 하지만 요즘 대부분의 배포판에서는 GRUB을 기본 부트로더로 제공하고 있다.

부트로더란 무엇인가?? 왜 사용하는 거지??
: machine이 직접 OS를 로드하면 BIOS는 우선 512 바이트의 부팅 가능한 미디어(master boot record 또는 MBR)를 읽는다. 하나의 MBR에 단 하나의 OS의 부트 레코드를 저장할 수 있기 때문에 여러 OS가 필요할 경우 문제는 자명하다. 따라서 우리에겐 보다 유연한 부트 로더가 필요하다.

마스터 부트 레코드는 부트 로더 프로그램 전체 또는 일부, 그리고 파티션 테이블(나머지 미디어가 파티션으로 나뉘어지는 방법에 대한 정보를 포함하고 있음.)을 가지고 있다. BIOS가 로딩되면 하드 드라이브의 첫 번째 섹터에 있는 데이터를 찾는다. 그것이 MBR이다. MBR에 저장된 데이터를 사용하여 BIOS는 부트 로더를 활성화한다.

BIOS가 액세스 할 수 있는 데이터 양은 매우 적기 때문에, 대부분의 부트 로더는 두 단계로 로딩된다. 첫 번째 단계에서, BIOS는 initial program loader 또는 IPL로 알려진 부트 로더의 일부를 로딩한다. IPL이 파티션 테이블을 검사하고, 다양한 미디어에 존재하는 데이터를 로딩할 수 있다. 이 작동은 두 번째 단계의 부트 로더가 처음에 자리잡기 위해 사용된다. 여기에는 로더의 나머지 부분이 포함된다.

두 번째 단계의 부트 로더는 부트 로더의 핵심이라 할 수 있다. 많은 사람들은 이것을 부트 로더라고 생각한다. 여기에는 사용자 인터페이스와 커널 로더 같은 디스크를 위시한 부분들을 포함하고 있다. 이러한 사용자 인터페이스들은 간단한 명령행부터 GUI 까지 다양하다.

부트 로더는 두 가지 방식(주 부트 로더 또는 제 2의 부트 로더) 중 하나로 설정된다. 주 부트 로더는 부트 로더의 첫 번째 단계가 MBR에 설치되는 장소이다. 제 2의 부트 로더는 부트 로더의 첫 단계가 부팅 가능한 파티션에 설치되는 장소이다. 개별 부트 로더들이 이때 MBR에 설치되고, 컨트롤을 제 2의 부트 로더에 전달하도록 설정된다.

+ Recent posts