February 12th, 2021

Программа, моделирующая сетевую архитектуру (разбор задания)

Задание из книги Таненбаума про компьютерные сети к главе 1 «Введение», цитата:

37. Напишите программу, которая осуществляет поток сообщений от верхнего слоя до нижнего слоя модели протокола с 7 уровнями. Ваша программа должна включать отдельную функцию протокола для каждого уровня. Заголовки протокола — последовательность до 64 символов. У каждой функции есть два параметра: сообщение, пришедшее из протокола более высокого уровня (буфер случайной работы), и размер сообщения. Эта функция присоединяет свой заголовок перед сообщением, печатает новое сообщение на стандартном выводе и затем вызывает функцию протокола нижнего уровня. Ввод программы — сообщение приложения (последовательность 80 символов или меньше).


Перевод ужасный. Я сначала ничего не понял. (Выделение цветом — моё.)

Оригинал:

37. Write a program that implements message flow from the top layer to the bottom layer of the 7-layer protocol model. Your program should include a separate protocol function for each layer. Protocol headers are sequence up to 64 characters. Each protocol function has two parameters: a message passed from the higher layer protocol (a char buffer) and the size of the message. This function attaches its header in front of the message, prints the new message on the standard output, and then invokes the protocol function of the lower-layer protocol. Program input is an application message (a sequence of 80 characters or less).


Мой вариант перевода:

37. Напишите программу, которая осуществляет прохождение сообщения от верхнего уровня к нижнему уровню модели сетевой архитектуры с 7-ю уровнями и протоколами. Ваша программа должна включать отдельную функцию протокола для каждого уровня. Заголовки, добавляемые по протоколам — последовательность до 64 символов. У каждой функции есть два параметра: сообщение (символьный массив), пришедшее от протокола уровня, лежащего выше, и размер сообщения. Эта функция присоединяет свой заголовок перед сообщением, печатает новое сообщение в стандартный вывод и затем вызывает функцию протокола уровня, лежащего ниже. На вход программы подаётся сообщение прикладного уровня (последовательность из 80 символов или меньше).


Во фразе «message flow» речь идет про одно сообщение, а не про несколько. На вход программы подается сообщение и мы должны увидеть, как оно изменится после прохождения каждого уровня нашей модели.

Фраза «the 7-layer protocol model» говорит о том, что, во-первых, наша программа будет всего лишь моделью и в действительности не будет работать с сетью. Программа должна быть написана лишь в иллюстративных целях. Во-вторых, часть этой фразы «7-layer protocol» отсылает к подразделу 1.3.1. «Иерархия протоколов» книги Таненбаума. Здесь речь идет не о «протоколе с 7 уровнями», как можно подумать и как подумал переводчик, а о наборе из семи уровней и соответствующих этим уровням семи протоколов (одному уровню соответствует один протокол). Такой набор (необязательно состоящий именно из 7 уровней и протоколов, это число может быть больше или меньше) называют «сетевой архитектурой» или «архитектурой сети».

Слово «layer» переводчик почему-то в одном предложении переводит как «слой», а в другом предложении — как «уровень». В принципе, оба варианта применимы, только нужно выбрать один из них, чтобы читатель не путался.

Фраза «protocol header», думаю, не должна переводиться как «заголовок протокола», потому что этот заголовок добавляется не к протоколу, а к сообщению (пакету). Здесь имеется в виду, что заголовок описан в протоколе (или регламентирован протоколом).

У нас есть стопка (стек) уровней и соответствующих этим уровням протоколов. Над самым верхним уровнем нет других уровней, но под ним есть шесть уровней. Над самым нижним есть шесть уровней, но под ним нет уровней. У каждого из средних в стопке (стеке) уровней сверху и снизу есть один или более уровней. В этом контексте перевод фразы «higher layer» как «более высокий уровень» некорректен, потому что у средних в стопке (стеке) уровней выше может находиться больше одного уровня, а в задании в данном случае подразумевается только один уровень — самый близкий из лежащих выше, то есть примыкающий сверху к данному уровню. Та же история с переводом фразы «lower-layer» — имеется в виду не любой из лежащих ниже уровней, а только один конкретный, самый близкий из лежащих ниже, то есть примыкающий снизу к данному уровню.

С переводом фразы «char buffer» как «буфер случайной работы» вышло забавно. Вообще в английском для слова «буква» есть слова «letter» и «character». Создатели языка программирования Си взяли слово «character», но оно им показалось слишком длинным, поэтому его сократили до «char». Но тут получилась путаница, потому что в английском языке уже есть слово «char» и оно никогда не использовалось ранее в значении «буква» или «символ». У слова «char» есть множество значений и одно из них действительно — «подённая работа» в смысле повседневная, тяжелая, низкооплачиваемая (случайная) работа. Однако, в контексте компьютерных сетей в данном случае фраза «char buffer», очевидно, переводится как «символьный буфер» или «символьный массив».

Под печатью сообщения в стандартный вывод, очевидно, подразумевается стандартный поток вывода, то есть наша программа будет выводить текст на дисплей компьютера. Тут подробнее:
https://ru.wikipedia.org/wiki/Стандартные_потоки
https://en.wikipedia.org/wiki/Standard_streams

