Однажды мы переводили ИТ-книгу, где нам попалась такое замечательное предложение:
The reliance on an in-order, reliable delivery of data provided by TCP allowed the HTTP specification to focus on the actual functionality of a search-and-retrieve of text information...
Глаз зацепился за "in-order". Что за зверь? Что за, пардон, "в-порядке-доставка"? ну не "внутризаказная" же, правда? В общем, нужно придумать какой-то приличный перевод, чтобы не было стыдно перед заказчиком.
Из пальца такое не высосешь, нужно заныривать в матчасть. Что ж, сделаем короткое, но увлекательное путешествие в 1970-е годы, во времена, когда интернет был ещё грудой железа и смелых идей. Поехали.
1. TCP или рождение короля протоколов. Как всё начиналось
В начале 1970-х годов компьютеры уже умели общаться, но делали это как глухие на переговорном пункте: каждый орал на своём языке и в своем ареале. Сети ARPANET (военная), PRNet (радиосеть) и SATNET (спутниковая) говорили на разных протоколах и не понимали друг друга (см. TCP Design Published и рисунок ниже).
Уверенная связь между этими сетями нужна была позарез — разгар холодной войны и у американцев еще свеж в памяти кубинский кризис. Соответственно, Агентство передовых исследовательских проектов Министерства обороны США (DARPA) поставило задачу: нужен единый язык для связи между всеми этими сетями.
За ее решение взялись двое ученых — Роберт Кан и Винтон Серф; в 1974 году опубликовали работу «A Protocol for Packet Network Intercommunication», где впервые представили протокол TCP.
Изначально TCP расшифровался как Transmission Control Program, но позже его разделили на две части: TCP (отвечает за саму передачу и он стал Transmission Control Protocol) и IP (отвечает за адресацию). Собственно, отсюда и пошло название TCP/IP.
После тестирования TCP/IP на трех различных видах сетей DARPA принял решение сделать его своим основным протоколом. В 1981 году был разработан и опубликован план по переводу 400 хостов со старого протокола NCP на TCP/IP. Крайним сроком для перехода был назначен день 1 января 1983 года, когда все устройства, не перешедшие на новый протокол, были бы отключены от сети. Так оно и случилось: 1 января 1983 года, когда ARPANET полностью перешла на TCP/IP, и по факту именно этот день можно считать датой рождения современного интернета — именно этот протокол стал международным стандартом.
2. Анатомия надежности: как работает TCP
TCP — это не просто протокол, это курьер с синдромом отличника-перфекциониста. Его главная задача — гарантировать, что данные будут доставлены полностью, без ошибок и в правильном порядке (подробнее о его механизмах).
В отличие от своего коллеги UDP, который просто «кидает» пакеты в сеть и забывает о них, TCP сначала устанавливает соединение и дальше следит за каждым пакетом. Получается прямо по-джентельменски — сначала предварительно созванивается, а потом следит за каждой фразой.
Он разбивает поток информации на сегменты, нумерует каждый байт и ждёт подтверждения (ACK — acknowledgement), что данные получены . Не получил ACK — отправил снова. Именно эта фанатичная добросовестность и педантичность позволяет приложениям (тому же HTTP, который тут совсем не всуе упомянули авторы переводимой нами книги) воспринимать сеть как простой файл на диске: что записал, то и прочитал.
3. Механизмы для 'in-order'
Разумеется, пакеты в интернете строем не ходят, там сплошной разброд и шатание: один может вылететь позже, но прийти раньше, потому что его маршрут оказался короче; у другого — как-то иначе. Как TCP борется с этим хаосом? В протоколе для этого работают последовательно три механизма.
1. Порядковые номера. Сообщения делятся по пакетам, у каждого отправленного пакета есть свой уникальный порядковый номер или "код позиции в сообщении (sequence number, см. рисунок). Получается, что-то типа постраничной отправки книги по почте, где у каждой страницы есть свой номер, но каждую отправляют в отдельном конверте.
2. Буферизация на приёмнике. Получающее устройство не отдаёт данные приложению сразу, как только они пришли. Он складывает их в специальный буфер и смотрит на номера . Если пришёл пакет №3, а пакеты №2 и №1 ещё в пути, получатель не отдаёт третий пакет. Он держит его в буфере на складе и ждёт два предшествующих.
3. Сборка. Как только приходят недостающие пакеты №1 и №2, TCP достаёт из буфера пакет №3, склеивает их в правильной последовательности (№1, №2, потом №3) и только тогда передаёт готовые данные приложению.
4. Перевод 'in-order delivery'
Получается, если вынести за скобки технический жаргон, in-order delivery означает, что получатель получает данные именно в том порядке, в котором их отправил отправитель, даже если физически по сети они пришли вперемешку. Для веб-сервера или браузера это значит, что они могут не думать о сортировке — TCP уже всё сделал за них.
Теперь становится очевидным, что «in-order» по смыслу означает не просто «порядок», а гарантию того, что пакеты не поменяются местами. Поэтому перевод формулируем так:
Поскольку доставка данных в правильном порядке гарантировалась TCP, в спецификациях HTTP в центре внимания были поиск и получение текстовой информации...
Вроде все.
Спасибо за внимание. Чтобы глубже разбираться в тонкостях IT-перевода и не бояться технических текстов, подписывайтесь на наш канал.
Такого добра у меня навалом, записывать только не успеваю (или ленюсь, грешен) :).