Автор хотел бы обратить внимание на вопиющие разброд и шатание в нашей индустрии, что отливается нашим кошелькам огромными расходами. Сегодня для соединения почти любых двух устройств применяется отдельный протокол, не совместимый с передачей между парой любых других устройств. Это приводит к необходимости перекодировки на каждом шагу. Разумеется, мы не хотим за это платить. Автор предлагает возможный выход из ситуации и хотел бы услышать мнения и комментарии общественности.
Способ, каким процессор общается с ОЗУ, несовместим с винчестером, а оба они, в свою очередь, неприменимы для обмена с платами интерфейсов или сопроцессорами - и это без какой-либо объективной надобности в таком расхождении1. Язык так называемых "внутренних устройств" не совпадает с языком так называемых "внешних"2. Мы на пороге одной из тайн, скрытых от общественного сознания - для чего предназначена материнская плата. Гражданин, который ответит, что делают процессор, ОЗУ и винчестер, начинает запинаться, когда его спрашивают, чем занимается чипсет. Здравый смысл не может подобрать никакой осмысленной роли, а предположить массовое помещательство конформизм не позволяет. В действительности материнская плата является драйвером, реализованным аппаратно, и по-существу совершенно бесполезным созданием3. Не какой-то конкретной длиной кабеля (сигнал издается в определенном диапазоне спектра, и разные участки этого диапазона (моды) движутся с разной скоростью по проводным линиям, вызывая уширение сигнала и наложение пакетов информации друг на друга), а совершенно искусственно было проведено деление устройств на "внешние" и "сетевые" - разумеется, с отдельным форматом сообщений для последних. Тут уже драйвер реализован программно4. Адреса компьютеров-пересыльщиков могут быть заданы в пересылаемом пакете или в самих пересыльщиках5. Протоколы могут ждать окончания выполнения команды или полагать, что устройство само отошлет ответ (или уведомление о его готовности)6. Существуют даже шифрование и нецензурируемые сети7.
Вся совокупность протоколов и практик их использования (вложений друг в друга) являет собой многомерное пространство со следующими осями и отсчетами по ним:
кодирование адреса - выбором провода (два устройства на проводе или на полосе частот, коллизий пакетов нет), числовым идентификатором в самом сообщении (много устройств на проводе, коллизии есть при работе без расписания и нет при работе по расписанию8), захватом провода (много устройств на проводе; получатель тот, который был отправителем в предыдущий раз, он должен ожидать на проводе; коллизий нет в течение периода удержания провода). Допустимая топология (звезда, ломаная линия) - как следствие;
фиксированный или произвольный размер упомянутого идентификатора (у всех, разработанных до сегодняшнего дня, фиксированный, откуда проистекает необходимость замены протоколов каждые несколько лет из-за увеличения вместимости накопителей, количества пользователей Интернета и т.д.);
фиксированное или произвольное количество идентификаторов для пунктов, через которые проходит траектория; пункты могли бы быть следующими (без всяких отличий между ними в пакете)9:
координаты аппаратуры компьютера-отправителя: идентификаторы процессоров-пересыльщиков; номер сетевого устройства, через который пакет уходит во внешний мир10;
интернет-адреса компьютеров-пересыльщиков;
координаты программных единиц компьютера-получателя: идентификатор пользователя, процесса (PID, номер порта) или базы данных, идентификатор сегмента данных процесса или таблицы базы данных, первичный ключ записи таблицы11;
координаты аппаратуры компьютера-получателя: идентификатор процессора; номер винчестера, флэшки или DVD/BluRay; номер сектора на них; номер платы ОЗУ; смещение на ней;
фиксированное или произвольное количество идентификаторов отправителя и пунктов траектории к нему (они могут использоваться как непосредственно адреса для ответного пакета, так и в качестве первичных ключей для поиска адресов по базе данных получателя);
указание конца пакета синхронным изменением на отдельном проводе, специально для этого выделенном и потому нерационально загруженном (сейчас дальние пересылки обходятся дороже, чем локальное увеличение количества транзисторов); специфической последовательностью, которая не может быть в самом пакете - такая последовательность означает нерациональное кодирование содержимого пакета (см. алгоритм шифрования Хаффмана); количеством байт всего пакета или только данных;
способ модуляции - синусоиды или тета-функции ("прямоугольники") в качестве базисных функций во всех существующих протоколах. В то время, как, например, представление разных букв "расческами" - последовательностями дельта-функций ("всплесков") с разными расстояниями между всплесками - позволяет работать при импульсных помехах и является естественным шифрованием, т.к. незнание конкретного набора "расчесок", которым кодируется сообщение, не позволяет расшифровать, а при наличии на проводе или в эфире многих передающих устройств - даже обнаружить сам факт передачи. Во всех случаях, за исключением передачи через компьютер-пересыльщик и необходимости избежать его цензуры, потребность в отдельном шифровании является следствием выбора неправильного базиса;
оговаривание параметров потока только в служебных пакетах (только в первых пакетах, если параметры не могут быть изменены до конца передачи) или дублирование их в каждом пакете с прикладными данными. К таковым параметрам относятся в т.ч. следующие:
запрос/согласие на передачу только в "окнах" (интервалах времени) по расписанию, само расписание, синхронизация часов. Необходимость указания приоритета в каждом пакете при отсутствии служебных пакетов - как следствие;
уведомления об отказе принимать, о номерах корректно полученных и сбойных пакетов; ширина окна (сколько пакетов может быть отправлено до получения первого подтверждения) - конкретное число или бесконечность, наличие/отсутствие буфера (очереди команд и результатов в NCQ-устройстве, склада пакетов в DTN-пересыльщике в ожидании видимости следующего пересыльщика);
договоренность о наборе "расчесок" или об алгоритме шифрования и его ключе (как обменяться такой информацией - см. первые стадии алгоритма шифрования с открытым ключом);
вещание на одного потребителя или на всех12.
Унификация приводит к следующим решениям.
Кодирование адреса - числовым идентификатором. Отправка пакета без расчленения на части "адрес-данные" означает пересылку и адреса, и данных между процессором и ОЗУ либо только по шине адреса, либо только по шине данных. Для современных многоядерных CPU, GPU, PPU, которым не хватает отдельных шин для каждой платы памяти, такое мультиплексирование является преимуществом13. В пакете допустимо любое количество адресов любого размера каждый. Адреса должны не содержать какие-то две последовательности бит14, чтобы использовать одну как разделитель между адресами, другую - как отделитель адресов от данных. Считая даже вместе с разделителями и отделителем, средняя длина адреса ячеек ОЗУ и секторов винчестера уменьшается (т.к. длина становится переменной) - это полезно для дальнейшего сокращения количества проводов в шинах. Все пересыльщики (аппаратура компьютера-отправителя, компьютеры-пересыльщики, программные единицы компьютера-получателя, аппаратура компьютера-получателя) пересылают пакет, выбрасывая первый адрес, т.к. он их собственный.
Предсказание конца пакета - числом произвольной длины "количество байт данных". Оно должно находится перед данными, поэтому расположим его перед адресами (отделив от них разделителем), чтобы, добавив еще данных, можно было заменить его большим, затерев ячейки памяти, ранее не принадлежавшие пакету. ОЗУ и кэш, будучи последними в траектории и получив пакет вида "длина данных-разделитель-единственный адрес-отделитель-данные", располагают данные, начиная со смещения, равного адресу15.
Если пакет предназначен для прохождения через Интернет, то за отделителем, но перед данными находятся еще два числа произвольного размера и одно число фиксированного размера (три числа отделяются двумя разделителями) - максимальное время жизни пакета, его порядковый номер, контрольная сумма адресов, времени жизни и порядкового номера. Порядковый номер идет после времени жизни, т.к. следующий пакет будет построен в ОЗУ путем затирания порядкового номера и данных предыдущего пакета; но порядковый номер находится перед данными, чтобы до их приема узнать, принималась уже копия пакета или нет (пакеты могут размножаться в Интернете). Упомянутая контрольная сумма вычисляется отдельно от контрольной суммы данных (последняя включена в сами данные), т.к. алгоритм последней может быть неизвестен никому, кроме отправителя и получателя. Сетевое устройство автоматически удаляет эти три дополнительных числа с двумя разделителями из пришедших пакетов, но информирует в целях учета базу данных ОС-получателя о порядковых номерах, адресах отправителей и получателей.
Обращение в каждую плату памяти большую часть времени происходит только одним ядром процессора (если компилятор разумен), поэтому указание приоритета в каждом пакете будет просто мусором на шине - для доступа к плате памяти несколькими ядрами достаточно контроллера с циклическим приоритетом. Аналогично указание параметров потока в каждом пакете, когда параметры одновременно немногочисленны и не менялись (например, указание того, что поток является TCP или UDP), есть глупость16. Пусть параметры потока оговариваются только в служебных пакетах, получателем которых является сама ОС (что указывается в последнем адресе, равном, например, нулю).
Итого получаем возможность сборки компьютера как детского конструктора и сквозной проход сообщений от регистров до космического Интернета. До настоящего времени открытая архитектура являлась мифом.
Отсюда такой "зоопарк" протоколов: HyperTransport, Infiniband, PCI Express, RapidIO, SDRAM, PATA, SATA
В первую очередь, SCSI и USB
Вот за что платит, например, потребитель IBM PC: перекодировкой между "внутренними устройствами" занят северный мост, между "внешними" - южный. Вместе мосты составляют чипсет материнской платы
Форматы для проводных сетевых устройств - Ethernet, Infiniband, IPv4/IPv6, TCP/UDP; для стационарных беспроводных - WiFi, Bluetooth, RFID; для подвижных беспроводных - GSM, Mobile IP
Первый случай - это алгоритмы IPv6, Дейкстры (OSPF), Freenet, Gnutella, Netsukuku; второй - таблица роутинга в маршрутизаторе. Конечно, пересыльщик может не подчиниться адресу в пакете и отправить на другой адрес, если линия с указанным следующим пересыльщиком оборвана
Ждущие протоколы - это HTTP, FTP, SMTP/POP3, BitTorrent, X11; полагающиеся - NCQ и DTN ("delay tolerant network", он же "disruption tolerant networking", он же "космический интернет")
Так называемый изохронный режим в протоколах FieldBus, ProfiNet, Sercos 3, PowerLink
Перенаправление пришедшего пакета во внешний мир или вглубь ОС зависит от настроек маршрутизатора - части ОС. Примечательно, что всего один дополнительный адрес в пакете ликвидирует врожденную болезнь IP - коллизии, вызванные кодированием одним идентификатором и потока, и порядкового номера пакета. В рамках моего предложения понятие потока исчезает, т.к. последовательно нумеруются пакеты для разных потребителей внутри одного компьютера-получателя, и таким образом компьютер-отправитель и компьютер-получатель не нуждаются в нескольких потоках
Достаточно воткнуть сетевые устройства, которые должны были бы быть расположены на одной шине, друг в друга по цепочке, выставлять порядковый номер устройства только на первом, и номер будет передан по цепочке с инкрементом (для уменьшения работы человека-сборщика компьютеров). В то же время удобнее передавать через все винчестеры в цепочке один и тот же номер устройства и суммарное количество секторов всех предыдущих винчестеров (кумулятивную сумму), а каждому винчестеру, до которого дошла очередь в цепочке, рассматривать полученное количество секторов как номер своего первого сектора (для облегчения программирования ОС ценой замены двух, в совокупности более коротких адресов "номер винчестера" и "номер сектора" на один более длинный "номер сектора"). Две цепочки устройств можно располагать на одной шине, если компилятор в курсе конвенции, с каких адресов начинается каждая из них; или если добавить в пакет спереди 2-й адрес, который устройства интерпретируют как код типа устройства, например, для сетевых плат и винчестеров он будет разный - правда, 2-й адрес будет лишним, если на одной шине устройства только одного типа. И, наконец, процессоры рассматривают максимальное из чисел, полученных по межпроцессорным линкам после "reset", как собственный номер, и передают по межпроцессорным линкам значение 'a*q + n', где 'a' - номер процессора (только что полученный), 'q' - количество линков у одного процессора, 'n' - порядковый номер линка. "Поверхности", образованные процессорами, соединяются в цилиндры, торы и т.д. операционной системой через указание специальному устройству, подключенному к "первым" и "последним" процессорам. Можно изготовить специальное устройство с шестеренками как у дипломата или камеры хранения, единственной задачей которого является передача после "reset" выставленного на нем номера следующему устройству в цепочке, а после этого самоустранение (если находишься в цилиндре или торе) и прямое соединение своего входа со своим выходом
Планы операционных систем могут быть самыми различными, например, sql50.euro.ru/sql5.19.2.pdf. Отсутствие протокола с излагаемыми свойствами не в последнюю очередь задерживает их развитие
Можно придумать ситуацию выборочного вещания (хотя автор никогда не встречал потребности в ней) с указанием для каждого адреса, кроме последнего, является ли данный пересыльщик также и потребителем пересылаемых данных
Лучше, если адресное пространство каждой следующей платы памяти продолжает таковое предыдущей; выбор шины, ведущей к нужной плате, осуществляет аппаратура процессора
Например, 9-й бит после каждого байта указывает, принадлежит ли следующий байт предыдущему или следующему числу (за 9-м битом нет 10-го); дополнительный 10-й бит после 9-го указывает, что здесь находится отделитель. Было бы ошибочным использовать Фибоначчиевую систему счисления (с весами битов [i-1]+[i-2]=[i], [1]=[2]) или подобную. В ней 1=000001, 2=000011=000100, 3=000101=000110=001000, 4=001001=001010, 5=001011=001100=010000, 6=010001=010010, 7=010011=010100, 8=010101=010110=011000=100000, т.е. без изменения величины числа комбинация 011 заменяется на 100 от младших разрядов к старшим, после чего 11 не встречается (и последовательности 0110 и 01110 могут использоваться как отделитель и разделитель). Для полноты картины: в обратном направлении от старших разрядов к младшим, также без изменения величины числа комбинация 100 может быть заменена на 011 - после чего не встречается 00. Видно, что Фибоначчиевая система счисления и ей подобные требуют в разы большего количества бит, чем двоичная; преобразователь Фибоначчиевой в двоичную и обратно уже сравним с АЛУ; а построение сумматоров и Фурье-преобразователей (а больше в процессоре ничего и нет) непосредственно на Фибоначчиевой удваивает сложность этих устройств.
Пакеты, которые мы описываем, формируются программно в ОЗУ или кэш, и, кроме них, стоило бы также ввести пакеты-машинные команды (далее просто команды), чтобы процессору не нужно было адрес устройства-получателя (например, сектора винчестера) отправлять сначала в устройство-отправитель (ОЗУ), чтобы то переслало его в устройство-получатель. Команды должны иметь формат, не позволяющий перепутать их с пакетами, например, "адрес-отделитель-трехбитный приказ[-целочисленный параметр-отделитель]". Команда с приказом 'L' (listen, без параметра и отделителя) заставляет устройство слушать шину и записывать все послания с шины в себя в участок, начинающийся с адреса, указанного в команде (послания не будут содержать адреса). Перед началом посланий можно издать команды с таким приказом нескольким устройствам, чтобы они принимали одновременно, и таким образом размножать данные. Команда с приказом 'N' (numbers) другому устройству заставляет его экстрагировать в шину числа, перемежающиеся в нем разделителем, в количестве, указанном в параметре команды, начиная в нем с адреса, также указанном в команде (команда с приказам 'B' (bytes) заставляет экстрагировать указанное количество байт). Началом послания является конец команд 'N' и 'В'. Все команды управляют также перенумерованными сумматорами и БПФ-преобразователями процессора, поэтому после хотя бы одного послания новая команда 'L' означает всем ранее слушавшим устройствам завершить прием, а данные в послании отправляются без их длины (чтобы не вычислять в сумматоре и ее), но послание автоматически завершается отделителем. Такая система команд позволяет оптимизировать не процессором, а компилятором. В команде с приказом 'O' (order) значащими являются только первые три бита параметра команды. Вместе с командами 'N2' и 'В2' она конструирует некую новую команду непосредственно на шине из ответов устройств. Это достигается последовательностью "команда 'N2' одному устройству - число и отделитель из устройства - команда 'O' с трехбитным приказом - команда 'N2' другому устройству - число и отделитель из другого устройства"
Кстати, Ethernet-адрес вообще не нужен - и раньше было достаточно одного IP-адреса