LINUX.ORG.RU
ФорумTalks

Почему в linux, bsd и прочих unix у сокетов api не соответствует напрямую протоколам?

 ,


0

1

Например

sock = socket(AF_INET, SOCK_STREAM, 0);

Тут нигде не написано, что это именно TCP. Мы можем это понять, почитав документацию

Аналогично

sock = socket(AF_INET, SOCK_DGRAM, 0);

не говорит о том, что это надо использовать UDP.

А если я захочу использовать SCPT, то надо будет делать

socket (AF_INET, SOCK_STREAM, IPPROTO_SCTP);

Немного неочевидно, чем принципиально TCP отличается от SCTP, что для TCP не надо указывать явно протокол, а для SCTP надо.

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

Почему нельзя было сделать проще и именовать протоколы по именам, которые указаны в описывающих их RFC, а не выдумывать какие-то ненужные абстракции?

Вроде такого:

socket(AF_INET, SOCK_TCP);
socket(AF_INET, SOCK_UDP);
socket(AF_INET, SOCK_SCTP);
socket(AF_INET, SOCK_RAW);

★★★★★

Система сделана гибко. Если указан SOCK_STREAM без конкретного протокола, то весь мир сможет прозрачно перейти на какой-нибудь TCP2, а может и SCTP без изменения софта, если конечно новые протоколы не потребуют изменений в API.

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

И, конечно, все оборудование мира _одновременно_ будет обновлено. Потому что если обновление будет не одновременно, то один софт/железо считает, что STREAM это TCP, а другой будет считать, что STREAM это SCTP. И ничего не будет работать

cvs-255 ★★★★★ ()
Последнее исправление: cvs-255 (всего исправлений: 3)
Ответ на: комментарий от slovazap

Так же, есть системы, где явно указано использовать конкретный протокол, а про unix-овые STREAM, DGRAM эти системы вообще ничего не знают, т.к. не unix

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

IPv6, который ничего не ломает, и то внедрить не могут повсеместно. А ты предлагаешь массовое ЛОМАЮЩЕЕ изменение

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

Такое слово как fallback слышал? Dual stack IPv4/6 как пример.

slovazap ★★★★★ ()

По-моему, это исторически получилось.

В самых первых версиях Unix кстати сети вообще не было. Сокеты - это берклеевская реализация конца 70-х. Кстати, вроде ни TCP, ни UDP тогда еще тоже не было, были прототипы.

Почему нельзя было сделать проще и именовать протоколы по именам, которые указаны в описывающих их RFC

То есть по той же причине, что ширина двух лошадиных задниц времен Древнего Рима оказывается влияет на размеры шаттлов. (Хотя вроде реально это все же байка про шаттл).

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

IPv4 и IPv6 - два вообще разных протокола, которые друг с другом не пересекаются и не мешают друг другу.

А если у тебя браузер начнет слать запрос по SCTP, а сервер будет пытаться обрабатывать его как TCP, то все поломается

cvs-255 ★★★★★ ()
Ответ на: комментарий от slovazap

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

Стандартизация протоколов обеспечивает возможность общения любого с любым.

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

Ломать будет.

Если на системе, где

sock = socket(AF_INET, SOCK_STREAM, 0);

начнет создавать SCTP сокет вместо TCP, ты попытаешься обратиться к сайту, где по-прежнему ожидается TCP, у тебя ничего не будет работать

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

IPv4 и IPv6 - два вообще разных протокола, которые друг с другом не пересекаются и не мешают друг другу.

Да что ты? А когда ты резолвишь имя с A и AAAA и не знаешь по какому протоколу доступен сервер? Про ip6addrctl слышал?

Тут то же самое, ничто не мешает попробовать SCTP и фоллбэкнуться на TCP. А может в новом протоколе будут и дополнительные средства обеспечения обратной совместимости.

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

ничто не мешает попробовать SCTP и фоллбэкнуться на TCP

А что бы тогда не сделать вообще

sock = socket()

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

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

И? Они видят конкретные протоколы и обрабатывают их как им надо. Их никак не касается API которое внутри себя использует конкретный клиент и что оно там умеет в плане выбора протокола.

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

Клиент сказал «хочу SOCK_STREAM». И новомодная система сказала «ок, сделаю SCTP». Все, клиент не может соединиться

cvs-255 ★★★★★ ()
Ответ на: комментарий от slovazap

А когда ты резолвишь имя с A и AAAA

Ну вот ты сам и видишь же, что сделали 2 записи, A и AAAA, а не стали пихать ipv6 адреса в A запись, по принципу «ну потыкается лишний раз, сам пускай разбирается»

А при твоем варианте вообще по коду не будет понятно, какой же вообще протокол тут используется.

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

То есть ты осознал и понял мой аргумент, но по какой-то субъективной причине не хочешь с ним соглашаться и теперь сознательно пишешь абсурд?

slovazap ★★★★★ ()

protocol == 0 означает «ну выбери там что-нибудь подходящее под ситуацию, я сам не хочу думать».

i-rinat ★★★★★ ()
Ответ на: комментарий от slovazap

Если указан SOCK_STREAM без конкретного протокола, то весь мир сможет прозрачно перейти на какой-нибудь TCP2

Ну и бред...

i-rinat ★★★★★ ()
Ответ на: комментарий от cvs-255

Ну вот ты сам и видишь же, что сделали 2 записи, A и AAAA, а не стали пихать ipv6 адреса в A запись, по принципу «ну потыкается лишний раз, сам пускай разбирается»

Нет, не вижу. Связи между обозначением зон и API сокетов нет вообще никакой.

А при твоем варианте вообще по коду не будет понятно, какой же вообще протокол тут используется.

Я тебе открою тайну, именно из-за того что у хоста могут быть и A и AAAA записи, в dualstack совместимом коде как раз таки и не будет понятно какой протокол используется. Потому что будут перебираться все адреса, а соответственно и версии IP. Открою секрет, такой же механизм используется в куче других мест, типа QUIC, HTTP 2 и TLS. Только они выходят за рамки API сокетов. А по сути это как раз твой socket(), где автоматом выбираются протоколы и 3, и 6, и 7 уровней. И тут тебя смущает что 4-й почему-то выбираться не может.

slovazap ★★★★★ ()
Ответ на: комментарий от i-rinat

О, вот и сферическое отсутствие аргументов со своим мнением пришло. Что ты считаешь бредом? Появление нового протокола? Название TCP2? Переход на него всего мира? Может ты в такой глуши живёшь что примеров этого которые по несколько раз в год случаются не видел?

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

Я тебе показываю бредовость твоего предложения

cvs-255 ★★★★★ ()
Ответ на: комментарий от slovazap

Нет, связь прямая. В aaaa записи хранятся ipv6 адеса, и пробовать создавать по ним ipv4 сокет нет смысла. И наоборот.

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

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

slovazap ★★★★★ ()
Ответ на: комментарий от cvs-255

Это частная особенность протокола DNS, в котором о гибкости не подумали, и таки не имеет отношения к API сокетов. Доказывается это очень просто - адрес может резолвиться не только из DNS, а, например, из hosts, где между 4 и 6 адресами никакой разницы нет. И всё работает абсолютно также.

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

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

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

Это не для меня, это объективная реальность. Ты спросил зачем так сделано - я рассказал и показал кучу примеров из смежных областей. Если это не может уложиться в твоей голове, плохие новости у меня для тебя.

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

И в любом случае, отличить ipv4 от ipv6 можно по написанию. Поэтому даже если встретился ipv6 адрес, никто не будет создавать ipv4 сокет с ним

cvs-255 ★★★★★ ()
Ответ на: комментарий от slovazap

Никогда не сделают для

sock = socket(AF_INET, SOCK_STREAM, 0);

SCTP. Как не станут и делать вариант с 'потыкался в варианты'. А значит и смысла нет в том, что ты написал.

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

Это ничего не меняет. Может появится несовместимый L3 протокол с таким же форматом адреса, а может появится L4 протокол который можно будет отличить по каким-то признакам.

slovazap ★★★★★ ()
Ответ на: комментарий от cvs-255

Никогда не сделают

Извини, на такие заявления ты не тянешь.

Как не станут и делать вариант с 'потыкался в варианты'. А значит и смысла нет в том, что ты написал.

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

slovazap ★★★★★ ()

Так сложилось. А ещё есть AF_UNIX + SOCK_STREAM/SOCK_DGRAM, где протоколами не пахнет.

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

И для него сделают отдельно, а не станут пихать к имеющимся

cvs-255 ★★★★★ ()
Ответ на: комментарий от slovazap

Ну ты свои объективные факты похоже у себя в воображении держишь

cvs-255 ★★★★★ ()
Ответ на: комментарий от slovazap

man sctp

Ты тоже не знаешь, зачем?

Ну просто типа

One can characterize SCTP as message-oriented, meaning it transports a sequence of messages (each being a group of bytes), rather than transporting an unbroken stream of bytes as does TCP.

и зачем тут тогда STREAM?

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

Ты тоже не знаешь, зачем?

Вы настолько не умеете пользоваться man? man sctp, нажимаете /, вводите SOCK_STREAM, читаете.

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

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

i-rinat ★★★★★ ()
Ответ на: комментарий от slovazap

man sctp, нажимаете /, вводите SOCK_STREAM, читаете

Сам-то пробовал? Там этого нет. Объяснения — в socket(2).

i-rinat ★★★★★ ()
Ответ на: комментарий от slovazap

То есть своими словами не можешь? Значит тоже не понимаешь.

kirk_johnson ★☆ ()
Ответ на: комментарий от i-rinat

А есть реальный use-case? Я просто даже с unix-domain особого смысла не вижу. В случае с SCTP разве что sendfile, наверное.

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

А кто ты нафиг такой чтобы тебе man пересказывать?

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

unix domain datagrams, в отличие от UDP, гарантировано доставляются, и, кажется, даже гарантируется порядок

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

unix domain datagrams, в отличие от UDP, гарантировано доставляются, и, кажется, даже гарантируется порядок

Я о другом. STREAM от DGRAM/SEQPACKET отличается тем, что у него нет границ сообщений. Единственный USE-case, который я себе смог придумать, это замена для TCP в тех случаях, когда альтернативой было гонять данные через localhost, как выше заметили. Во всех остальных случаях проще гонять данные сообщениями, а если нужно файл постримать, то проще fd передать.

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