리눅스 Tips, 리눅스 C/C++ 프로그래밍, 모바일 클라우드 동향 및 테스트 등

  Welcome to my Blog!

 °Name : KWON HAN SEUNG
 °Interested in
   - Linux
   - Mobile Cloud
   - Image Processing
   - Signal Processing

 Facebook Link...
 Univ. Team Link...

2013년 4월 26일 금요일

네트워크 기본이론 : 06 스위치를 켜라(1)


1. 스위치와 브리지

 - 스위치 또는 브리지는 콜리전 도메인을 나누어 주는 장비이다.
 - 브리지와 스위치는 둘다 데이터 링크 레이어이지만 다음과 같은 차이점이 존재한다.
  1) 스위치는 하드웨어 방식으로, 브리지는 소프트웨어 방식으로 프레임을 처리한다.
  2) 브리지는 포트들이 같은 속도를 지원하지만, 스위치는 서로 다른 속도를 연결해줄 수 있는 기능을 제공한다.
  3) 스위치는 브리지에 비해 제공하는 포트 수가 훨씬 많다.
  4) 스위치의 경우 cut-through 또는 store-and-forward 방식을 사용하는데 비해서 브리지는 오로지 store-and-forward 방식만을 사용한다.

2. 본격적으로 스패닝 트리를 공부하기 전에

 - 스패닝 트리 알고리즘이란 스위치나 브리지에서 발생하는 루핑을 막기 위한 프로토콜이다.
 - 스패닝 트리 프로토콜을 이해하기 위해 다음과 같은 두 가지 개념을 이해할 필요가 있다.
  1) 브리지 ID
    - 브리지나 스위치들이 통신할 때 서로의 확인을 위해 하나씩 가지고 있는 번호
    - Bridge Priority(2byte) + MAC Address(6byte) 로 구성되어 있음
    - 디폴트 값은 중간값인 32768
  2) Path Cost
    - 브리지가 얼마나 가까이, 그리고 빠른 링크로 연결되어 있는지를 알아내기 위한 값
    - (Bandwidth - Path Cost) : (10Mbps - 100), (100Mbps - 19), (1Gbps - 4)

3. 본격적으로 스패닝 트리를 공부하기 전에

 - 스패닝 트리를 이해하기 위해 외어야 할 기본 동작 세가지는 다음과 같다.
  1) 네트워크당 하나의 루트 브리지(Root Bridge)를 갖는다.
  2) 루트 브리지가 아닌 모든 브리지(Non Root Bridge)는 무조건 하나씩의 루트 포트(Root Port)를 갖는다.
  3) 세그먼트(Segment) 당 하나씩의 데지그네이티드 포트(Designated Port)를 갖는다.
    * 스패닝 트리 프로토콜에서 루트 포트, 데지그네이티드 포트를 제외한 모든 포트는 막는다.

4. STP(Spanning Tree Protocol)에서 힘 겨루기

 - 루트 브리지, 루트 포트, 데지그네이티드 포트를 정하기 위한 4가지 단계는 다음과 같다.
  1) 누가 더 작은 Root BID를 가졌는가?
  2) 루트 브리지까지의 Path Cost 값은 누가 더 작은가?
  3) 누가 더 작은 Sender BID를 가졌는가?
  4) 누구의 Port ID가 더 낮은가?
 - 스패닝 트리 정보를 주고받기 위해 BPDU(Bridge Protocol Data Unit)이라는 특수한 프레임을 사용하며, 2초마다 주고받는 BPDU에는 Root BID, Path Cost, Sender BID, Port ID 등의 정보가 실려있다.

5. Root Bridge 선정하기

 - 다음은 루트 브리지 선정 Flow이다.
  1) 스위치(브리지) 부팅
  2) BPDU 프레임 주고받기(Root BID, Sender BID 모두 자신의 BID 값)
  3) 전달 받은 BPDU 프레임에서 BID 값을 비교하여 낮은 값의 브리지가 루트 브리지
  4) 루트 브리지가 아닌 스위치(브리지)의 BPDU에서 Root BID값을 선정된 루트 브리지 값으로 대체
 - 강제적으로 다른 스위치(브리지)를 루트 브리지로 선정하고 싶은 경우에는 BID의 Bridge Priority 값을 낮은 값으로 변경하면 된다.

6. Root Port 선정하기

 - 다음은 루트 포트 선정 Flow이다.
  1) 루트 브리지가 아닌 스위치(브리지)의 각 포트에서 루트 브리지까지의 Path Cost 비교
  2) 각 스위치(브리지)에서 가장 낮은 Root Path Cost를 가진 포트가 루트 포트로 선정

7. Designated Port 선정하기

 - 세그먼트(Segment) 당 하나씩의 데지그네이티드 포트를 지님을 기억하자.
 - 다음은 데지그네이티드 포트 선정 Flow이다.
  1) 루트 브리지의 포트는 모두 데지그네이티드 포트
  2) 루트 브리지가 아닌 스위치 사이에 생성된 세그먼트에서는 Root BID, Root Path Cost, Sender BID, Port ID 값을 순서대로 비교하여 낮은 값을 지닌 포트가 데지그네이티드 포트 선정

8. 스패닝 트리 프로토콜의 5가지 상태 변화

 - STP의 구현 과정에서 모든 스위치(브리지)들의 포트들은 다음의 5가지 상태로 변화한다.
  1) Disabled : 포트 고장, 관리자가 포트를 Shut Down 시킨 상태
    - 데이터 전송 : 불가능
    - MAC Address Learning : 불가능
    - BPDU 전송 :  불가능
  2) Blocking : 스위치를 처음 켜거나 Shut Down 상태의 포트를 살린 경우로 BPDU 전송을 통해 루트 브리지, 루트 포트, 데지그네이티드 포트 선정이 이 단계에서 이루어짐
    - 데이터 전송 : 불가능
    - MAC Address Learning : 불가능
    - BPDU 전송 :  가능
  3) Listening : 블로킹 상태에서 루트 브리지, 루트 포트, 데지그네이티드 포트 선정이 완료된 상태로 네트워크 상황에 따라 다시 블로킹 상태로 되돌아 갈 수 있음
    - 데이터 전송 : 불가능
    - MAC Address Learning : 불가능
    - BPDU 전송 :  가능
  4) Learning : 리스닝 상태를 포워딩 딜레이인 15초 동안 유지하면 러닝 상태로 변경되며, 맥 어드레스 테이블을 만드는 작업을 수행하는 단계
    - 데이터 전송 : 불가능
    - MAC Address Learning : 가능
    - BPDU 전송 :  가능
  5) Forwarding : 러능 상태를 포워딩 딜레이인 15초 동안 유지하면 포워딩 상태로 변경되며, 이때부터 데이터 프레임 전송이 가능
    - 데이터 전송 : 가능
    - MAC Address Learning : 가능
    - BPDU 전송 :  가능
 * 리스닝, 러닝, 포워딩 상태에 있던 포트도 루트 포트나 데지그네이티드 포트에서 탈락되면 바로 블로킹 상태로 넘어갈 수 있으며, 고장이나 Shut Down 여부에 따라서도 디스에이블드 상태로 넘어갈 수 있다.

