Кіріспе

Процестер аралық байланыс API

Беркли сокеттері – процестер аралық байланыс (IPC) үшін қолданылатын Интернет сокеттері мен Unix домен сокеттеріне арналған қолданбалы бағдарламалау интерфейсі (API). Ол көбінесе байланыстырылатын модульдердің кітапханасы түрінде жүзеге асырылады. Ол 1983 жылы жарық көрген 4.2BSD Unix операциялық жүйесінде пайда болды. Сокет – желілік байланыс жолының жергілікті түйінінің абстрактілі бейнесі (дескриптор). Беркли сокеттерінің API Unix философиясы бойынша оны файл дескрипторы (файл тұтқасы) ретінде көрсетеді, бұл деректер ағынына кіріс және шығыс үшін ортақ интерфейсті қамтамасыз етеді. Беркли сокеттері аз өзгерістермен де-факто стандарттан POSIX спецификациясының құрауына айналды. POSIX сокеттері термині, негізінен, Беркли сокеттерімен мағынасы бірдей, бірақ олар БСД сокеттері деп те белгілі, бұл Беркли бағдарламалық қамтамасының алғашқы іске асырылуын мойындау.

Тарих және жүзеге асыру

Беркли сокеттері 1983 жылы жарық көрген 4.2BSD Unix операциялық жүйесімен бағдарламалау интерфейсі ретінде пайда болды. Бірақ 1989 жылға дейін Калифорния университеті Беркли AT&T корпорациясының меншік құқығындағы Unix лицензиялық шектеулерінен босатылған операциялық жүйе мен желілік кітапхана нұсқаларын шығара алмады. Көптеген заманауи операциялық жүйелер Беркли сокет интерфейсінің бір түрін қолдайды. Ол Интернеттегі қолданбалар үшін стандартты интерфейске айналды. Тіпті MS Windows үшін тәуелсіз әзірлеушілер жасаған Winsock та стандартты қатаң сақтайды. BSD сокеттері API C бағдарламалау тілінде жазылған. Көптеген басқа бағдарламалау тілдері де C API негізіндегі орама кітапханасы түрінде ұқсас интерфейстерді ұсынады.

Баламалар

STREAMS негізіндегі Транспорттық қабат интерфейсі (TLI) API сокет API-ге балама болып табылады. TLI API-ді ұсынатын көптеген жүйелер Беркли сокет API-ін де ұсынады. Unix емес жүйелер жиі Беркли сокет API-ін туылған желілік API-ге аударма қабаты арқылы ұсынады. Plan 9 және Genode файл дескрипторларын емес, басқару файлдарын пайдаланатын файлдық жүйе API-лерін қолданады.

Басты файлдар

Беркли сокет интерфейсі бірнеше бас файлдарда анықталған. Бұл файлдардың атаулары мен мазмұны түрлі іске асыруларда сәл өзгеше болуы мүмкін. Жалпы, олар мыналарды қамтиды:

Файл Сипаттама
sys/socket.h Негізгі сокет функциялары мен дерек құрылымдары.
netinet/in.h AF_INET және AF_INET6 адрестік отбасылары және оларға сәйкес PF_INET және PF_INET6 протокол отбасылары. Бұларға стандартты IP-адрестер және TCP және UDP порт нөмірлері кіреді.
sys/un.h PF_UNIX және PF_LOCAL адрестік отбасы. Бір компьютерде іске қосылған бағдарламалар арасындағы жергілікті байланыс үшін қолданылады.
arpa/inet.h Сандық IP-адрестерді өңдеуге арналған функциялар.
netdb.h Протокол атауларын және хост атауларын сандық адрестерге аударуға арналған функциялар. Жергілікті деректерді, сондай-ақ атау қызметтерін іздейді.

тыңдаңыз

Сокет адреске байланысқаннан кейін, тыңдау (listen) оны келіп түсетін қосылымдарға дайындайды. Алайда, бұл тек ағымдық (қосылымдық) дерек режимдері үшін, яғни сокет түрлері үшін (SOCK STREAM, SOCK SEQPACKET) ғана қажет. listen екі аргумент қабылдайды: sockfd, жарамды сокет дескрипторы; backlog, бір мезгілде кезекте сақталуы мүмкін күтіліп тұрған қосылымдар санын көрсететін бүтін сан. Операциялық жүйе әдетте осы мәнге шектеу қояды. Қосылым қабылданғаннан кейін, ол кезектен алынып тасталады. Сәтті орындалса 0 қайтарылады. Егер қате туындаса, 1 қайтарылады.

