LINUX.ORG.RU
ФорумTalks

ACK номер ожидаемого ОКТЕТА к принятию, а не номер ПАКЕТА! Драма в стихах

 , , ,


0

3

ACK номер ожидаемого ОКТЕТА к принятию, а не номер ПАКЕТА! Драма в стихах

Дорогой LOR, я сидел ни кого не трогал читал книгу Network Programming with Go от Adam Woodbeck, раздел №2, а именно Socket Level Programming. Потом переводил параграф на русский язык, писал поэму на тему параграфа и отсылал своему другу с прозвищем «Маэстро Алгоритм» - получал в ответ порцию отборных матов и продолжал дальше.

И тут перечивая свою очередную поэму, и сверясь с книгой я обнаружил страшное. Автор гонит. Читаем:

Страинца 48, Acknowleging Receipt Packages by Using Their Sequnce Number.

For example, if a sender transmits
a bunch of packets with sequence numbers up through 100 but then receives
an ACK from the receiver with sequence number 90, the sender knows it
needs to retransmit packets from sequence numbers 91 to 100.
  1. Sequence Number - это номер следующий сущности готовой к принятию, если ACK Sequence Number = 90 - это значит 89 сущностей успешно принято, готовы принимать 90 сущность. ACK Sequence Number = (Success + 1) где Success это номер того, чего успешно приняли. Следовательно если из 100 отправленных, пришел ACK Seq Num = 90 то успешно пришло 89, и надо переотправлять с 90 по 100; - 11 пакетов.

  2. Cущность то не пакет, а БАЙТ. БАЙТ - 8 битов - ОКТЕТ.

Что делать, господа присяжные заседатели? Коммандовать парадом продолжаю я, но таких косяков я ожидал от лоровцев, но ни как от писателя букв на бумаге в книге.

Теперь ссылки найденные системой Grok.com:

https://datatracker.ietf.org/doc/html/rfc9293#section-3.4-1

 3.4. Sequence Numbers

A fundamental notion in the design is that every octet of data sent over a TCP connection has a sequence number.

Обратите внимание на изящество, байт звется ОКТЕТОМ, так как Байт он быавет разный.

https://datatracker.ietf.org/doc/html/rfc9293?referrer=grok.com#section-3.1-6.8.2

Acknowledgment Number:

    32 bits
If the ACK control bit is set, this field contains the value of the next sequence number the sender of the segment is expecting to receive. Once a connection is established, this is always sent.

Все равно я респектую Adam Woodbeck - книга хорошая. И заставляет задуматься, в принцпе для Go дела нет, все эти механизмы котроля передачи скрыты в реализации. И предоставляется просто интерфейс. Тем не мене ACK - это номер октета, а ни какого не пакета. И вообще TCP это «стриминговая» передча данных, реализуемая в модели не пакетов, а потока сохраняющего последовательнсть окетов.

P.S.

Внимательно вчитываясь в RFC9293, я пришел к выводу, что SNI и ACK похожи на указатели в Си. Или на шаклу линейки: первый сантиметр начинается с 0, а уже с 1 сантиметра начинается 2 сантиметр. Также SNI - указывает ту точку на которой остановились, если 0 - зачит будтем передавать 1 ОКТЕТ. Хотя я оконательно запутался, понятно, что это байты, и понятн что есть два поля в TCP Header которые указывают начиная с какого байта передаем, и какой байт уже приняли. А дальше надо детально разбираться. Сути это не меняет.

У каждго из узлов передачи есть свои числа, и говорить они могут одновремено. Дел полно двигаемся дальше. Adam Woodbeck - правильный пацан, кент в уважухе.

P.P.S.

Стараюсь разбираться: ISN - это то с чего начали (при утановленом SYN флаге, грубо говоря «от балды»). SEQ (Sequence Number) - это поле указывающие какой октет мы сейчас передаем. ACK (Aknowledge Number) - поле которое говорит какой ОКТЕТ мы готовы принять следующим.

  • SYN, ACK - флаги.
  • ISN - первое число, случайное.
  • Sequence Number, Aknowledgment Number - это 32 битные поля в TCP Header в IP пакете.

SEQ_num - Начало какой байт начали передовать. ACK_num - какйо байт ждем, ждем 10 байт (9 приняли), или ждем 20 (19 приняли).

P.P.P.S.

Важно добавить, SEQ_num и ACK_num указывают номера ОКТЕТОВ для TCP сегментов передаваемого и ожидаемого. SEQ_num - указывает байт с которого начинается TCP сегмент, а TCP сегмент икапсулирован в IP пакет.

И это механизмы для формирования непрерывного последовательного потока данных - дублирования потерянных сегментов.

P.P.P.P.S.

Протокол TCP предоставляет услуги поточной передачи данных, через объект Сокет. Последовательность данный при передачи реализована, через механизм сегментов которые содержат порядковые номера ОКТЕТОВ.

Существует два поля при помощи который получатель и отправитель регулируют последовательно отправки и получения сегментов, дублируя - если придется потерянные сегменты данных. Это 32битные поля SEQ_num и ACK_num. SEQ_num это информация от передающей стороны указывающая с какого порядкового номера ОКТЕТА (байта) начинается текущий сегмент. ACK_num это 32 битное поле которое заполняет принимающая сторона указывая какой следующий номер ОКТЕТА она готова принять: Если номер 100, значит 99 уже успешно принято.

Важно что сервер и клиент имеют два независимых друг от друга потока передачи данных и для каждого потока есть свои ACK_num, SEQ_num значения.

В чем я еще путаюсь так это в 0 байте-октете. Но это сути не меняет, а является низкоуровневой реализаций, 0-indexed или 1-indexed - не суть важно так как первое значение SEQ_num заполняется псевдослучайным образом и называется ISN: Initial Sequential Number вестимо.

TCP сегмент данный инкапсулирован в IP пакет и описывается так называемым TCP Header - который содержит флаги и вышеописанные поля SEQ_num и ACK_num - для реализации бесперебойного и последовательного потока данных.

P.P.P.P.P.S.

Дополнение: книга про TCP/IP которую я нашел по поиску картинок в Google. Подозрительно похожа на TCP/IP Illustrated от Kevin R. Fall, W. Richard Stevens - не факт, не проверял.



Последнее исправление: lbvf50txt (всего исправлений: 7)
Ответ на: комментарий от imul

кожаным тоже можно, все зависит от самой кожи и толщины бересты.

anc ★★★★★
()
Ответ на: комментарий от imul

Возможно будет сейчас сказ про бычка, и если тема надоела, то можно без подробностей. Если ты не программист системщик (но возможно именно системщик, не следил), а прикладник, то зачем настолько глубоко вникать в особенности реализации сетевых подсистем операционки? Для прикладников даже recv/send часто сликом низкоуровневые вызовы, если не на голом си пишешь. Уже понавернули кучу абстракций поверх.

Еще подумал над вашим вопросом. Он интересный.

Отвечу так. Чтоб рабочее место не висело в воздухе и не было окружено «магией», где из мрака выплывают какие-то сущности, которые что-то там, как-то делают. Проще: для психологического здоровья разработчика.

☕️ ☕️ ☕️ ☕️ ☕️ ☕️ ☕️ ☕️ ☕️
А вот и развернутый ответ на ваш вопрос, написан ярко, хлестко, агрессивно. Но не ваш адрес, а для передачи смысла. Поехали!
☕️ ☕️ ☕️ ☕️ ☕️ ☕️ ☕️ ☕️ ☕️

Системный программист, это тот, кто пишет систему. Т.е. реализует какие-то задачи на уровне Ярда.

Прикладник - это любой разработчик который пишет «приложение» - нечто работающие в ОС. И вот начиная с уровня «от Ядра» разницы между языком программирования уже нет. Это всего лишь детали. Си, PHP, Java, Go, Perl, Python - все решают одну и ту же задачу, на одних и тех же конструкциях: массивах, деревьях, графах. И все в итоге непосредственно общаются внутри ОС. Все пишут под ОС и передают данные через механизмы ОС: сокеты, файлы, потоки.

Базовая ошибка новичка: А какой язык мне выучить. Ему надо не язык учить, а устройство ОС, его программа с миром будет общаться через механизмы ОС.

Начертить какие-то уровни внутри Userspace сложно, все равно придется шастать туда сюда при создании хоть сколько-то сложных приложений. Как только заканчивается «формошлепство» границы стираются. Даже на самом примитивном CRUD который подключается к отдельному процессу DBMS.

Весь системный дизайн, монолиты, микросервисы, масшатбировние, контейнеры и прочие «сладкие слова» упираются в две дисциплины:

а) Алгоритмы и Структуры Данных
б) Введение в Операционные Системы (и Сети как не неотъемлемую их часть: OSI и Процесс, ведь сети это IPC)

Картины:

Есть понимание «а» и «б» - масштабируешь, нет - мычишь. Под ОС я подразумеваю Сети как неотъемлемую часть. В каждом проекте 100 новых слов, все изгаляются придумывают какие-то новые словосочетания и девочки их пересказывают. Есть понимание «а» и «б» - 15 минут и ты «на корабле». Нет… ну извиняй.

lbvf50txt
() автор топика
Ответ на: комментарий от lbvf50txt

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

imul ★★★★★
()
Последнее исправление: imul (всего исправлений: 1)
Ответ на: комментарий от imul

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

Дак он и не погружается, тут вот была сташная битва на LOR, когда я объяснял общую взгляд на сокет от «прикладника», а мне вертели у виска и объясняли - что есть такие специальные сокеты которыми можно формировать сообщения уровня L2 если дать права процессу согласно Capabilites (которую подключили к Linux в такой-то версии Ядра).

lbvf50txt
() автор топика
Ответ на: комментарий от imul

А б) это вопрос интерфейсов и библиотек, которые также могут быть абстракциями без привязки к платформе.

ОС это и есть «абстракция». Поток, сокет, процесс, тред, файл, файловый дескриптор, индексный дескриптор - они не особо от ОС зависят.

lbvf50txt
() автор топика
Ответ на: комментарий от lbvf50txt

Вопрос в полноте реализации этих абстракций. И в наличии библиотек с другими методами и абстракциями поверх системных.

imul ★★★★★
()
Ответ на: комментарий от imul

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

Мой разбор TCP в этом треде, на уровне 3-way HandShake, и базвого Sequence Number - это базовая база. Там глубже еще бездонные глубины алгоритмов по которым вычисляются правила отправки пакетов. Там в Ядре Матанный-Матан для вычисления коллизий и всего прочего, вот то чем занимаются реальные системщики, а не Си программисты утилит.

Второе, как показала практика, Архитектуру ОС лучше учить в UNIX-like OS. Потому что всё удобно, просто и рядом. Да, так именно CLI дает понимание всего на уровне практики. Лучший и яркий пример - Minix от Таненбаума.

lbvf50txt
() автор топика
Последнее исправление: lbvf50txt (всего исправлений: 2)
Ответ на: комментарий от lbvf50txt

Ничуть не возражаю. Знание - сила. В споре в теме про tcp/ip хватит всем это было видно. Но, возможно ты предлагаешь работать прикладнику не с потоком на L7, а реализовывать в программе системный стэк самостоятельно, забирая L2 фреймы?

imul ★★★★★
()
Ответ на: комментарий от imul

Но, возможно ты предлагаешь работать прикладнику не с потоком на L7, а реализовывать в программе системный стэк самостоятельно, забирая L2 фреймы?

Отнють. Такое предлагал мой оппонент. Со своей стороны, я объяснял выгоды использования уже готовых решений, и разделение приложения по уровням OSI, дабы сохранять кодовую базу «верхних уровней» при появлении новых протоколов.

Приводя в пример HTTP приложения на фреймворках которые не требуются переписывать, при изменении версии протокола. Потому-что за протокол отвечает HTTP сервер, и переход HTTP/1.1=>HTTP/2=>HTTP/3 будет происходить бесшевно.

P.S. Что не отменяет прикладной необходимости понимать, чем HTTP/1.1 отличается от HTTP/2, а HTTP/2 от HTTP/3. И какая часть приложения, за что отвечает. Даже банально какой HTTP сервер выбран, и как он настроен. А вот как раз разница между HTTP/2 и HTTP/3 упирается в L4. Вот мы и дошли до точки объяснения.

lbvf50txt
() автор топика
Последнее исправление: lbvf50txt (всего исправлений: 6)
Ответ на: комментарий от lbvf50txt

Ты же понимаешь, я был должен это спросить. Теперь могу ложиться спать спокойно.

imul ★★★★★
()
Ответ на: комментарий от lbvf50txt

Приводя в пример HTTP приложения на фреймворках которые не требуются переписывать, при изменении версии протокола. Потому-что за протокол отвечает HTTP сервер, и переход HTTP/1.1=>HTTP/2=>HTTP/3 будет происходить бесшевно.

Обратите внимание, вы привели 3 версии протокола, в то время как из модели tcp/ip «в прод» заехало только две. Ну и срок жизни у них не сопоставим со сроком жизни http как такового.

anc ★★★★★
()
Ответ на: комментарий от Zhbert

В магазине, наверное, не успеваешь ничего купить до закрытия?

Он там охране и ГБР за вин-чунь поясняет.

slackwarrior ★★★★★
()
Ответ на: комментарий от lbvf50txt

Моя модель взаимодействия с LOR

Дуинг ит вронг во все поля, иллюзии на самоподсосе.

Если лупить в бревно - то будет травма.

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

slackwarrior ★★★★★
()
Ответ на: комментарий от lbvf50txt

И это претензия не к вам, а просто наблюдение за тем с какой тщательностью читают тексты в форумах: ВСЕМ ПЛЕВАТЬ.

На простыни текста не по теме? Безусловно. Ну, еще обидный смех бывает, когда щоки смешно надувают в духе «крутого Коляна».

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 1)
Ответ на: комментарий от lbvf50txt

Как и предполагалось - сырые сокеты. Если человек не пишет очередной ping, traceroute, tcpdump, или wireshark, не ломает стандартный стек, или не хочет написать свой стек взамен системного, то оно как бы и не нужно никому. Хоть от рута, хоть с капами.

imul ★★★★★
()
Ответ на: комментарий от firkax

который написан на Си, если что

Ох уж эти сишники, которые считают, что если они в каждой функции будут высирать этажерки кода для разбора пакетов, то тогда будет точно надёжно. Вот только эти орлы (которые в соснах норки долбят) Наплодили тучу CVE с RCE тупо накосячив с этими самыми этажерками.

bdrbt
()
Ответ на: комментарий от lbvf50txt

Ты только начал читать про го, а уже выводов наделал.

PS я так понимаю пердак сгорел от банальной неточности автора книги, который вполне вероятно мог допустить ошибку/опечатку. Книга про го, а не описание тцп стека. И даже когда изучаешь яп, нужно читать сразу две книги от разных авторов. (Ну или последовательно, если так удобнее, но не менее двух источников должно быть, если реально хочешь изучить).

ergo ★★★
()
Ответ на: комментарий от bdrbt

Да, код там комментирован эталонно. Но лезть сразу в исходники, на мой взгляд, крайность. Лучше все таки с книжек начинать.

ergo ★★★
()
Ответ на: комментарий от bdrbt

Так на си тоже можно всё в либу спрятать и показать только вызов, а потом ыкать.

imul ★★★★★
()
Ответ на: комментарий от ergo

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

На LOR есть «национальный спорт» - называется долбиться в открытые двери. Вы явно подаете заявку на КМС. Учите пользователя детально цитирующего две разных книги с указанием глав и авторов, читать две разных книги.

Поздравляю.

lbvf50txt
() автор топика
Ответ на: комментарий от imul

На других языках будут такие же этажерки. Пакеты чудесным образом сами себя не разберут

https://rack.github.io/

Это точно. «Этажерка» это прямое название компонента в Ruby который раскалывает HTTP запрос под фреймворки.

lbvf50txt
() автор топика
Ответ на: комментарий от ergo

я так понимаю пердак сгорел от банальной неточности автора книги, ….

Ну что за бред вы пишите?

Моя цель не кого-то унизить, а разобраться. По этому в тексте 4 P.P.P.P.S.

Где детально, методично, не скрывая ошибок идет разбор клубка «TCP пакета». В начале я путаюсь с ISN, Флагами, Полями отсчитывающими Октеты.

А в конце уже уже изображение и описание инкапсулированого сегмета в дейтаграмму с схемой изображающий TCP headеr, с четким описанием где флаги, а где поля, правда, и расшифровка ISN. К слову, я до сих пор путаюсь как там октеты считаются, и что там 0, а что 1 октет.

Т.е. если отправителю пришел пакет с ACK_num равным 4 (ISN = 1), то значит крайний принятый октет имел номер 3. А вот теперь вопрос:

  • принятые октеты были 2,3.
  • принятые октеты были 1,2,3. Вот это правильно, поговорил с LLM. Если ACK_num==ISN это приглашение к принятию первого ОКТЕТА. Так ACK_num==ISN+количество_принятых_октетов.

Вот в этом я путаюсь. Но это не так важно.

lbvf50txt
() автор топика
Последнее исправление: lbvf50txt (всего исправлений: 4)

А где собственно у автора написано, что это порядковый номер ПАКЕТА?

Из той цитаты, что ты привел в корневом посте, это вообще не следует. Там лишь написано, что у пакета есть некий порядковый номер, который помогает отправилю решить, какие пакеты нужно передать. Он не пишет, что именно это за номер (номер байта, бита, пакета, или еще чего-то), потому что для данной книги это неважно.

bigbit ★★★★★
()
Ответ на: комментарий от bigbit

А где собственно у автора написано, что это порядковый номер ПАКЕТА?

Мы уже это обсуждали. Вы выходите на второй круг.

lbvf50txt
() автор топика
Ответ на: комментарий от lbvf50txt

Просто там ни к чему не пришли, а ведь это очень важный момент. Фраза «the sender knows it needs to retransmit packets from sequence numbers 91 to 100» не означает, что это номер пакета. Это просто означает, что в пакете есть некий sequence number, и все.

bigbit ★★★★★
()
Ответ на: комментарий от bigbit

@bigbit, важным момент разобраться как работает ACK_num вместе с ISN (Initial Sequence Number).

ACK_num (32bit поле в TCP Header) указывает ожидаемый порядковый номер ОКТЕТА к приёму, и значение ACK_num описывается формулой ACK_num = ISN + количество_успешно_принятых_октетов;

Значит если ACK_num = 90:

  • то если ISN < 90 то успешно принято по 89-тый октет включительно (количество 89-(ISN-1));
  • если ISN == 90 то принято 0 пакетов (количество 89-(ISN-1)=89-(90-1)=89-89=0);
  • а если ISN > 90 то PANIC;

Вот это важно. А кто там что как сформулировал обсасывать - не очень важно.

lbvf50txt
() автор топика
Последнее исправление: lbvf50txt (всего исправлений: 2)
Ответ на: комментарий от ergo

Да, код там комментирован эталонно. Но лезть сразу в исходники, на мой взгляд, крайность. Лучше все таки с книжек начинать.

Про книги я вас поддерживаю. Книги - важный инструмент обучения.

lbvf50txt
() автор топика
Ответ на: комментарий от ergo

Главное, вы мой союзник по книгам. Людей которые уважают книги - уважаю я. И полностью поддерживаю вашу рекомендацию читать книги нескольких авторов во время изучения предмета. Более того, не читать, а прорабатывать - пересказывать.

ACK номер ожидаемого ОКТЕТА к принятию, а не номер ПАКЕТА! Драма в стихах (комментарий)

Пересказ 5 раз подряд - техника японских студентов. Дает понимание текста и запоминание. Также диспуты и споры. По этому я на LOR.

А так, конечно, я запальный тип - гусар. Что поделать, такой темперамент.

lbvf50txt
() автор топика
Последнее исправление: lbvf50txt (всего исправлений: 3)

Сейчас я продолжаю разбираться с ISN и ACK. И 3-Way Hand Shake.

  • РАЗ: Клиент отправляет ISN в поле SEQ_num.
  • ДВА: Сервер отвечает ACK_num = ISN+1
  • ТРИ: Клиент шлет первый данные и подписыет их SEQ_num = ISN+1

Короче дело к ночи.

Если у нас ISN=1, и мы получили от сервера ACK_num=4 это значит что:

  • РАЗ: Клиент уведомил о ISN=1
  • ДВА: Клиент отправил 1 октет под номер 2=ISN+1=1+1=2
  • ТРИ: Клиент отправил 2 октет под номер 3=ISN+2=1+2=3

А сейчас сервер ждет Октет 3 (с инфомрацией) под номер 4 = (ISN + 2) + 1. Иди разберись? - надо ставить WireShark и решать вопрос на месте. Так скажешь - правильно, этак скажешь правильно. В общем ACK=ISN+1 начальное значение.

Кто знает пишите.

lbvf50txt
() автор топика
Последнее исправление: lbvf50txt (всего исправлений: 2)
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)