Рубрики
Без рубрики

TCP рукопожатие

Введение TCP Эти статьи будут около двух важных сетевых протоколов … Помечено Linux, Python, Networking, Tutorial.

Введение

Эти статьи будут около двух важных сетевых протоколов; TCP и UDP Отказ Я постараюсь сделать его лаконичкой, учитывая объем информации, что существует связано с этими двумя конкретными протоколами. Я постараюсь подходить к этой теме графическим способом, пытаясь обратиться к вашей любви к красивым эскизам.

Предпосылка

  1. Python 3.
  2. 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 Отказ

До следующего раза ребята 👋.

Библиография

  1. Практический анализ пакетов Третье издание Chris Sanders.
  2. Сетевое программирование с GO Учитесь кодируют безопасные и надежные сетевые службы с нуля Адам Вудбек.
  3. Разъем программирования HOSTO. Выпуск 3.7.3RC1. Из документации по стандартной библиотеке Python.
  4. Размер окна и ACK Отказ
  5. Loopback Ubuntu Отказ
  6. TCP в двух словах Отказ

Оригинал: “https://dev.to/gealber/tcp-handshake-3ac”