қабылдау

Басқа хосттардан ағымға бағытталған қосылымдарды тыңдап тұрғанда, осы оқиғалар туралы хабарлама жіберіледі (мысалы, select функциясы) және қосылымды қабылдау функциясы арқылы инициализациялау қажет. Ол әрбір қосылым үшін жаңа сокет құрайды және қосылымды тыңдау тізімінен алып тастайды. Функцияның келесі аргументтері бар: sockfd, қосылым тізімінде тұрған тыңдау сокетінің дескрипторы. cliaddr, клиенттің мекенжай ақпаратын алу үшін sockaddr құрылымына нұсқау. addrlen, socklen_t орнына нұсқау, ол қабылдауға берілген клиент мекенжайы құрылымының көлемін көрсетеді. accept қайтарғанда, бұл орналасқан жерде құрылымның көлемі (байттармен) болады. accept қабылданған қосылым үшін жаңа сокет дескрипторын немесе қате пайда болған жағдайда 1 мәнін қайтарады. Алдағы хостпен барлық байланыс осы жаңа сокет арқылы жүзеге асырылады. Датаграммалық сокеттерге қабылдау арқылы өңдеу қажет емес, себебі қабылдаушы тыңдау сокетін пайдаланып сұранысқа дереу жауап бере алады.

қосылу

connect файл дескрипторымен анықталатын сокет арқылы, оның адресімен анықталатын нақты қашықтағы хостқа тікелей байланыс орнатады. Қосылымға бағытталған протокол қолданылғанда, бұл байланысты құрады. Кейбір протоколдар байланыссыз болып табылады, ең танымалсы – пайдаланушылық деректерді жіберу протоколы (User Datagram Protocol). Қосылымсыз протоколдармен қолданылғанда, connect деректерді жіберу және қабылдау үшін қашық адресті анықтайды, соның арқасында жіберу және қабылдау сияқты функцияларды пайдалануға болады. Мұндай жағдайларда, connect функциясы басқа көздерден келетін дерек пакеттерін қабылдауға мүмкіндік бермейді. connect қате кодын көрсететін бүтін санды қайтарады: 0 – сәтті орындалғанын, ал -1 – қате болғанын білдіреді. Тарихи тұрғыдан алғанда, BSD негізіндегі жүйелерде connect шақырылымы сәтсіз аяқталса, сокет дескрипторының күйі анықталмайды (Бұл Бірыңғай Unix спецификациясында көрсетілгендей), сондықтан портативті бағдарламалар сокет дескрипторын дереу жауып, сокет функциясын пайдаланып жаңа дескриптор алуы керек.

gethostbyname және gethostbyaddr

gethostbyname және gethostbyaddr функциялары домендік атаулар жүйесінде немесе жергілікті хосттың басқа да ажырату механизмдерінде хосттар мен мекенжайларды ажырату үшін қолданылады (мысалы, /etc/hosts іздеуі). Олар struct hostent типіндегі объектіге сілтеме қайтарады, ол Интернет протоколы хостын сипаттайды. Функциялар келесі аргументтерді қабылдайды: name хост атын көрсетеді. addr хост мекенжайын қамтитын addr құрылымына сілтемені көрсетеді. len addr ұзындығын байттармен көрсетеді. type хост мекенжайының адрестік отбасы типін (мысалы, AF_INET) көрсетеді. Функциялар қателік болған жағдайда NULL сілтемесін қайтарады, онда сыртқы бүтін сан уақытша қателік пе, жарамсыз немесе белгісіз хост екенін тексеруге болады. Әйтпесе, жарамды struct hostent * қайтарылады. Бұл функциялар BSD сокет API-нің тікелей құрамдас бөлігі емес, бірақ хостты іздеу үшін API функцияларымен бірге жиі қолданылады. Бұл функциялар қазір домендік атаулар жүйесін сұрау үшін қолданылатын ескі интерфейстер саналады. Протоколға тәуелсіз (IPv6 қолдайтын) жаңа функциялар анықталды. Бұл жаңа функциялар getaddrinfo және getnameinfo болып табылады және жаңа addrinfo дерек құрылымына негізделген. Бұл функция жұбы BSD сокет API-мен бірге 4.2BSD (1983) нұсқасында пайда болды, дәл сол жылы DNS алғаш құрылды. Алғашқы нұсқалары DNS-ті сұрамай, тек /etc/hosts іздеуін орындады. 4.3BSD (1984) нұсқасы DNS-ті қарапайым түрде қосты. Ағымдағы нұсқа Name Service Switch арқылы іске асырылады, бұл Solaris және одан кейінгі NetBSD 1.4 (1999) нұсқаларынан алынған. Бастапқыда NIS+ үшін анықталған NSS, DNS-ті осы функциялардың іздеу үшін көптеген опцияларының біріне айналдырады және оның қолданылуын бүгін де тоқтатуға болады.

