NS-3가 뭔데?
얘는 인터넷 시스템용 이산 이벤트 시뮬레이터 discrete-event simulator이다. 주로 연구 교육용으로 쓰는 공짜 소프트웨어라는 것
내가 뭘 시뮬레이션 돌리고 싶을 때, "시간흐름"을 그냥 연속적으로 돌려버리는게 아니라
"이벤트가 생길 때만" 처리하는 식으로 굴러간대
그럼 젠장할 "이산 이벤트? 이벤트 기반 시뮬레이터?" 이게 뭔데 그럼
예를 들어서 패킷이 송신되거나 수신되는 "특정 순간"에만 시뮬레이터가 반응하는거야 ㅇㅇ
실제 시간이 100초 흘러가든 말든 관심없고 이벤트만 처리하는데
이게 바로 CPU 자원 안 잡아먹고 성능상 개꿀이라는 거임
Priority Queue로 동작한다는게 뭔 소리냐
NS-3의 핵심구존데 일단 그림 ㄱㄱ
이벤트 A가 11:28이고 이벤트 B가 11:49래
그럼 얘네 둘이 큐에 들어간다? 그럼 A가 먼저 처리되는 거임
즉, 시간 순으로 우선순위가 낮은(이른 시간)인게 먼저 나가는 큐다 이 소리
큐에서 꺼낸 이벤트는 하나씩 꺼내서 처리하는데 그래서 A가 먼저 나가고 그 다음에 B가 처리됨 ㅇㅇ
결론은 Priority Queue + Event driven 방식으로 이벤트 기반으로 하는 시뮬레이터이다.
"NS-3는 시간 지날 때마다 멍하니 있는 게 아니라, 이벤트 생길 때만 야무지게 반응하는 똑똑한 시뮬레이터임ㅋㅋ 우선순위 큐로 시간 순 정렬돼서 이벤트 하나씩 정성스럽게 처리하는 성실한 시뮬 돌쇠라고 보면 됨."
이 아래 이미지 뭔 소리야?
일단 핵심은 뭐냐
NS-3에서 노드 간 통신은 이렇게 생겼고 내부 구조는 이렇게 생겼다 이 소리임
위쪽 그림 : 노드들의 연결 상태
이게 뭐냐
그냥 하나의 컴퓨터라고 생각해, 일단은 라우터든 호스트든 간에 ㅇㅇ
걔네들이 줄로 연결되어있죠? 이게 바로 P2P나 CSMA같은 "물리적 연결" 또는 논리적 링크들임
저 두개가 연결된 걸 확대하면 아래 그림이 된다
아래 그림 : 노드들의 내부 구조
아래의 두개의 큰 박스가 각각 노드임, 그리고 이 노드 안에는 구조가 어떻게 되어있느냐
- Application : 유저 앱이라고 보면 됨. Echo client, Echo server, OnOff App같은거. 이게 뭔지는 나중에 보고, 이게 패킷을 만들고 보내고 하는 놈
- Protocol stack : TCP/IP 스택인데 ns-3에서 제공하는 "인터넷 프로토콜"들이 모여있는 거야. 얘는
InternetStackHelper
로 설치해 ㅇㅇ 여기서 라우팅도 하고, 포트 지정도 하고, 패킷 조립도 다 함
"노드가 그냥 껍데기잖아. 여기에 인터넷 되게 만들어주는 게 이놈임. 안 깔면 UDP건 TCP건 아무것도 안 됨ㅋㅋ"
(저 둘 사이에 있는 socket-like api라고 써있는 건 진짜 소켓처럼 프로그래밍할 수 있단 소리임. UdpSocket, TcpSocket 클래스가 실제로 있음. 진짜 send(), recv()같은 시스템 콜 느낌의 API인데
"니가 send() 호출하는 건 그냥 show야ㅋㅋ 실제로는 그걸 받아서 NetDevice가 던져주는 거임. 근데 진짜 소켓처럼 짤 수 있어서 편함 ㄹㅇ" )
- NetDevice : 진짜 네트워크 장비라고 생각하면 됨. 예를 들어서
PointToPointNetDevice : 유선 링크
CsmaNetDevice : 버스 구조
WifiNetDevice : 무선 링크
이 장치가 실제로 패킷을 보내고 받는 주체임
"패킷 실질적으로 송수신하는 건 이놈이 다 함. 노드에 붙어있는 랜카드라고 보면 됨 ㅇㅇ"
- Channel : 얘는 두 NetDevice, 아까 찐 네트워크 장비라고 했지? 이 사이에 존재하는 링크임. 패킷이 이걸 타고 보내진다
그래서 뭐냐
Application에서 패킷을 만들어
Protocol Stack을 통해서 약속에 맞게 포장을 해, 뭐 IP, UDP 헤더를 추가하는 등
NetDevice에서 이걸 전송 준비를 해서
Channel에다가 던져
상대편 NetDevice가 이걸 받아
Protocol Stack이 이걸 받아서 포장된 것을 뜯어 그리고
Application에 전달한다.
야 이건 그냥 “ns-3에서는 패킷이 이렇게 돌아간다”를 쭉 보여주는 그림임. 노드끼리 연결된 것처럼 보이지만, 실제로 내부에선 앱 → 스택 → 장치 → 채널 → 장치 → 스택 → 앱 순서로 감. 니가 OnOffApplication 설치하잖아? 걔가 NetDevice까지 내려가서 Channel로 패킷을 날리는 구조임 ㅇㅇ.
흠... 솔직히 뭔 소린지 모르겠음
[Application] ← (내 코드) send()
│
▼ Sockets‑like API ← 진짜 리눅스 socket 비스무리
[Protocol Stack] ← IP, TCP/UDP, 라우팅 전부 탑재
│
▼
[NetDevice] ← 랜카드 / Wi‑Fi 모듈 / 모뎀
│ ▲ (MAC주소 + 큐 + PHY)
│패킷 전송│수신
▼ │
──── Channel ──── ← 선(케이블) or 전파(무선)
▲ │
[NetDevice] │ ← 상대편 랜카드
▲ │
[Protocol Stack]
▲
[Application] ← 상대 앱 recv()
대애충 정리하자면 ㅇㅇ
Application (Echo Client, OnOffApp 등) 얘는 패킷 데이터 만들고 send()이거 불러
Socket-like API (UdpSocket::send()) 얘는 실제 소켓처럼 보이게 해주는 거임
Protocol Stack (InternetStackHelper로 쌈뽕하게 설치 가능) Ip 헤더 붙이고 포트-라우팅 결정
NetDevice(PointToPointNetDevice, CsmaNetDevice 등) 실제 송수신, 큐 관리, MAC 주소 보유
Channel(P2P, CSMA, WIFI) 두 netDevice 사이의 링크
그래도 모르겠으면 다음 편 ㄱㄱ
'프로그램 공부 > 네트워크프로젝트' 카테고리의 다른 글
네트워크 프로젝트 5주차 (0) | 2025.04.22 |
---|---|
네트워크 프로젝트 4주차 (2) | 2025.04.21 |
네트워크 프로젝트 3주차 (0) | 2025.04.21 |