2012년 4월 22일 일요일

프로토콜 계층

application layer
transport layer
network layer

link layer
physical layer
위 두가지는 특정 링크상에 통신을 다루는 책임이 있으므로 그들은 전형적으로 부여된 링크와 관련된 네트워크 인터페이스 카드로 구현된다.(이더넷이나 wifi 인터페이스 카드)


네트워크 카드
위키백과, 우리 모두의 백과사전.
Network card.jpg
네트워크 카드(network card)는 컴퓨터, 네트워크 안에서 컴퓨터끼리 통신하는 데 쓰이는 하드웨어의 하나이다. 대한민국에서는 랜 카드(문화어: 망카드, 망기판)라고 흔히 말하며, 네트워크 어댑터, 네트워크 인터페이스 카드(NIC), 이더넷 카드라고도 한다. OSI 계층 1(물리 계층)과 계층 2(데이터 링크 계층) 장치를 가지는데, 맥 주소를 사용하여 낮은 수준의 주소 할당 시스템을 제공하고 네트워크 매개체로 물리적인 접근을 가능하게 한다. 사용자들이 케이블을 연결하거나 무선으로 연결하여 네트워크에 접속할 수 있다.
"두 장의 카드"를 사용하여 같은 주소를 공유하던 사례는 없다. IEEE 표준에 근거한 것인데, 고유의 맥 주소를 네트워크 인터페이스 콘트롤러의 제조업체에게 할당하는 책임을 진다.
노벨, 3COM (마벨), 인텔, 리얼텍 등이 네트워크 카드 제조 업체로 잘 알려져 있다.

[편집] 연결 방식

네트워크 카드는 이전에는 보통 확장 카드로 따로 설치하였지만 요즘에는 대개 메인보드에 내장되어 쓰는 경우가 많다.
  • 메인보드 기준
    • 내장형(일반적으로 유선이 많으며, 일부 무선이 내장된 경우도 있음)
    • PCI 커넥터
    • ISA 커넥터 (현재는 쓰이지 않음)
    • PCI 익스프레스
  • 네트워크 기준

[편집] 속도

속도는 흔히 10/100/1000로 나뉜다.
  • 초당 10 메가비트
  • 초당 100 메가비트
  • 초당 1000 메가비트
  • 초당 최대 160 기가비트


랜카드는 인터넷을 하기 위한 필수적인 하드웨어입니다.

보통 인터넷을 하기 위해서는 랜선, 랜카드, 허브가 필요하고, 무선랜인 경우에는 무선랜카드와 AP(Access Point:허브역할수행)가 있어야 됩니다.

보통은 가입하실때 랜카드 유무를 묻는데 랜카드가 없을시는 가격을 더 받습니다.(랜카드 가격 1만에서 1만5천원선, 요즘은 경쟁이 붙어서 공짜로 해주기도 하지만요...^^)

혹시 랜카드가 남았다면 가지고 계시다가 인터넷이 안될때 랜카드 교체 방법도 한방법이 될수 있으니 버리지 마시고 가지고 계시기 바랍니다.  



랜카드란?
NIC(Network Interface Card)이며 네트워크 장비이다. 요즘은 P&P즉 플러그 앤 플레이로 인하여
자동으로 필요한 프로그램과 네트워크 자동으로 연결합니다. 쩌네?

랜카드는 케이블에 유저의 데이터를 실어서 허브나 스위치, 혹은 라우터 등으로 전달해주고 자신에게 온 데이터를
CPU에게 전달해주는 역할을
한다. 즉 데이터를 전송하고 데이터를 CPU에 올리는 작업을 NIC 네트워크 카드 랜카드의 주된 작업이다.
결국은 네트워크 상의 데이터를 주고 받아주는 장비네? 어려운거 없어 일단은 이렇게만 알아도 어디가서 랜카드에 대한 지식은 내가 짱 !!!!!!!!!!!!! 야르 !!

아래 내용은 지극히 실무적인 내용이라.. 그냥 훍터보자 외우지마 !! 머리통 터진다