Шикі розеткалар

Шикі сокеттер хосттың TCP/IP стегінің өңдеуін айналып өтетін қарапайым интерфейсті ұсынады. Олар пайдаланушы кеңістігінде желілік протоколдарды жүзеге асыруға және протокол стегін түзетуге көмектеседі. Шикі сокеттер кейбір қызметтер, мысалы ICMP сияқты, TCP/IP моделінің Интернет қабатында жұмыс істейтін қызметтермен қолданылады.

Блоктау және бұғаттамау режімі

Беркли сокеттері екі режимнің бірінде жұмыс істей алады: тоқтатушы немесе тоқтатушы емес. Тоқтатушы сокет операция үшін көрсетілген деректердің бір бөлігін немесе барлығын жібергенше (немесе алғанша) басқаруды қайтармайды. Тоқтатушы сокеттің барлық деректерді жібермеуі қалыпты жағдай. Бағдарлама қайтарылған мәнді қанша байт жіберілгенін немесе алынғанын анықтау үшін тексеруі керек және әлі өңделмеген деректерді қайта жіберуі керек. Тоқтатушы сокеттерді пайдаланғанда, қабылдауға ерекше назар аудару керек, себебі клиент қосылу кезеңінде үзілсе, оқуға дайын екенін көрсеткеннен кейін де тоқтауы мүмкін. Тоқтатушы емес сокет қабылдау буферіндегі барлық деректерді қайтарады және дереу жұмысын жалғастырады. Егер дұрыс жазылмаса, тоқтатушы емес сокеттерді пайдаланатын бағдарламалар желілік байланыс жылдамдығының өзгеруіне байланысты жарыс жағдайларына ұшырауы мүмкін. Сокет әдетте fcntl және ioctl функцияларын пайдаланып тоқтатушы немесе тоқтатушы емес режимге орнатылады.

Аяқтау сокеттері

Операциялық жүйе сокет жабылғанша сокетке бөлінген ресурстарды босатып жібермейді. Бұл әсіресе, егер қосылу әрекеті сәтсіз аяқталса және қайтадан талпыныс жасалса маңызды. Қолданба сокетті жапқанда, сокетке қатысты интерфейс ғана жойылады. Сокетті ішкі жағынан жою ядроның жауапкершілігінде. Кейде, сервер тарапында сокет 4 минутқа дейін белгілі бір күйде болуы мүмкін. SVR4 жүйелерінде деректер жоғалуы мүмкін. Осы жүйелерде барлық деректерді жеткізуге кепілдік беру үшін SO_LINGER параметрін пайдану қажет болуы мүмкін.

TCP-ді қолданатын клиент-сервер мысалы

Трансмиссияны басқару протоколы (TCP) – байт ағындарын беру үшін түрлі қателерді түзету және өнімділік мүмкіндіктерін қамтамасыз ететін, қосылысқа бағытталған протокол. Процесс, протокол отбасының параметрлері, ағынды сокеттер үшін сокет режимі және TCP үшін IP протоколы идентификаторы бар функцияны шақыру арқылы TCP сокетін жасайды.

UDP-ді қолданатын клиент-сервер мысалы

Пайдаланушы деректер протоколы (UDP) – жеткізілуіне кепілдік берілмейтін, қосылымды қажет етпейтін протокол. UDP пакеттері реті келмей, бірнеше рет немесе тіпті келмей де қалуы мүмкін. Осы қарапайым құрылысының арқасында UDP, TCP-ге қарағанда едәуір аз жүктеме шығынына ие. Қосылымды қажет етпеу, екі хост арасында ағын немесе тұрақты байланыс ұғымының болмауымен сипатталады. Мұндай деректер датаграммалар (датаграмма сокеттері) деп аталады. UDP адрестік кеңістігі, UDP порт нөмірлерінің кеңістігі (ISO терминологиясында TSAP), TCP порттарынан толыққандай бөлек.