9. 스패닝 트리의 변화

 - 링크의 속도와 루트 브리지를 어디로 잡느냐의 여부를 항상 염두해서 네트워크를 디자인
 - 스패닝 트리의 변화를 공부함에 앞서 알아야할 용어
  1) Hello Time : 루트 브리지가 헬로 BPDU를 보내는 시간 간격으로 디폴트는 2초
  2) Max Age : 브리지들이 루트 브리지로부터 얼마 동안 헬로 BPDU를 받지 못했을 때 루트 브리지가 죽었다고 생각하고 새로운 스패닝 트리를 만들기 시작하는가에 대한 시간으로 디폴트는 20초
  3) Forwarding Delay : 브리지 포트가 리스닝 상태에서 러닝 상태로, 러닝 상태에서 포워딩 상태로 바뀌는데 걸리는 시간으로 디폴트는 각 15초

'네트워크 기본이론 : 06 스위치를 켜라(2) '에 이어서...

2013년 4월 10일 수요일

네트워크 기본이론 : 05 IP 주소로의 여행

1. 라우터와 IP 주소

 - 라우터에서
  1) 이더넷 인터페이스 : 내부 네트워크에 연결되는 라우터의 포트로 내부에서 사용하기 위해 부여 받은 IP 주소 중 하나를 배정해야 한다. 이러한 IP 주소는 보통 맨 앞의 번호를 쓰게 되는데, 예를 들어 내부 PC용으로 부여 받은 주소가 203.120.150.1~203.120.150.255까지라면 라우터는 203.120.150.1을 사용하는 것이 보편적이다.
  2) 시리얼 인터페이스 : 외부 네트워크(인터넷)에 연결되는 라우터의 포트로 DSU 또는 CSU라는 전용선 모뎀에 연결된다. 시리얼 인터페이스도 이더넷 인터페이스 처럼 IP 주소를 부여해야 하는데 이는 마음대로 정하는 것이 아니라 라우터가 접속하는 상대편(ISP) 라우터의 시리얼 인터페이스와 IP 주소를 서로 맞추어 부여해야 한다.

 - 라우터에서 인터페이스가 달라진다는 것은 네트워크가 달라진다는 것을 의미한다.
 - IP 주소는 TCP/IP 프로토콜을 사용하는 모든 장비들을 구분하기 위해 만들어진 32자리의 2진수이다.
 - 32자리의 2진수로 이루어진 IP 주소는 네트워크 부분과 호스트 부분으로 나뉘고, 어떻게 나누었는지에 따라 5종류의 Class 중 하나가 된다.
  1) 네트워크 부분 : 하나의 브로드캐스트 영역으로 하나의 PC가 데이터를 뿌렸을 때 그 데이터를 라우터를 거치지 않고 바로 받을 수 있는 영역이다.
  2) 호스트 부분 : 각각의 PC 또는 장비를 뜻하며, 다른 장비가 같은 주소를 부여 받아서는 안된다. 예를 들어 내부 PC용으로 부여 받은 주소가 203.120.150.1~203.120.150.255까지라면 203.120.150 부분이 네트워크 부분, 나머지 부분이 호스트 부분이 된다.

 - 참고로 IP 주소 중에 네트워크 부분만이 라우터가 라우팅 할 때 참고하는 부분이다.
 - 다음은 IP주소의 Class를 나타낸다. 이와 같은 Class는 IP 주소를 효율적으로 배분하기 위해 사용된다.
  1) Class A : 다음과 같이 32개의 이진수 중에서 맨 앞쪽 하나가 항상 0으로 시작되는 것들
                              0xxx xxxx . xxxx xxxx . xxxx xxxx . xxxx xxxx
                      클래스 A의 경우 앞의 8비트가 네트워크 부분을 나타내고 나머지 24비트가 호스트 부분을 나타낸다.  또한 네트워크 부분의 경우 가장 작은 네트워크(0.0.0.0)와 가장 큰 네트워크(127.0.0.0)는 네트워크에서 제외 되므로 1.0.0.0~126.0.0.0을 네트워크 부분으로 가지며, 호스트 부분의 경우 모두 0인 경우(네트워크 자체를 나타내므로)와 모두 1인 경우(브로트캐스트 주소이므로)는 제외 되므로 (2^24-2)가 호스트의 수가 된다.
  2) Class B : 다음과 같이 32개의 이진수 중에서 맨 앞이 반드시 10(2진수)으로 시작되는 것들
                              10xx xxxx . xxxx xxxx . xxxx xxxx . xxxx xxxx
                      클래스 B의 경우 앞의 16비트가 네트워크 부분을 나타내고 나머지 16비트가 호스트 부분을 나타낸다.  또한 네트워크 부분의 경우 가장 작은 네트워크(128.0.0.0)와 가장 큰 네트워크(191.255.0.0)는 네트워크에서 제외 되므로 128.1.0.0~191.254.0.0을 네트워크 부분으로 가지며, 호스트 부분의 경우 모두 0인 경우(네트워크 자체를 나타내므로)와 모두 1인 경우(브로트캐스트 주소이므로)는 제외 되므로 (2^16-2)가 호스트의 수가 된다.
  3) Class C : 다음과 같이 32개의 이진수 중에서 맨 앞이 항상 110(2진수)으로 시작되는 것들
                              110x xxxx . xxxx xxxx . xxxx xxxx . xxxx xxxx
                      클래스 C의 경우 앞의 24비트가 네트워크 부분을 나타내고 나머지 8비트가 호스트 부분을 나타낸다.  또한 네트워크 부분의 경우 가장 작은 네트워크(192.0.0.0)와 가장 큰 네트워크(223.255.255.0)는 네트워크에서 제외 되므로 192.0.1.0~223.255.254.0을 네트워크 부분으로 가지며, 호스트 부분의 경우 모두 0인 경우(네트워크 자체를 나타내므로)와 모두 1인 경우(브로트캐스트 주소이므로)는 제외 되므로 (2^8-2)가 호스트의 수가 된다.
  4) Class D 와 Class E : 멀티캐스트용, 연구 개발용

 - 네트워크가 서로 다른 두 장비 간의 통신은 라우터를 통해서만 가능하다. 앞서 언급하였듯이 라우터의 각 인터페이스에는 해당 인터페이스가 속한 네트워크의 IP 주소를 부여해야 하며(사실 스위치나 허브에 IP 주소를 배정하지 않아도 통신에는 지장이 없지만 관리를 위해서 부여하는 것이 좋다),  IP 주소를 배정할 때는 접속 가능한 호스트의 수 등을 파악해야 한다.
 - 기본 게이트 웨이란 내부 네트워크에서 없는 녀석을 찾을 때 밖으로 통하는 문이 되는 것으로 라우터의 이더넷 인터페이스가 된다.

