192.168.0.20/24 인 IP 가 있고
사용 중인 네트웍이192.168.0.0/24,10.4.1.0/26,10.4.2.0/24 등이 있을때
어떤 네트웍 구간인지 확인할수 있는 아주빠른 방법이 있나요?
즉 들어오는 ip 가 어떤 네트웍에 속하는지 알려고 합니다.
단지 어떤 네특웍인지만 구분할려고 하는데 좋은 방법이 있으면 알려주세요
한개의 패킷에 대해 실시간으로 대조(조회) 및 판단을 하려 한다면 비교하고자 하는 네트웍의 갯수에 따라서 시간은 비례한다는 건 당연한 것입니다. 위의 예제는 제가 커널에서 이미 등록한 규칙들을 차례로 비교하는 부분중 일부를 조금 변형하여 보여드린 부분인데요, 비교 규칙의 수는 일반적으로 많지 않기 때문에 시간에 구애를 별로 받지 않았습니다. 그러나 님의 이야기를 들어보니 비교할 대상인 네트웍의 수가 많을 경우의 비교횟수가 미치는 영향을 생각하시는 군요. 위의 예제에서 OBJECT_NUM_NETWORK가 문제가 되는군요...
비교대상인 네트웍의 수가 어느 정도 많다면(?) spacelee님이 말씀하신 자료구조를 이용한 방법이 가장 최상의 답변이 될것으로 기대됩니다. 코드로의 구현을 위해 머리를 짜내는 것은 해당 개발자의 몫입니다.
비슷한 경우의 저의 예를 들자면 완전 이진 트리를 이용하여 인덱스를 따로 두고 비교를 했었습니다. 이것은 자료의 수가 많고 자주 변경되지 않는 경우 상당히 유용합니다. 또 다른 경우는 자료를 수치변환(해싱)하여 그 값의 산포도를 보고서 그 값들의 최대값만큼의 배열을 참조하는 방식(clamp)을 사용했었고요.. 잠깐 이야기 했듯이 방식의 선정 및 구현은 개발하는 사람의 몫입니다.
-----[꼬릿말 절취선 시작]-----
삽질전에 먼저 구글신께 기도하자.
-----[꼬릿말 절취선 끝]-----
3. map의 upper_bound() 함수를 사용하여 Network ID를 search한다. ==> 찾아진 key보다 하나 앞에있는 원소를 가져온다.
(upper_bound() : Finds the first element whose key is greater than k. 라고 되어있네요.. -_-;;)
4. 구해진 key와 그 value로 bit masking하여 해당 네트워크 세그먼트가 맞으면 네트워크 세그먼트를 찾은 것임.
5. 만약 구해진 값이 없거나(iterater가 map의 첫번째 원소를 가리키거나), bit masking 결과가 일치하지 않으면 일치하는 네트워크 세그먼트가 없는것임.
Hash Table 알고리즘이 상수니까... 위의 알고리즘도 상수겠지요? (왜 map에 초과하지 않는 가장 큰 원소를 찾는 함수는 없을까요? )
필터링
글로 쓸라니깐 귀차니즘의 압박으로 인해, 그냥 간단히 코드로 끄적거려 봅니다.
추가덧글: 시간이 없어서리 글을 좀 짧게 썼습니다. 죄송함다 ㅡ.ㅡ
파지랑 빈병 줏으러 가야되기 땜에...
-----[꼬릿말 절취선 시작]-----
삽질전에 먼저 구글신께 기도하자.
-----[꼬릿말 절취선 끝]-----
확실한 코드에 감사드립니다.
답변에 감사드립니다. 그런데 저도 처음엔 그렇게 작업하다가 네트웍 수에 따라 비례하여 느려지는 현상때문에 적용을 하지 못하고 있습니다. 적절한 다른 대안이 있을까요?
Kernel land에서 하는 것인가요?? 아니면 user land에서
Kernel land에서 하는 것인가요?? 아니면 user land에서
하는 것인가요?
만약 커널이라면 interface id를 보면 쉽게 알 수 있습니다.
LAN쪽 IP Address에 대해 판단만 한다는 전제하에, 네트웍 수가 어느정도 일지 모르겠지만.. 대부분의 장비들의 포트가 16개 미만이라 판단할때 어떤 알고리즘을 쓴다 해도 비슷한 결과를 얻을 것입니다.
실제로 제가 방화벽 개발할때 유사 기능( IP Count )을 모듈로 넣은 적이 있었는데, 스마트 비트를 이용해 시험한 결과 성능 감소는 없는 것으로 나왔습니다.
저같은 경우는 모든 ip 표현을(from ip, to ip)의 ran
저같은 경우는 모든 ip 표현을
(from ip, to ip)의 range 형태로 일단 변환한 다음에
이놈들을 sorting한 다음에
겹치는 range들을 compaction 시킨 다음에
그 결과 data structure를 가지고
바이너리 서치를 했습니다.
라우터에서는 trie인가 patricia tree인가 비슷한 알고리즘을 쓰는거
같은데 그건 함 찾아보세용.^^;;
라우터 알고리즘은 메모리를 많이 쓰는 대신에
O(logn)이 아니라 O(상수)였던거 같습니다.
권위를 의심할 것,어긋남을 존경할 것,자리잡기를 거부할 것,항상 자신을 재창조할 것 - MIT 미디어랩 -
넷마스크
한개의 패킷에 대해 실시간으로 대조(조회) 및 판단을 하려 한다면 비교하고자 하는 네트웍의 갯수에 따라서 시간은 비례한다는 건 당연한 것입니다. 위의 예제는 제가 커널에서 이미 등록한 규칙들을 차례로 비교하는 부분중 일부를 조금 변형하여 보여드린 부분인데요, 비교 규칙의 수는 일반적으로 많지 않기 때문에 시간에 구애를 별로 받지 않았습니다. 그러나 님의 이야기를 들어보니 비교할 대상인 네트웍의 수가 많을 경우의 비교횟수가 미치는 영향을 생각하시는 군요. 위의 예제에서 OBJECT_NUM_NETWORK가 문제가 되는군요...
비교대상인 네트웍의 수가 어느 정도 많다면(?) spacelee님이 말씀하신 자료구조를 이용한 방법이 가장 최상의 답변이 될것으로 기대됩니다. 코드로의 구현을 위해 머리를 짜내는 것은 해당 개발자의 몫입니다.
비슷한 경우의 저의 예를 들자면 완전 이진 트리를 이용하여 인덱스를 따로 두고 비교를 했었습니다. 이것은 자료의 수가 많고 자주 변경되지 않는 경우 상당히 유용합니다. 또 다른 경우는 자료를 수치변환(해싱)하여 그 값의 산포도를 보고서 그 값들의 최대값만큼의 배열을 참조하는 방식(clamp)을 사용했었고요.. 잠깐 이야기 했듯이 방식의 선정 및 구현은 개발하는 사람의 몫입니다.
-----[꼬릿말 절취선 시작]-----
삽질전에 먼저 구글신께 기도하자.
-----[꼬릿말 절취선 끝]-----
그냥 글을 보면서 생각한 건데요...1. IP를 network b
그냥 글을 보면서 생각한 건데요...
1. IP를 network byte order로 적으면 아이피가 그대로 정렬이 된다.
192.168.11.1 -> 3232238337
192.168.11.2 -> 3232238338
192.168.11.3 -> 3232238339
...
2. Network ID는 해당 네트워크 세그먼트의 IP 중 가장 작은 값이다.
위의 두가지를 사용합니다.
1. map을 만듭니다.
<key : network byte order의 Network ID, value : network Byte Order의 NetMask>
2. 비교하려는 IP를 network byte order로 변경
3. map의 upper_bound() 함수를 사용하여 Network ID를 search한다. ==> 찾아진 key보다 하나 앞에있는 원소를 가져온다.
(upper_bound() : Finds the first element whose key is greater than k. 라고 되어있네요.. -_-;;)
4. 구해진 key와 그 value로 bit masking하여 해당 네트워크 세그먼트가 맞으면 네트워크 세그먼트를 찾은 것임.
5. 만약 구해진 값이 없거나(iterater가 map의 첫번째 원소를 가리키거나), bit masking 결과가 일치하지 않으면 일치하는 네트워크 세그먼트가 없는것임.
Hash Table 알고리즘이 상수니까... 위의 알고리즘도 상수겠지요? (왜 map에 초과하지 않는 가장 큰 원소를 찾는 함수는 없을까요? )
----------------------------------------------
한번뿐인 인생....
미친듯이 살아보자!
----------------------------------------------
댓글 달기