랜카드는 랜에 접속하기 위한 카드처럼 생긴것? 이라고 생각해도 틀린말은 아니다.
랜카드를 구비할때는 주어진 환경, 버스방식, 접속방식을 고려해야 한다.
주어진 환경에는 토큰링, 이더넷등이 있고 버스방식에는 PCI, ISA, EISA등이 있고, 접속방식에는 데스크탑, 노트북
USB포트용, 프린터포트용 즉 접속 방식에만 차이를 보이뿐 동일한 기능을 한다.
외쿡은 토큰링을 많이 사용하는데 우리나라는 이더넷을 더 많이 사용한다고 한다 !! 뭐 이런건 알아도 몰라도 되지만 알아두면 좋징 !!

랜카드는 랜카드에 접속하는 케이블의 종류에 따라서 TP 포트를 가진 랜카드, BNC, AUI포트를 가진 랜카드, 광케이블과
연결하는 랜카드등 랜카드의 종류를 나눌수 있다
. 즉 다시말해 랜카드는 환경, 버스, 접속, 연결케이블에 따른 랜카드를
구비해야 한다.

[출처] 랜카드(NIC) 란?|작성자 세큐러팅

2012년 4월 16일 월요일

시스코 시스템 : 네트워크 핵심을 지배

미국의 네트워크 통신회사로 세계 네트워크 장비 시장의 3분의 2를 석권하고 있다. 최근에는 중소기업과 일반 소비영역, 광통신 영역등으로 진출하고 있으며 캘리포니아주 산호세에 본사가 있다.
국가 미국
업종 네트워크 통신
설립일 1986년
본사 캘리포니아주 산호세
총자산 328억 7000만 달러(2000)
매출액 189억 2800만 달러(2000)


본문
데이터 처리에 뛰어난 회사로 1986년 첫제품을 출하하였고, 1990년 기업공개를 하였다. 세계에서 가장 가치가 높은 회사의 하나로 꼽히는 이 회사는 네트워크를 접속시켜 인터넷을 가능하게 하는 장비에 대한 세계 시장의 3분의 2를 석권하고 있다. 또한 전화 접속 서버네트워크 관리 소프트웨어도 제작하고 있다.

전통적으로 서비스 제공업체와 기업을 상대로 업무활동을 해왔지만, 경쟁업체인 3Com의 기반인 중소기업과 일반 소비자 영역, 그리고 노텔네트워크스(Nortel Networks Corporation)와 루슨트테크놀로지스(Lucent Technologies) 등과 같은 회사들이 지배하고 있는 광통신 영역 등으로도 차츰 진출하고 있으며 주니퍼네트워크스(Juniper Networks, Inc.)와도 경합을 벌이고 있다.

유능한 인재와 최신 기술을 확보하기 위한 정책으로 1993년 이래 70여 차례의 기업 인수를 해왔지만, 2000년 말부터는 시장 상황으로 타기업 인수 속도가 느려지고 있는 상태이다.

2000년 현재 총자산 328억 7000만 달러, 매출액 189억 2800만 달러이며, 본사는 캘리포니아주() 산호세에 있다.

랜카드란

랜카드의 정의는 아래와 같습니다.