2. 서브넷 마스크

 - 서브넷 마스크란 메인이 아닌 어떤 가공을 통한 네트워크를 만들기 위해서 씌우는 마스크로 주어진 IP 주소를 네트워크 환경에 맞게 나누어 주기 위해서 씌워주는 2진수 조합이다.
 - 라우터를 통해서 큰 네트워크에 서브넷 마스크를 씌워 네트워크를 나누어 줄 수 있으며, 이는 네트워크(브로드캐스트 도메인)가 너무 커서 발생하는 통신 문제를 해결할 수 있도록 한다.
 - 서브넷 마스크는 네트워크를 나누었는지 여부를 판단하기 위하여, 네트워크를 나누지 않더라도 항상 사용된다. 이때 사용되는 서브넷 마스크를 디폴트 서브넷 마스크라 하며 클래스에 따라 다음과 같이 나타낸다.
  1) Default Subnet Mask_Class A : 255 . 0 . 0 . 0
  2) Default Subnet Mask_Class B : 255 . 255 . 0 . 0
  3) Default Subnet Mask_Class C : 255 . 255 . 255 . 0

 - 서브넷 마스크는 이진수로 썼을 때 반드시 '1'이 연속적으로 나와야 한다.
 - 서브넷 마스크는 서브넷의 IP 주소에서 네트워크 부분과 호스트 부분을 판단할 수 있도록 해주며, 여기에서 서브넷은 서브넷 마스크를 통해서 나뉘어진 각각의 네트워크를 말한다. 각각의 서브넷 끼리의 통신은 라우터를 통해서만 가능하다. 추가적으로 라우터 없이 네트워크를 나누기 위해 서브넷 마스크를 만들어서 쓴다는 말은 틀린 말이다.
 * 콜리전 도메인을 나누는 것이 스위치,
    브로드캐스트 도메인을 나누는 것이 라우터이다.
 - 예를 들어 150.100.0.0이란 클래스 B 네트워크를 255.255.255.0이란 서브넷 마스크를 사용해서 서브네팅을 했을 경우. 150.100.100.1과 150.100.200.1은 서로 다른 네트워크에 속한 호스트가 된다. 즉 서로 다른 브로드캐스트 도메인에 존재하고 있기 때문에 라우터를 통해서만 통신이 가능하다.
 - 서브넷을 실제로 나누는 예를 살펴보자. 210.100.1.0란 클래스 C 네트워크를 받았을 때, PC 30대인 네트워크를 최소 4개 이상 만든다고 하자. 여기서 주의할 점은 서브넷을 통해서 네트워크를 나누었을 때 각 네트워크에서 호스트 부분이 전부 0인 경우(네트워크 자체)와 전부 1인 경우(브로드캐스트 주소)는 사용할 수 없으며, 이에 따라 사용 가능한 호스트 수는 '2^(호스트 비트 수) - 2' 라는 것이다. 따라서 호스트 수 30개가 되기 위해서는 호스트 자리 수가 이진수 5개가 되며, 서브넷 마스크는 255.255.255.224가 되는 것이다.

네트워크 기본이론 : 04 네트워크 장비들에 관한 이야기

1. 랜카드(NIC)

 - NIC는 Network Interface Card의 약자로 보통 랜카드라고 부른다.
 - 랜카드는 유저의 데이터를 케이블에 실어서 허브나 스위치, 혹은 라우터 등으로 전달해주고 자신에게 온 데이터를 CPU에게 전달해 주는 역할을 한다.
 - 랜카드의 분류
  1) 네트워크 환경에 따라
   a. 이더넷용 : 대부분의 환경에서는 이더넷을 사용
   b. 토큰링용
   c. FDDI용
   d. AMT용
  2) PC의 버스 방식에 따라
   a. PCI용 : 현재 가장 많이 사용
   b. ISA용
   c. EISA용 : 간혹 서버급에서 사용
  3) 속도에 따라 : 실제 상황에서는 인캡슐레이션, 오버헤드에 의해 제 속도가 나오지 않는다.
   a. 10Mbps용
   b. 100Mbps용
   c. 10-100 Auto-sense용
  4) 케이블의 종류에 따라
   a. UTP용 : 일반적임
   b. BNC용
   c. AUI용
   d. 광케이블용
 - 장치관리자 -> 네트워크 어댑터에서 랜카드에 대한 등록정보에서 리소스 항목을 살펴보면, 입/출력 범위, 인터럽트 요청(IRQ), 메모리 범위(Base Memory) 등이 나타난다. 이러한 값들은 내가 목적지인 데이터가 들어왔을 떄 랜카드는 컴퓨터의 CPU에게 자기가 가지고 있던 IRQ를 이용하여 인터럽트를 걸게 되고, CPU는 IRQ번호를 확인하고 랜카드에서의 서비스 요청임을 확인, 그리고 이 데이터에게 어떤 서비스를 제공할 것인지를 미리 정해 놓은 장소인 Base Memory로 이동하여 작업을 시작하게 된다.

