Передача данных по сети. Стек протоколов TCP/IP.

Теория

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

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

Для передачи данных в сети Интернет используется стек протоколов TCP/IP. В протоколе TCP/IP строго описаны правила передачи информации от отправителя к получателю и обратно. Передача сообщений проходит несколько уровней, каждый из которых работает независимо от предыдущего, используя т.н. инкапсуляцию.

Посмотреть слайды

Уровни модели TCP/IP:

Уровень

За что отвечает

Протоколы

4 уровень - Прикладной

Формат данных, их шифрование

HTTP (веб-страницы), SMTP (почта), FTP (файлы)

3 уровень - Транспортный

Способ передачи данных

TCP, UDP

2 уровень - Сетевой

Маршрутизация в сети

IP

1 уровень - Сетевых интерфейсов

Физическая передача данных

Ethernet, Wi-Fi

Общий ход передачи информации выглядит следующим образом:

  1. Данные от приложения отправляются протоколу транспортного уровня.

  2. Получив данные от приложения, протокол разделяет всю информацию на небольшие блоки (пакеты). К каждому пакету добавляется адрес назначения, а затем пакет передается на следующий уровень - уровень протоколов Интернет (сетевой уровень).

  3. На сетевом уровне пакет помещается в дейтаграмму протокола Интернет (IP), к которой добавляется заголовок и концевик. Протокол сетевого уровня определяет адрес следующего пункта назначения IP-дейтаграммы и отправляет его на уровень сетевого интерфейса.

  4. Уровень сетевого интерфейса принимает IP-дейтаграмму и передает их в виде кадров с помощью аппаратного обеспечения (например, сетевой карты).

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

Практика

1. Напишите функции для передачи данных с помощью модели TCP/IP от клиента сети. Каждая функция должна имитировать работу одного из уровней передачи данных. Используйте заготовку кода ниже:

''' 4 уровень, функция application() - отвечает за формат данных, их шифрование
   input функции - данные, которые хотим отправить по сети, протокол данных ('SMTP','HTTP','FTP')
   output: данные + информация про формат данных и шифрование '''
def application (data, protocol):
  ...

''' 3 уровень, функция transport() - отвечает за способ передачи данных и их транспортировку
   input: результат работы функции application(), протокол транспортировки данных ('TCP', 'UDP')
   output: данные + информация про транспортировку'''

def transport(data, protocol):
  ...

''' 2 уровень, функция internet() - отвечает за маршрутизацию в сети. Она ищет кому и как доставить данные
   input: результат работы функции transport()
   output: данные + информация про адресата и маршрут доставки'''

def internet(data):
  ...

'''1 уровень, функция network_interface - отвечает за соединение с сетью
   input: результат работы функции internet(), информация о соединении
   output: кортеж из 2 значений:
       1. данные, преобразованные в бинарный формат
       2. информация о типе соединения (1 - 'Ethernet', 2 -'Wi-Fi', другие числа - "No connection")'''

def network_interface (data, connection):
  ...

data = '01101'
print (data)
data_app = application(data,'SMTP')
print ('application level - ', data_app)
data_transport = transport (data_app,'TCP')
print ('transport level - ', data_transport)
data_ip = internet (data_transport)
print ('internet level - ', data_ip)
data_from_network = network_interface (data_ip,'Wi-Fi')
print ('network_interface level - ', data_from_network)

2. Напишите функции для получения данных из сети клиентом с помощью модели TCP/IP. Каждая функция должна имитировать работу одного из уровней передачи данных. Используйте заготовку кода ниже, учтите потери данных:

'''1 уровень, функция network_interface - отвечает за соединение с сетью
   передаём в функцию 2 аргумента:
    1 аргумент, data - это данные в виде бинарного числа
    2 аргумент, connection - это тип соединения (1 - 'Ethernet', 2 -'Wi-Fi', другие числа - "No connection")
   возвращаем:
    - если удалось установить соединение - то кортеж из 2 значений: данные в виде строки из нулей и единиц и тип соединения
    - если не удалось установить соединение, то строку "No connection"'''

def network_interface(data, connection):
   ...

''' 2 уровень, функция internet() - отвечает за маршрутизацию в сети. Она ищет кому и как доставить данные
передаём в функцию результат работы функции  network_interface()
возвращаем данные в виде строки, если данные переданы в кортеже и адресованы нам, иначе - передаём None'''

def internet(data):
   ...

''' 3 уровень, функция transport() - отвечает за способ передачи данных и их транспортировку
передаём в функцию результат работы функции internet()
возвращаем:
 - если c предыдущего уровня получены данные, то формируем кортеж из 2 значений: данные, протокол передачи
 - None - если данные не получены'''

def transport(data):
   ...

''' 4 уровень, функция application() - отвечает за формат данных, их расшифровку
передаём в функцию результат работы функции transport()
возвращаем:  '''

def application (data):
   ...

data = 0b110110111
print (bin(data))
data_from_network = network_interface (data,1)
print ('network_interface level - ', data_from_network)
data_ip = internet (data_from_network)
print ('internet level - ', data_ip)
data_transport = transport (data_ip)
print ('transport level - ', data_transport)
data_app = application(data_transport)
print ('application level - ', data_app)