что именно делает ntohs () в pcap?

Я прочитал документацию по одному из ответов:

Функция ntohs принимает 16-битное число в сетевом порядке байтов TCP / IP (семейство адресов AF_INET или AF_INET6) и возвращает 16-битное число в порядке байтов хоста.

Пожалуйста, объясните на примере, каков сетевой порядок байтов и каков порядок байтов хоста.


person tabs_over_spaces    schedule 08.04.2013    source источник


Ответы (1)


Число 1000 в двоичном формате составляет 1111101000.

Если это 16-битное двоичное число, это 0000001111101000.

Если он разделен на два 8-битных байта, это два байта со значениями 00000011 и 11101000.

Эти два байта могут быть в двух разных порядках:

  • В порядке байтов с обратным порядком байтов байт, содержащий старшие 8 бит, является первым, а байт с младшими 8 битами - вторым, поэтому первый байт равен 00000011, а второй байт - 11101000.
  • В порядке байтов с обратным порядком байтов байт, содержащий младшие 8 бит, является первым, а байт, содержащий старшие 8 бит, является вторым, поэтому первый байт равен 11101000. а второй байт - 00000011.

В машине с байтовой адресацией оборудование может быть с прямым порядком байтов или прямым порядком байтов, в зависимости от того, какой байт хранится по младшему адресу в памяти. Большинство персональных компьютеров имеют прямой порядок байтов; Более крупные компьютеры бывают как с прямым порядком, так и с прямым порядком байтов, причем ряд более крупных компьютеров (например, мэйнфреймы IBM, компьютеры среднего уровня и серверы SPARC) имеют прямой порядок байтов.

Большинство сетей являются последовательными по битам, поэтому биты передаются один за другим. Биты байта могут передаваться первыми со старшим или младшим битом, но сетевое оборудование будет скрывать эти детали от процессора. Однако они будут передавать байты в том порядке, в котором они находятся в памяти хоста, поэтому, если машина с прямым порядком байтов передает данные на машину с прямым порядком байтов, число, которое машинная передача будет выглядеть иначе на принимающей машине с прямым порядком байтов; эти различия не скрыты сетевым оборудованием.

Следовательно, чтобы позволить машинам с прямым и обратным порядком байтов обмениваться данными на каждом уровне протокола, либо:

  • необходимо выбрать «стандартный» порядок байтов, а машинам, использующим другой порядок байтов, необходимо перемещать байты многобайтовых чисел, чтобы они не находились в стандартном порядке байтов машины, перед передачей данных переместите их , так что они находятся в стандартном порядке байтов машины после получения данных;
  • двум машинам необходимо согласовать конкретный порядок байтов для сеанса (например, для протокола управления окнами сети X11 исходное сообщение от клиента к серверу определяет порядок байтов, который следует использовать);
  • сообщения протокола должны указывать используемый порядок байтов (например, как это делается с DCE RPC; это протокол, используемый для «Microsoft RPC»);
  • принимающая машина должна каким-то образом правильно угадать порядок байтов (я не знаю каких-либо используемых в настоящее время протоколов, где это делается, но старый протокол BSD "talk" не использовал ни один из методов, используемых выше, и реализация на Sun386i должен был использовать его для обработки машин Motorola 68K с прямым порядком байтов и машин Intel x86 с прямым порядком байтов).

Различные Интернет-протоколы используют первую стратегию, определяя порядок байтов с прямым порядком байтов; в различных RFC это называется «сетевой порядок байтов». (Протокол доступа к файлам SMB Microsoft также использует первую стратегию, но с прямым порядком байтов.)

Таким образом, сетевой порядок байтов является прямым порядком байтов. «Порядок байтов хоста» - это порядок байтов используемой вами машины; он может быть прямым порядком байтов, и в этом случае ntohs() просто возвращает значение, которое вы ему дали, или это может быть обратный порядок байтов, и в этом случае ntohs() меняет местами два байта значения, которое вы ему дали, и возвращает это значение. Например, на машине с прямым порядком байтов ntohs(1000) вернет 1000, а на машине с прямым порядком байтов ntohs(1000) поменяет местами байты высокого и низкого порядка, давая 1110100000000011 в двоичном формате или 59395 в десятичном.

person Community    schedule 08.04.2013
comment
›Биты байта могут передаваться первыми со старшим или младшим битом, но сетевое оборудование скроет эти детали от процессора. Я искал этот ответ. Это первый раз, когда я вижу его четко изложенным, спасибо за это. - person Michael Böckling; 29.10.2018