외부와 가장 빠른 속도로 데이터를 주고 받을 수 있는 PC의 통신장치로, 근거리통신망을 뜻하는 랜(LAN)과 비디오카드나 모뎀처럼 PC의 확장슬롯에 꽂혀 사용되는 장치를 의미하는 카드(card)를 합친 용어이다. 네트워크카드와 이더넷카드·이더넷어댑터·NIC(Network Interface Card) 등 다양하게 불린다. 여기서 이더넷(Ethernet)은 가장 널리 사용되는 랜의 방식이다. 랜에 연결된 PC나 워크스테이션들은 대체로 이더넷이나 토큰링(token ring)과 같은 근거리통신망 전송기술을 위해 특별히 설계된 랜카드를 장착하고 있다.
콘트롤칩과 통신전용칩·버퍼 등으로 이루어져 있다. 이 가운데 콘트롤칩은 데이터의 입출력과 기본적인 기능을 관장하며, 통신전용칩은 통신기능을 관장하고, 버퍼는 데이터를 저장하는 기능을 가진다. 보드의 형태에 따라 ISA(Industry Standard Architecture)용과 EISA(Extended Industry Standard Architecture)용으로 구분된다. 또한 지원되는 커넥터의 형태에 따라 AUI(attachment unit interface)+동축케이블, AUI+TP(Twisted Pair), AUI+동축케이블+TP 등의 종류가 있다. 이 가운데 AUI+동축케이블+TP로 이루어진 것을 콤보(Combo)형이라고 한다.
간단하게 말하자면 컴퓨터에 인터넷을 할 수 있게 해주는 부품이라고 생각하면 됩니다.
요즘은 대부분 메인보드에 내장된 형태로 되어 있는 내장랜을 많이 씁니다.
내장 랜이 고장난 경우 따로
이런 식으로 되어 있는 카드 형태의 랜카드를 장착해서 씁니다.
이것이 모양상의 분류구요.
무선 신호를 받아 들일수 있는 무선랜카드, 유선신호만 받아 들이는 우리가 많이 볼 수 있는 유선랜카드 로도 나울 수 있습니다.

2012년 4월 5일 목요일

비트 필드

아이오 교육센터의 기술자료는 다양한 서적/문서를 참고해서 교육센터 자체로 만든 자료입니다.
마음대로 퍼가셔도 되지만 꼭 출처를 밝혀 주시기 바랍니다.
bit flag를 활용한 성능 향상 기법
게임서버를 만들일이 있다고 가정해 보겠습니다. 저는 게임을 잘 모르지만 일예로 리니지 같은 게임을 만든 다면 게임서버에 들어갈 요소는 무엇이 있을까요? 캐릭터, 몬스터, 아데나, 맵, 좌표체계 기타등등
이 떠오릅니다. 이중에서도 가장 중요한것이 빠져 있는 데요? 그것은 바로 아이템 입니다.

그렇다면 프로그램에서 아이템을 소유하고 있는지를 표현 하려면 어떤 자료 구조가 가장 좋을 까요?
일견 떠오르는 것은 변수지만 변수는 아이템의 수가 많아 지면 변수도 증가 해야 하고 변수의 네이밍이 어려울 뿐더러 루프구조에 넣을수 없으므로 일반화 시킬수 없다는 단점이 있습니다.

이런 단점을 극복한 것이 바로 배열 이지요.

배열을 이용해 다음처럼 프로그램을 작성해 봅시다.
#include <stdio.h>

int main()
{
int item[4] = {0,}; // 아이템은4, 0은없음, 1은있음
int i;

item[0] = 1; // 0번아이템취득
item[3] = 1; // 3번아이템취득

for( i=0; i<4; i++ )
{
if( item[i] != 0 ) // 아이템소유유무검사
printf("%d번아이템소유중\n", i );
}
printf("---------------------\n");
item[0] = 0; // 0번아이템상실

for( i=0; i<4; i++ )
{
if( item[i] != 0 ) // 아이템소유유무검사
printf("%d번아이템소유중\n", i );
}

return 0;
}

프로그램의 결과는?

0번 아이템 소유중
3번 아이템 소유중
---------------------
3번 아이템 소유중

로 출력 됩니다.

아주 훌륭한 결과라 할 수 있습니다. 아이템 개수가 늘어 나더라도 프로그램은 아이템의 수만 바꾸면 간단하게 바꿀수 있도록 설계 되어 있으니 아이템 소유 유무를 출력하는 부분만 함수로 분리 해주면 아주 좋은것 같습니다.

그렇다면..
다음과 같이 함수로 모듈화 하면 되겠네요..
#include <stdio.h>

void get_item( int *item , int n)
{
int i;
for( i=0; i<n; i++ )
{
if( item[i] != 0 ) // 아이템소유유무검사
printf("%d번아이템소유중\n", i );
}
}


int main()
{
int item[4] = {0,}; // 아이템은4, 0은없음, 1은있음


item[0] = 1; // 0번아이템취득
item[3] = 1; // 3번아이템취득

get_item ( item, 4 );
printf("---------------------\n");
item[0] = 0; // 0번아이템상실

get_item ( item, 4 );

return 0;
}

그럼 이제 모든게 끝났습니다. 원래 게임 서버라는게 그래픽이 들어가지 않으므로 빠르게 데이터를 중계하는 자료구조가 중요한데 위에 설계처럼 배열을 이용하니 간단히 해결 된것 같습니다.

그럼 이제 문제가 전혀 없는 걸까요?

잠시 생각해 봅시다.

동시접속자 : 10000명
캐릭터 수 : 5개
아이템수 : 1024개
아이템 메모리단위 : 4byte

인 시스템의 경우 아이템을 위한 서버의 메모리는 얼마일까요?

4 * 10000 * 5 * 1024 => 약 200 Mbyte

라는 결과가 나옵니다. 게임서버를 이루는 수많은 요소 중에 아이템을 표시하기 위해서 저렇게 메모리를 많이 끼워야 한다는 결론이 나옵니다. 머 요즘은 메모리가 싸니깐 메모리를 더 끼면 되는거 아녀? 라고 생각할 수도 있지만 더 큰 문제는 메모리를 저렿게 많이 사용하면 속도가 느려져서 유저들이 게임을 실시간으로 즐길수 없다는 결론에 도달하게 됩니다.

결론적으로 위와 같이 프로그램 하면 절대 안된다는것이지요..

안된다는 것을 알았다면 대안이 필요할텐데요?

그 대안은 바로 아이템을 위해 INT를 사용 하지않고 char를 사용하는 것입니다.

하지만 그 정도 대안으로는 위와 같은 문제를 해결 할수 없지요.. 메모리를 혁신적으로 줄여서 성능을 향상 시키고 싶다면 고수들이 즐겨 쓰는 비트 필드 연산자를 이용 하면 됩니다.

다음의 프로그램을 보세요.. 그리고 원리를 생각해 보세요.
#include <stdio.h>

void get_item( int *item , int n)
{
int i;
for( i=0; i<n; i++ )
{
if( *item & (1<<i) ) // 아이템소유유무검사
printf("%d번아이템소유중\n", i );
}
}

int main()
{
int item=0; // 아이템을표시하기위해배열을사용하지않음

item |= 1<<0; // 0번아이템취득
item |= 1<<3; // 3번아이템취득

get_item ( &item, 4 );
printf("---------------------\n");
item &= ~(1<<0); // 0번아이템상실

get_item ( &item, 4 );

return 0;
}

프로그램의 결과는?

0번 아이템 소유중
3번 아이템 소유중
---------------------
3번 아이템 소유중

으로 기존 배열 버젼과 같습니다.

다음 설명을 보세요.

모든 아이템을 1bit만으로 표시 하기 위해 비트별 |는 비트 세팅을 위해 사용 됩니다.


위에 그림처럼 아이템은 비어 있었으나 가장 마지막 비트가 세팅됩니다.
비트 필드는 가장 오른쪽이 2의 0승 자리 이므로 0번째 인덱스가 세팅되었다고 볼수 있습니다.



위에 그림에서 보듯이 0번 인덱스가 세팅 되어 있는 아이템에서 3번 인덱스를 세팅하려해도
비트필드 연산 | 가 사용 됩니다. 원래 세팅되었던 값은 그대로 유지된채 3번이 추가 되는것을 볼수 있습니다.

비트가 세팅되었는지 검사하는 연산자는 & 연산자 입니다. 아이템의 다른 인덱스의 비트의 세팅유무에 상관없이 0번 인덱스에 1로 세팅되어있으면 1이되고 0으로 세팅되었으면 0이됩니다. (C언어 에서는 모든 비트가 0일때 false) 그러므로 해당 검사 하려는 비트를 추출 하기 위해서는 비트 마스크 역할을 하는 & 연산자가 사용 됩니다.
위에 그림도 마찬가지로 3번째 인덱스의 세팅 값이 전체의 TRUE/FALSE를 결정하므로 3번째 인덱스의 세팅유무를 추출 할수 있습니다.

