Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
arhadthedev opened this issue Oct 26, 2022 · 0 comments
Open

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

arhadthedev opened this issue Oct 26, 2022 · 0 comments

Comments

@arhadthedev
Copy link
Owner

поток [ <-> ] протокол (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-протокол, если схема взаимодействия такая же, как и с сокетом.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant