Файл: Протокол транспортного уровня для передачи информации.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 10.11.2023

Просмотров: 18

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

ПРОГРАММИРОВАНИЕ В INTERNET
TCP- И UDP-СЕРВЕР

TCP
(Transmission Control
Protocol)
протокол транспортного уровня для передачи информации.
=

Основные характеристики TCP

обмен осуществляется пакетами;

надежный
:
1)
установка соединения
;
2)
подтверждение получения пакета;
3)
правильный порядок отправки;
4)
подсчет контрольных сумм для проверки целостности пакетов;

низкая скорость передачи.

Установка и закрытие (полузакрытие) соединения
}
полузакрытие соединения
URG — срочные данные
ACK
— поле подтверждения
PSH — отправка/получение немедленно
RST — сброс подключения
SYN
— синхронизация порядкового номера
FIN
— больше нет данных от отправителя
По умолчанию сокет автоматически завершит доступную для записи сторону, когда закончится доступная для чтения сторона.

Пример установки соединения
(handshake)

Установка соединения и обмен данными

Структура пакета
net.Server класс, который используется для создания сервера TCP или
IPC. Наследует EventEmitter.
=

Способы создания экземпляров net.Server
1)
С помощью метода net.createServer
([options][, connectionListener]).
2)
Путем явного создания экземпляра класса new net.Server
([options][, connectionListener]).
Некоторые из опций, которые можно настроить:

allowHalfOpen
– если установлено значение false, то использование полузакрытых сокетов не будет разрешено. По умолчанию: false.

keepAlive
– eсли установлено значение true, активизируется функция поддержания активности на сокете сразу после получения нового входящего соединения. По умолчанию: false.

Класс net.Server (события)

close генерируется при закрытии сервера. Если соединения существуют, это событие не генерируется до тех пор, пока не будут завершены все соединения.

connection генерируется при установке нового соединения. В обработчик передается socket (экземпляром net.Socket).

error генерируется при возникновении ошибки. В отличие от net.Socket, событие close не будет сгенерировано непосредственно после этого события, если только server.close() не будет вызван вручную. С

listening генерируется после вызова server.listen().

Класс net.Server (методы)

server.address() возвращает адрес, имя семейства адресов и порт сервера.

server.close([callback]) запрещает серверу принимать новые соединения и сохраняет существующие соединения. Этот метод является асинхронным, сервер окончательно закрывается, когда все соединения завершены, и сервер генерирует событие close.

server.getConnections(callback) позволяет асинхронно получить количество одновременных подключений к серверу. Обратный вызов принимает два аргумента err и count.

server.listen([port[, host[, backlog]]][, callback]) или server.listen(options[, callback]) запускает сервер. Этот метод является асинхронным.

server.ref()/unref() отмечает события, генерируемые сервером, второстепенной задачей.

net.Socket класс, который является абстракцией
TCP-сокета или потоковой конечной точки IPC. Наследует EventEmitter, а также stream.Duplex.
=

Способы использования net.Socket
1)
Можно создать net.Socket и использовать его непосредственно для взаимодействия с сервером:

net.createConnection(options[, connectListener])
(или net.connect(port[, host][, connectListener])
, или socket.connect(port[, host][, connectListener]))
– фабричная функция, которая создает новый net.Socket, немедленно инициирует соединение с помощью socket.connect(), а затем возвращает net.Socket. Когда соединение установлено, в возвращаемом сокете будет сгенерировано событие connect. Последний параметр connectListener, если он указан, будет добавлен в качестве слушателя для события connect один раз.

new net.Socket([options])
– создает новый объект сокета. Вновь созданный сокет может быть либо TCP-сокетом, либо потоковой конечной точкой IPC, в зависимости от того, к чему он подключается.
2)
Он также может быть создан Node.js и передан при получении соединения. Например, он передается слушателям события connection, генерируемого net.Server, поэтому можно использовать его для взаимодействия с клиентом.

Класс net.Socket (события)

close генерируется после полного закрытия сокета.

