Шрифт:
Прежде чем более подробно ознакомиться со взаимодействием различных модулей сетевой подсистемы BSD UNIX, рассмотрим сначала структуры данных, определяющие сокет, коммуникационный протокол и сетевой интерфейс.
Структуры данных
Структура данных
Рис. 6.21. Структуры данных сокета
Сокет является коммуникационным узлом и обеспечивает буферизацию получаемых и отправляемых данных. Как только данные попадают в распоряжение сокета в результате системного вызова (например, write(2) или send(2)), сокет немедленно передает их модулю протокола для последующего отправления. Данные передаются в виде связанного списка специальных буферов mbuf, структура которых также показана на рис. 6.21. Модуль протокола может ожидать подтверждения получения отправленных данных или отложить их отправку. В обоих случаях сообщения остаются в буфере передачи сокета до момента окончательной отправки или получения подтверждения. Аналогично, данные, полученные из сети, в конечном итоге буферизуются в приемной очереди сокета-адресата, пока не будут извлечены оттуда системным вызовом (например, read(2) или recv(2)).
Для избежания переполнения буфер (структура
Сокеты, используемые для приема и обработки запросов на установление связи (зарегистрированные с помощью системного вызова listen(2)), адресуют два связанных списка: список сокетов, связь для которых не полностью установлена, и список сокетов, обеспечивающих доступ к созданным каналам передачи данных.
Следующая структура данных, которую мы рассмотрим, относится к коммуникационным протоколам. Каждый модуль протокола представляет собой набор функций обработки и структур данных и описывается структурой данных, называемой коммутатором протокола. Коммутатор протокола хранит адреса стандартных функций протокола, например, функций ввода (
Рис. 6.22. Коммутатор протокола
Перед первым использованием модуля вызывается функция его инициализации
С помощью функции
Таблица 6.7. Запросы функции pr_usrreq
Системный вызов | Значение | Запрос |
---|---|---|
close(2) | Прекратить обмен данными | PRU_ABORT |
accept(2) | Обработать запрос на установление связи | PRU_ACCEPT |
bind(2) | Связать сокет с адресом | PRU_BIND |
connect(2) | Установить связь | PRU_CONNECT |
listen(2) | Разрешить обслуживание запросов | PRU_LISTEN |
send(2), sendto(2) | Отправить данные | PRU_SEND |
fstat(2) | Определить состояние сокета | PRU_SENSE |
getsockname(2) | Получить адрес локального сокета | PRU_SOCKADDR |
getpeername(2) | Получить адрес удаленного сокета | PRU_PEERADDR |
ioctl(2) | Передать команду модулю протокола | PRU_CONTROL |
Функции