Передача данных по сети. Стек протоколов TCP/IP.¶
Теория¶
Обмен информацией между компьютерами (по проводному соединению или нет) происходит путем передачи пакетов (фрагментов) данных через сеть. Такая передача должна проходить по определённым правилам или стандартам, которые и называют протоколом передачи данных.
Протокол передачи данных - это набор соглашений интерфейса логического уровня, которые определяют обмен данными между различными программами.
Для передачи данных в сети Интернет используется стек протоколов TCP/IP. В протоколе TCP/IP строго описаны правила передачи информации от отправителя к получателю и обратно. Передача сообщений проходит несколько уровней, каждый из которых работает независимо от предыдущего, используя т.н. инкапсуляцию.
Уровни модели TCP/IP:
Уровень |
За что отвечает |
Протоколы |
|---|---|---|
4 уровень - Прикладной |
Формат данных, их шифрование |
HTTP (веб-страницы), SMTP (почта), FTP (файлы) |
3 уровень - Транспортный |
Способ передачи данных |
TCP, UDP |
2 уровень - Сетевой |
Маршрутизация в сети |
IP |
1 уровень - Сетевых интерфейсов |
Физическая передача данных |
Ethernet, Wi-Fi |
Общий ход передачи информации выглядит следующим образом:
Данные от приложения отправляются протоколу транспортного уровня.
Получив данные от приложения, протокол разделяет всю информацию на небольшие блоки (пакеты). К каждому пакету добавляется адрес назначения, а затем пакет передается на следующий уровень - уровень протоколов Интернет (сетевой уровень).
На сетевом уровне пакет помещается в дейтаграмму протокола Интернет (IP), к которой добавляется заголовок и концевик. Протокол сетевого уровня определяет адрес следующего пункта назначения IP-дейтаграммы и отправляет его на уровень сетевого интерфейса.
Уровень сетевого интерфейса принимает 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)