Требуется ли обратный порядок байтов при отправке номеров по сети?

В большинстве примеров в Интернете авторы обычно изменяют порядок байтов перед отправкой номера из порядка байта хоста в сетевой порядок байтов. Затем на принимающей стороне авторы обычно восстанавливают порядок от порядкового байта сети до порядка байтов хоста.

Q1: Учитывая, что архитектура двух систем неизвестна, не было бы более эффективным, если бы авторы просто проверяли контенту машин перед изменением порядка байтов?

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

7 ответов

В общем, вы не можете знать архитектуру удаленной системы. Если каждый использует определенный порядок байтов - порядок сетевого байта, тогда нет путаницы. Существует некоторая стоимость для всех реверсов, но стоимость реинжиниринга ВСЕ сетевых устройств будет намного больше.

A1: Предположим, что мы попытаемся установить порядок байтов удаленных систем. Нам необходимо установить связь между системами и определить, какой порядок байтов для удаленной системы. Как мы общаемся, не зная порядок байтов?

A2: Если вы знаете, что обе системы имеют одну и ту же архитектуру, тогда вам не нужно менять байты на каждом конце. Но вы, в общем, не знаете. И если вы создадите такую ​​систему, то вы решили решение сетевой архитектуры, которое в будущем будет исключать разные архитектуры процессоров. Рассмотрите переход Apple с 86k на PPC на x86.


A1: Нет, это точка. Вы не хотите заботиться об устойчивости машины на другом конце. В большинстве случаев (за пределами строгой, контролируемой среды... которая, безусловно, не является интернетом) вы не узнаете. Если каждый использует один и тот же порядок байтов, вам не нужно беспокоиться об этом.

A2: Нет. За исключением случаев, когда это заканчивается не по дороге, и все ломается, кто-то собирается задаться вопросом, почему не была принята известная передовая практика. Обычно это будет человек, который выйдет на вашу зарплату.


Маленький или большой Endian является специфичным для платформы, но для сетевой связи это часто встречается с большим энтузиазмом, см. wiki.


Q1: да, было бы более эффективно, если бы отправитель и получатель проверили свою энсианность (точнее, сообщали друг другу свою endianess и тестировали, если это то же самое).

Q2: нет, не всегда необходимо использовать "стандартный" порядок байтов. Но это проще для кода, который хочет взаимодействовать портативно.

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

Читайте о serialization и, например, этот вопрос и мой ответ там


Сетевой порядок байтов - это big-endian. Если отправляющая или получающая архитектура тоже имеет большой смысл, вы можете пропустить шаг на этом конце, поскольку перевод составляет nop. Однако зачем беспокоиться? Перевод всего проще, безопаснее и практически не влияет на производительность.


Нет необходимости проверять соответствие, если вы используете функции ntohl() и htonl() и т.д./макросы. На машинах большого конца они уже не будут работать.


Не о слепом обращении. Все сети работают над большим эндизиатом. Мой компьютер [linux + intel i386] работает на маленьком endian. поэтому я всегда меняю порядок, когда код для моего компьютера. Я думаю, что Mac работает над большим эндиантом. Некоторые платформы для мобильных телефонов также.

licensed under cc by-sa 3.0 with attribution.