반응형

OS: Ubuntu 18.04
Simulator: ns-3.30

 

ns-3에서 무선 채널을 통해 두 노드가 서로 unicast로 패킷을 보낼 때, 시뮬레이션 타임을 기준으로 완전히 똑같은 시간에 패킷을 보내면 (즉, ns3::Socket::Send 함수를 똑같은 시간에 사용하면) 충돌이 발생한다.
이것을 방지하려면 패킷을 보낼 때 의도적으로 약간의 지터(jitter)를 부여하면 되는데, 예를 들면 두 노드가 ns3::Socket::Send를 call할 때, 수십~수백 마이크로초(microseconds) 정도의 차이만 있어도 무선 채널에서 충돌로 인한 패킷 유실을 피할 수 있다.

이를 위해 각 노드에서 Socket::Send 함수를 call 하는 부분 앞에 매번 지터를 아래와 같이 넣어 주었다.

Ptr<UniformRandomVariable> rng = CreateObject<UniformRandomVariable> ();
uint32_t jitter = rng->GetInteger(0, 1000);
Simulator::Schedule(jitter, &패킷_보내는_함수, 함수 파라미터, ...);

문제는 위와 같이 지터를 넣어 주는데도 영문도 모르게 패킷이 전달이 안되는 것이다.

분명히 동일한 시간에 패킷을 보내지만 않으면 서로 모두 전달이 되는데도 불구하고, bootstrap처럼 자동으로 주기적으로 heartbeat 메세지를 보내도록 설정하면, 패킷이 이유 없이 사라지는 것이었다. 보내는 노드에서 Socket::Send 함수를 call 한 기록만 있고 패킷을 받은 노드가 하나도 없는 상황...

 

UniformRandomVariable 클래스를 다시 확인해 보니, GetInteger 함수는 "다음(next)" 랜덤 값을 반환한다고 되어 있다. 그 말은, 랜덤 숫자의 배열을 미리 생성해 놓고, 맨 첫번째 인덱스부터 시작해서 GetInteger 함수를 call할 때마다 순서대로 하나씩 반환한다는 뜻이다.

내가 동시에 모든 노드가 시뮬레이션 시작 시간에 동시에 heartbeat 메세지를 생성해서 broadcast하도록 스케줄링을 걸었고, 그 스케줄링 함수 안에 Socket::Send 함수 앞에 GetInteger를 썼다. 내가 랜덤에 시드 값을 지정하지 않았기 때문에, 모든 노드가 같은 타이밍에 GetInteger를 맨 처음 불러왔다면, 모두가 똑같은 jitter 숫자를 가져온다는 뜻이므로, 랜덤을 잘못 적용한 셈이다. ㅠㅠ

 

각 노드별로 노드 ID 숫자를 seed로 입력해 주었더니, 모두가 처음으로 받아 오는 GetInteger 값이 다 다른 숫자가 되었다. 이제서야 진짜 랜덤으로 작동한 것이다.

#include "ns3/random-variable-stream.h"

// ...(중략)

SeedManager::SetSeed(node_id + 1); // ns-3에서 node id는 0부터 시작하고, 

                                                                            // Seed 값에 0이 들어가면 런타임 에러가 나서 1을 더해 줬다.

Ptr<UniformRandomVariable> rng = CreateObject<UniformRandomVariable> ();

 

 

반응형
블로그 이미지

Bryan_

,
반응형

회사에 입사하면서, 나는 내 이력에서 박사 타이틀을 떼어 버리고 오로지 열심과 업무수행 능력으로만 인정받고 싶었다. 내 입장에서 박사학위는 분수에 맞지 않지만, 그간 고생한 이력이 불쌍해서 학교가 나에게 "옛다" 하고 마지못해 쥐어 준 것이었다. 그런 부끄러움 때문에 채용 과정이 끝난 뒤에는 소셜 네트워크에서 학력을 다 없애 버렸다. 그러나 부서에 배치받고 나서 일을 하면 할 수록, 주위 동료들과 상사들은 나를 더욱 더 '네트워크 박사'의 이미지로 바라보고 있음을 깨달았다.

모름지기 공학박사는 특정 분야의 기술적인 한계가 어디인지 알고, 인간의 삶을 개선하기 위한 기술적인 문제를 정의하고, 그 문제를 해결하기 위한 체계적인 절차와 방법을 제시할 수 있어야 한다.
돌이켜 보면 내가 잘 했던 것은 특정 기술분야의 정점이 어디인지를 비교적 빨리 찾아내는 것이었다. 문제 정의는 지도교수의 가르침에 비해 평균 또는 그 이하여서 지도교수의 도움을 자주 받았던 것 같다. 해결 방법에 대해서는 문제 정의가 되기도 전에 먼저 움직이려고 하거나, 정작 문제 정의를 해결하는 가장 핵심적인 action item 말고 곁가지를 먼저 챙기는 실수를 자주 했었다. 뭘 실험으로 증명해야 되는지 스스로 이해하기도 전에 실험 환경을 만드는 성급함이랄까...

그런데 회사에서 연구를 중심으로 하지 않는 부서에 왔음에도 불구하고 박사의 문제 정의 능력이 필요한 업무는 여전히 존재한다. 무엇보다 상사의 상사의 상사쯤 되는, 경영진까지 보고를 해야 하는 일에서는 그 무엇보다도 문제의 핵심을 제한된 분량의 슬라이드나 문서로 정확하게 표현해야만 한다.

입사 후 초반 몇 개월 동안은 내가 회사가 돌아가는 그 자체를 익히느라 중요한 일을 맡지는 않았다. 그러나 이제 회사의 현황을 어느 정도 알게 되면서 가끔 부서 차원의 결정에 관여하거나 윗선에 보고해야 할 때, 사람들은 나에게 박사로서의 역할을 해 주기를 기대하는 것 같다.

생각해 보면 그게 너무나 당연한 것이다. 회사가 나보다 더 체력도 좋고 두뇌 회전도 좋으며 (요즘은 인적성 검사가 IQ 테스트 빨리 풀기 대회니까) , 인건비까지 더 싼 신입사원을 뽑지 않고 굳이 경력직으로 (업무 경력으로 보면 신입과 똑같은) 박사를 채용하는 이유는 그렇게 쓸 곳이 있기 때문이다. 그리고 내가 그렇게 뽑혀 와서는, 경력 없는 일반 신입사원과 똑같은 종류의 일들만 열심히 한다면, 내가 아무리 열심히 일처리를 한다고 한들 주위 사람들의 기대에는 부응하지 못하는 것이다.

나의 자격지심 때문에 박사 타이틀을 일부러 없애면서 주어지는 모든 종류의 일을 닥치는 대로 열심히'만' 하는 것이 능사가 아니다. 내가 좋든 싫든, 나는 회사가 현재 갖고 있는 challenge와 그 이면에 숨겨진 근본적인 기술적 문제를 드러내고, 이것을 해결하기 위한 체계적인 방향을 제시하는 역할을 해 주는 것이 제대로 인정받는 길이다. 졸업할 때까지 연구능력을 충분히 인정받지 못했다면, 이제부터라도 능력을 키우고 발휘해서 드러내려고 노력하는 것이 바람직한 마음가짐일 것이다.
스스로 박사의 무게감을 덜어 내려 하지 말고, 그 무게감이 오히려 진짜임을 증명하기 위해 이번주도 노력하자.

Keep learning, keep thinking.

 

반응형
블로그 이미지

Bryan_

,
반응형

네트워크 시뮬레이터로로 예전부터 1년반쯤 전까지는 QualNet을 써 오다가, 작년부터는 줄곧 ns-3만 쓰고 있는데, 둘 사이에 장단점을 간단히 비교해 볼 수 있을 것 같았다.


주의사항: 주관적인 관점이라서 다른 사용자 입장에서는 의견이 다를 수 있음.




<비용>

QualNet : ns-3 (압승)


*QualNet

 - 대학교에서 University license로 기본 라이브러리만 구매하면 약 1000만원

 - 기본 제공이 안되는 라이브러리 추가 시 약 100~250만원 정도 예상 (LTE, Zigbee 같은 것들이 여기에 해당 ㅜㅜ)

 - 한 번 라이선스 구입하면 무제한 사용

 - 대신 버전 업그레이드 기간에는 제한이 있음. 문제는 시간이 지날 수록 최신 버전을 써야 할 필요가 생긴다는 것. 2010년쯤에 구입했던 5.1 버전에는 기본 제공하는 와이파이 표준이 802.11a/b/g 밖에 없어서 802.11n이나 ac를 테스트할 수가 없었다. 구 버전 사용자가 최신 버전을 쓰려면 본사에 1000달러를 내면 된다고 한다.

 - 멀티코어를 잘 지원해서 시뮬레이션 성능을 높일 수는 있는데, 라이선스 하나에 코어 2개가 최대임. 코어 수 늘리려면 라이선스 더 사야 함(...)


*ns-3

 - 무료 (오픈소스)

 - 버전 업그레이드 되면 그냥 새로 다운받아서 쓰면 됨

 - 오픈소스라서 실시간으로 수정되는 코드를 버전 관리 시스템에서 바로 받아쓸 수도 있다. (물론 그만큼 버그에는 취약. 공식 릴리즈 공지되는 버전만 써도 무방)




<그래픽 유저 인터페이스(GUI)>


QualNet (압승) : ns-3


*QualNet

 - ns-3에 비해 월등히 좋음.

 - 마우스 클릭만 가지고 가장 기본적인 시뮬레이션 실행이 가능한 수준 ㄷㄷ.

 - 파워포인트에서 도형 배치하고 선 긋듯이 노드들 배치하고, 트래픽은 보내는 곳과 받는 곳 사이에 선을 drag & drop으로 죽 그어 주면 만들어짐. 그 선을 더블클릭해서 패킷 사이즈, 보내는 양, 시작시간 등등 다 설정하면 됨. 각 노드도 더블클릭해서 각각의 네트워크 인터페이스, 프로토콜, IP주소, 그외 각종 설정들 다 바꿀 수 있음.

 - 그림 그리기(?)를 끝내고 시뮬레이션 시작(play 버튼)을 누르면 노드와 노드 사이에 패킷 전달되는 과정, 노드의 움직임, 무선일 경우에는 전송 범위까지 실시간으로 시뮬레이션 시간에 맞춰서 다 표시됨. 보여주는 정보의 종류를 조정할 수 있고, 재생되는 속도도 조정 가능. (물론 최고속도는 컴퓨터의 하드웨어 성능에 비례함)

 - 시뮬레이션 끝나면 결과를 그래프로 볼 수 있는데, L1/L2/L3/L4/어플리케이션 계층 각각에 대해서 통계치를 다 볼 수 있음. 예를 들어 PHY 계층에서 signal 발생시킨 수와 에러율 확인, MAC 계층에서 프레임 전송 수와 실패 재전송 수, 라우팅 계층의 경로 탐색 시도 수, 응용 계층에서의 실제 throughput 이 모든 것을 모든 노드에 대해서 다 확인 가능.

 - 물론 GUI만으로 논문 실험에 쓸 만한 자기만의 방법을 설정해줄 수는 없고, 그 부분은 어쩔 수 없이 코드 수정을 해야 함.


*ns-3

 - GUI가 큰 의미가 없음 (...)

 - 애초에 ns-3에는 시뮬레이션 환경 자체를 설정하는 GUI가 존재하지 않음.

 - C++ 코드로 일단 뭐가 됐든 시뮬레이션을 돌려 본 뒤에야 자신이 만든 네트워크 토폴로지가 어떻게 생겼는지 GUI에서 확인 가능. 왜냐하면 ns-3에서 제공하는 NetAnim 이라는 GUI는 실시간으로 시뮬레이션을 시각화하는 것이 아니고, 시뮬레이션 결과 파일을 읽어들여서 재생하는 역할이기 때문. (스타크래프트의 지난 경기 리플레이로 보는 것과 차이가 없음)

 - 앞으로도 눈으로 보는 대로 시뮬레이션 환경을 만들 수 있도록 돕는 GUI가 나올 확률은 낮음. ㅜㅜ 왜냐하면 퀄넷은 시뮬레이션 환경 자체는 별도의 스크립트 파일로 처리하고, 실제 L1/L2/L3/L4 계층의 행동은 C/C++ 코드로 처리하기 때문에 GUI에서 스크립트 파일을 만들어 주는 것이 가능한 반면에, ns-3는 그냥 모두 다 C++로 코딩해야 되기 때문에.

 - 그나마 ns-3 입장에서 위안이 되는 점은, 토폴로지를 눈으로 확인할 필요가 없고 환경을 조금씩 바꾸면서 수많은 반복 실험을 해야할 때가 되면 GUI를 쓸 필요 없이 커맨드 라인에서 배치(batch)를 돌리게 되니까 퀄넷이나 ns-3나 별 차이가 없게 될 것이라는 점. (퍽이나 ㅠㅠ)




