4

Я изучал основы сервера / клиента, как часть моих навыков сетевого программирования.

Так что в основном я пишу сервер, прослушивающий какой-то порт, и клиент подключается к нему, и поток данных продолжается ...

Теперь я восхищен тем, как ping может получать ответ от удаленного компьютера без какой-либо службы, отвечающей на него? Или я здесь ошибаюсь?

3 ответа3

10

Поскольку пинг (точнее, эхо-запросы ICMP) является частью интернет-протокола, сетевой стек (который является реализацией протокола вашей операционной системы) отвечает на эти запросы.

Это ни TCP, ни UDP, ни какой-либо другой транспортный протокол. В заголовке Интернета есть поле протокола, которое указывает, какой тип полезной нагрузки содержит IP-пакет. Для пакетов TCP это поле указывает TCP. Для пакетов ping это указывает ICMP.

Btw. это не единственное использование ICMP. Например, когда TTL пакета падает до нуля во время прохождения через сеть, он отбрасывается, и отправитель уведомляется пакетом ICMP.

Если вам интересно, как ping (8) отображает полученные ответы ICMP из пространства пользователя, это делается с помощью API сокетов. Это соответствующий раздел из исходного кода:

/* Initialize raw ICMP socket */
proto = getprotobyname ("icmp");
if (!proto)
  {
    fprintf (stderr, "ping: unknown protocol icmp.\n");
    return NULL;
  }

fd = socket (AF_INET, SOCK_RAW, proto->p_proto);
5

Да, вы немного ошибаетесь.

Когда по запросу (RFC 1122) хосту отправляется запрос проверки связи, хост должен ответить. Таким образом, существует "служба", отвечающая на это. Это не сервис уровня приложения - сам стек TCP/IP отвечает "сервисом".

Пинг без сессии - что может сбить вас с толку. Ping использует IP, который не требует установления сеанса посредством переговоров (что делает TCP). Когда вы писали свою программу для своего класса, я готов поспорить, что вы написали ее с использованием сокетов TCP.

2

ping фактически делает ICMP-запрос против самого стека IP, поэтому никакие сервисы на машине не будут его записывать, но если у вас работает что-то вроде wireshark, вы можете обнаружить пакеты таким образом.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .