게이트웨이(gateway)는 ‘관문’이나 ‘출입구’라는 의미로 다양한 분야에서 일반적으로 사용되는 용어다. 컴퓨터 네트워크에서의 게이트웨이는 현재 사용자가 위치한 네트워크(정확히는 세그먼트-segment)에서 다른 네트워크(인터넷 등)로 이동하기 위해 반드시 거쳐야 하는 거점을 의미한다. 자동차 고속도로로 진입하기 위해 통과하는 톨게이트(tollgate)와 유사한 개념이다.
두 컴퓨터(노드-node라고도 함)가 네트워크 상에서 서로 연결되려면 동일한 통신 프로토콜(protocol, 통신 규약)을 사용해야 한다. 따라서 프로토콜이 다른 네트워크 상의 컴퓨터와 통신하려면 두 프로토콜을 적절히 변환해 주는 변환기가 필요한데, 게이트웨이가 바로 이러한 변환기 역할을 한다. 한국인과 미국인 사이에 원활한 의사소통을 위해 통역사를 두는 것과 동일하다.
게이트웨이는 네트워크간 톨게이트
게이트웨이는 일반적으로 하드웨어 형태로 제공되며, 내부적으로 복잡한 원리로 작동하지만 외형은 생각보다 간단하다. 흔히 보는 네트워크 허브나 스위치 등과 비슷하게 생겼다. 또한 기능이나 용도, 적용 범위 등에 따라 손바닥만한 제품부터 소형 냉장고만한 제품까지 크기도 다양하다. 물론 설치와 설정 작업은 네트워크 전문가가 아니면 처리하기가 매우 어렵다.
게이트웨이는 또한 라우터(router)와 동일한 개념으로 이해할 수 있다. 라우터는 네트워크 장비의 일종으로,패킷(packet, 네트워크 전송 데이터의 최소 단위)을 다른 네트워크 보내주는(forward) 역할을 한다. 이와 함께 최적의 네트워크 경로를 찾아주는 역할도 함께 수행한다. 이렇듯 라우터도 이기종 네트워크를 연결한다는 부분에서 게이트웨이와 상통한다(다만 게이트웨이는 라우터보다 포괄적인 개념이다).
우리는 컴퓨터 사용 환경에서 게이트웨이를 늘 사용하고 있다. 다만 그에 대한 관심과 지식이 적어 우리들 눈에 잘 띄지 않을 뿐이다. 가깝게는 인터넷 유무선 공유기(이하 공유기)가 우리가 만나는 첫 번째 게이트웨이다. 공유기는 사용자 컴퓨터의 네트워크와 인터넷을 연결하여 사용자가 웹 사이트에 접근할 수 있도록 관문을 열어 준다. 사용자가 속해 있는 (로컬) 네트워크의 통신 프로토콜(예, netbios)과 인터넷의 통신 프로토콜(예, http)이 다르기 때문이다. 참고로 공유기는 게이트웨이의 역할과 라우터의 역할, 방화벽 역할 등을 동시에 제공하는 종합 네트워크 장비다.
한편 자신의 컴퓨터에서 목적지 네트워크까지 도달하기까지 여러 개의 게이트웨이를 거칠 수 있다. 고속도로를 갈아탈 때마다 톨게이트를 지나야 하는 것과 다름 없다. 또한 톨게이트를 지날 때마다 통행료가 부가되듯, 게이트웨이를 거칠 때마다 네트워크 부하(트래픽, traffic)도 증가하여 전송 속도가 느려질 수 있다(이때 거치는 게이트웨이의 수를 ‘홉 카운트’-hop count-라고도 한다).
인터넷을 위한 필수 조건
해당 컴퓨터가 속해 있는 (로컬) 네트워크 구역 내에서는 IP 주소와 서브넷마스크(subnet mask)만 있어도 주변 컴퓨터와 통신이 가능하다. 다른 네트워크 구역으로 나갈 필요가 없기 때문이다. 하지만 인터넷 등의 이기종 네트워크로 나가기 위해서는 게이트웨이(라우터 등)가 있어야 하고, IP 주소, 서브넷 마스크와 함께 게이트웨이 주소까지 정확하게 설정해야 한다.
컴퓨터가 서로 통신하기 위해서는 모든 컴퓨터마다 유일한 IP 주소를 할당해야 하듯, 게이트웨이에도 중복되지 않는 IP 주소가 필요하다. 이 IP 주소를 토대로 각 컴퓨터가 다른 네트워크와 연결된다. 일반적으로 게이트웨이의 IP 주소는 해당 네트워크 내 컴퓨터에 할당된 IP 주소 중 끝자리(4번째 옥텟)만 다른 형태다. 대게 1을 지정한다. 이를 테면 컴퓨터 IP 주소가 123.123.123.123이라면, 게이트웨이 주소는 123.123.123.1이 된다. 물론 게이트웨이 IP 주소 설정이 잘못되면 외부 네트워크(인터넷) 연결이 불가능하다.
:지금까지 작성했던 프로그램들은 모두 하나의 단일 채널에서 일어는 입/출력만을 다루었습니다 즉 이전의 모든 버전의 에코 서버는 한번에 하나의 클라이언트 연결만을 처리 하였습니다 하지만 응용프로그램은 여러 채널의 입/출력을 동시에 처리하는 능력을 요구할 때가 자주 있습니다.예를 들어 동시에 여러 포트를 열어서 에코서버를 할때 서버가 각 소켓을 생성하고 이를 각 포트에 바인딩 한 후 무슨 일이 일어날까를 생각해 봅시다.기존방식에는 문제점이 발견되는데 서버는 연결을accept할 준비가 되어있습니다 하지만 어떤 소켓을 선택해야 할지 선택을 하지 못합니다.아무 서버나 연결하게 된다면 기존의 대기하고 있는 소켓역시 대기가 되어버리는 불편한 상황이 발생합니다.물론 이러한 문제는non-bloaking소켓을 이용하여 해결이 가능하지만 그것보다는 특정 소켓의 입/출력이 준비가 될때까지 서버를bloacking을 하는 것이 좋습니다
하지만 단점도 있습니다 정리하자면
:프로세스 생성에 많은 양의 연산,메모리 공간 요구. IPC (inner process communcation)방법도 복잡합니다
이런한 일련의 과정들은 가능하게 하는 것이linux상에서 다시 말하면unix상에서 제공해주는select를 사용하면 됩니다select는 입/출력이 예상되는 소켓의 식별자를 리스트로 명시하고 리스트의 식별자중 준비되어진 식별자를 준비가 되었는지를 반환하여 알리고blocking이 되지 않을 것이라는 것을 확신하고 진행하게 됩니다
전반적인 순서는 아래와 같습니다
-하나의 서버에 여러개의 클라이언트 제어 -서비스 품질은 멀티프로세스보다 더 떨어지는것 같아보입니다 -실질적으로 서버와 클라이언트의 통신에서 데이타 송수신은 매우 작다 -그렇기 때문에 많은 클라이언트에게 서비스 할 수 있습니다.
-하나의 프로세스가 해당 클라이언트n개 즉...파일 디스크립터를 묶어서 -관리를 합니다. ※ 즉fd_set으로 묶어서 파일 디스크립터정보를 담습니다
분석해보기>> 1)FD_ZERO(&reads); //0으로초기화 FD_SET(0,&reads); //파일디스크립터 0(stdin) 설정
1
0
0
0
.........
마지막 파일 디스크립터에+1되게 되어있다?
1
0
0
1
.........
result = select(1, &temps, 0, 0, &timeout);
수신데이터가있는지확인합니다<5초설정>
확인할파일디스크립트는1개입니다
입력이되었다면result = 1
2)elseif(result ==0) 5초간아무변화가없을때
0
0
0
0
.........
3)temps = reads;원본값으로초기화시켜주질않을경우
while문을한바퀴돌고나면
1
0
0
0
.........
에서
0
0
0
0
.........
으로 변화되고 이후로는 계속0인 상태가 됩니다
select사용시에는 원본을 저장 할 수 있는 변수를 써야 합니다
3. 결과 확인
참고>> select()함수의 인자를 보면 이 중 n은 검사가 필요없는 가장 작은 식별자값으로써 최대 식별자 값보다 1이 작다위에서 보면 소켓셋에 담을 수 있는 소켓 디스크립터의 최대갯수는 시스템 정의 상수인 FD_SETSIZE로 정의 되어있지만 그 수가 상당히 크므로 매번 그 크기만큼 검사하면 비효율적이므로 이를 효율적으로 검사하기 위해서 정수n을 전달하여 그 크기+1까지만 검사한다
그 다음에는 각 소켓셋(읽기셋, 쓰기셋, 예외셋)이 파라미터로 들어가며 만약 NULL이 들어가면 그 소켓셋은 대상 리스트에 대한 입/출력 감시를 하지 않는다 마지막 파라미터인 timeout은 NULL로 설정하면 읽기셋, 쓰기셋, 예외셋에 삽입한 소켓 중에 변화가 생길 때까지 대기하고 있다가 변화가 발생한 소켓의 수를 리턴하게 된다. timeout을 양수로 설정한 경우에는 변화가 발생한 소켓이 생길 때까지 대기하고 있다가 설정한 시간이 되면 변화가 발생한 소켓이 없더라도 대기상태를 해제하게 된다. 이때 변화가 발생한 소켓이 없다면 0을 리턴하게 된다. 그리고 timeout 값이 0으로 설정되면 대기시간 없이 바로 리턴하게 된다