<시뮬레이션 성능(scalability, running time 측면)>


QualNet (우세) : ns-3


*QualNet

 - 애초에 퀄넷이 처음부터 내세우는 장점이 scalability이고, 기본적으로 모든 코드에 MPI 적용이 되도록 만들었기 때문에 (사용자가 새로 만드는 코드까지 전부) 멀티 프로세서 지원의 편의 측면에서 ns-3를 압도함.

 - QualNet 판매하는 회사 이름도 심지어 Scalable Networks임 (...)

 - GUI에서는 시뮬레이션 시작 버튼 옆에 프로세서 개수 칸이 있는데 그냥 숫자 써주면 끝.

 - 커맨드 라인에서는 "-mp 2"라고 쓰면 알아서 듀얼코어 써서 돌림.

 - 그냥 싱글코어로 돌려도 꽤 빠른 편임.

 - 다만 GUI에서 실시간으로 시뮬레이션 진행 중인 애니메이션 화면을 봐 가면서 실행하면 당연히 느림. (...) GUI에서 눈으로 확인이 되었으면 커맨드 라인에서 돌려야 함.

 - 유일한 단점이 있다면, 코어 개수도 현질을 해야 3개 이상 쓸 수 있다는 점.

 - 또한 라이선스 때문에 한번에 여러 머신에서 여러 프로세스를 돌리는 것이 불가능함. (라이선스 서버 1개가 라이선스 1개를 프로세스 1개에 할당하는 방식이고, 그 동안에는 다른 프로세스가 실행될 수 없는 구조 ㅠㅠ 동시에 여러 머신에서 시뮬레이션을 돌리려면 머신 개수만큼 라이선스가 있어야 함.)


*ns-3

 - ns-3도 퀄넷처럼 이벤트 기반 처리 방식으로 시뮬레이션을 실행하고, MPI 라이브러리를 통해서 멀티코어를 사용할 수 있기 때문에, 구조적인 측면에서는 퀄넷과 큰 차이가 없음. 하지만 사용의 편의가 떨어지는 게 문제.

 - ns-3에서 멀티코어를 쓰려면 사용자가 수동으로 mpi 관련 라이브러리를 미리 설치해야 하고, 자신의 시뮬레이션 코드에 MPI를 쓰겠다는 설정을 또 별도로 작성해 줘야 함. 단순히 argument에 숫자 추가만 하면 되는 QualNet에 비해 쓰기 어려울 수밖에 없음. (인터넷에도 MPI 적용이 안돼서 질문하는 글이 많음)

 - 모든 코드가 다 MPI가 되는 것도 아님. 특히 와이파이 같은 무선 쪽은 MPI가 아직 안돼서 무조건 싱글코어로 돌려야 함. 이게 특히 심각해지는 부분이 ns-3가 가상 머신들을 연동해서 돌아갈 때.


 - 다만 ns-3가 퀄넷에 비해 유리한 상황이 있기는 한데, 똑같은 시뮬레이션 인스턴스를 1개가 아니라 조건이 조금씩 다른 수백~수천 개의 시나리오를 순차적으로 처리해야 할 때. 퀄넷은 라이선스 1개당 1개 프로세스만 존재할 수 있지만, ns-3는 오픈소스니까 그런 거 없다. 원하는 만큼 클러스터에 복제해서 원하는 만큼 얼마든지 프로세스를 돌릴 수 있음. 즉, 개별 시뮬레이션 처리 시간이 오래 걸리는 문제를 동시에 여러 머신과 프로세스를 써서 얼마든지 전체 시뮬레이션 시간을 줄일 수 있음.




<외부 프로그램과의 확장성>


QualNet : ns-3 (우세)


*QualNet

 - 외부 프로그램에서 패킷을 만들어서 퀄넷의 시뮬레이션 네트워크에 주입하는 것이 가능한데, 방법이 편하지 않음. 외부 프로그램과 퀄넷 사이에 패킷을 서로 전달해 주는 코드를 하나 더 만들어야 함. (이것도 C언어로)


*ns-3

 - 리눅스 컨테이너(lxc)를 써서 VM을 만들어서 그 VM들 사이의 네트워크를 ns-3가 시뮬레이션할 수 있음!!

 - ns-3 시뮬레이션 코드 위에 아예 실제로 작동하는 프로그램 소스코드를 그대로 컴파일해서 돌리는 것(Direct Code Execution; DCE)도 가능!!


 - 그러나 위 2개 다 아직 한계가 있음 ㅠㅠ

 - VM 방식은 호스트 머신(리눅스)에 브릿지 인터페이스에 tap을 붙여서 ns-3와 연결되는데, 여기서 약간씩 딜레이가 발생함. VM들은 자기들만의 clock을 갖고 있는데 ns-3에 약간이나마 늦게 패킷이 흘러들어오면 그걸 ns-3 프로세스가 시뮬레이션으로 처리하고 다시 VM들에게 돌려주는 과정에서 각 VM은 이미 자기 시간이 흘러가고 있음. 결국 실제 환경에 비해서 delay가 커질 수밖에 없는 구조.

 - 게다가 설상가상으로, 와이파이 같은 무선 네트워크 환경에 저렇게 VM을 붙이면 ns-3가 아직(2017.04.15 기준) 무선 환경을 멀티코어로 처리하지 못하기 때문에 무선 환경의 신호 세기, 간섭, fading, propagation 이런 것들을 다 싱글코어에서 계산해야 됨(......)

 - 그래서 VM 10개를 만들고 와이파이 애드혹 네트워크를 시뮬레이션했더니, 각자 1초에 하나씩 hello 메세지를 broadcast하기만 하는데도 그 상태로 ping을 날리면 20초가 넘어가는(...) 도저히 실험 불가능한 상태가 됨. 지못미 ㅠㅠ

 - VM에 대한 대안으로 나온 것이 DCE인데, 이것도 사실 C++로 개발된 프로그램만 취급함. C++ 소스코드를 가져와서 ns-3에서 호환될 수 있게 g++ 옵션을 조금 추가해서 빌드하면 되는데, 그렇다고 모든 시중의 C++ 프로그램이 다 빌드되는 것도 아님. ns-3 커뮤니티 얘네들은 자랑스럽게 iperf를 소스코드 수정 없이 그대로 빌드해서 갖다쓸 수 있다고 자랑하는데, tcpdump 같이 더 심각한 일을 하는 소스코드는 아예 컴파일 불가능 ㅜㅜ

 - 내가 직접 소켓 프로그래밍으로 C++ 프로그램을 만들어서 돌리려고 해도 생각보다 지원 안되는 코드가 많아서 코딩에도 제약이 있음. 이게 뭐야...


 - 결론적으로, 분명히 확장성이 좋아 보이는데 결국 실제로 제대로 써 보려고 달려들면 퀄넷이나 ns-3나 안되는 건 마찬가지임 ㅠㅠ




<통계(Statistics)>


QualNet : ns-3 (무승부)


시뮬레이션 결과에 대한 통계를 내 주는 부분은 양쪽 다 방식도 다르고 장단점도 분명해서 어느 한 쪽이 유리하다고 볼 수는 없다.


*QualNet

 - 위의 GUI 부분에도 언급되어 있듯이, 물리 계층부터 응용 계층까지 각 계층에서 낼 수 있는 모든 통계를 항상 만들어 줌. GUI에서 그래프를 그려줄 때 참고하는 파일이 .stat 파일이고, 시뮬레이션 1개를 실행하고 나면 자동으로 생성되기 때문에 이 .stat 파일을 직접 파싱해서 원하는 통계치를 계산하는 것도 가능.

 - 모든 계층에 대한 통계가 다 나오는 점이 의외로 디버그에 유용할 때도 있음. 가령 응용 계층에서 패킷을 모두 전송 실패했는데 물리 계층에서 받는 signal이 분명히 기록되어 있다면 중간의 라우팅 계층 같은 부분에서 기대와 다르게 패킷을 drop했을 수 있으므로, 라우팅 계층의 logic을 살펴보는 식의 접근이 가능함.


*ns-3

 - 시뮬레이션 환경에서 생성하는 노드 각각에 대해서 .pcap 파일을 자동으로 만들도록 설정할 수 있는데 (코드에 pcap output을 만들어 달라고 1줄 추가하면 됨), 이 pcap 파일을 Wireshark에서 바로 보거나 그래프를 볼 수도 있고, tcpdump에서 약간의 규칙을 적용해서 원하는 정보를 원하는 포맷으로 만들어 쓸 수 있음.

 - pcap 파일을 기반으로 패킷을 분석하고 통계를 내는 부분은 오픈소스 도구들도 여럿 존재하기 때문에 퀄넷의 자체 포맷(stat)에 비해 유리한 점이 있음.




반응형
블로그 이미지

Bryan_

,
반응형

FireChat이라는 모바일 앱은 스마트폰들이 블루투스와 Wi-Fi P2P 기술을 이용해서 통신망 인프라스트럭쳐(3G, 4G/LTE, Wi-Fi 액세스 포인트 등) 없이도 서로 연결된 기기들끼리 메세지를 주고받을 수 있게 도와준다.


FireChat은 홍콩에서 한창 시위가 진행될 때 갑자기 유명해졌는데, 그 당시에 좁은 지역에 사람들이 집중적으로 모여들면서 셀룰러 망이 감당할 수 있는 수준을 넘어서면서 통신이 잘 되지 않자 시위대 구성원들 사이에 인프라 없이 서로 통신하기 위해 설치하기 시작하면서 단기간에 50만 다운로드를 기록했다.


Wired 기사 [1]에 의하면, FireChat의 개발사인 OpenGarden에서 필리핀 지역에 메쉬 네트워크를 실현하기 위해 노력하고 있다.


그런데 전통적인 무선 메쉬 네트워크(Wireless Mesh Network; WMN)의 개념에서는 어딘가에 고정적으로 설치되는 메쉬 라우터(mesh router)가 필요하다. 기존의 AP와 비슷하면서 AP들 사이에 무선 링크가 존재하는 것이 차이점이다.

그런데 태풍 때문에 재난상황이 자주 발생한다는 필리핀 도시 지역에 고정된 메쉬 라우터를 설치한다면, 셀룰러 망과 같은 인프라가 망가질 때 메쉬 라우터도 함께 망가질 가능성이 높을 텐데 어떻게 메쉬 네트워크를 구현하는 것일까?


알고 보니, 일부 사람들이 GreenStone이라고 부르는 중개기를 들고 다니면서 메쉬 네트워크를 유지하는 개념이라고 한다.


(GreenStone, image from TechInAsia [2])


GreenStone은 현재 필리핀의 Makati 지역에서 시범적으로 운영되고 있는 듯 하다.


ISM 대역의 블루투스 라디오를 쓰고 주변의 FireChat 앱에서 발생하는 메세지를 모아 뒀다가, 이동하면서 새롭게 연결된 FireChat 사용자들에게 저장된 메세지를 전달하는 역할을 갖는다.

이것은 어떤 의미에서 보면 "지연 허용 네트워크(Delay-tolerant Network; DTN)"에 더 가깝다. 메세지가 마치 물리적인 편지와 같이, 실시간으로 즉시 전달될 수는 없더라도 언젠가 당사자(destination node)를 만나게 되면 비로소 전달되게 하는 기술이다.


홍콩 시위대들이 FireChat을 사용할 때에는 밀집되어 있는 수많은 사용자들이 인프라 없이 메세지를 서로 전달하는 것(일종의 flooding)이 강조되었다면, GreenStone은 밀집되어 있지는 않지만 도시 전역에 퍼져 있는 FireChat 사용자들이 시간이 좀 걸리더라도 서로 메세지를 교환할 수 있도록 하는 데 초점을 맞추고 있다.

DTN 기술은 처음 소개된 이래로 지금까지 꾸준히 연구자들의 주목을 받아 왔지만, 항상 실제로 어디에 쓰이는지에 대해서 의문점이 따라다녔었다. 그런데 필리핀에서 메쉬 네트워크와 DTN이 결합된 듯한 형태로 실제 사용 예가 나타나는 것은 고무적인 일이다.


OpenGarden 사는 통신사의 입장에서는 눈엣가시 같은 존재감을 점점 나타내고 있지만, 사용자들의 입장에서는 안정적인 성능(QoS 같은 것)을 포기하는 대신 무료로 주변과 통신할 수 있는 기회를 제공하는 고마운 대상이 될 수 있다. (항상 그렇다는 것은 아니다. 특히 우리나라처럼 셀룰러 망이 지나치게 잘 되어 있는 곳에서는 굳이 이런 느리고 불안정한 메세징 앱을 쓰려고 하지 않을 테니까.)

하지만 적어도 스마트폰에 기본적으로 내장된 ISM 대역의 라디오 기술을 이용해서, 가끔 통신망 인프라 없이 직접 무선 라디오를 가지고 필요한 사람들과 통신이 가능하게 해 주는 것은 중/장기적으로 사용자에게 좋은 영향을 끼칠 수 있다.


분명히 내 눈앞에 있는 전자기기가 내 스마트폰과 마찬가지로 와이파이/블루투스를 내장하고 있는데, 그냥 서로 직접 얘기하게 만들어서 원하는 일을 할 수는 없을까? 이 질문에 대한 여러 해답 중의 하나가 OpenGarden의 사례가 될 것으로 기대한다.




<참고자료>

[1] https://www.wired.com/2015/10/giant-network-for-free-messaging/

[2] https://www.techinasia.com/firechat-messaging-app-disaster-tool




반응형
블로그 이미지

Bryan_

,
반응형

OS: Ubuntu 14.04.1 LTS, Raspbian Jessie

tcpdump: Version 4.6.2 (libpcap 1.6.2)



리눅스에서 네트워크(e.g. 메쉬 네트워크)에 참여하는 각각의 기기가 자신을 거쳐 가는 모든 트래픽 사용량을 네트워크 인터페이스별로 구분해서 통계를 낼 필요가 생겼다.


Tcpdump에서는 "-i any" 옵션을 써서 한꺼번에 모든 인터페이스를 모니터링할 수는 있다. 하지만 아쉽게도 화면에 표시되는 로그 한 줄이 어느 네트워크 인터페이스에 연관된 것인지 알 수 없다. 특히 멀티라디오 멀티채널 라우팅 프로토콜을 돌리는 메쉬 라우터의 입장에서는 지나가는 트래픽 플로우 하나가 어느 네트워크 인터페이스를 거쳐서 지나가고, 소비하는 대역폭의 양이 어느 정도인지 반드시 확인해야 한다.


결국 두 가지 방법 중 하나를 써야 한다.

  1. Tcpdump 인스턴스 하나를 모든 네트워크 인터페이스에 대해서 검사하도록 실행하고, tcpdump에 찍히는 source, destination IP 주소를 검사해서 어느 네트워크 인터페이스에 해당되는지 확인(예측)하는 방법
  2. 각 네트워크 인터페이스별로 tcpdump 인스턴스를 별도로 실행하고, 각 인터페이스별로 구분되는 로그를 활용하기


처음에는 내가 1번 방식을 써서 라우팅 프로토콜에서 tcpdump 로그를 파싱하고 source, destination IP주소를 가지고 네트워크 인터페이스 이름을 알아내는 함수를 코딩해서 썼는데, 예상치 못한 문제가 발생했다. 로그에 찍히는 source와 destination IP 주소가 현재 로깅을 하는 기기와 상관없는 원격지의 IP주소일 경우에는 어느 인터페이스를 통해서 패킷이 들어오고 나가는지 알 수가 없었다. 아주 불가능한 것은 아니지만, 라우팅 테이블에 접근해서 source, destination 양쪽으로 가는 경로와 네트워크 인터페이스를 확인해야 했다. 그리고 외부에서 현재 기기로 들어오는 패킷인지, 패킷이 현재 기기를 통해서 다른 노드(next hop)로 빠져나가는 것인지를 tcpdump 로그에서는 알 길이 없었다. 라우터 입장에서는 똑같은 로그가 두 줄이 찍히는 것처럼 표시가 되었다.


결국 2번 방법을 쓰기로 하고 인터넷을 찾아보니 나와 비슷한 목적으로 tcpdump를 응용하는 사례가 이미 있었다. [1]

핵심은, 동시에 여러 개의 tcpdump 인스턴스를 실행하고, 그 대신 각 인스턴스에서 로그가 한 줄 찍힐 때마다 앞에 네트워크 인터페이스 이름을 추가해서 한 화면에 모두 출력하는 것이고, 이것을 bash script로 만든 것이 첫 번째 답변이다. ([2]에도 있음)