Фраза «program input» подразумевает, что наша программа будет запрашивать текст сообщения у пользователя, поэтому переводить эту фразу следует не «ввод программы», а, к примеру, «на вход программы подаётся».

Верхний уровень любой сетевой модели (хоть OSI, хоть TCP/IP или какой-то другой) обычно называют «прикладным уровнем» (по-английски «application layer»), потому что на этом уровне действуют приложения пользователя, которые при необходимости работы с сетью обращаются к сетевому программному обеспечению. К примеру, когда пользователь работает в браузере, браузер можно считать пользовательским приложением, которое с помощью протокола прикладного уровня (HTTP) работает с остальными уровнями сетевой архитектуры. Исходя из этого, фраза «application message», думаю, означает, что это сообщение, которое изначально будет запрашивать наша программа на прикладном уровне (именно поэтому здесь присутствует прилагательное «application»). Первая функция (реализующая протокол верхнего уровня) и будет запрашивать у пользователя это сообщение. Поэтому фразу «application message» переводим как «сообщение прикладного уровня».

Продолжение (реализация программы): тут.

Непрощенный, 1992, кино

Фильм очень понравился. Первый раз смотрел в 90-х, почти ничего не запомнил. Недавно пересмотрел дважды.

После «долларовой трилогии» запустил на просмотр и эту ленту. Ожидал стрельбы, разборок, крутых парней, то есть обычного вестерна. Однако, почти весь фильм прошел не так, как я от него ожидал. События происходят в то время, когда порядки Дикого Запада остались в далеком прошлом. Бывшие убийцы стали фермерами, а об их похождениях складывают легенды.

Главный герой (Клинт Иствуд, он же — режиссер) оказывается неудачливым грязным фермером, отцом двоих малолетних детишек, владельцем издыхающих от какой-то злой болезни свиней. Жену свою он похоронил, она умерла от оспы в 29 лет. Это седой, горбящийся мужчина, практически старик. Зритель не может поверить, что когда-то он колесил по Дикому Западу, убивая людей (в том числе, по слухам, женщин и детей), грабя банки.

И течение сюжета подтверждает мнение зрителя о том, что легенды об этом человеке врут. Он не может попасть из пистолета в пустую банку. С трудом взбирается на лошадь, потому что та отвыкла от седла. Весь фильм этот человек будет падать с этой лошади и снова неловко на нее взбираться.

В фильме нет положительных персонажей. Два ковбоя порезали лицо проститутке за то, что она хихикнула, когда увидела слишком маленький причиндал одного из них. Проститутки хотели, чтобы ковбоев повесили, но местный шериф (Джин Хэкмен) лишь заставил этих ковбоев заплатить штраф владельцу публичного дома в виде семи лошадей. Тогда проститутки собрали 1000 долларов и пустили слух, что заплатят эти деньги тому, кто убьет тех двоих ковобоев.

Вот и потянулась в городок разная мразь с оружием. Но, как оказалось, никогда ничего не происходило так, как описано в книжках про крутых стрелков в белом, защищающих честь дамы.

Все «крутые» оказываются обычными людьми с их слабостями. Прибывший в город со своим личным биографом «легендарный стрелок» оказывается хвастуном и алкоголиком. Старый напарник (Морган Фриман) Уильяма Мунни уже не хочет никого убивать, а молодой напарник врет всем вокруг, хвастаясь своей крутостью, но, убив человека, с ужасом начинает осознавать, что убийство не сделало его крутым и уверенным в себе. Да и сам Мунни не горит желанием кого-то убивать, а действует только по необходимости. На все рассказы о своих похождениях он отвечает, что ничего не помнит, потому что в то время почти постоянно был пьян.

Фильм даже, в какой-то момент, мне показалось, свернул в комедийное русло. Получив по щщам и с горем пополам застрелив двух ковбоев, Мунни и его молодой напарник готовились уже ливнуть с деньгами, но тут фильм наконец свернул в драму. Ковбои и шериф отловили и запытали старого напарника Мунни, который никого не смог убить, отказался от денег и ехал домой, к жене.

И тут оказалось, что среди хвастунов, мерзавцев и крутых ребят, сочинявших о себе басни, таки был один настоящий эталонный убийца. Единственный, о котором, возможно, легенды не врали. И пока остальные подстегивали себя, стараясь показать жестокость и бесстрашие, Уильям Мунни, наоборот, себя придерживал. Он действительно практически ничего не помнил, потому что действительно во время своих похождений был пьян в стельку. И как только он впервые за одиннадцать последних лет снова выпил, убийца вернулся.

Так что данный фильм и нужно смотреть дважды. Во второй раз — чтобы насладиться игрой актеров, понимая уже, кто здесь волк в овечьей шкуре в этом стаде овец.

Кстати, название «Непрощенный» имеет, мне кажется, двойной смысл: во-первых, проститутки не простили ковбоев, а, во-вторых, Уильям Мунни не простил себя за свои старые грехи.

У фильма было 9 номинаций на «Оскар» в 1993 году, и он победил в 4 из них, в том числе — лучший фильм, лучшая мужская роль второго плана (Джин Хэкмен), лучший режиссер (Клинт Иствуд), лучший монтаж.