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);

★★★★★

Последнее исправление: cvs-255 (всего исправлений: 4)

это называется «гибкость». Сначала придумали одно, потом другое, потом обложили палками - получили 3е, потом обмазали г-ном — получили 4е. И все это обозвали громким словом — стандарт :)))

mrdeath ★★★★★
()

Дети интернета, дблин.

Почему…

Потому, что решалась строго противоположная задача: отразить на межмашинную связи семантику сокетов обмена потоками и сообщениями. Ну не было TCP/IP до 4.2BSD, да и тот не очень совместим с последующими версиями. Вот и придумали TCP для передачи SOCK_STREAM и UDP для SOCK_DGRAM в PF_INET. Ну и, понятно, SOCK_RAW для всяких извращений.

Потом уже пошли всякие PF_NETBIOS, PF_OSI, PF_DECnet, AF_CCITT, PF_APPLETALK, PF_IPX, PF_ISDN, PF_INET6…

Затем придумали транспортный SCTP хоть поверх IPv4, хоть IPv6, хоть обоих сразу. Это что — повод ломать работающий десятилетиями интерфейс сокетов Беркли?

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

начнет создавать SCTP сокет вместо TCP

Поэтому в ietf и придумывали RFC на этот случай: браузеру предписывается попытаться открыть оба соединения: SCTP и TCP в разных нитях, затем немного подождать. Работать с тем, от кого получен ACK. Если ответили оба — на выбор клиента.

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

не было TCP/IP

Сам по себе TCP/IP появился в 1972, а BSD4.2 в 1983. 11 лет спустя. Так что TCP/IP создавался не на основе BSD4.2

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

Сам по себе TCP/IP появился в 1972

Ну не сам по себе TCP/IP в привычном виде, а первые работы по нему. TCP/IP, если мне не отшибло память — это rfc760 и 761 принятые в 1980 году. Уже потом пошла замена NCP на TCP и прочее.

Но речь не об этом. Ты жалуешься на берклиевские сокеты, которые универсальны и не прибиты гвоздями к IPv4. Твоя главная ошибка — „нигде не написано, что это именно TCP“ и „для TCP не надо указывать явно протокол, а для SCTP надо“. В общем случае указывать нужно всегда, просто есть разумные значение «по умолчанию». Если ты пишешь socket(AF_INET, SOCK_STREAM, 0); то это всего лишь означает, что протокол система выберет сама, основываясь на запрошенном типе сокета. Если нужен именно TCP, вызывай

socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

Так что TCP/IP создавался не на основе BSD4.2

Я говорю о том, что не было сокетов с TCP/IP до релиза 4.2BSD. А потом интерфейс стал стандартным де факто во всех unix(-like). Тот же самый STREAMS (TLI) из SVR благополучно проиграл.

baka-kun ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.