Домой Edit me on GitHub

2019-06-19

Каналы передачи данных | Сетевое программирование | Базы данных | Основы Веб-программирования

Введение

IP

IP-адрес (айпи-адрес, сокращение от англ. Internet Protocol Address) — это уникальный сетевой адрес узла в компьютерной сети, построенной по протоколу IP. В сети Интернет требуется глобальная уникальность адреса; в случае работы в локальной сети требуется уникальность адреса в пределах сети. В версии протокола IPv4 IP-адрес имеет длину 4 байта, в IPv6 — 16 байт.

Для сети класса A…
(один байт - поле сети, следующие за ним - номер хоста)

10.0.0.0 адрес сети класса A, потому что все биты адреса узла равны 0
10.0.1.0 адрес узла этой сети
10.255.255.255 широковещательный адрес этой сети, потому что все биты адреса
узла равны 1

Для сети класса B…
(два байта - поле сети, следующие за ним - номер хоста)

172.17.0.0 адрес сети класса B
172.17.0.1 адрес узла этой сети
172.17.255.255 широковещательный адрес этой сети

Для сети класса C…
(три байта - поле сети, следующие за ним - номер хоста)

192.168.3.0 адрес сети класса C
192.168.3.42 адрес узла этой сети
192.168.3.255 широковещательный адрес этой сети

Порт

Номер порта является 16-разрядным целым двоичным числом, таким образом, порты возможны в диапазоне от 1 до 65535 (для TCP, номер порта 0 зарезервирован и не может быть использован). Для UDP порт источника не является обязательным и нулевое значение означает отсутствие порта.

  • FTP: 21 для команд, 20 для данных
  • SSH: 22 — удалённое управление хостом с ОС UNIX/Linux/BSD (если разрешено)
  • telnet: 23 — подключение для удалённого управления сетевыми устройствами (если такой сервис поддерживается)
  • SMTP: 25
  • SMTP c SSL: 465, 587
  • DNS: 53 (UDP) — необходимо для работы большинства служб Интернета на ПК обычного пользователя
  • DHCP: 67, 68/UDP
  • TFTP: 69/UDP
  • HTTP: 80, 8080 — если закрыть, браузер не будет отображать страницы
  • SNMP: 161/UDP, 162/UDP - стандартный интернет-протокол для управления устройствами в IP-сетях на основе архитектур TCP/UDP. К поддерживающим SNMP устройствам относятся маршрутизаторы, коммутаторы, серверы, рабочие станции, принтеры, модемные стойки и другие.
$ cat /etc/services
$ getent services http
http                  80/tcp www

Поиск сервисов на Python, при помощи socket.getservbyname(), socket.getservbyport():

>>> import socket
>>> socket.getservbyport(80)
'http'
>>> socket.getservbyport(21)
'ftp'
>>> socket.getservbyport(53, 'udp')
'domain'
>>> socket.getservbyname('http')
80

На C:

Компиляция:

$ gcc getservbyname.c -o getservbyname
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
   struct servent *serv;

   if (argc < 3) {
      puts("Incorrect parameters. Use:");
      puts("   gsbnm service-name protocol-name");
      return EXIT_FAILURE;
   }

   /* getservbyname() - opens the etc.services file and returns the */
   /* values for the requested service and protocol.                */

   serv = getservbyname(argv[1], argv[2]);
   if (serv == NULL) {
      printf("Service \"%s\" not found for protocol \"%s\"\n",
         argv[1], argv[2]);
      return EXIT_FAILURE;
   }

   /* Print it. */
   printf("Name: %-15s  Port: %5d    Protocol: %-6s\n",
             serv->s_name,ntohs(serv->s_port),serv->s_proto);
   return EXIT_SUCCESS;
}

Пример использования:

$ ./getservbyname http tcp
Name: http             Port:    80    Protocol: tcp

Сокет

Для обеспечения сетевых коммуникаций используются сокеты. Сокет это конечная точка сетевых коммуникаций. Каждый использующийся сокет имеет тип и ассоциированный с ним процесс.

Сокеты существуют внутри коммуникационных доменов. Домены это абстракции, которые подразумевают конкретную структуру адресации и множество протоколов, которое определяет различные типы сокетов внутри домена. Примерами коммуникационных доменов могут быть: UNIX домен, Internet домен, и т.д.

Обычно клиент явно подсоединяется к слушателю, после чего любое чтение или запись через его файловый дескриптор будут передавать данные между ним и сервером.

Файловый дескриптор

Ко всем потокам ввода-вывода (которые могут быть связаны как с файлами, так и с каталогами, сокетами и FIFO) можно получить доступ через так называемые файловые дескрипторы. Файловый дескриптор — это неотрицательное целое число. Когда создается новый поток ввода-вывода, ядро возвращает процессу, создавшему поток ввода-вывода, его файловый дескриптор.

В программе, сокет идентифицируется дескриптором - это просто переменная типа int.

Файловая система UNIX

Previous: Низкоуровневое программирование Next: Межпроцессное взаимодействие