소켓 버퍼 크기 설정

Posted at 2010/02/02 12:03// Posted in network

//option= SO_RCVBUF | SO_SNDBUF
int SetSockBufSize(int option, int size)
{
int ret=0;
for (int trySize=size; trySize>=1024; trySize-=1024) {
if (setsockopt(m_socket, SOL_SOCKET, option, (char FAR *)&trySize, sizeof(int))==SOCKET_ERROR) {
int err=WSAGetLastError();
if (err==WSAENOPROTOOPT || err==WSAEINVAL) break;
} else {
int len=sizeof(len);
getsockopt(m_socket, SOL_SOCKET, option, (char FAR *)&ret, &len);
break;
}
}
return ret;
}

이올린에 북마크하기(0) 이올린에 추천하기(0)
2010/02/02 12:03 2010/02/02 12:03

네트워크 BGP 다루기

Posted at 2009/04/15 23:54// Posted in study/network
BGP 피어 세션 만들기

하나의 AS 안에는 여러개의 BGP 라우터가 존재할 수 있다. 외부 AS 에 직접 연결된 BGP 를 EBGP 라고 부르고, AS 내부에서 BGP 라우터간 BGP 연결을 IBGP 라고 부른다.

EBGP 인지, IBGP 인지는 OPEN 메시지내 AS 번호를 이용해 구분하게 된다.

EBGP 는 반드시 물리적으로 직접 연결이 되어 있어야 한다. BGP가 아닌 라우터를 중간에 둘 경우에는 루프나 블랙홀이 생길 수 있으므로 복잡한 설정이 필요하다.

IBGP 는 중간에 여러개의 내부 라우터가 존재하는 간접 연결도 가능하다.


라우터에는 여러개의 인터페이스가 있으며 각기 주소가 설정되어 있다.
아무것나 사용해도 되나 가능하면 안정된 하드웨어를 사용하는게 좋다. 불안한 하드웨어를 사용하면 접속이 끊어졌다 다시 붙었다하는 현상이 생길 수 있다. 시스코 라우터는 가상 인터페이스를 둬서 물리적인 인터페이스의 고장 여부에 상관없이 작동된다


라우터는
EBGP 를 통해 받은 루트 정보는 다른 라우터로 전달하지만
IBGP 로 받은 루트 정보는 전달하지 않는다.

R(a), R(b), R(c) 3개의 라우터가 있을때
R(a) - R(b) - R(c) 선형으로 연결하면
R(a)에 EBGP로 들어온 루트 정보는 IBGP 로 통해 R(b) 에 전달되지만
R(b)는 IBGP로 들어온 루트 정보를 다시 보내지 않으므로
R(c)는 R(a) 의 외부로 연결된 루트를 알지 못하게 된다

즉, AS내 BGP 들은 서로 모두 접속되어있는 풀메쉬(Full-mesh) 구조로 연결이 되어있어야 한다


BGP 간 동기화 문제
같은 AS 내 외부로 연결된 R(a) 와 R(d)가 있고 그 사이를 R(b) 와 R(c)가 연결되어 있다.

R(a) 에서 R(d) 로 가는 패킷이 있을 경우
R(a) 는 R(b) 로 보내고
R(b) 는 R(c) 로 보내고
R(c) 는 R(d) 로 보내야 한다

하지만 R(b) 와 R(c) 는
내부 라우터라 패킷을 어디에 보낼지 모르므로
R(b) -> R(c) 를 디폴트로 처리하고
R(c) -> R(d) 를 디폴트 처리해야한다

이렇게 패킷 전송은 가능한지만 R(d) 에서 R(a)로 응답을 보내야 할 경우
R(c) 는 디폴트 설정이라 무조건 R(d) 로 보내므로 루프 현상이 발생하게 된다
이런 현상을 막기 위해 R(b) 와 R(c) 가 디폴트 처리할때는
되돌아 가는 루트를 확보해줘야 한다.

루트 확보를 자동으로 하기 위해 BGP 데몬의 루트 정보를 RIP 에 인젝팅 하는 방법도 있지만
BGP 라우팅 테이블은 규모가 매우 커서 내부 라우터의 부하가 너무 커지기 때문에
좋은 방법은 아니다.


라우팅 업데이트의 소스 문제
소스란 누가 제일 처음 업데이트 메시지를 주었는가이다.
소스를 파악하는 것은 라우팅의 정확도(accuracy)와 안정성(stability)를 위해 중요하다.

BGP 는 소스가 누군지 알고 있지만
IGP 는 소스를 모른다

BGP 를 통해 AS내로 들어온 루트가 있다
루트를 IGP 를 통해 전달할 경우 소스 정보는 사라진다.
IGP 를 통해 전달된 루트가 다시 AS 밖으로 나갈때는 다시 소스가 필요한데,
소스가 없다면 자동으로 현재 AS 로 설정된다.

BGP에 잘못된 소스 정보를 사용하는걸 막기 위해서는
소스가 남아 있는 IBGP 를 통해서 루트 정보를 전달해야한다.

시스코 라우터는 BGP 로 받은 걸 다시 AS 외부로 내보내지 않는 식으로 문제를 해결하고 있다.


결론
IGP 를 통해 받은 루트 정보를 BGP 로 올리면 많은 문제가 생기므로
BGP 는 가능하면 스태틱하게 설정한다.

굳이 자동화 할경우에는 Network 커맨드를 사용하게 된다.
Network 는 특정 네트워크 주소가 자기 AS 임을 알려주는 명령이다.

자동화된 BGP 테이블내 엔트리에는 BGP Origin Type 이 설정되는데
근원을 모르는 것은 INCOMPLETE
BGP 를 통해 들어와 소스를 알 수 있는건 EGP
Network 명령으로 설정된건 IGP 로 표시된다

이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/04/15 23:54 2009/04/15 23:54

네트워크 BGP 메시지

Posted at 2009/04/15 22:38// Posted in study/network
BGP 는 TCP 레이어에서 작동되므로 IP 와는 달리 연결 개념이 있다.
  1. BGP 는 TCP 커넥션을 이용해 물리적으로 직접 연결된 다른 라우터에 접속한다.
  2. 접속이 성공하면 연결 설정에 OPEN, NEGO, KEEP-ALIVE 메시지를 사용한다
  3. 루트(Route) 정보는 UPDATE 메시지를 통해 교환된다.
BGP 업데이트 메시지는 전세계로 퍼진다. 업데이트 메시지내에 현재까지 지나온 AS 주소가 모두 추가되어 있어 만약 자신에게 다시 돌아오더라도 해당 메시지를 무시해 루프를 방지하게 된다.

BGP 는 가장 짧은 AS경로를 가진  루트(Route)를 선택한다. 선택에서 제외된 다른 루트 정보는 다른 AS 로 보내지는 않지만 계속 소유하고 있으며 만약 가장 짧은 루트가 끊길 경우 가지고 있던 다른 루트를 사용하게 된다.

BGP 메시지는 (IP헤더, TCP 헤더, BGP 메시지) 순서로 붙어있어 BGP 데몬이 없으면 TCP 헤더뒤 메시지를 확인 불가능하다.

BGP 업데이트 메시지는 (공통헤더, 취소 경로(Withdraw Routes), 경로 속성(Path Attribute), 추가 경로(Network Prefixes))로 구성된다. 경로 속성은 어떤 AS 를 거쳐 도착했는지를 나타내는 BGP 의 핵심적인 부분이다.

경로 속성에는 매우 다양한 정보가 들어있어
라우터마다 필수 구현(Well-known bit) 할 것과 옵션 구현(Optional bit)할 것으로 나누어져 있다.
설령 옵션 구현일지라도 다른 라우터에게 반드시 전달해야할 것(Transitive bit)와 전달안해도 되는 것(Nontransitive bit)가 존재한다.
이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/04/15 22:38 2009/04/15 22:38

네트워크 인터도메인 라우팅의 기본

Posted at 2009/04/15 21:57// Posted in study/network
IP 레이어는 라우터의 관심 영역이다.
IP 레이어 이하는 라우터에서 다루지 않는다.

라우팅 방법
  • 스태틱 라우팅: 수동 설정
  • 다이나믹 라우팅: 반자동 설정
    • 인테리어 도메인 라우팅: RIP, OSPF
    • 인터 도메인 라우팅: BGP
  • 디폴트 라우팅: 경로를 못찾았을 경우 무조건 보냄

AS
인터넷은 AS의 집합이다. AS 는 독립적인 단위로 내 마음대로 네트워크 구성을 할 수 있는 네트워크이다. AS 번호는 16비트로 6만 5천개 정도이다. 인터도메인 라우팅(BGP)에서만 사용된다.
  • 소유권(행정권) 소유 - 아무 프로그램이나 설치 가능
  • 관리자 마음대로 관리 가능 - 외부인이 접근하는 것은 불법
  • 블랙박스 - 외부인은 안에서 무엇을 하는지 알 수 없다
  • 게이트내 프로토콜(IGP: 인테리어 게이트웨이 프로토콜) 마음대로 설정 가능
    • 최적의 경로 설정 가능.
    • 연결이 끊기면 알아서 다른 경로를 찾음.
인터 도메인 라우팅은 최적의 경로보다는 비즈니스 문제가 더 큰 영향을 준다
AS간에는 어떤 주소로 라우팅하는지 루트 정보(Route Information)를 외부에 보내게되는데
비즈 문제로 인해 경로 교환을 안 할 수 도 있다.


라우터 내부
패킷이 전달되기 위해서는 라우팅 테이블이 만들어져야 한다. 라우팅 테이블을 구축하는 것이 라우팅 데몬이다. 어느 라인을 타고 나갈 것인지 결정하는 포워딩은 BGP > OSPF > RIF 순의 우선순위를 갖으며 높은 우선 순위의 데몬이 정보를 갖고 있지 않다면 다음 우선 순위의 데몬을 사용한다.


라우팅 테이블 구축 순서 (TCP 영역 - 라우팅 데몬 영역)
  1. 라우터 데몬 실행
  2. 라우팅 정보 사용
  3. 다른 라우팅 프로토콜 검색 - 각 목적지의 네트워크 접두어(network prefix)에 대한 최적 경로를 찾는다.판단 기준은 홉 카운트(hop count)이다
  4. 라우터는 다음 목적지에 다음 hop 장치를 연결한다
  5. 다음 hop 장치의 포워딩 정보를 포워딩 테이블에 넣는다

라우터 패킷 포워딩 순서 (IP 영역)
  1. 패킷이 들어온다
  2. 패킷을 분석해 목적지를 파악한다
  3. 어느 인터페이스로 보낼 것인지 체크한다
  4. TTL 증가
  5. 목적지 도달

라우팅 문제의 시작

내부 라우터는 성능이 나빠 처리 가능한 라우팅 테이블 개수가 적다. 외부 라우터가 10만개나 되는 라우팅 테이블을 내부 라우터에 넘기면 내부 라우터는 죽는다. 최악의 상황을 막기 위해 외부 라우터는 내부 라우터에 일부 정보만을 넘긴다. 내부 라우터는 자신이 핸들링 하지 못하는 정보는 디폴트 라우팅 처리를 한다. 내부라우터는 부족한 정보만 가지고 있으므로 여러가지 문제가 생긴다.

참고)
BGP 정보는 IP 프레임에 실려서 지나간다. BGP 데몬이 없으면 IP프레임에 실려있는 BGP 정보를 볼 수 없으며 평범한 IP 패킷으로 보일 뿐이다




Stub AS

싱글 호밍된 AS 처리

고객 입장
- 나갈 수 있는 길은 하나이므로 디폴트로 라우터 테이블에 설정한다.

공급자 입장
  1. 스태틱 라우팅
    • 자루네 패킷은 모두 KT로 보내라
    • BGP 를 타고 전세계 라우터로 퍼진다
    • 전세계에서 자루네 패킷은 일단 KT로 오게된다.
  2. 다이나믹 라우팅
    • 스태틱 라우팅은 C클래스가 너무 많아져 관리가 어렵다
    • 고객 AS 와 동일한 IGP 를 두면 자동 관리 가능 (단 고객AS 가 IGP 를 바꾸면 ISP 의 IGP 도 바꿔줘야 하므로 비현실적이다)
  3. BGP 장착
    • AS 번호가 필요하다
    • 하지만 AS 번호는 한정되어있어 AS번호를 받기는 어렵다
    • Private AS 번호를 사용한다

멀티 호밍된 AS 처리

문제:
KT 와 DACOM 이 모두 연결되어있을 경우 KT-DACOM 간 패킷이 고객AS 를 통해 지나가
트래픽이 증가한다.

해결:
KT 에서 받은 네트워크 주소를 DACOM 에 보내지 않고
DACOM 에서 받은 네트워크 주소를 KT 에 보내지 않는다





이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/04/15 21:57 2009/04/15 21:57

네트워크 CIDR의 붕괴!

Posted at 2009/04/15 21:48// Posted in study/network
대부분의 고객은 하나의 ISP 에 연결되어있다. KT만 쓴다던지, 데이콤만 쓴다던지 하는 것이다.이것을 싱글호밍(Single Homing)이라고 부른다. 대개는 ISP 가 확보한 주소를 받아서 사용한다.

그런데 일부 학교나 연구소는 ISP가 확보한 주소가 아닌 자체적인 주소를 소유하고 있는 경우가 있다. ISP는 전혀 다른 주소이므로 CIDR 을 사용해 결집(aggregation)이 안된다.

어떤 고객은 연결된 ISP 와의 접속이 사고로 중단되었을때  비스가 중지되는 위기 상황에 대비하기 위해 여러개의 ISP와 연결하는 경우가 있다. 이것을 멀티호밍(Multihoming)이라고 부른다.

멀티호밍 상황1)
ISP1 은 xxx.xxx.0.0/3 을 관리하고
ISP2 는 xxx.yyy.0.0/13 을 관리한다
XXX 는 xxx.xxx.0.0/18 을 관리하며
ISP1 과 ISP2 는 NAP 으로 연결되어있다.

문제의 고객 xxx.xxx.0.0/20 이란 주소를 사용하고 있으며 ISP1 과 ISP2 에 연결되어있다.
문제의 고객에게 들어와야하는 패킷은 가장 긴주소 매칭에 의해 XXX 로 흘러가게 되어 전혀 수신을 못하게 된다.

멀티호밍 상황2)
ISP1 은 xxx.xxx.0.0/3 을 관리하고
ISP2 는 xxx.yyy.0.0/13 을 관리한다.
ISP1 과 ISP2 는 NAP 으로 연결되어있다.

ISP1 과 ISP2 에 둘다 연결된 고객은 ISP1 과의 접속이 갑자기 중단되면 ISP2 를 통해서
인터넷을 사용할 수 있어야 하지만 패킷은 ISP1로만 보내려고 하므로 패킷을 받지 못하게 된다.



모든 해결책은 최상위 라우터에
고객의 상세한 주소를 직접 업데이트시키는 수밖에 없다.

결국 CIDR의 핵심은 결집(aggregation)은 깨졌으며
CIDR 의 붕괴로 라우팅 테이블은 다시 증가하게 되었다.





이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/04/15 21:48 2009/04/15 21:48

네트워크 CIDR 의 위기!

Posted at 2009/04/15 21:04// Posted in study/network
CIDR 은 쉽고 간단한 해결 방법이었지만, 시간이 흐름에 따라 한두개씩 문제점이 발생하기 시작했다.

1. Fragment 문제
xxx.xxx.xxx.xxx/17 은 C클래스(xxx.xxx.xxx.xxx/24) 7개(24-17=7)의 모음이다.

하지만 7개는 매우 이상적인 숫자로 현실에서는 IP 를 더 이상 사용하지 않는 경우로 인해 구멍이 생겨 7개보다 적은 숫자의 C클래스들만 존재하게 된다. 전체적으로 보면 512개 주소가 남았다 하더라도 연속적이지 않으면 300개의 주소를 사용은 불가능하다.

2. 중복 주소 문제
R(a) 는 xxx.xxx.1.0/24 를 담당하고
R(b) 는 xxx.xxx.0.0/16 를 담당한다
R(c) 는 R(a) 와 R(b)의 상위에 있다

R(c) 라우팅 테이블에는 R(a) 와 R(b)에 해당하는 네트워크 주소가 들어있다.
- R(a) : xxx.xxx.0.0/16
- R(b) : xxx.xxx.1.0/24

문제는 xxx.xxx.1.1 이란 주소가 들어왔을때 발생한다.
/16 로 마스킹하면 xxx.xxx.0.0 이 되어 R(a)의 xxx.xxx.0.0 에 일치하고
/24 로 마스킹해도 xxx.xxx.1.0 이 되어 R(b)의 xxx.xxx.1.0 에 일치한다

양쪽도 일치하므로 어느쪽으로 나가야 할지 혼란에 빠지게 된다.

해결책은 네트워크 주소가 좀더 일치하는 쪽으로 보내는 것이다.

s: xxx.xxx.1.0
a: xxx.xxx.0.0 (x)
b: xxx.xxx.1.0 (o)

R(b) 쪽이 좀더 많이 일치하므로 R9b)쪽으로 보내게 된다


3. 루프 발생
R(a) 는 xxx.xxx.0.0/24 를 담당하고
R(b) 는 xxx.xxx.1.0/24 를 담당하고
R(c) 는 R(a)와 R(b)의 상위에 있는 라우터로 xxx.xxx.0.0/23 을 담당한다.
R(d) 는 R(c) 와 연결된 외부 라우터이다.

R(d)에서 xxx.xxx.1.1를 목적 주소로 패킷이 도착해
R(c)로 전송했는데 불행히도 R(c) 와 R(b) 의 접속이 끊어졌다.

이때 R(c) 의 라우팅 테이블은 다음과 같다
xxx.xxx.0.0/24 R(a)로 보내라
xxx.xxx.0.0/23 R(d)로 보내라

도착한 패킷의 목적 주소인 xxx.xxx.1.1 에 가장 일치하는 주소는
"xxx.xxx.0.0/23 R(d)로 보내라" 이므로 R(c) 는 R(d)로 패킷을 돌려보낸다.
패킷을 받은 R(d)는 원래 보내던 것처럼 다시 R(c)로 보내게 되고
패킷은 무한반복에 빠진다.

해결책은 패킷을 받은 라우터는 자신이 aggregated 한 경로보다 낮은 곳으로는 보낼 수 없게 하는 것이다. /13 은 /10 으로 갈 수 없다.

시스코 라우터는 디폴트(Null0)이라는 쓰레기통이 존재해 루프 현상은 없지만 패킷이 전송도중 사라지는 블랙홀 현상이 발생한다.

인터넷상 최상위 라우터는 받은 패킷을 어디론가 보내야 하므로 디폴트가 없다.

이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/04/15 21:04 2009/04/15 21:04

네트워크 CIDR

Posted at 2009/04/15 20:53// Posted in study/network
인터넷이 발달하면서 인터도메인에서 라우팅해야할 테이블 엔트리 개수가 기하급수적으로 늘어났다. 라우팅 테이블이 커질수록 라우팅 처리시간이 오래걸리게 된다. 하지만 네트워크 프로세서내의 하이스피드 메모리 크기는 무한정으로 커질 수 가 없다. 캐쉬는 크기가 작을 수록 빠르고, 커질 수록 느려지기 때문이다.

C클래스의 개수는 2의 24승, 100만개정도이나 당시 라우터의 한계는 10만개 정도였고,
라우팅 테이블 크기를 줄이기 위한 방법으로 CIDR(Classless InterDomain Routing)이 등장하게 되었다.

대부분의 인터넷 서비스는 ISP 하의 계층적인 구조로 이루어져있다. 인접한 주소대의 네트워크를 묶어 하나의 네트워크 주소로 만드는 것을 반복하면 상위로 갈수록 네트워크 주소가 매우 간단해진다.

