ping -t

ping -t

  • Comments 14
  • Likes

Każdy wie, że ping.exe uruchomiony z parametrem -t wysyła pakiety, i wysyła, i wysyła, i wysyła...

Według dokumentacji - bez końca. Tymczasem prawda jest inna. Zamiast wysyłać w nieskończoność, ping.exe wyśle "tylko" 4294967295 pakietów.

Minimalny (i niezmienialny!) odstęp między pakietami wynosi 1s. Czyli zamiast wieczność, cała zabawa potrwa ~135 lat.

Czy to ważne? Chyba nie... za to ciekawe i a nuż przyda się w jakimś konkursie... ;))

Autor: Grzegorz Tworek

Comments
  • Znaczy, nie umiecie napisać programu tak, że działa jak w dokumentacji, i zamiast to poprawić - rozprawiacie o tym w internecie, zajmując cenne kilobajty na tekst równie sensowny jak ten komentarz? Podziwiam, podziwiam...

  • clondike, widzę, że już nie masz się czego przyczepić. Daj sobie na wstrzymanie człowieku. Jeśli ograniczenie długości ping -t do 135 lat traktujesz jako błąd to lepiej puknij się w czółko i weź jakieś ziółka na uspokojenie. Ech.

  • ping.exe ma 15360 bajtów. Można go poprawić i zapewniam Cię, że to w tym przypadku nie kwestia tego, że nikt nie potrafi. Tylko czy dystrybuując poprawkę z nowymi binariami do milionów komputerów nie zajmie się trochę więcej "cennych bajtów"? ;)))

    Błędy były i będą. Tak samo jak były i będą sytuacje, w których co innego pisze się w dokumentacji dla użytkowników a co innego w kodzie.

    Wiedzieć o takich sytuacjach warto. A czy warto do tego robić jakieś zamieszanie - odpowiedz sobie sam :)

  • Nie można tego zmienić, bo wszystkie programy które liczą na to, że ping przestanie działać po 135 latach zwyczajnie trzeba by poprawiać.

  • Jeśli już wchodzisz w takie zbędne 'szczegóły' to pominałęś fakt, że ping nie jest wysyłany DOKŁADNIE co sekundę, tylko za każdym razem minimalnie później, więc słówko 'niezmienialny' jest zdecydowanie nie na miejscu :P

  • Wiadomo ze ver. 32-bit (2^32) wysle 4294967295, a ver. 64-bit (2^64) wysle az 18446744073709551615.

    Anyway, ciekawe lol.

  • CO z tego z 135 lat skoro windows wytrzyma z tydzien :_)

  • Wasza przeglądarka (IE) nie radzi sobie w tym szablonem bloga. Komiczne :)

  • Jeśli już wchodzisz w takie zbędne 'szczegóły' to pominałęś fakt, że ping nie jest wysyłany DOKŁADNIE co sekundę, tylko za każdym razem minimalnie później, więc słówko 'niezmienialny' jest zdecydowanie nie na miejscu :P

    Nie do końca. Czas powrotu pinga jest za każdym razem odejmowany od tej niezmienialnej sekundy, więc to opóźnienie to naprawdę nieduża wartość. Poza tym, napisałem że sekunda to czas minimalny.

    Może być więcej, wystarczy że coś nie odpowiada na pinga....

  • Wiadomo ze ver. 32-bit (2^32) wysle 4294967295, a ver. 64-bit (2^64) wysle az 18446744073709551615

    O ile wiem, wersja 64bit też używa w tym miejscu uint.

  • CO z tego z 135 lat skoro windows wytrzyma z tydzien :_)

    Może źle zaistalowałeś? Bo mój rekord to ponad dwa lata ciągłej pracy jako serwer plików w firmie. ;))

  • ping pingiem a co jak mi wyskakuje minusowy? gdzieś kiedyś czytałem o tym ale nie moge teraz tego znaleźć google wywala tylko chucka norrisa który gra w call of duty znacie lekarstwo? napiszcie na maila

    time=-1ms np...

  • ping (i w ogóle ICMP w Windows) próbuje dla każdego powracającego pakietu echo dopasować żądanie, dla którego ten pakiet wrócił. Jest tabela żądań i jak coś wróci - poszukiwane w niej są dane, które pozwalają na stwierdzenie kto był sprawcą. Każde żądanie ma w polu StartTime zapisany czas wysłania. Jak pakiet powraca, to od bieżącego czasu odejmowany jest czas wysłania i mamy czas wędrówki pakietu. Teoria jest prosta.

    Problem zaczyna się przy praktyce. Konkretnie podczas pomiaru czasu. Metod jest wiele, ale używana jest superdokładna funkcja KeQueryPerformanceCounter. Funkcja ta opiera się na zliczaniu sumy "tyknięć" zegara CPU. Problem w tym, że wielordzeniowe procesory AMD mają własny pogląd na ten temat i w zależności od tego, do którego rdzenia trafią rozkazy związane z obsługą KeQueryPerformanceCounter, odpowiedzi przychodzą różne. W efekcie, ping, który swobodnie między rdzeniami sobie wędruje, może od jednego rdzenia dostać czas wysłania późniejszy niż od drugiego czas dotarcia odpowiedzi. Odjęcie tych wartości daje ujemny czas wędrówki pakietu.

    Nie mam pod ręką komputera na którym pojawiałby się taki błąd, ale prostą drogą obejścia problemu powinno być zmienienie affinity dla procesu ping.exe tak, żeby wykonywał się tylko na jednym rdzeniu. Ewentualnie można żonglować PerfEnablePackageIdle ale wydaje mi się, że to może skutkować zwiększonym poborem energii podczas bezczynności, co z kolei może być bolesne w laptopach.

  • jakoś nikt jeszcze nie powiedział że dla człowieka  który ogółem biorąc żyje dość krótko ( porównajcie z jakimś żółwikiem czy sekwoją ) 135 lat to już wieczność, gdyż zgodnie z twierdzeniami prawie każdej religii po takim czasie zacznie "życie wieczne" =D

Your comment has been posted.   Close
Thank you, your comment requires moderation so it may take a while to appear.   Close
Leave a Comment