2. 허브(HUB)

 - 연결된 모든 PC들이 서로 통신할 수 있게 해주는 역할을 하는 장비로, 멀티포트 리피터(Multiport Repeater)라고도 한다. 이는 포트가 여러 개 달린 장비인데, 이것은 한 포트로 들어온 데이터를 나머지 모든 포트로 뿌려준다는 것이다.
 - 허브는 랜카드 처럼 이더넷용, 토큰링용 등으로 나뉘고, 포트 수에 따라, 속도에 따라서도 종류가 나뉜다.
 - 허브의 설치는 전원에 연결하고 스위치를 켜면 OK!
 - 이더넷 허브의 경우 이더넷의 특징인 CSMA/CD의 적용을 받는다. 따라서 하나의 PC가 허브에 데이터를 보내고 있을 때 또 다른 PC가 데이터를 보내려고 하면 콜리전이 발생한다. 따라서 같은 허브에 열결되어 있는 모든 PC들은 모두 '같은 콜리전 도메인 상에 있다'(Shared 방식 허브)라고 말한다.
 - 허브를 계속해서 연결해 나갈수록 콜리전 도메인의 크기는 점점 커지게 되고, 콜리전에 영향을 받는 PC들이 많아지므로 속도가 감소한다.
 - 허브의 종류
  1) 인텔리전트 허브 : 지능형 허브로 NMS(네트워크 관리시스템)을 통해 데이터 분석 및 제어
  2) 더미 허브 : 일반적인 허브
  3) 세미 인텔리전트 허브 : 일단은 더미 허브이나, 인텔리전트 허브와 연결하면 인텔리전트 허브가 됨

3. 브리지와 스위치

 - 허브의 콜리전 도메인에 따른 문제를 해결하기 위해 콜리전 도메인을 나누어 줄 수 있는 장비가 탄생하였는데, 바로 브리지(Bridge) 또는 스위치(Switch)이다.
 - 스위치는 허브에 비해서 데이터 처리 방법이 우수할 뿐만 아니라 전송 에러 등을 복구해주는 등 다양한 기능을 가진다.
 - 스위치는 임의의 두 포트 사이에서 통신이 일어나면 나머지 모든 PC들은 기다려야 했던 허브와는 달리 다른 PC들도 동시에 통신이 가능하며 이를 '포트별로 콜리전 도메인이 나뉘어 있다' 혹은 '각각의 포트에 연결된 PC가 독자적으로 10Mbps 또는 100Mbps의 속도를 갖는다'라고 말한다.
 - 브리지나 스위치는 다음 다섯 가지 일을 한다.
  1) Learning : 들어오는 프레임에 대해서 출발지의 맥 어드레스를 세그먼트 별로 브리지 테이블에 저장한다.
  2) Flooding : 들어온 프레임의 목적지 주소가 브리지 테이블에 없는 경우 들어온 포트를 제외한 나머지 모든 포트로 프레임을 뿌려준다.
  3) Forwarding : 들어온 프레임의 목적지 주소가 브리지 테이블에 존재하며, 목적지가 출발지와 다른 세그먼트에 존재하는 경우 프레임을 해당 포트쪽으로만 뿌려준다.
  4) Filtering : 들어온 프레임의 목적지 주소가 브리지 테이블에 존재하며, 목적지가 출발지와 같은 세그먼트에 존재하는 경우 브리지(또는 스위치)는 다른 포트들을 막는다. 이를 통해 콜리전 도메인을 나눌 수 있게 되는 것이다.
  5) Aging : 브리지 테이블의 기억 용량 및 시간은 한정되어 있다. 따라서 어떤 맥 어드레스를 브리지 테이블에 저장하고 나면 그때부터 Aging기능이 가동되어 저장 후 300초가 지나도록 더 이상 그 출발지 주소를 가진 프레임이 들어오지 않으면 브리지 테이블에서 해당 맥 어드레스를 삭제한다. 만약 300초 이내에 똑같은 출발지 주소의 프레임이 들어오면 Aging 타이머를 리플래시 한다.
 - 브리지와 스위치는 둘다 데이터 링크 레이어이지만 다음과 같은 차이점이 존재한다.
  1) 스위치는 하드웨어 방식으로, 브리지는 소프트웨어 방식으로 프레임을 처리한다.
  2) 브리지는 포트들이 같은 속도를 지원하지만, 스위치는 서로 다른 속도를 연결해줄 수 있는 기능을 제공한다.
  3) 스위치는 브리지에 비해 제공하는 포트 수가 훨씬 많다.
  4) 스위치의 경우 cut-through 또는 store-and-forward 방식을 사용하는데 비해서 브리지는 오로지 store-and-forward 방식만을 사용한다.
   . store-and-forward : 일단 프레임을 전부 받아들인 다음 제대로 다 들어왔는지, 에러는 없는지, 출발지 주소와 목적지 주소는 어디인지를 파악해서 처리해주는 방식으로 에러 발견시 재전송을 요구하기 때문에 에러 복구능력이 뛰어나다.
   . cut-through : 스위치가 들어오는 프레임의 목적지 주소만을 본 다음 바로 전송 처리를 하는 방식으로 프레임의 처음 48비트만을 보기 때문에 빠른 처리가 가능하지만 에러 복구능력이 떨어진다.
   . fragment-free : 앞의 두 방식의 장점을 결합한 방식으로 프레임의 처음 512비트를 보는 방식이다. 에러 감지 능력이 cut-through에 비해서 뛰어나다고 볼 수 있다.

4. Looping & Spanning Tree Algorithm

 - Looping은 하나의 호스트에서 다른 호스트로 가는 경로가 두개 이상인 경우 프레임이 네트워크 상에서 무한정으로 도는 현상을 말한다.
 - Looping을 자동적으로 막아주는 알고리즘인 스패닝 트리 알고리즘이 존재한다. 스패닝 트리 알고리즘은 스위치나 브리지에서 발생할 수 있는 루핑을 미리 막기 위해 두 개 이상의 경로가 발생하면 하나를 제외하고 나머지 경로들을 자동으로 막아두었다가 만약 기존 경로에 문제가 생기면 막아놓은 경로를 풀어서 데이터를 전송하는 알고리즘이다.
 - 위의 경우에서 만약 문제가 발생하여 현재의 링크가 끊어졌을 때 대기하고 있던 다른 링크가 다시 살아나서 연결을 해주는데 약 1분이 걸린다. 요즘에는 이러한 문제를 해결하기 위해 여러개의 링크를 마치 하나의 링크처럼 인식하게 하는 기술인 시스코의 이더 채널(Ether-Channel)이나 업링크 패스트(Uplink Fast)라는 기술을 사용한다.

