Является ли протокол TCP асинхронным?

«Является ли протокол TCP асинхронным?» — вопрос из категории Сети, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Сам по себе протокол TCP не является ни синхронным, ни асинхронным. Это протокол транспортного уровня, обеспечивающий надежный поток байтов.

Синхронность или асинхронность — это характеристика API или модели программирования, используемой поверх TCP.

Как это работает:

  1. TCP обеспечивает установление соединения (handshake), гарантированную доставку, контроль потока и упорядоченность данных.
  2. Программист решает, как с этим работать:
    • Синхронно (блокирующий I/O): Вызов socket.read() блокирует поток выполнения до тех пор, пока данные не будут получены.
      // Синхронное чтение
      Socket socket = new Socket("example.com", 80);
      InputStream in = socket.getInputStream();
      int data = in.read(); // Поток заблокирован здесь
    • Асинхронно (неблокирующий I/O): Используются механизмы вроде Selector (Java NIO), async/await (C#/Python), колбэки или CompletableFuture. Приложение не блокируется на операциях ввода-вывода и может обслуживать множество соединений в одном потоке.
      // Асинхронный стиль с Java NIO
      SocketChannel channel = SocketChannel.open();
      channel.configureBlocking(false); // Неблокирующий режим!
      channel.connect(new InetSocketAddress("example.com", 80));
      // Поток не блокируется, можно проверять готовность через Selector

Итог: TCP предоставляет надежный канал. Асинхронность — это способ организации кода приложения для эффективного использования этого канала без блокировок.