Кіріспе
Процестер аралық байланыс 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-лерін қолданады.
Басты файлдар
Беркли сокет интерфейсі бірнеше бас файлдарда анықталған. Бұл файлдардың атаулары мен мазмұны түрлі іске асыруларда сәл өзгеше болуы мүмкін. Жалпы, олар мыналарды қамтиды:
File Descriptionsys/socket. h Core socket functions and data structures. netinet/in. h AF INET and AF INET6 address families and their corresponding protocol families, PF INET and PF INET6. These include standard IP addresses and TCP and UDP port numbers. sys/un. h PF UNIX and PF LOCAL address family. Used for local communication between programs running on the same computer. arpa/inet. h Functions for manipulating numeric IP addresses. netdb. h Functions for translating protocol names and host names into numeric addresses. Searches local data as well as name services.
Файл Сипаттама
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 Протокол атауларын және хост атауларын сандық адрестерге аударуға арналған функциялар. Жергілікті деректерді, сондай-ақ атау қызметтерін іздейді.
File Descriptionsys/socket. h Core socket functions and data structures. netinet/in. h AF INET and AF INET6 address families and their corresponding protocol families, PF INET and PF INET6. These include standard IP addresses and TCP and UDP port numbers. sys/un. h PF UNIX and PF LOCAL address family. Used for local communication between programs running on the same computer. arpa/inet. h Functions for manipulating numeric IP addresses. netdb. h Functions for translating protocol names and host names into numeric addresses. Searches local data as well as name services.
тыңдаңыз
Сокет адреске байланысқаннан кейін, тыңдау (listen) оны келіп түсетін қосылымдарға дайындайды. Алайда, бұл тек ағымдық (қосылымдық) дерек режимдері үшін, яғни сокет түрлері үшін (SOCK STREAM, SOCK SEQPACKET) ғана қажет. listen екі аргумент қабылдайды: sockfd, жарамды сокет дескрипторы; backlog, бір мезгілде кезекте сақталуы мүмкін күтіліп тұрған қосылымдар санын көрсететін бүтін сан. Операциялық жүйе әдетте осы мәнге шектеу қояды. Қосылым қабылданғаннан кейін, ол кезектен алынып тасталады. Сәтті орындалса 0 қайтарылады. Егер қате туындаса, 1 қайтарылады.
sockfd, a valid socket descriptor. backlog, an integer representing the number of pending connections that can be queued up at any one time. The operating system usually places a cap on this value. Once a connection is accepted, it is dequeued. On success, 0 is returned. If an error occurs, 1 is returned.
қабылдау
Басқа хосттардан ағымға бағытталған қосылымдарды тыңдап тұрғанда, осы оқиғалар туралы хабарлама жіберіледі (мысалы, select функциясы) және қосылымды қабылдау функциясы арқылы инициализациялау қажет. Ол әрбір қосылым үшін жаңа сокет құрайды және қосылымды тыңдау тізімінен алып тастайды. Функцияның келесі аргументтері бар: sockfd, қосылым тізімінде тұрған тыңдау сокетінің дескрипторы. cliaddr, клиенттің мекенжай ақпаратын алу үшін sockaddr құрылымына нұсқау. addrlen, socklen_t орнына нұсқау, ол қабылдауға берілген клиент мекенжайы құрылымының көлемін көрсетеді. accept қайтарғанда, бұл орналасқан жерде құрылымның көлемі (байттармен) болады. accept қабылданған қосылым үшін жаңа сокет дескрипторын немесе қате пайда болған жағдайда 1 мәнін қайтарады. Алдағы хостпен барлық байланыс осы жаңа сокет арқылы жүзеге асырылады. Датаграммалық сокеттерге қабылдау арқылы өңдеу қажет емес, себебі қабылдаушы тыңдау сокетін пайдаланып сұранысқа дереу жауап бере алады.
sockfd, the descriptor of the listening socket that has the connection queued. cliaddr, a pointer to a sockaddr structure to receive the client's address information. addrlen, a pointer to a socklen t location that specifies the size of the client address structure passed to accept When accept returns, this location contains the size (in bytes) of the structure. accept returns the new socket descriptor for the accepted connection, or the value 1 if an error occurs. All further communication with the remote host now occurs via this new socket. Datagram sockets do not require processing by accept since the receiver may immediately respond to the request using the listening socket.
қосылу
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-ті осы функциялардың іздеу үшін көптеген опцияларының біріне айналдырады және оның қолданылуын бүгін де тоқтатуға болады.
name specifies the name of the host. addr specifies a pointer to a struct in addr containing the address of the host. len specifies the length, in bytes, of addr. type specifies the address family type (e. g., AF INET) of the host address. The functions return a NULL pointer in case of error, in which case the external integer may be checked to see whether this is a temporary failure or an invalid or unknown host. Otherwise a valid struct hostent * is returned. These functions are not strictly a component of the BSD socket API, but are often used in conjunction with the API functions for looking up a host. These functions are now considered legacy interfaces for querying the domain name system. New functions that are completely protocol agnostic (supporting IPv6) have been defined. These new functions are getaddrinfo and getnameinfo , and are based on a new addrinfo data structure. This pair of functions appeared at the same time as the BSD socket API proper in 4.2BSD (1983), the same year DNS was first created. Early versions did not query DNS and only performed /etc/hosts lookup. The 4.3BSD (1984) version added DNS in a crude way. The current implementation using Name Service Switch derives Solaris and later NetBSD 1.4 (1999). Initially defined for NIS+, NSS makes DNS only one of the many options for lookup by these functions and its use can be disabled even today.
Шикі розеткалар
Шикі сокеттер хосттың 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 порттарынан толыққандай бөлек.