connect генерируется при успешном установлении соединения через сокет.

data генерируется при получении данных. Данные аргумента будут буфером или строкой.

end генерируется, когда другой конец сокета сигнализирует об окончании передачи, тем самым заканчивая доступную для чтения сторону сокета, т.е. при полузакрытии. По умолчанию (опция allowHalfOpen = false) сокет отправит обратно пакет конца передачи и уничтожит свой файловый дескриптор.

Класс net.Socket (события)

error генерируется при возникновении ошибки. Сразу после генерируется событие close.

ready генерируется, когда сокет готов к использованию. Запускается сразу после connect.

timeout генерируется, если время ожидания сокета истекло из-за бездействия. Только уведомляет, что сокет был бездействующим.
Пользователь должен вручную закрыть соединение.

Класс net.Socket (свойства)

socket.bytesRead
– количество полученных байтов;

socket.bytesWritten
– количество отправленных байтов;

socket.connecting
– если true, то socket.connect() был вызван и еще не завершен.
Он будет оставаться истинным до тех пор, пока сокет не будет подключен, затем он будет установлен в значение false и будет сгенерировано событие connect;

socket.destroyed
– равняется true после вызова метода destroy();

socket.pending
– true, если сокет еще не подключен, либо connect() еще не был вызван, либо он все еще находится в процессе подключения;

socket.readyState
– представляет состояние соединения в виде строки (opening, open, readOnly, writeOnly).


Класс net.Socket (свойства)

socket.localAddress
– строковое представление локального IP-адреса, к которому подключается удаленный клиент;

socket.localPort
– числовое представление локального порта;

socket.localFamily
– строковое представление семейства локального IP-адреса;

socket.remoteAddress
– строковое представление удаленного IP-адреса;

socket.remotePort
– числовое представление удаленного порта;

socket.remoteFamily
– строковое представление семейства удаленного IP-адреса.

socket.timeout
– тайм-аут сокета в мс, установленный socket.setTimeout() (по умолчанию undefined).

Класс net.Socket (методы)

socket.address() возвращает связанный адрес, имя семейства адресов и порт сокета.

socket.connect(port[, host][, connectListener]) устанавливает соединение, а потом генерирует событие connect. Если возникает проблема с подключением, вместо события connect будет сгенерировано событие error. Последний параметр connectListener, если он указан, будет добавлен в качестве слушателя для события connect один раз. Этот метод является асинхронным.

socket.destroy([error]) гарантирует, что в этом сокете больше не будет операций ввода-вывода. Уничтожает поток и закрывает соединение.

socket.end([data[, encoding]][, callback]) полузакрывает сокет. т. е. отправляет пакет FIN.
Возможно, что сервер будет продолжать отправлять данные (если при его создании параметр allowHalfOpen установлен в true).

Класс net.Socket (методы)

socket.unref()
позволяет процессу завершиться, если это единственный активный сокет в системе событий. А метод socket.ref() не позволяет процессу завершиться, если это единственный оставшийся сокет.

socket.setEncoding([encoding]) устанавливает кодировку для сокета (для Readable Stream).

socket.setKeepAlive([enable][, initialDelay]) включает/отключает функции проверки активности и, при необходимости, устанавливает начальную задержку.

socket.setTimeout(timeout[, callback]) устанавливает для сокета тайм-аут (в мс) бездействия сокета. По умолчанию net.Socket не имеет тайм-аута (undefined).

socket.write(data[, encoding][, callback])
отправляет данные на сокет. Второй параметр указывает кодировку. Необязательный callback будет выполнен, когда данные будут окончательно записаны, что может произойти не сразу.

Простейший TCP-сервер

Простейший TCP-клиент

Результат работы

Отправка буфера (TCP-сервер)

Отправка буфера (TCP-клиент)

Результат работы

TCP-сервер (использование pipe)
net.Socket – это дуплексный поток


TCP-клиент (буфер)

TCP-клиент (использование pipe)

Сервер, прослушивающий два порта

