Что такое socket tcp ip
Сокеты¶
Сокеты (англ. socket — разъём) — название программного интерфейса для обеспечения обмена данными между процессами. Процессы при таком обмене могут исполняться как на одной ЭВМ, так и на различных ЭВМ, связанных между собой сетью. Сокет — абстрактный объект, представляющий конечную точку соединения.
Принципы сокетов¶
Каждый процесс может создать слушающий сокет (серверный сокет) и привязать его к какому-нибудь порту операционной системы (в UNIX непривилегированные процессы не могут использовать порты меньше 1024). Слушающий процесс обычно находится в цикле ожидания, то есть просыпается при появлении нового соединения. При этом сохраняется возможность проверить наличие соединений на данный момент, установить тайм-аут для операции и т.д.
Каждый сокет имеет свой адрес. ОС семейства UNIX могут поддерживать много типов адресов, но обязательными являются INET-адрес и UNIX-адрес. Если привязать сокет к UNIX-адресу, то будет создан специальный файл (файл сокета) по заданному пути, через который смогут сообщаться любые локальные процессы путём чтения/записи из него (см. Доменный сокет Unix). Сокеты типа INET доступны из сети и требуют выделения номера порта.
Обычно клиент явно подсоединяется к слушателю, после чего любое чтение или запись через его файловый дескриптор будут передавать данные между ним и сервером.
Основные функции¶
Общие | |
Socket | Создать новый сокет и вернуть файловый дескриптор |
Send | Отправить данные по сети |
Receive | Получить данные из сети |
Close | Закрыть соединение |
Серверные | |
Bind | Связать сокет с IP-адресом и портом |
Listen | Объявить о желании принимать соединения. Слушает порт и ждет когда будет установлено соединение |
Accept | Принять запрос на установку соединения |
Клиентские | |
Connect | Установить соединение |
socket()¶
Создаёт конечную точку соединения и возвращает файловый дескриптор. Принимает три аргумента:
domain указывающий семейство протоколов создаваемого сокета
type
protocol
Протоколы обозначаются символьными константами с префиксом IPPROTO_* (например, IPPROTO_TCP или IPPROTO_UDP). Допускается значение protocol=0 (протокол не указан), в этом случае используется значение по умолчанию для данного вида соединений.
Функция возвращает −1 в случае ошибки. Иначе, она возвращает целое число, представляющее присвоенный дескриптор.
Связывает сокет с конкретным адресом. Когда сокет создается при помощи socket(), он ассоциируется с некоторым семейством адресов, но не с конкретным адресом. До того как сокет сможет принять входящие соединения, он должен быть связан с адресом. bind() принимает три аргумента:
Возвращает 0 при успехе и −1 при возникновении ошибки.
Автоматическое получение имени хоста.
listen()¶
Подготавливает привязываемый сокет к принятию входящих соединений. Данная функция применима только к типам сокетов SOCK_STREAM и SOCK_SEQPACKET. Принимает два аргумента:
После принятия соединения оно выводится из очереди. В случае успеха возвращается 0, в случае возникновения ошибки возвращается −1.
accept()¶
Используется для принятия запроса на установление соединения от удаленного хоста. Принимает следующие аргументы:
Функция возвращает дескриптор сокета, связанный с принятым соединением, или −1 в случае возникновения ошибки.
connect()¶
Устанавливает соединение с сервером.
Некоторые типы сокетов работают без установления соединения, это в основном касается UDP-сокетов. Для них соединение приобретает особое значение: цель по умолчанию для посылки и получения данных присваивается переданному адресу, позволяя использовать такие функции как send() и recv() на сокетах без установления соединения.
Загруженный сервер может отвергнуть попытку соединения, поэтому в некоторых видах программ необходимо предусмотреть повторные попытки соединения.
Возвращает целое число, представляющее код ошибки: 0 означает успешное выполнение, а −1 свидетельствует об ошибке.
Передача данных¶
Для передачи данных можно пользоваться стандартными функциями чтения/записи файлов read и write, но есть специальные функции для передачи данных через сокеты:
Нужно обратить внимание, что при использовании протокола TCP (сокеты типа SOCK_STREAM) есть вероятность получить меньше данных, чем было передано, так как ещё не все данные были переданы, поэтому нужно либо дождаться, когда функция recv возвратит 0 байт, либо выставить флаг MSG_WAITALL для функции recv, что заставит её дождаться окончания передачи. Для остальных типов сокетов флаг MSG_WAITALL ничего не меняет (например, в UDP весь пакет = целое сообщение).
Русские Блоги
Подробное описание сокета (TCP и UDP)
Изучая LInux, сетевое программирование сокетов является основой, и новичкам их также сложно изучить. Благодаря этой статье читатели могут полностью понять IP-адрес, номер порта, TCP, концепцию UDP, использование API сокета, моделирование с помощью диаграмм и идей реализации авторского кода. Связь клиент / сервер и т. Д.
В центре внимания статьи:
Внедрить клиент / сервер UDP
Как упоминалось ранее, существует множество способов локального межпроцессного взаимодействия (IPC). Наиболее распространенные из них можно описать следующим образом:
Понять процесс связи на сетевом уровне:
Сначала узнайте IP:
(IP: IP-адрес интернет-протокола)
При общении IP делится на исходный IP и целевой IP,
Номер порта:
Номер порта используется для идентификации процесса и сообщения операционной системе, в какую программу передаются текущие данные для анализа;
IP-адрес + номер порта могут идентифицировать определенный процесс определенного хоста в сети;
Номер порта может быть занят только одним процессом.
Номер порта и процесс:
Процесс имеет уникальный идентификатор pid, и номер порта также может идентифицировать процесс;
Процесс может быть привязан к нескольким номерам портов, а номер порта не может быть привязан к нескольким процессам.
В сегменте данных протокола транспортного уровня (TCP / IP) есть два номера порта, которые называются, соответственно, номером порта источника и номером порта назначения, которые описывают «Чьи данные от? Кому?»
(TCP) Протокол управления передачей, ориентированный на соединение. Это универсальный протокол, обеспечивающий надежную передачу данных.
Протокол транспортного уровня
Ориентирован на байтовый поток
Протокол транспортного уровня
Ориентированный на дейтаграммы
Сетевой порядок байтов:
Фактически, легко понять эту проблему, которая является более сложной большой и маленькой проблемой в языке C.
Передатчик отправляет адрес памяти в порядке от младшего к большему;
Принимающий хост сохраняет адрес памяти от младшего к старшему;
TCP / IP предусматривает: сетевой поток данных должен принимать порядок байтов с прямым порядком байтов, а именно:Старший байт наземного адреса;
Независимо от того, является ли хост прямым или прямым порядком байтов, он должен соответствовать правилам TCP / IP;
Если передатчик является прямым порядком байтов, сначала преобразуйте данные в прямой порядок байтов перед отправкой.
socket API:
Параметр 1 (домен):Выберите семейство протоколов, используемое созданным сокетом;
AF_INET: протокол IPv4;
AF_INET6: протокол IPv6;
AF_LOCAL: протокол домена Unix;
AF_ROUTE: сокет маршрутизации;
AF_KEY: гнездо для ключа.
Параметр 2 (тип):Укажите тип розетки, выбранные типы:
SOCK_STREAM: сокет байтового потока;
SOCK_DGRAM: сокет датаграммы;
SOCK_RAW: исходный сокет.
procotol: конкретный используемый протокол, обычно используется протокол по умолчанию (NULL).
Параметр 1 (sockfd):Дескриптор сокета (номер сокета), возвращенный вызовом socket () и не связанный.
Параметр 2 (отставание):Размер отслеживаемой очереди портов.
Параметры (fd):Дескриптор сокета (номер сокета), возвращенный вызовом socket () и не связанный.
Простая сетевая программа TCP:
Простая сетевая программа UDP:
Параметр 1 (sockfd):Дескриптор сокета (номер сокета), возвращенный вызовом socket () и не подключенный
Параметр 2 (buf):Указатель на буфер, в котором хранятся отправленные данные
Параметр 3 (len):Длина буфера.
** Параметр 4 (флаги): ** Значение флагов равно 0 или другому.
Параметр 1 (sockfd):Дескриптор сокета (номер сокета), возвращенный вызовом socket () и не подключенный
Параметр 2 (buf):Указатель на буфер, в котором хранятся полученные данные
Параметр 3 (len):Длина буфера
** Параметр 4 (флаги): ** Значение флагов равно 0 или другому.
Русские Блоги
Протокол TCP / IP и основы сетевого программирования
Существует множество способов локального межпроцессного взаимодействия (IPC), которые можно разделить на следующие четыре категории:
1、TCP/IP
2. Что такое розетка
Поскольку сокет предоставляет интерфейс для набора протоколов TCP / IP,Следовательно, приложения, использующие протокол TCP / IP, обычно используют интерфейс сокета (сокета) UNIX BSD для реализации связи между сетевыми процессами, то есть: процессы в сети обмениваются данными через сокеты.. На данный момент почти все приложения используют сокеты, и сейчас наступил век сети, взаимодействие процессов в сети стало повсеместным, это то, что мы называем «все сокеты».
Теперь, когда известно, что процессы в сети взаимодействуют через сокеты, что такое сокет?
Объяснение сокета: интерфейс сокета составляет один конец соединения, и соединение может быть полностью определено парой интерфейсов сокета.
2.1, представляет процесс в сети
PID процесса можно использовать для однозначной идентификации процесса локально, но это невозможно в сети. Фактически, семейство протоколов TCP / IP помогло нам решить эту проблему. «IP-адрес» сетевого уровня может однозначно идентифицировать хост в сети, а «протокол + порт» транспортного уровня может однозначно идентифицировать приложение. (процесс) в хосте. Таким образом, тройки (IP-адрес, протокол, порт) могут использоваться для идентификации процесса компьютера в сети, а при взаимодействии процессов в сети этот символ может использоваться для завершения взаимодействия между процессами.
2.2, полная связь через сокет
Сцена из жизни. Если вы хотите позвонить другу, сначала наберите номер и подождите, пока друг ответит на него. В то же время, когда друг услышит мелодию звонка и ответит на звонок, когда он свободен, вы и ваш друг установите соединение и вы можете поговорить друг с другом. По окончании обмена положите трубку, чтобы завершить разговор.
Начнем с серверной части. Сервер сначала инициализирует Socket, затем связывается с портом, прослушивает порт, вызывает accept для блокировки и ждет подключения клиента. В это время, если клиент инициализирует Socket, а затем подключается к серверу (соединение), если соединение успешно, то устанавливается соединение между клиентом и сервером. Клиент отправляет запрос данных, сервер получает запрос и обрабатывает запрос, затем отправляет данные ответа клиенту, клиент считывает данные и, наконец, закрывает соединение, и взаимодействие заканчивается.
2.3, TCP, UDP (с установлением соединения и без установления соединения)
И TCP, и UDP построены поверх IP. Следовательно, IP является основой для построения всего набора протоколов TCP / IP. Но IP обеспечивает надежную и надежную услугу без установления соединения. Он принимает пакеты со своего верхнего уровня, инкапсулирует их в IP-пакет, выбирает правильный аппаратный интерфейс для пакета в соответствии с маршрутом и отправляет пакет из этого интерфейса. Как только пакет отправлен, IP больше не заботится о пакете. Как и все протоколы без установления соединения, он больше не запоминает пакет после его отправки.
Эта простота также является основным преимуществом IP. Поскольку он не делает никаких предположений о базовом физическом носителе, он может запускать IP на любом физическом канале, который может переносить пакеты. Например, IP может работать на простых последовательных каналах, Ethernet и Token Ring LAN, X.25, WAN с использованием ATM (асинхронный режим передачи, асинхронный режим передачи), CDPD (сотовые цифровые пакетные данные, беспроводные сотовые цифровые пакетные данные) сети и многие другие сети. Хотя между этими сетевыми технологиями есть большие различия, IP обращается с ними одинаково и не делает никаких предположений о них, кроме того, что они могут пересылать пакеты. Этот механизм подразумевает глубокий смысл. IP может работать в любой сети, которая может передавать пакеты, так же как и весь набор протоколов TCP / IP.
Расширение TCP через IP
Теперь давайте посмотрим, как TCP использует этот простой сервис без установления соединения для предоставления надежных сервисов с установлением соединения.Пакеты TCP называются сегментами и отправляются в дейтаграммах IP, поэтому невозможно предположить, что эти пакеты прибудут к месту назначения, не говоря уже о том, чтобы гарантировать, что пакеты прибудут в исходном порядке без повреждений.
Чтобы обеспечить такую надежность, TCP добавляет к основным IP-сервисам три функции:
Расширение UDP через IP
С другой стороны, UDP предоставляет ненадежную службу без установления соединения для программистов, пишущих приложения. Фактически, UDP добавляет только две функции к базовому IP-протоколу.
Аналогия TCP и UDP
Для TCP и UCP стандартная аналогия: использование протокола без установления соединения похоже на отправку письма, а использование протокола, ориентированного на установление соединения, похоже на телефонный звонок.
А теперь давайте посмотрим, что происходит, когда мы звоним другу, а не отправляем письмо.
подводить итоги
Сетевой адрес в TCP-соединении можно рассматривать как телефонный номер офисного коммутатора, а номер порта можно рассматривать как добавочный номер конкретного телефона, вызываемого в офисе. Таким же образом сетевой адрес UDP можно рассматривать как адрес многоквартирного дома, а номер порта можно рассматривать как личный почтовый ящик в холле многоквартирного дома.
3. Основные операции розетки
Поскольку сокет является реализацией режима «открытие-запись / чтение-закрытие», сокет предоставляет функциональные интерфейсы, соответствующие этим операциям. Давайте возьмем TCP в качестве примера, чтобы представить несколько основных функций интерфейса сокетов.
3.1, функция socket ()
socket () используется для создания дескриптора сокета (дескриптора сокета), который однозначно идентифицирует сокет.
Функция сокета соответствует операции открытия обычных файлов. Операция открытия обычного файла возвращает дескриптор файла, и этот дескриптор сокета совпадает с дескриптором файла, и последующие операции будут использовать его и использовать в качестве параметра для выполнения некоторых операций чтения и записи.
Так же, как вы можете передавать различные значения параметров в fopen для открытия разных файлов. При создании сокета вы также можете указать разные параметры для создания разных дескрипторов сокета. Три параметра функции сокета:
Примечание: Нельзя произвольно комбинировать вышеуказанный тип и протокол.Например, SOCK_STREAM нельзя комбинировать с IPPROTO_UDP. Когда протокол равен 0, автоматически выбирается протокол по умолчанию, соответствующий типу типа.
Когда мы вызываем socket для создания сокета, возвращаемое слово описания сокета существует в пространстве семейства протоколов (семейство адресов, AF_XXX), но не имеет конкретного адреса. Если вы хотите назначить ему адрес, вы должны вызвать функцию bind (), в противном случае система автоматически случайным образом назначит порт, когда вы вызываете connect () и listen ().
3.2, функция bind ()
Функция bind () назначает сокету конкретный адрес из семейства адресов. Например, AF_INET и AF_INET6 должны назначить сокету комбинацию адреса ipv4 или ipv6 и номера порта.
Три параметра функции:
Примечание: структура адреса протокола второго параметра является частным адресом.—— При создании сокета отличаться в соответствии с семейством протоколов адресов, например:
Домен Unix соответствует:
Обычно сервер привязан к общеизвестному адресу (например, IP-адрес + номер порта), когда он запускается для предоставления услуг, и клиент может подключаться к серверу через него; клиенту не нужно указывать, операционная система автоматически назначит номер порта и собственную комбинацию IP-адресов. Вот почему обычно сервер вызывает bind () перед прослушиванием, но клиент не вызывает его. Вместо этого система случайным образом генерирует его при connect ().
Сетевой порядок байтов и порядок байтов хоста
Следовательно: При привязке адреса к сокету, пожалуйста, сначала преобразуйте порядок байтов хоста в сетевой порядок байтов вместо того, чтобы предполагать, что порядок байтов хоста такой же, как сетевой порядок байтов с использованием Big-Endian. Из-за этой проблемы были совершены кровавые преступления! Из-за этой проблемы в коде проекта компании она вызвала множество необъяснимых проблем, поэтому, пожалуйста, помните, что не следует делать никаких предположений о порядке байтов хоста, не забудьте преобразовать его в сетевой порядок байтов и назначить его сокету.
3.3, функции listen (), connect ()
Если в качестве сервера после вызова socket () и bind () будет вызываться listen () для мониторинга сокета. Если в это время клиент вызывает connect () для отправки запроса на соединение, сервер получит запрос.
3.4, функция accept ()
После того как TCP-сервер по очереди вызовет socket (), bind () и listen (), он будет отслеживать указанный адрес сокета. После того, как TCP-клиент вызывает по очереди socket () и connect (), он отправляет запрос на соединение на TCP-сервер. После того, как TCP-сервер прослушивает запрос, он вызывает функцию accept () для получения запроса, чтобы соединение было установлено. После этого вы можете запускать операции сетевого ввода-вывода, то есть операции чтения и записи, аналогичные обычным файлам.
нота:
3.5, read (), write () и другие функции
На этом этапе сервер и клиент установили соединение. Сетевой ввод / вывод может быть вызван для операций чтения и записи, то есть реализуется связь между различными процессами в сети!
Существуют следующие группы сетевых операций ввода-вывода:
Рекомендуется использовать функции recvmsg () / sendmsg (), эти две функции являются наиболее распространенными функциями ввода-вывода.
Мы должны разбираться с этим в зависимости от типа ошибки. Если это ошибка EINTR, это означает, что при записи произошла ошибка прерывания. Если это EPIPE, проблема с сетевым подключением (другая сторона закрыла подключение).
3.6, функция close ()
После того, как сервер установит соединение с клиентом, будут выполнены некоторые операции чтения и записи. После завершения операций чтения и записи соответствующий дескриптор сокета должен быть закрыт. Это похоже на вызов fclose для закрытия открытого файла после завершения операции завершено.
По умолчанию закрытие сокета TCP помечает сокет как закрытый, а затем немедленно возвращается к вызывающему процессу. Слово описания больше не может использоваться вызывающим процессом, то есть оно больше не может использоваться в качестве первого параметра чтения или записи.
По умолчанию close () немедленно отправляет в сеть пакет FIN, независимо от того, есть ли данные в выходном буфере. Это означает, что вызов close () приведет к потере данных в выходном буфере ядра.
Примечание: операция закрытия только делает счетчик ссылок соответствующего дескриптора сокета 1. Только когда счетчик ссылок равен 0, клиент TCP запускается для отправки запроса на завершение соединения на сервер.
4. Установка и закрытие розетки
4.1 Подробное объяснение установления TCP-соединения с трехсторонним рукопожатием в сокете
Клиент должен использовать функцию connect (), чтобы установить соединение с сервером перед отправкой и получением данных. Целью установления соединения является обеспечение правильности IP-адреса, порта и физического соединения, а также открытие канала для передачи данных.
Мы знаем, что TCP устанавливает «трехстороннее рукопожатие», то есть происходит обмен тремя пакетами. Его можно сравнить со следующим диалогом:
Трехсторонний процесс установления связи и передача состояния, API сокетов
подводить итоги:
4.2, передача данных TCP
После установления соединения два хоста могут передавать данные друг другу.
4.2.1, 200 байт передаются без потери данных
Сначала хост A отправляет 100 байтов данных через один пакет, а номер Seq пакета устанавливается на 1200. Чтобы подтвердить это, хост B отправляет пакет ACK хосту A и устанавливает номер Ack равным 1301.
Чтобы гарантировать точную доставку данных, целевая машина должна немедленно вернуть пакет ACK после получения пакета данных (включая пакет SYN, пакет FIN, обычный пакет данных и т. Д.), Чтобы отправитель мог подтвердить успех передача информации.
Номер подтверждения = номер Seq + количество переданных байтов + 1
Так же, как и в протоколе трехстороннего рукопожатия, добавление 1 в конце означает, что другой стороне будет передаваться номер Seq.
4.2.2, 200 байтов пакета данных / пакета подтверждения потеряны и переданы
На приведенном выше рисунке показано, что 100 байтов данных передаются на хост B через пакет Seq 1301, но в середине произошла ошибка, и хост B не получил ее. По прошествии некоторого времени хост A все еще не получил подтверждение ACK для Seq 1301, поэтому он пытается повторно передать данные.
Чтобы завершить повторную передачу пакетов данных, сокет TCP будет запускать таймер каждый раз при отправке пакета данных. Если пакет ACK от целевой машины не будет получен в течение определенного периода времени, таймер истечет, и данные пакет будет передан повторно.
На приведенном выше рисунке показан случай потери пакета данных. Также будут случаи потери пакета ACK, который также будет передан повторно.
Тайм-аут повторной передачи (RTO, тайм-аут повторной передачи)
Время приема-передачи (RTT, Round-Trip Time) представляет собой общую задержку от начала отправки данных отправителю до тех пор, пока отправитель не получит пакет подтверждения ACK от получателя (получатель немедленно подтверждает после получения данных).
Количество ретрансляций
Количество повторных передач TCP-пакетов зависит от настроек системы. В некоторых системах пакет данных будет повторно передан только 3 раза.Если подтверждение ACK пакета данных не получено после 3 повторных передач, попытки повторной передачи предприниматься не будут. Однако некоторые бизнес-системы с высокими требованиями будут постоянно повторно передавать потерянные пакеты данных, чтобы обеспечить нормальное взаимодействие бизнес-данных в максимально возможной степени.
Наконец, следует отметить, что отправитель очистит данные в выходном буфере только после получения пакета подтверждения ACK от другой стороны.
4.3 Подробное объяснение четырех волн TCP в сокете для освобождения соединения
Установление соединения очень важно, это предпосылка для правильной передачи данных;Отключение также важно, оно позволяет компьютеру высвободить ресурсы, которые больше не используются.. Если соединение не может быть отключено обычным образом, это не только вызовет ошибки передачи данных, но также приведет к тому, что сокет не будет закрыт и продолжит занимать ресурсы. Если количество одновременных операций велико, нагрузка на сервер будет вызывать беспокойство.
Четыре волны разрыва связи можно сравнить со следующим диалогом:
Поскольку TCP-соединение является полнодуплексным, каждое направление должно быть закрыто отдельно. Этот принцип заключается в том, что когда одна из сторон завершает задачу отправки данных, она отправляет FIN, чтобы завершить соединение в этом направлении. Получение FIN означает только отсутствие потоков данных в в этом направлении, то есть данные больше не будут приниматься (read / recv вернет 0), но данные все еще могут быть отправлены по этому TCP-соединению, пока FIN также не будет отправлен в этом направлении.
Четырехволновый процесс и переход между состояниями
подводить итоги
4.4, прочие вопросы
Это связано с тем, что в состоянии LISTEN сервер получает сообщение SYN для установления запроса на соединение,Клиент помещает ACK и SYN в сообщение и отправляет его клиенту.. Когда соединение закрывается, при получении сообщения FIN от другой стороны это означает только то, что другая сторона больше не отправляет данные, но все еще может получать данные. Вы не можете отправить все данные другой стороне, поэтому вы можете немедленно закрыть или отправить некоторые. После того, как данные будут отправлены другой стороне, отправьте другой стороне сообщение FIN, чтобы указать, что соединение сейчас закрыто. Следовательно,Собственные ACK и FIN обычно отправляются отдельно.
4.4.2. Описание статуса TIME_WAIT
Клиент переходит в состояние TIME_WAIT после отправки пакета ACK в последний раз вместо прямого перехода в состояние CLOSED для закрытия соединения. Почему?
Когда клиент отправляет обратно пакет ACK серверу в последний раз, сервер может не получить его из-за сетевых проблем, и сервер снова отправит пакет FIN. Если клиент полностью закрывает соединение в это время, сервер в любом случае не получит ACK.Клиенту необходимо подождать некоторое время и подтвердить, что другая сторона получает пакет ACK, прежде чем перейти в состояние ЗАКРЫТО. Итак, как долго тебе нужно ждать?
У пакетов данных есть время, чтобы жить в сети. По истечении этого времени они будут отброшены до достижения целевого хоста, а исходный хост будет уведомлен. Это называется
Максимальное время жизни сегмента (MSL, максимальное время жизни сегмента)
5. Доменное имя
12 арабских цифр трудно запомнить. Проще использовать имя.
Когда вы набираете что-то вродеhttp://www.w3school.com.cn Для такого доменного имени программа DNS переводит доменное имя в число.
Во всем мире к Интернету подключено большое количество DNS-серверов. DNS-сервер отвечает за преобразование доменных имен в TCP / IP-адреса, а также отвечает за обновление систем друг друга новой информацией о доменных именах.
Когда новое доменное имя регистрируется вместе с его TCP / IP-адресом, DNS-серверы по всему миру обновляют эту информацию.