*폴트 톨러런트 : 네트워크 상에 어떤 문제가 발생할 때를 대비해서 미리 장애 대비를 하는 것.
*로드 밸런싱 : 네트워크의 로드를 분산하여 성능 향상의 효과를 보는 것.
  -> 대부분의 로드 밸런싱은 폴트 톨러런트가 가능하지만 폴트 톨러런트는 로드 밸런싱이 안되는 경우도 있다.

5. 라우팅? 스위칭?

 - 스위치는 브로드캐스트에서 한계를 보인다. 따라서 브로드캐스트 영역(도메인)을 나누는 것은 매우 중요한 일이며 이를 위해서는 라우터가 반드시 필요하다.
 - 라우터는 스위치가 보장 못하는 보안 기능, 즉 패킷 필터링 기능을 제공하여 네트워크 주소에 따라 전송을 막았다가 풀었다가 할 수 있다. 또한 로드 분배를 통하여 데이터가 여러 경로를 타고 전송될 수 있도록 한다. 이 외에도 프로토콜이나 데이터의 크기, 중요도 등 여러 상황에 따라 트래픽의 전송 순서를 조정해주는 QoS(Quality of Service) 기능도 제공한다.

네트워크 기본이론 : 03 TCP/IP와의 만남

1. TCP/IP 개요

 - TCP/IP는 Transmission Control Protocol/Internet Protocol의 약자로 인터넷을 사용하기 위해 꼭 필요한 프로토콜이다.
 - 네트워크에 접속되는 호스트들은 고유의 주소를 가지고 있어서 자신이 속해 있는 네트워크 뿐만아니라 다른 네트워크에 연결되어 있는 호스트까지도 서로 데이터를 주고받을 수 있도록 만들어져 있는 것이 특징이다.

2. IP주소

 - 인터넷을 사용하는 PC 각각은 유일한 네트워크 주소(Logical)를 가지는데 이를 IP주소라고 한다.
 - 그러나 IP주소는 한정적이므로 다음과 같은 방식을 이용하여 IP주소를 공유한다.
  1) NAT : Network Address Translation의 약자로 내부 네트워크에서는 공인되지 않은 IP주소를 사용하고, 인터넷으로 나갈 때만 공인 주소(실제 IP주소)를 사용하는 방식
  2) PAT : 동일한 IP주소를 가지고 여러명이 인터넷에 접속하면서 포트번호만 바꾸는 방식
 - IP 주소는 210.126.12.99와 같은 형태를 띄며, 실제로는 이진수 8자리가 4묶음으로 이루어진 것으로, 중간에 점을 찍어서 표시하는 것이다.

3. 이진수의 사용

 - 컴퓨터에서 사용하는 모든 숫자는 이진수이므로 위에서 언급했던 것처럼 IP주소도 실제로는 이진수이다.
 - IP주소(IPv4)가 한정적이기 때문에 보다 더 많은 주소를 부여할 수 있는 방법인 IPv6가 대두되었다.(IPv4 : 2 ^ 32개 -> IPv6 : 2 ^ 128개)

4. TCP/IP의 특징

 - TCP/IP는 다음과 같은 특징을 가진다.

  1) IP 주소가 서로 같으면 안된다.
  2) 네트워크별로 동일한 네트워크 부분을 가져야 한다.
  3) 서브넷 마스크를 동일하게 가져야 한다.

 - 위와 같은 특징으로 인하여 네트워크 관리자의 IP주소 관리에 대한 부담이 컸었지만 IP주소를 자동으로 배정해주는 DHCP(Dynamic Host Configuration Protocol)의 등장으로 인해 사용자 IP주소 관리가 편해졌다.
 - DHCP 서버가 네트워크 상의 모든 IP주소를 가지고 있다가 클라이언트 PC가 켜지면서 네트워크에 브로드캐스트를 통하여 IP주소를 요청한다. DHCP 서버는 이 요청을 듣고 클라이언트에게 자신이 관리하는 IP주소 중 하나를 자동으로 주는 것이다.

네트워크 기본이론 : 02 네트워크와 케이블

1. LAN과 WAN

 - LAN(Local Area Network) : 한정된 지역 안에서의 네트워크 구축
 - WAN(Wide Area Network) : 서로 멀리 떨어진 곳을 네트워크로 연결

2. Ethernet

 - 네트워크를 구축하는 방법에는 Ethernet, Token-Ring, FDDI, ATM 방식 등이 존재하며, 어떤 네트워킹 방식을 사용하느냐에 따라 네트워크 장비들의 선택이 달라진다.
 - Ethernet은 위에서 본 것처럼 네트워킹의 한 방식으로 CSMA/CD라는 프로토콜을 사용하여 통신을 한다.
 - CSMA/CD(Carrier Sense Multiple Access/Collision Detection) : 통신하고자 하는 컴퓨터가 네트워크를 살펴봐서 아무도 통신을 하고 있지 않으면 무조건 자기 데이터를 실어서 보낸 다음 잘 갔는지 확인해보는 방식이다. 그러나 만약 동시에 두 개의 컴퓨터에서 데이터를 실어 보내려고 하면 충돌이 발생하게 되는데, 이를 Collision이라 한다. 이렇게 Collision이 발생하면 이 두 컴퓨터는 자신이 보내려던 데이터를 랜덤한 시간 동안 기다렸다가 다시 보내게 된다.

3. Token-Ring

 - 토큰을 가진 컴퓨터만이 네트워크에 데이터를 실어 보낼 수 있으며, 데이터를 다 보내고 나면 바로 옆 컴퓨터에게 토큰을 건네주는 방식이다.
 - 내가 지금 바로 보내야 할 데이터가 있고, 다른 컴퓨터들은 보낼 데이터가 하나도 없다고 하더라도 차례가 올 때까지 계속 기다려야하는 단점이 있다.