TCP-клиент (номер порта берется из аргументов командной строки)

Результат работы

UDP
(User Datagram Protocol)
протокол транспортного уровня для передачи информации.
=

Основные характеристики UDP

обмен осуществляется дейтаграммами;

ненадежный
:
1)
не устанавливает соединение;
2)
упорядоченность не соблюдается;
3)
доставка не гарантируется;

более высокая скорость передачи.

Структура UDP-дейтаграммы
dgram.Socket инкапсулирует функциональность дейтаграммы
. Наследует EventEmitter.
=

Создать экземпляр dgram.Socket можно с помощью метода dgram.createSocket(type[, callback])
Ключевое слово new не должно использоваться для создания экземпляров dgram.Socket.
!

Класс dgram.Socket (события)

close генерируется после закрытия сокета с помощью функции close(). После срабатывания в этом сокете не будут создаваться новые события message.

connect генерируется после того, как сокет связан с удаленным адресом в результате успешного вызова connect().

error генерируется всякий раз, когда возникает какая-либо ошибка. В функцию обработчика событий передается один объект Error.

listening генерируется, когда dgram.Socket становится адресуемым и может получать данные. Это происходит либо явно с помощью socket.bind(), либо неявно при первой отправке данных с помощью socket.send().

message генерируется, когда в сокете доступна новая дейтаграмма. В функцию обработчика событий передаются два аргумента: msg (само сообщение) и rinfo
(информация об удаленном адресе, отправителе сообщения).

Класс dgram.Socket (методы)

socket.address()
возвращает объект, содержащий информацию об адресе сокета
(address, family и port).

socket.bind([port][, address][, callback])
или socket.bind(options[, callback]) прослушивает дейтаграммы на указанном порте и адресе. Если порт не указан, ОС попытается выполнить привязку к произвольному порту. Если адрес не указан, ОС попытается прослушивать все адреса. После завершения привязки генерируется событие listening и вызывается callback.

socket.close([callback]) закрывает сокет и перестает прослушивать данные на нем. Если предоставлен callback, то он добавляется в качестве слушателя для события close.

socket.connect(port[, address][, callback])
cвязывает сокет с удаленным адресом и портом.
Каждое сообщение автоматически отправляется этому адресату. Кроме того, сокет будет получать сообщения только от этого удаленного узла. Как только связь установлена, генерируется событие connect и вызывается callback.


Класс dgram.Socket (методы)

socket.disconnect() отвязывает подключенный сокет от его удаленного адреса. Этот метод является синхронным.

socket.unref() позволяет процессу завершиться, если это единственный активный сокет в системе событий. А метод socket.ref() не позволяет процессу завершиться, если это единственный оставшийся сокет.

socket.remoteAddress() возвращает объект, содержащий адрес, семейство и порт удаленной конечной точки.

socket.send(msg[, offset, length][, port][, address][, callback]) отправляет данные на сокет. Для несвязанных сокетов необходимо указать порт назначения и адрес, иначе будет использоваться связанная с сокетом удаленная конечная точка. Единственный способ узнать наверняка, что дейтаграмма была отправлена, — это использовать callback.

Простейший UDP-сервер

Простейший UDP-клиент

Критерии сравнения
TCP
UDP
Соединение
Требуется установленное соединение для передачи данных
Протокол без соединения
Гарантия доставки
Может гарантировать доставку данных получателю
Не гарантирует доставку данных получателю
Повторная передача данных
Повторная передача нескольких пакетов случае потери одного из них
Отсутствие повторной передачи потерянных пакетов
Проверка ошибок
Полная проверка ошибок
Базовый механизм проверки ошибок. Использует вышестоящие протоколы для проверки целостности
Упорядоченность
Гарантирует правильный порядок
Порядок не соблюдается
Скорость
Низкая
Высокая
Сферы применения
Используется для передачи сообщений электронной почты, HTML-страниц браузеров
Видеоконференции, потоковое вещание, DNS, VoIP, IPTV

TCP vs UDP