- Ожидаются ли слова из буфера в младшем или старшем порядке?
Для работы в сети («полезная нагрузка» любого пакета, отправленного или полученного черезсеть, использующая любой протокол); буфер всегда содержит октеты (байты) , и октеты всегда поступают в том же порядке, в котором они были отправлены (проблема «порядка байтов» отсутствует).
Перед тем, как программное обеспечение использует сетевую передачу для отправкиданные по сети преобразуют что-то (например, структуру на языке высокого уровня) в буфер октетов.Это называется «сериализацией» и необходимо, чтобы избежать всех видов катастроф переносимости (не только «endianess», но и таких вещей, как заполнение структуры компилятора / реализации, различия в формате с плавающей запятой, различия в наборе символов и т. Д.).
После того, как программное обеспечение получает данные из сети, оно преобразует буфер октетов во что-то (например, структуру на языке высокого уровня).Это называется «десериализация».Он включает в себя 3 цели:
- проверка работоспособности (попытка убедиться, что вы получили то, что, по вашему мнению, вы должны были получить)
- авторизация (попытка убедиться в правильности отправителя ине злоумышленник)
- преобразование буфера октетов обратно во что-то (например, структуру на языке высокого уровня).
Ни одна из этих вещей (сериализация и деСериализация) являются частью самой сети - они «до сети» и «после сети», а не «в середине сети».
Обратите внимание, что (исходя из ваших вопросов) вы предположили, чтобуфер является структурой высокого уровня и не смог сериализовать / десериализовать;таким образом, ваш код (включая контрольную сумму) будет поврежден и потерпит неудачу (и, вероятно, не только из-за "endianess").
Если размер буфера нечетный, последний байт добавляется непосредственно к сумме, но добавляется ли он просто как значение ИЛИ как байт НИЗКОГО ЗАКАЗА слова (учитывая, что следующий байт равен 0 - байт ВЫСОКОГО ЗАКАЗА вlittle endian)?
Да.
Обратите внимание, что основная часть вычисления контрольной суммы (которая неверно предполагает, что «буфер октетов» является словами) сломается из-за«endianess» (если у отправителя и получателя разные порядковые номера, проверка контрольной суммы «will» (см. примечание) завершится неудачей для всех сообщений, длина которых превышает 1 октет).Простой способ избежать этого - использовать «сумму байтов» (вместо «сумма слов»).Лучшим способом избежать этого является более сложная контрольная сумма (например, CRC-32, которая используется TCP).
Примечание: при использовании 16-битной контрольной суммы в 65536 есть как минимум 1 вероятность того, чтоконтрольная сумма пройдет случайно благодаря одной лишь удаче;и подход «сумма чего-либо» подвержен различным сбоям (например, если отправитель или получатель неправильно указали размер сообщения и на конце имеется множество нулей, которых не должно быть, тогда «неправильные нули» не будут действоватьконтрольная сумма).Это означает, что когда отправитель и получатель используют один и тот же порядок байтов, есть вероятность «хуже, чем 1 в 65536», что контрольная сумма пройдет, когда она не должна;и это также означает, что когда отправитель и получатель используют разные порядковые номера, а размер сообщения превышает 1 октет, существует вероятность того, что контрольная сумма пройдет, когда она «должна», «лучше, чем 1 в 65536».