4. UTP 케이블

 - 네트워크 장비 사이의 연결에 사용되는 케이블에는 광 케이블, UTP 케이블, 동축 케이블 등 다양한 종류가 있으며, UTP는 Unshieled Twisted-pair의 약자로 우리 주변에서 가장 많이 사용되는 케이블이다.
 - 카테고리
  1) 카테고리 1 : 전화망에 사용
  2) 카테고리 2 : 최대 4Mbps의 속도로 데이터 전송
  3) 카테고리 3 : 10 Base T 네트워크에 사용되는 케이블로 최대 10Mbps의 속도로 데이터 전송
  4) 카테고리 4 : 토큰링 네트워크에서 사용되는 케이블로 최대 16Mbps의 속도로 데이터 전송
  5) 카테고리 5 : 기가비트 표준의 케이블

5. 케이블의 종류

 - ex) 10 Base T
  1) 10 : 지원 속도로 여기에서는 10Mbps를 지원하는 케이블임을 의미
  2) Base : Baseband용 케이블을 의미하며 Baseband는 디지털 방식, Broadband는 아날로그 방식
  3) T (or Number) : 알파벳은 케이블의 종류(?)로 여기에서는 TP케이블임을 의미하며 숫자가 나올 경우 최대 전송거리를 의미

6. 맥 어드레스

 - 맥 어드레스의 맥(MAC)은 Media Access Control의 약자로 모든 네트워크 장비들은 이 MAC주소를 이용하여 통신을 한다.
 - 인터넷은 TCP/IP 통신을 하고 따라서 통신을 하기 위해서 IP주소를 사용한다고 많이들 알고 있는데 사실 IP주소를 MAC주소로 바꾸는 절차인 ARP(Address Resilution Protocol)과정을 거친후 MAC주소를 이용하여 통신을 하고 있는 것이다.

 - ARP절차


 - 모든 네트워크 장비(Ethernet)들은 48bit의 고유 주소를 갖는데 이를 MAC주소라 하며, 00:60:97:8F:4F:86 과 같은 형태로 나타내어진다. 앞의 6자리는 생산자를 나타내느 코드로 OUI라 하며, 나머지 6자리는 각 생산자들이 장비에 분배하는 Host Identifier(시리얼 넘버)

7. 유니캐스트, 브로드캐스트, 멀티캐스트

 - 유니캐스트 : 현재 네트워크 상에서 가장 많이 사용되는 통신 방식으로 특정 목적지의 주소 하나만을 가지고 통신하는 방식이다. 어떤 PC가 유니캐스트 프레임을 뿌리게 되면 로컬 이더넷의 기본 성격이 붙어있는 모든 PC들에게 정보를 뿌리는 Shared방식이기 때문에 그 로컬 네트워크 상에 있는 모든 PC들은 일단  이 프레임을 받아들여서 랜카드에서 자신의 맥 어드레스와 비교하게 된다. 그 다음 자신의 랜카드 맥 어드레스와 목적지 맥 어드레스가 서로 다른 경우는 바로 그 프레임을 버리고, 같은 경우는 이 프레임을 CPU로 전달한다.
 - 브로드캐스트 : 로컬 랜 상에 붙어있는 모든 네트워크 장비들에게 보내는 통신이다. 브로드캐스트의 대표적은 예는 ARP이며, 외에도 라우터끼리 정보를 교환한다거나 다른 라우터를 찾을 때, 또 서버들이 자신이 어떤 서비스를 제공한다는 것을 모든 클라이언트들에게 알리 때 등 여러 경우에 사용된다. 그러나 브로드캐스트 프레임을 전송받은 PC의 랜카드는 목적지 주소에 상관없이 CPU로 정보를 전달해야 하며, 브로드 캐스트를 주기적으로 발생하는 성격때문에 전체 네트워크 뿐 아니라 PC자체의 성능 역시 떨어뜨리는 결과를 가져오기도 한다.
 * 참고사항 : 라우터는 원래 브로드캐스트를 막는 성질이 있다.
 - 멀티캐스트 : 보내고자 하는 그룹 멤버들에게만 한 번에 보내는 방식이다.(ex. 200 명의 사용자가 있는 네트워크에서 150 명에게만 같은 정보를 동시에 제공) 그러나 멀티캐스트는 라우터나 스위치에서 이 기능을 지원해 주어야만 사용가능하다. 추가적으로 멀티캐스트는 그룹에 포함되고 또 그룹에서 빠져나가는 것을 정의하기 위해 몇 가지 기술들을 사용하며, IP 주소의 경우에는 클래스 D를 사용한다.

8. OSI 7 Layer

 - International Organization for Standardization에서 만들었으며 통신이 일어나는 과정을 7단계로 나눈 것며, 통신을 7단계로 표준화하여 그 효율성을 높이기 위함이다. 7단계로 나눈 이유는 다음과 같다. 첫 번째, 데이터의 흐름이 한눈에 보인다. 두 번째, 문제 해결에 용이하다. 세 번째, 여러 회사 장비들을 사용해도 네트워크가 이상없이 돌아간다.
 - OSI 7 Layer
  (User)
  1) Application Layer<Specific Address>
  2) Presentation Layer<Specific Address>
  3) Session Layer<Specific Address>
  4) Transport Layer<Port Address>
  5) Network Layer<Logical Address> : 패킷 라우팅(라우터)
  6) Data Link Layer<Physical Address> : 프레임 오류 및 흐름 관리(브리지, 스위치)
  7) Physical Layer<Physical Address> : 비트 데이터 전달(통신 케이블, 리피터, 허브)

9. 프로토콜

 - 프로토콜이란 컴퓨터끼리 서로 통신하기 위해서 꼭 필요한 서로간의 통신 규약 또는 통신 방식에 대한 약속이다.
 - Protocol = Semantic + Syntax + Action

2013년 4월 9일 화요일

리눅스 시스템 프로그래밍 : 04 유저 환경(1)


1. 리눅스 계정 시스템

 리눅스는 다중 사용자 운영체제다. 이는 동시에 여러사람이 컴퓨터의 자원을 사용할 수 있음을 의미한다. 그러므로 리눅스 운영체제는 여러사람을 관리할 수 있는 시스템을 가지고 있어야 한다. 이것을 계정 시스템이라고 한다. 계정이란 컴퓨터 자원에 접근할 수 있는 사람들에 대한 정보로 이해하면 될 것이다.

 아니다. 엄밀히 따지자면, 사람이라는 표현은 잘못된것 같다. 운영체제의 계정에는 시스템 계정일반 사용자 계정 크게 두가지로 분류할 수 있는데, 사람이라하면 일반 사용자 계정만을 가리키는 것이기 때문이다. 그러므로 사람 대신 객체라고 표현하는게 옳은 것 같다. 다시 정리하자. 계정이란 컴퓨터 자원에 접근할 수 있는 객체에 대한 정보를 의미한다.


2. 계정 정보


 계정이라는 것은 컴퓨터 자원에 접근하기 위한 객체라는 것을 알게 되었다. 그렇다면, 이들 객체는 각 객체의 특징을 나타내주는 정보를 가지고 있을 것이다. 이것을 계정정보라고 하다. 계정정보는 다음과 같은 정보들을 포함하고 있을 것이다. 계정은 유저라고 부르기도 하며, 계정정보는 유저정보와 동일한 의미로 사용된다.

  • 계정이름 계정을 다른 계정과 분리시켜주는 이름
  • 권한 컴퓨터 자원은 그 한계가 있다. 무한대가 아니다. 또한 다중 사용자 운영체제인 리눅스에 의해서 접근하게 될경우, 시스템 보안데이터 보안의 차원에서 접근제어를 해야할 필요가 있다. 리눅스(:12)는 권한을 통해서 이를 관리한다. 즉 이 파일은 누구누구는 읽기만 가능하고, 어떤 그룹에 대해서는 읽기/쓰기가 모두 가능하다 라는 식으로 관리한다.
  • 패스워드 이름과 이름에 따른 권한이 주어졌다면, 이 권한을 요청한 유저가 정말로 합법적인 유저인지를 확인하는 과정을 거쳐야 할 것이다. 인증과정인 셈이다. 가장 널리 사용되는 방법은 아이디/패스워드를 통한 인증방법이다.

 위의 3가지 정보를 가지고 있으면, 완전한 하나의 계정을 만들어 낼 수 있다. 몇몇 부가적인 정보들이 더 필요한 경우가 있는데, 나머지는 말 그대로 부가정보들일 뿐이다.


3. 슈퍼유저


 컴퓨터 시스템은 회사와 매우 비슷한 면이 있다. 회사처럼 자원과 계정(사람)이 있으며, 권한이 부여된다. 입출입시 인증을 요구하기도 한다.

 회사에 CEO가 있다면, 운영체제(:12)에는 슈퍼유저(:12)가 있다. 슈퍼유저는 무엇이든지 할 수 있는 막강한 권한을 가진 특별한 유저를 칭한다. 회사의 경우 CEO라고 하더라도, 권한을 행사함에 있어서 여러가지 제약이 있는 반면, 슈퍼유저는 말그대로 슈퍼맨의 능력을 가지고 모든 능력을 행사할 수 있다. 다음과 같은 명령하나로 운영체제를 싹 날려버릴 수도 있다.

# rm -rf /

 전통적으로 유닉스에서 슈퍼유저는 root라는 계정이름이 부여된다. 리눅스 역시 유닉스의 이러한 전통을 따르고 있다. 슈퍼유저는 파일을 만들고 삭제하고, 파티션을 나누고, 유저를 추가하고 권한을 조정하는 등의 모든 업무를 처리할 수 있는 권한을 가지게 된다. 그 권한이 워낙 막강한 관계로, 최근의 몇몇 운영체제들은 root 라도 그 권한을 제한시키는 경우가 있다.


4. 유저 생성 과정


 아마도 여러분은 adduser(1) 명령을 이용해서 유저를 생성하는 법을 알고 있을 것이다. 여기에서는 실제 유저를 생성하기 위해서 어떤 과정을 거쳐야 하는지에 대해서 알아보도록 하겠다.




  4.1 유저 파일들


 리눅스에서 모든 정보는 파일을 통해서 관리된다는 것을 알고 있을 것이다. 유저정보 역시 마찬가지 이며, 유저와 관련된 파일들은 /etc 밑에 존재한다. 전통적으로 유닉스 시스템에서 /etc 디렉토리는 각종 설정파일을 저장하기 위한 목적으로 사용되어지고 있다. 유저 관련 주요 파일들은 다음과 같다.

passwd 유저 이름과 패스워드가 저장된다.
shadow passwd와 비슷하지만 보안이 강화되었다.
group 그룹 정보가 저장되어있다.
adduser.conf 유저생성과 관련된 변수들이 정의되어 있다.

각 파일들에 대한 내용은 아래에 다루도록 할 것이다.


  4.2 passwd 파일


 유저의 기본적인 정보는 /etc/passwd파일에 저장된다. 유저정보는 printable ASCII 문자로 입력이 되기 때문에 vi(:12)와 같은 에디터를 이용해서 내용을 확인할 수 있다. 다음은 passwd 파일 내용의 일부분이다.

# cat /etc/passwd
...
yundream:x:1000:1000:yundream,,,:/home/yundream:/bin/bash
mysql:x:110:121:MySQL Server,,,:/var/lib/mysql:/bin/false
mt-daapd:x:114:65534::/var/cache/mt-daapd:/bin/true
testyun:x:1004:1004:,,,:/home/testyun:/bin/bash
myyun:x:115:65534::/home/myyun:/bin/false
...
:를 구분자로 7개의 필드로 이루어진 간단한 구조를 하고 있다. 각 필드가 포함하는 내용은 다음과 같다.
유저:패스워드:UID:GID:GECOS:디렉토리:쉘
  1. 유저 : 시스템내에서 사용되는 유저 이름
  2. 패스워드 : 유저가 사용할 패스워드
  3. UID : 유저에게 부여되는 ID로 일련의 숫자다.
  4. GID : 유저가 포함되는 그룹의 ID로 일련의 숫자다.
  5. GECOS : 유저의 부가정보로 생략가능하다.
  6. 디렉토리 : 유저의 홈 디렉토리
  7. : 유저가 사용하게 될 shell(:12) 프로그램

 기본적으로 /etc/passwd 를 편집할 수 있다면, 어렵지 않게 유저를 추가시키는 프로그램을 생성할 수 있다. 마찬가지로 /etc/passwd 파일을 읽어들이는 것으로, 사용자의 정보를 얻어올 수도 있다. 파일의 권한설정등에 사용되는 값은 유저 이름이 아닌 UID이기 때문에, /etc/passwd 파일은 자주 분석될 필요가 있다. 이러한 분석 프로그램은 프로그래머가 직접 작성할 수도 있지만 몇몇 함수를 이용하면 쉽게 유저정보를 얻어올 수 있다. 이에 대해서는 마지막에 사용자 정보를 얻어오는 프로그램을 작성하는 것으로 알아보도록 할 것이다.

