Введение
Эти статьи будут около двух важных сетевых протоколов; TCP и UDP Отказ Я постараюсь сделать его лаконичкой, учитывая объем информации, что существует связано с этими двумя конкретными протоколами. Я постараюсь подходить к этой теме графическим способом, пытаясь обратиться к вашей любви к красивым эскизам.
Предпосылка
- Python 3.
- Wireshark или любой другой пакет Sniffer, выберите тот, который вы знаете, как его использовать.
Я буду использовать Python для простоты, но это может быть достигнуто с помощью любого другого языка программирования на ваш выбор.
Что такое протокол?
Ну, протокол является стандартным набором правил, которые позволяют общаться между электронными устройствами. Итак, в конце, TCP это просто набор правил, используемых электронными устройствами для связи между собой. Давайте посмотрим некоторые из этих правил.
Описание рукопожатия TCP
Установка соединения
Предположим, у нас есть две части, и человек пытается протянуть другой, используя правила TCP Как мы могли достичь этого? Если вы прочитали некоторую информацию о TCP. тогда я уверен, что вы прочитали это
А TCP Соединение использует трехстороннее рукопожатие для представления обеих частей в разговоре …
Или что-то похожее на это, верно? Давайте назовем одну часть клиент , который является узлом или частью, которая запускает связь, в то время как другой узел будет называться Сервер Отказ Теперь, когда клиент Попробуйте начать разговор, он сначала посылает Syn Флаг на сервер. Если вы любопытный человек, я уверен, что вам интересно, какая информация идет на этот первый пакет, так что давайте узнаем.
Для того, чтобы иметь возможность воспроизвести эту ситуацию, простой TCP Соединение, я собираюсь создать чрезвычайно простые Сервер и клиент с Python используя розетка Библиотека, которая является частью стандартной библиотеки Python, поэтому просто наличие Python достаточно хороша.
# server.py import socket def main(): # creating the socket sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # binding the socket to the port 7456 # notice that bind() take a tuple as argument sck.bind(('localhost', 7456)) # now is time to say, I'm ready for connection OS, could you let me please? # the 1 specified how many connection it will queue up, until # start rejecting attempts of connections. sck.listen(1) print("Hey you I'm listening on 7456...weird port by the way") # accepting the incoming connection (client_sock, address) = sck.accept() while True: # 1024 is a magic number used on every networking tutorial out there # so here I also make use of it. Also in this case means that the socket # will process up to 1024 bytes of the incoming message from the client msg = client_sock.recv(1024) if not msg: break print(f"FROM: {address} MSG: {msg}") print() # good bye socket client_sock.close() if __name__ == "__main__": main()
Это больше комментариев, чем сам код, так что не вытягивайте. Это часть, соответствующая Server.py
Файл, ничто здесь здесь, мы создаем розетку, свяжите сокет и т. Д. Прочитать комментарии. Теперь для Client.py
:
# client.py import socket def main(): # creating the socket sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # just connecting sck.connect(("localhost", 7456)) print("Sending data...") sck.sendall(b"Hola server, are you bored?") # I don't care about your response server, I'm closing sck.close() if __name__ == "__main__": main()
Даже проще, клиент просто отправляет одно сообщение на сервер, довольно глупое сообщение, но сообщение нам не нужно серьезно.
Идея состоит в том, чтобы воспроизвести ситуацию следующим образом:
Открыть Wireshark, вам может потребоваться использовать
Sudo
команда, чтобы иметь возможность понюхать сетевой интерфейс.Учитывая, что трафик, который мы хотим понюхать, это только местное, мы будем нюхать петля Интерфейс, вот фото только в случае.
Нам нужно отфильтровать трафик, учитывая, что мы используем TCP на порту 7456 Итак,
TCP.port
будет соответствующий фильтр для нашего дела.Теперь мы все приятно идти, начните скрипт с сервером. Если вы посмотрите на Vireshark прямо сейчас, это не будет никакого трафика, учитывающего, что клиент не пытался подключиться.
python server.py
- Запустите клиентский скрипт,
python client.py
Теперь вы должны увидеть что-то вроде этого,
Первый синхронизм
Если вы оглядываетесь назад, все это было сделано с идеей взглянуть на первую Syn Пакет, отправленный клиентом, верно? Теперь давайте посмотрим на это. Если вы дадите щелчок на этом первом пакете, Wireshark покажет вам всю информацию, связанную с ней, и позвольте мне сказать вам, что это много. Для того, чтобы упростить анализ, давайте сосредоточиться на Последовательность Номер, Признать Номер, Флаги и Окно Размер стоимости.
Номер последовательности : Это число, идентифицирующее сегмент TCP, это используется для обеспечения того, чтобы часть данных не пропущена. Это как способ отслеживать заказ, в котором были отправлены пакеты.
Признать номер : Номер последовательности, который ожидается на следующем пакете с другого устройства.
Флаги : Используется для идентификации типа TCP пакета, который был передан.
Размер окна : Размер буфера приемника TCP в байтах. Это действительно хитрый, я сначала не получил это, мне на самом деле было трудно попытаться понять это. Поэтому я использую мастер знаний (Google или любой другой поисковой системы), и нашел этот вопрос, Размер окна и ACK
Размер окна (что наборы приемника) – это жесткий предел на том, сколько байтов отправитель может отправить, не вынужденные остановиться, чтобы дождаться признание Отказ
Я рекомендую вам прочитать весь вопрос, потому что оно разъясняет недопонимание, связанное с Размер окна Отказ
Все это обрабатывается библиотекой, которую вы используете, поэтому вам не понадобится справиться с этим самостоятельно. Так что это первое Syn Пакет, отправленный клиент на сервер, действуйте как простая презентация
SYN, ACK по серверу
В ответ на это Syn Сервер Ответить с SYN, ACK пакет. Если вы посмотрите на ту же информацию, упомянутую ранее, вы заметите, что в этом случае Флаги Syn и Признание были отмечены как набор
Сервер говорит: «Хорошо, я видел тебя, это Мой Номер последовательности (SEQ), и я ожидаю, что этот порядковый номер от Вы (ACK) “
ACK от клиента
Это последняя часть рукопожатия, в этой части клиент отвечает с его текущим SEQ, который является предыдущим плюсом, а также включает в себя ожидаемый номер последовательности с сервера (ACK).
Вывод
Понимание протокола не является легкой задачей, даже здесь мы стараемся упростить эту задачу больше всего, сосредоточиться только на подключении двух частей и анализируя пакеты, связанные с этим соединением. Все еще зная, что у INT и выходов протокола стоит того. В следующий раз я постараюсь к тому же с UDP Отказ
До следующего раза ребята 👋.
Библиография
- Практический анализ пакетов Третье издание Chris Sanders.
- Сетевое программирование с GO Учитесь кодируют безопасные и надежные сетевые службы с нуля Адам Вудбек.
- Разъем программирования HOSTO. Выпуск 3.7.3RC1. Из документации по стандартной библиотеке Python.
- Размер окна и ACK Отказ
- Loopback Ubuntu Отказ
- TCP в двух словах Отказ
Оригинал: “https://dev.to/gealber/tcp-handshake-3ac”