Механизъм на сокетите (sockets), позволява взаимодействие между процеси, изпълнявани на различни машини. Основното предназначение на сокетите е да предоставят удобен интерфейс за междупроцесна комуникация, като скрият от програмистите конкретните детайли на мрежовите протоколи. Използваната за целта трислойна управляваща структура в ядрото включва: ниво сокети, осигуряващо интерфейс между системните извиквания и долните нива;
протоколно ниво, съдържащо модули за реализация на комуникационните интернет протоколи (например TCP и IP). Програмният интерфейс на сокетите е дефиниран за използване с различни комуникационни протоколи, не само за TCP/IP;
ниво драйвери, съдържащо драйверите за управление на мрежовите физически устройства. Със сокет (socket) в UNIX се обозначава крайна комуникационна точка, достъпна през дескриптор. Посредством две сокета може да се установи комуникационен канал между процеси, евентуално изпълняващи се на различни машини. Процесите комуникират, използвайки модела клиент-сървър, като процесът-сървър чака заявка през сокета от своя край на двупосочния канал, а процесът-клиент комуникира с него през сокета от другия край.
С всеки сокет се свързва уникален за мрежата адрес, като същността на адреса зависи от комуникационната област (domain), за която е предназначен. Областта определя фамилията мрежови протоколи, които могат да бъдат използвани. Текущо във файла /sys/socket.h са дефинирани следните области:
- област UNUX (AF_UNIX) – вътрешни за UNIX протоколи;
- област Internet (AF_INET) – Internet протоколи;
- област XEROX (AF_NS) – протоколи на мрежовите системи XEROX;
- област ISO (AF_ISO) – ISO протоколи.
Процесите, комуникиращи в рамките на една и съща област, използват еднакъв формат за адрес на сокет. Форматът на адреса за областта UNIX съответства на формата на файлова спецификация в ОС UNIX. Например файловата спецификация /alpha/beta/gamma може да бъде адрес на сокет. В областта Internet се използва формат на Интернет адрес, състоящ се от 32-разреден номер на хост и 16-разреден номер на порт. Даден сокет може да се използва само в рамките на областта, за която е създаден.
Всеки сокет е от определен тип. Типовете са системно дефинирани и задават семантиката на комуникацията – организация на комуникационния канал и формат на предаваните данни.
Не всички типове сокети са допустими за всички комуникационни области. Ако даден тип е допустим за определена комуникационна област, той може да бъде реализиран с един или повече протокола на тази област, избрани от програмиста. Дефинирани са следните типове сокети:
потокови сокети (SOCK_STREAM). Потоковите сокети са ориентирани на установяване на двупосочна връзка между комуникиращите си процеси и осигуряват надеждно дуплексно предаване на подредени потоци данни без разграничаване на отделните записи в потоците. Не се допуска загуба и дублиране на данни. Този тип се реализира в областта Internet посредством протокола TCP;
пакетирани последователни сокети (SOCK_SEQPACKET). Типът подобно на потоковите сокети е ориентиран на установяване на двупосочна връзка и осигурява предаване на потоци от записи с фиксирана максимална дължина. Този тип се използва само в областта AF_NS;
дейтаграми (SOCK_DGRAM). Сокетите от този тип прехвърлят съобщения с променлива дължина, наречени дейтаграми. За тези сокети не се установява връзка и следователно не се гарантира получаването на съобщенията в същия ред, в който са изпратени. Не се гарантира също, че съобщенията изобщо ще бъдат получени или че няма да бъдат дублирани. Гарантира се само запазване на оригиналния размер на всяка дейтаграма. Дейтаграмите се поддържат от протокола UDP на областта Internet;
сокети с надеждна доставка на съобщенията (SOCK_RDM). Типът е подобен на дейтаграмните сокети, но гарантира доставката на съобщенията;
чисти сокети (SOCK_RAW). Тези сокети позволяват на процесите директен достъп до протоколите, поддържащи сокети от другите типове, като са достъпни и протоколите от по-ниските нива. Например в областта Internet е възможен достъп, както до протокола TCP, така и до протоколите от ниско ниво IP или Ethernet. Чистите сокети са удобно средство за разработка на нови протоколи.
Сокетите се вписват в основната идеология на UNIX, при която интерфейсът за работа с входно-изходните устройства е еднакъв с интерфейса към файловата система. Използват се едни и същи системни извиквания open(), read(), writ() и close() за работа с файлове и устройства, като ядрото на UNIX се грижи да разреши конкретните различия. Системното извикване open(dev_name, mode) връща манипулатор, наречен файлов дескриптор (descriptor), който се използва от следващите операции (системните извиквания read(), write() и close()) за идентифициране на устройството dev_name. Типът на достъпа до устройството (четене, запис) се задава чрез параметъра mode. По този начин операциите, които се изпълняват с устройствата са същите, както при обикновените файлове:
Механизмът на сокетите се базира на няколко системни извиквания, които за реализация на горните действия се използват в различно съчетание в зависимост от типа, комуникационната област и избрания протокол
- loc_addr – адрес на локалния хост, върху който е създаден сокета;
- loc_process – локален номер на порт;
- rem_addr – адрес на отдалечения хост, с който се осъществява комуникацията;
- rem_process – номер на порт на отдалечения сокет.
За да се използва сокет, той трябва първо да бъде създаден. За тази цел се използва системното извикване socket()
Аргументите на системното извикване socket() са следните:
- domain – задава комуникационната област и свързания с нея формат на адреса;
- type – тип на сокета;
- protocol – протокол, който ще се използва за поддържането на указания тип сокет. Протоколът се задава чрез своя номер, както е дефиниран във файла /etc/protocols.
След създаването си сокетът няма име (адрес) и следователно с него не може да се установи комуникационен канал. За присвояване на адрес на сокета се използва системното извикване bind():
Аргументите на системното извикване bind() са следните:
socketdesc – дескриптор на сокета;
localaddress – указател към структура от тип sockaddr, задаваща адреса (името) на сокета;
addresslength – дължина на структурата, указвана от localaddress, в брой байтове
Комуникационен канал с установяване на връзка се създава със системното извикване connect(): socketdesc – дескриптор на локалния сокет;
dest_address – указател към структура от тип sockaddr, задаваща адреса на отдалечения сокет;
addrlen – размер на адреса на отдалечения сокет в брой байтове.
За да може успешно да се създаде комуникационен канал, процесът от другата страна (например процесът-сървър) трябва да е подготвил своя сокет за установяване на връзка с помощта на системното извикване listen(). Връзката се счита за установена при успешно изпълнение на системното извикване accept():
Най-прост начин за прекъсване на връзката е затваряне на асоциирано с нея сокет посредством системното извикване close()