R(a) xxx.xxx.0.0/24
R(b) xxx.xxx.1.0/24
R(c) xxx.xxx.2.0/24
R(d) xxx.xxx.3.0/24

a와 b를 묶어 R(x) xxx.xxx.0.0/23 으로 만들고
c와 d를 묶어 R(y) xxx.xxx.2.0/23 으로 만든다

다시 x 와 y 를 묶어 R(z) xxx.xxx.0.0/22 를 만든다

최상단 라우터 R(z)는 단 하나의 xxx.xxx.0.0/22 주소만 외부에 있는 라우터에게 전달하면 된다.
이로인해 라우팅 테이블의 엔트리 개수는 대폭 감소하게 되어 인터넷은 계속 정상적으로 운영될 수 있게 되었다.

B클래스를 사용하지 않고 C클래스를 묶어서 사용한다.
사실상 클래스 개념은 더 이상 의미가 없어지게 되었으며,
그래서 클래스 없는(Classless) 인터 도메인 라우팅이라고 부른다.

참고)
네트워크 주소는 net 주소와 host 주소로 나누어져 있으며
host주소를 나누는 것을 서브넷이라 하고
net주소를 나누는 것을 슈퍼넷이라고 부른다

이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/04/15 20:53 2009/04/15 20:53

네트워크 VLSM

Posted at 2009/04/15 18:38// Posted in study/network
인터넷 초기 IP 할당은 클래스 단위로 이루어졌다.

A 클래스 xxx.___.___.___ 16M 개 IP 사용 가능 (약 100만개, 16M)
B 클래스 xxx.xxx.___.___ 64K 개 IP 사용 가능 (약 6만 5천개)
C 클래스 xxx.xxx.xxx.___ 256개 IP 사용 가능

IP 개수는 4G 개로 한정되어있는 상황이고
각 국가나 ISP가 가지고 있는 IP 개수는 더욱 부족하다.

xxx.xxx.0.0 ~ xxx.xxx.255.255 까지 B클래스 IP를 확보한 소규모 ISP가 있다고 하자.
인원 30명 회사 A 와 인원 70명 회사 B 에게 IP를 나누어줘야 한다.

가장 쉬운 방법은
A 회사에게 xxx.xxx.1.0/24 를 주고
B 회사에게 xxx.xxx.2.0/24 를 주는 방법이다.

하지만 이 방법은 IP 낭비가 너무 심하다.
30 + 70 합쳐서 100개도 안되기 때문에 잘하면 C클래스 하나에 넣을 수 있는 방법이 있을 것이고
이것이 바로 VLSM(Variable Length Subnet Masks ) 가변 길이 서브넷 마스크를 사용하는 것이다.

라우터를 3개 준비한다.

일단 R(m) 서브넷 마스크 xxx.xxx.1.0/24 로 C 클래스를 설정한다.

A회사는 30개 이므로 가장 가까운 2의 승수인 32(2의 5승)개 IP를 준다.
xxx.xxx.xxx.1.0/(32-5) = xxx.xxx.xxx.1.0/27
xxx.xxx.xxx.1.0/(256-32) = xxx.xxx.xxx.1.0/224

B회사는 70개 이므로 가장 가까운 2의 승수인 128(2의 7승)개를 줘야 한다.
이미 A회사에 32개를 줬으므로 32번째부터 시작한다.
xxx.xxx.xxx.1.32/(32-7) = xxx.xxx.xxx.1.32/25
xxx.xxx.xxx.1.32/(256-128) = xxx.xxx.xxx.1.32/128

만약 새로운 C회사가 12개를 필요로 한다면 16(2의 4승)개를 할당하면 되므로
A+B 회사 합친 32+128 = 160번째부터 시작한다.
xxx.xxx.xxx.1.160/(32-4) = xxx.xxx.xxx.1.160/28
xxx.xxx.xxx.1.160/(256-16) = xxx.xxx.xxx.1.160/240

빡빡하게 사용하고도 아직도 80개의 IP가 남았다 햐햐-_-



이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/04/15 18:38 2009/04/15 18:38