Skip to content

Транспорт и протоколы #21

@arhadthedev

Description

@arhadthedev
поток [ <-> ] протокол (SSL)[ <-> ] транспорт (socket)

  |                                      ^
  +......................................+
 дополнительное владение через ссылку

[переместить SSL из транспорта в протокол мы не можем - старый сокет перестаёт работать]
[сейчас поток может сменить транспорт не более одного раза]

[при замене класса мы сообщаем об этом все четырём сторонам избегая рекурсии с вызывающей стороны]
[для обратной совместимости проверяем, является ли принятый класс потомком старого и если да, передаём ему обёртки]

Задача - завершить работу протокола, забрав транспорт.

1 Добавить shutdown_tls в loop
2 Написать поточную обёртку поверх

I cannot connect the loose ends in the code to get how to shutdown and whether a socket can be taken before a final shutdown

self._sslobj.unwrap() закопан внутри SSLProtocol и необходимо архитектурно грамотно вытащить значение за пределы класса не прорубая
окна.

=========================

Разбираюсь:

  • кто поверх кого (транспорт или протокол)
  • TCP, UDP и тем более TLS (в реализации Питоновского пакета ssl это сокет) - это внутренняя деталь транспорта.
    С точки зрения пользователя существует только поточное и пакетное взаимодействие в один или несколько потоков.
    Несколько потоков - это, например, процессы, владеющие stdin и stdout. Вот только это дело не протокола (каждый
    поток - это обычный pipe), а loop.subprocess_*, возвращающего кортеж из трёх потоков
  • кто взаимодействует с буферами, а кто с протоколами
  • какова роль протокола, если буферизацию определяет ресурс, оборачиваемый классом транспорта, а способ получения
    данных - очередь сообщений (poll vs proactor)

У нас есть транспорты и протоколы.

Ответы:

Создание (т. е. кто в принципе в курсе):

  • транспорт:

    • loop.connect_read_pipe, loop.connect_write_pipe
    • loop.create_connection, loop.create_unix_connection, loop.create_server, loop.sendfile
    • loop.create_datagram_endpoint
    • loop.subprocess_shell, loop.subprocess_exec
  • протоколы:

    • не задокументировано, то есть пользователю не видно

    • встречаются в имени параметра protocol_factory функций цикла

    • гипотеза: протокол позволяет прозрачно заменить нижележащий сокет; но ради этого там
      масса слабосвязанной лапши, крутящейс вокруг внутренних переменных.

    • asyncio.stream.start_server вызывает loop.create_server с фабрикой следующего вида:
      def factory():
      reader = StreamReader(limit=limit, loop=loop)
      protocol = StreamReaderProtocol(reader, client_connected_cb,
      loop=loop)
      return protocol
      return await loop.create_server(factory, host, port, **kwds)

    • то есть протокол смотри на пользователя, а транспорт - на низкоуровневый поток ввода-вывода.
      Зачем тогда TLS-протокол, если схема взаимодействия такая же, как и с сокетом.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions