Например
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);