IT story

Linux에서 지연 및 손실 된 패킷 시뮬레이션

hot-time 2020. 4. 13. 08:20
반응형

Linux에서 지연 및 손실 된 패킷 시뮬레이션


나는에 대한 패킷 지연 및 손실 시뮬레이션 싶습니다 UDPTCP응용 프로그램의 성능을 측정하는 리눅스에 있습니다. 이를 수행하는 간단한 방법이 있습니까?


netem 은 이미 Linux 및 사용자 공간 유틸리티에 내장 된 기능을 활용하여 네트워크를 시뮬레이션합니다. 이것은 실제로 Mark의 대답이 다른 이름으로 언급 한 것입니다.

홈페이지 의 예는 이미 요청한 것을 달성하는 방법을 보여줍니다.

광역 네트워크 지연 에뮬레이션

이것은 가장 간단한 예이며, 로컬 이더넷에서 나가는 모든 패킷에 고정 된 지연 시간을 추가합니다.

# tc qdisc add dev eth0 root netem delay 100ms

이제 로컬 네트워크에서 호스트하기위한 간단한 핑 테스트는 100 밀리 초의 증가를 보여야합니다. 지연은 커널의 클럭 해상도 (Hz)에 의해 제한됩니다. 대부분의 2.4 시스템에서 시스템 클록은 100Hz에서 실행되며 10ms 단위로 지연 될 수 있습니다. 2.6에서이 값은 1000 ~ 100Hz의 구성 매개 변수입니다.

이후 예제는 qdisc를 다시로드하지 않고 매개 변수를 변경합니다.

실제 광역 네트워크는 변동성을 보여 임의의 변동을 추가 할 수 있습니다.

# tc qdisc change dev eth0 root netem delay 100ms 10ms

이로 인해 추가 된 지연은 100 ± 10ms가됩니다. 네트워크 지연 변동은 순전히 무작위가 아니므로 상관 값도 모방합니다.

# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%

이로 인해 추가 된 지연이 마지막 임의 요소의 25 %에 따라 다음 임의 요소와 함께 100 ± 10ms가됩니다. 이것은 진정한 통계적 상관 관계가 아니라 근사치입니다.

배포 지연

일반적으로 네트워크 지연은 일정하지 않습니다. 지연의 변동을 설명하기 위해 정규 분포와 같은 것을 사용하는 것이 더 일반적입니다. netem 분야는 불균일 분포를 지정하기 위해 테이블을 사용할 수 있습니다.

# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal

실제 테이블 (normal, pareto, paretonormal)은 iproute2 컴파일의 일부로 생성되어 / usr / lib / tc에 배치됩니다. 실험 데이터를 기반으로 자신의 분포를 만드는 것이 약간의 노력으로 가능합니다.

패킷 손실

임의 패킷 손실은 'tc'명령에 백분율로 지정됩니다. 가능한 가장 작은 0이 아닌 값은 다음과 같습니다.

(2) -32 = 0.0000000232 %

# tc qdisc change dev eth0 root netem loss 0.1%

이로 인해 1 / 10 % (즉, 1000 개 중 1 개)의 패킷이 무작위로 삭제됩니다.

선택적 상관 관계도 추가 할 수 있습니다. 이로 인해 난수 생성기는 난수가 낮아 패킷 버스트 손실을 에뮬레이션하는 데 사용할 수 있습니다.

# tc qdisc change dev eth0 root netem loss 0.3% 25%

이로 인해 패킷의 0.3 %가 손실되고 각 연속 확률은 마지막 패킷의 1/4에 따라 달라집니다.

프로브 n = 0.25 × 프로브 n-1 + 0.75 × 랜덤

참고 당신은 사용해야 tc qdisc add해당 인터페이스에 대한 규칙이없는 경우 또는 tc qdisc change이미 해당 인터페이스에 대한 규칙이있는 경우. tc qdisc change규칙이없는 인터페이스 에서 사용하려고 하면 오류가 발생 RTNETLINK answers: No such file or directory합니다.


손실 된 패킷의 경우 단순히 iptables 및 통계 모듈을 사용 합니다 .

iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP

위의 경우 1 % 확률로 들어오는 패킷을 삭제합니다. 약 0.14 이상이며 대부분의 TCP 연결은 완전히 중단 될 수 있으므로주의하십시오.

man iptables를 살펴보고 자세한 정보는 "통계"를 검색하십시오.


내 동료 중 하나가 tc를 사용 하여이 작업을 수행합니다. 자세한 내용은 매뉴얼 페이지를 참조하십시오. 여기에서 사용법의 예를 볼 수 있습니다 .


iptables (8)에는 모든 n 번째 패킷을 일치시키는 데 사용할 수있는 통계 모듈이 있습니다. 이 패킷을 삭제하려면 -j DROP를 추가 하십시오 .


네트워킹 물리 시뮬레이션에 대한학습서 는 UDP 연결에서 대기 시간 및 패킷 손실을 시뮬레이션하기위한 샘플 코드C ++ 클래스를 포함하며 지침이 될 수 있습니다. 다운로드 가능한 소스 코드Connection.h 파일에있는 Connection 클래스 의 공개 대기 시간packetLoss 변수를 참조하십시오 .


직접 시도하지는 않았지만 이 페이지 에는 Linux의 내장 iptables IP 필터링 시스템에서 실행되는 플러그인 모듈 목록이 있습니다. 모듈 중 하나를 "nth"라고하며 구성 가능한 패킷 속도를 떨어 뜨리는 규칙을 설정할 수 있습니다. 적어도 시작하기에 좋은 장소 일 수 있습니다.


당신은 http://snad.ncsl.nist.gov/nistnet/ 시도 할 수 있습니다 그것은 꽤 오래된 NIST 프로젝트 (마지막 릴리스 2005)이지만 그것은 나를 위해 작동합니다.


사용하기 쉬운 네트워크 오류 주입 도구는 Saboteur 입니다. 다음을 시뮬레이션 할 수 있습니다.

  • 총 네트워크 파티션
  • 원격 서비스 작동 불능 (예상 포트에서 수신 대기하지 않음)
  • 지연
  • 패킷 손실 -TCP 연결 시간 초과 (두 시스템이 상태 저장 방화벽으로 분리 될 때 자주 발생)

과학 커뮤니티에서 가장 많이 사용되는 도구 중 하나는 DummyNet 입니다. ipfw커널 모듈 을 설치 한 후 두 시스템간에 50ms의 전파 지연을 발생 시키려면 다음 명령을 실행하십시오.

./ipfw pipe 1 config delay 50ms
./ipfw add 1000 pipe 1 ip from $IP_MACHINE_1 to $IP_MACHINE_2

패킷 손실의 50 %를 발생 시키려면 다음을 실행해야합니다.

./ipfw pipe 1 config plr 0.5

자세한 내용은 여기 입니다.

참고 URL : https://stackoverflow.com/questions/614795/simulate-delayed-and-dropped-packets-on-linux

반응형