그런데, 이상한 점이 있다. 패스워드 영역이 x로 되어있다. 패스워드가 몽땅 x일리는 없을테고 !!?


  4.3 shadow password


 passwd 파일에 사용자 패스워드가 없다면, 어떻게 유저이름과 패스워드로 인증이 가능할 건지가 문제가 된다. 우선 passwd 파일의 문제점에 대해서 알아보도록 하자. 다음은 passwd 파일의 권한이다.

# ls -al /etc/passwd
-rw-r--r-- 1 root root 1522 2008-01-09 23:34 /etc/passwd

 누구든지 읽을 수 있게 되어있다. 단방향 암호화 되어 있기는 하지만, 암호화된 일련의 문자를 얻을 수 있다면, 패스워드 검사 프로그램을 만들어서 패스워드를 찾아낼 수 있다. 이는 보안상 심각한 문제라고 할 수 있다.

 그래서 shadow password라는 방식을 도입했다. /etc/passwd 에는 패스워드를 제외한 정보만을 저장하고, 실제 패스워드는 오직 root 계정만 읽을 수 있는 /etc/shadow파일에 저장하는 것으로 passwd 파일의 보안문제점을 해결한 방식이다. /etc/shadow 파일의 권한을 확인해 보면, 단지 root 계정만 읽을 수 있음을 알 수 있다. 일반 유저가 읽을 수 없기 때문에, 패스워드 보안을 달성하게 된다.

#ls -al /etc/shadow
-rw-r----- 1 root shadow 996 2008-01-09 23:34 /etc/shadow

 사실 사용자가 컴퓨터 시스템에 로그인 할것인지 안할 것인지를 결정하는 권한은 root 사용자만 가지고 있기 때문에, 다른 유저가 읽을 필요는 없을 것이다.

 단 일반 사용자도 패스워드를 제외한 다른 유저의 정보를 알아야할 필요가 있기 때문에, /etc/passwd 파일을 남겨두게 된다. 유저정보는 /etc/passwd 패스워드 정보는 /etc/shadow 를 통해서 유지된다. 다음은 shadow 파일에 저장된 정보들이다.

yundream:$1$1S6/q4Ed$7en1qZdeOVofyEjqaofy/:13663:0:99999:7:::

 역시 :를 구분자로 해서 필드를 구분하고 있다. 각 필드의 정보는 getspend(3) 메뉴얼 문서를 참고하기 바란다.

패스워드는 crypt(3)와 md5(:12)를 이용해서 단방향으로 암호화 된다.


5. 사용자 정보 얻어오기


 그럼 실제 사용자 정보를 얻어오는 방법에 대해서 알아보도록 하자. 우선 사용자 정보는 /etc/passwd 파일의 내용을 읽어와서 구분자 :로 필드를 쪼개고, 이것들을 구조체에 집어 넣는 방법을 생각해볼 수 있을 것이다.

 그러나 위의 방법은 너무 귀찮다. 다행히도 리눅스는 /etc/passwd 파일에서 사용자 정보를 얻어오기 위한 표준 라이브러리(:12) 함수인 getpwent함수를 제공하고 있다.

#include <pwd.h>
#include <sys/types.h>

struct passwd *getpwent(void);

 getpwent 함수는 /etc/passwd 에서 패스워드 정보를 읽어들여서 passwd 구조체에 저장하고, 이것에 대한 포인터를 되돌려준다. passwd 구조체는 다음과 같이 정의되어 있다.


struct passwd
{
    char  *pw_name;     /* 유저 이름 */
    char  *pw_passwd;   /* 유저 패스워드 */
    uid_t pw_uid;       /* 유저 ID (UID) */ 
    gid_t pw_gid;       /* 그룹 ID (GID) */ 
    char  *pw_gecos;    /* 실제 이름 */
    char  *pw_dir;      /* 홈 디렉토리 */
    char  *pw_shell;    /* 사용자 쉘 */
};

다음은 getpwent()함수를 이용해서 유저정보를 읽어오는 간단한 프로그램이다.

#include <pwd.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>

int main(int argc, char **argv)
{
    char *name;
    if (argc != 2)
    {
        printf("Usage : %s username\n", argv[0]);
        return 1;
    }
    name = argv[1];

    struct passwd *pass_info = NULL;

    while((pass_info = getpwent()) != NULL)
    {
        if (strncmp(name, pass_info->pw_name, strlen(name)) == 0)
        {
            printf("%12s uid(%d) gid(%d) home(%s)\n",
                pass_info->pw_name,
                pass_info->pw_uid,
                pass_info->pw_gid,
                pass_info->pw_dir);
            return 0;
        }
    }
    printf ("Can not find User : %s\n", name);
    return 1;
}

네트워크 기본이론 : 01 네트워크 세상에 들어서며

1. 네트워크

 - 네트워킹이란? 여러 장비 사이에서 정보의 공유를 위해 서로 연결하는 것.

2. 인터넷

 - 인터넷에서 인터는 연결을 의미하는 것으로 인터넷이란 네트워크를 연결한 것.
 - 인터넷은 하나의 프로토콜(TCP/IP)을 사용하고, 웹 브라우저를 통해 인터넷을 탐험하며, 인터넷에는 수 많은 정보가 있다는 특징을 지닌다. 여기에서 프로토콜이란 간단히 말해서 대화의 규칙이라고 생각하면 된다.

3. 인트라넷

 - 회사에서 쓰는 여러가지 프로그램들을 마치 인터넷을 사용하는 것처럼 쓰도록 만들어 놓은 것으로, 회사의 직원 이외에는 사용할 수 없는 특징을 지닌다.

4. 엑스트라넷

 - 인트라넷을 협력 회사나 고객에게 사용할 수 있도록 확대한 것이다.