Протокол пользовательских дейтаграмм (User Datagram Protocol - UDP) является простым, ненадежным протоколом дейтаграмм, предусматривающим лишь сквозную адресацию и необязательную контрольную сумму данных. В FreeBSD контрольные суммы включаются или отключаются для всей системы в целом и не могут включаться или отключаться для отдельных сокетов.
Заголовки протокола UDP чрезвычайно просты и содержат лишь номера исходного и конечного портов, размер дейтаграммы и контрольную сумму данных. Адреса хостов для дейтаграммы предоставляются псевдозаголовком IP.
Инициализация UDP
Когда в домене Интернета создается новый UDP сокет (socket) дейтаграмм, уровень сокетов находит элемент переключения протокола UDP и вызывает процедуру udp_attach() сокетом в качестве параметра. UDP использует in_pcballoc() для создания нового управляющего блока протокола в своем списке текущих сокетов. Он также устанавливает ограничения по умолчанию для исходящего и входящего буферов.
Хотя дейтаграммы никогда не помещаются в исходящий буфер, в качестве предела устанавливается верхний предел размера дейтаграммы; элемент переключения протокола UDP содержит флаг PRATOMIC, который требует, чтобы все данные при операции отправки представлялись протоколу одновременно.
Если прикладная программа хочет привязать номер порта - например, хорошо известный номер порта для какой-нибудь службы дейтаграмм, - она делает системный вызов bind. Этот запрос достигает UDP в виде вызова процедуры udpbind(). Привязка может также указать определенный адрес хоста, который должен быть адресом интерфейса на данном хосте.
В противном случае адрес будет оставлен неопределенным, отвечающим любому локальному адресу на входе и выбираемым в качестве подходящего для каждой операции вывода. Привязка осуществляется посредством in_pcbbind(), которая проверяет, что выбранный номер порта (или адрес и порт) не используется, а затем записывает локальный порт связи.
Для отправки дейтаграмм система должна знать удаленную часть связи. Программа может указывать этот адрес и порт при каждой операции отправки, используя sendto или sendmsg, или она может заранее определить их с помощью системного вызова connect. В любом случае протокол UDP использует функцию in_pcbconnect() для записи адреса и порта назначения. Если локальный адрес был не привязан и если найден маршрут до места назначения, в качестве локального адреса используется адрес исходящего интерфейса. Если локальный номер порта был не привязан, он выбирается в это время.
- 16/01/2010 11:25 - SYN. Состояния ТСР-соединения
- 16/01/2010 11:03 - Процедура пересылки IP-пакетов
- 16/01/2010 10:58 - Процедура ввода IPv4. Входная процедура.
- 16/01/2010 10:46 - Размер пакета IP. Выходная процедура IP.
- 15/01/2010 17:34 - Управляющие операции
- 14/01/2010 09:55 - Порты и связи Интернета
- 14/01/2010 09:39 - Многоадресная рассылка Интернета. Setsockopt
- 14/01/2010 09:29 - Широковещательные адреса
- 14/01/2010 09:11 - Адреса IPv4. Маска сети (подсети)