마지막 하이라이트인 비트 제거 입니다. 비트제거는 비트검사 루틴에다가 ~인 1의 보수를 적용하면 작성 할수 있습니다. 전체 아이템에서 ~을 취한 비트 마스크를 적용하면 기존 플래그는 그대로 내려오고 해당 플래그만이 제거 된것을 확인 할 수 있습니다.
이상으로 배열을 이용한 모델의 게임서버의 메모리량을 32분의 1로 혁신적으로 줄이고 속도도 향상 시킨 비트 필드 연산자의 활용법을 공부 했습니다.
하지만 이렇게 기능을 향상 시킨 프로그램도 치명적인 문제를 안고 있는데요? 그문제는 무엇일까요?
그 문제는 바로 INT는 정수 표기법 이므로 32bit 이상을 가질수 없고 그렇기 때문에 아이템을 32개 밖에 처리 할수 없다는 문제가 있습니다.
아주아주 치명적인 문제이지요..
게임서버에 아이템을 32개밖에 둘수 없다니....
메모리를 아무리 아끼면 머합니까? 사용할수 없는데....
그렇다고 여기서 포기 하면 안되겠지요? 그래서 우리의 선인들은 더욱도 놀라운 기법을 연구했는데요?
이 문제를 어떻게 해결할지 여러분도 고민해 보세요..
그럼 다음 강좌에 그 기법을 상세히 논의 해보도록 하지요...
무료 세미나를 진행 합니다.
주제 : C 포인터의 모든것
신청 : www.ioacademy.co.kr 참고

진수 바꾸기

질문자 인사 감사합니다. 덕분에 많이 알아갑니다.

#include <stdio.h>
typedef unsigned int UINT;

void print(UINT dec)
{
int i=0;
for(i=0; i < 32; i++) {
printf("%c", (dec & (0x01 << i))? '1':'0');
}
putchar('\n');
}

UINT dec2bit(UINT dec)

{
UINT bit = 0U;
while(dec) {
bit |= (0x01 << (dec % 10));
dec /= 10;
}

return bit;
}

int main()
{
UINT bit1 = dec2bit(1234U);
UINT bit2 = dec2bit(3456U);
UINT bit3 = bit1 | bit2;

print(bit1);
print(bit2); print(bit3);

getchar();
return 0;
}

2012년 3월 31일 토요일

아스키 코드

아스키코드는 위 약자풀이에서 보는 것과 같이 미국표준협회(ANSI)에서 제정된 것이다.
이것은 정보교환용 미국표준부호이며, 문자, 숫자, 특수문자에 수치(numberic Value)를 부여한 부호체계이다.

음... 쉽게 설명하자면 사전에 약속을 한다음 암호를 보내고 해독하는 과정을 생각하면 쉽게 이해되리라 생각한다. -_-

예를 들어서 대문자 'A'는 16진수로 '0x40'으로 약속되었으며
소문자 'a'는 16진수로 '0x61'로 약속되어 있다.




자세한 내용은 아스키코드 협회 홈페이지를 참조하세요.
링크 : http://www.asciitable.com/

이렇게 아스키코드는 16진수로 둘째자리까지 있어서
총 256개로 구성되어 있다 (0x00에서 0xFF까지)
그리하여 우리는 여기서 아스키코드는 8비트(bit)졌음을 알수 있고 고로, 1바이트(byte)로 이루어졌음을 알수 있다.

보통은 (0x00 에서 0x7F) 부분을 많이 사용하며...
그 이후의 문자들은 확장형이라고 해서 보통 유니코드를 아스키로 읽을때 볼수있는 괴상망측한 문자들로 구성되어 있다.





아스키코드는 본인의 업무상에서는 주로 하드웨어를 제어할때 많이 쓰이며,
그 경우 메세지 앞뒤로 제어문자들이 딸려오는 것이 특징이다.
아스키코드만으로는 세상모든 문자를 다 표현할 수 없어, 그리하여 어제 설명했던 유니코드를 만들어 다양한 전세계언어들을 넣을 수 있도록 하고 있다.

CS공부, 유용한 사이트

http://winapi.co.kr/