다만 [1]과 [2]에 소개된 스크립트가 라즈베리파이에서는 에러가 나서, 그냥 옵션들 빼고 여러 인터페이스를 동시에 쓰도록 간단하게 만들었다.


[anydump2.sh]

#!/bin/sh


# Get a list of interface names from a user by an argument. (e.g. 'eth0 wlan0')

# Note that the list of interfaces separated by a space should be inside '' or "".

IFLIST=$1


# When this exits, exit all background processes:

trap 'kill $(jobs -p) &> /dev/null && sleep 0.2 &&  echo ' EXIT


# Create one tcpdump output per interface and add the interface name in front of each line:

for interface in $IFLIST

do

        tcpdump -l -i $interface -Nn -b ip -tttt | sed 's/^/'"$interface"' /' 2>/dev/null &

done


# Wait until Ctrl+C

wait



사용 예시:


무선 인터페이스 3개(wlan0, wlan1, wlan2)를 모니터링할 경우,

$ sudo ./anydump2.sh 'wlan0 wlan1 wlan2'



출력 예시:

(listening 이후부터 출력되는 로그의 맨 앞에 인터페이스 이름이 다르게 찍히는 것을 볼 수 있다)


cdsn@cdsn-HP-EliteBook-2740p:~/exp/tcpdm-monitor$ sudo ./anydump2.sh 'wlan0 wlan1 wlan2'

[sudo] password for cdsn: 

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on wlan0, link-type EN10MB (Ethernet), capture size 65535 bytes

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on wlan2, link-type EN10MB (Ethernet), capture size 65535 bytes

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on wlan1, link-type EN10MB (Ethernet), capture size 65535 bytes

wlan0 2016-09-05 17:42:41.671768 IP 192.168.4.6 > 192.168.4.5: ICMP echo request, id 2210, seq 1, length 64

wlan0 2016-09-05 17:42:41.671861 IP 192.168.4.5 > 192.168.4.6: ICMP echo reply, id 2210, seq 1, length 64

wlan0 2016-09-05 17:42:42.650726 IP 192.168.4.6 > 192.168.4.5: ICMP echo request, id 2210, seq 2, length 64

wlan0 2016-09-05 17:42:42.650783 IP 192.168.4.5 > 192.168.4.6: ICMP echo reply, id 2210, seq 2, length 64

wlan0 2016-09-05 17:42:43.650913 IP 192.168.4.6 > 192.168.4.5: ICMP echo request, id 2210, seq 3, length 64

wlan0 2016-09-05 17:42:43.650952 IP 192.168.4.5 > 192.168.4.6: ICMP echo reply, id 2210, seq 3, length 64

wlan1 2016-09-05 17:42:47.740037 IP 192.168.3.6 > 192.168.3.5: ICMP echo request, id 2211, seq 2, length 64

wlan1 2016-09-05 17:42:47.740121 IP 192.168.3.5 > 192.168.3.6: ICMP echo reply, id 2211, seq 2, length 64

wlan1 2016-09-05 17:42:48.752034 IP 192.168.3.6 > 192.168.3.5: ICMP echo request, id 2211, seq 3, length 64

wlan1 2016-09-05 17:42:48.752080 IP 192.168.3.5 > 192.168.3.6: ICMP echo reply, id 2211, seq 3, length 64

wlan1 2016-09-05 17:42:49.747415 IP 192.168.3.6 > 192.168.3.5: ICMP echo request, id 2211, seq 4, length 64

wlan1 2016-09-05 17:42:49.747452 IP 192.168.3.5 > 192.168.3.6: ICMP echo reply, id 2211, seq 4, length 64

^C6 packets captured6 packets captured


6 packets received by filter6 packets received by filter


0 packets dropped by kernel0 packets dropped by kernel


0 packets captured

0 packets received by filter

0 packets dropped by kernel

wlan1 

wlan0 

wlan2 

cdsn@cdsn-HP-EliteBook-2740p:~/exp/tcpdm-monitor$ 





<참고자료>

[1] StackOverflow, "How to display interface in tcpdump output flow?," http://serverfault.com/questions/224698/how-to-display-interface-in-tcpdump-output-flow

[2] Sebastian Haas, "Anydump 1.3," http://sebastianhaas.de/anydump-release/



반응형
블로그 이미지

Bryan_

,