Всемирная паутина

Методические указания к лабораторной работе по курсу «инфокоммуникационные системы и сети»

Всемирная паутина, или «Веб» (англ. World Wide Web, WWW), является, пожалуй, наиболее заметным приложением Internet.

Номинальный вклад этой работы в оценку — 30 единиц.

Ресурсы Всемирной паутины

Ознакомьтесь с материалами какого-либо «некоммерческого» (т. е. не принадлежащего какой-либо компании и не связанного с реализацией предпринимательской деятельности) ресурса Всемирной паутины.

  1. (1 ед.) Расскажите о предмете, которому посвящен выбранный ресурс Всемирной паутины. Подкрепите ссылками (URI) на две различных страницы ресурса.

  2. (2 ед.) Найдите во Всемирной паутине альтернативный, независимый от выбранного, источник информации о предмете (индивиде, некоммерческой организации, etc.) Опишите предмет по материалам альтернативного источника. Укажите, в чем источники сходятся, а в чем не согласны друг с другом. Подкрепите сравнение двумя цитатами из каждого ресурса.

  3. (1 ед.) Используя «отладочные» средства пользовательского агента выявите три различных ресурса HTTP, запрашиваемых для отображения конкретной страницы. Приведите URI ресурсов и их HTTP-заголовки.

  4. (1 ед.) Воспользуйтесь для просмотра ресурса каким-либо «легковесным» пользовательским агентом Всемирной паутины — Lynx, Dillo, Edbrowse, etc. Приведите одно преимущество и один недостаток использования такого агента по сравнению с «полновесным» (Chromium, Firefox, etc.)

    Пример: просмотр Всемирной паутины агентом Edbrowse.
    $ edbrowse 
    edbrowse ready
    g http://en.wikipedia.org/
    74193
    11263
    /know/i
    h2 Did you know ...
    z7
    
    {Fountain figure by Andrea della Robbia, Florence, c. 1490}
    Fountain figure by {Andrea della Robbia}, Florence, c. 1490
    
    * ... that depictions of {urinating boys} (example pictured)
    in {Renaissance art} could alternatively represent boyish innocence or erotic virility?
    * ... that {Keith Sebelius} voted against the {War Powers Resolution},
    g2
    147608
    36207
    ft
    War Powers Resolution - Wikipedia
    1z
    
    From Wikipedia, the free encyclopedia
    {Jump to navigation} {Jump to search}
    
    War Powers Resolution
    {Great Seal of the United States}
    Long title Joint resolution concerning the war powers of Congress and the President.
    q
    $ 
    
  5. (1 ед.) Выявите и опишите две существенных «технических» (орфография, «разметка», etc.) ошибки на ресурсе. Подкрепите ссылками на «нормативные» (словарь, спецификация формата, etc.) документы.

  6. (2 ед.) Свяжитесь с оператором ресурса и договоритесь об устранении найденных проблем. Сохраните страницу в «машине времени» Internet-архива до и после их устранения! Включите в отчет URI сохраненных редакций.

Internet-архив

  1. (1 ед.) Изучите историю какого-либо «некоммерческого» ресурса Всемирной паутины в «машине времени» (англ. Wayback machine; http://web.archive.org/.) Сравните между собой три редакции какой-либо страницы ресурса, разделенные не менее, чем одним годом. Приведите пять существенных отличий между редакциями.

  2. Среди прочего, Internet-архив содержит большое количество «исторических» видеоигр для различных платформ.

    1. (2 ед.) Для какой-либо игры, имеющейся в Internet-архиве, найдите видео прохождения «на скорость.» Запишите видео собственного успешного прохождения этой игры, время которого не превышает время найденного более, чем на четверть.

    2. (1 ед.) Опубликуйте записанное видео во Всемирной паутине.

    3. (1 ед.) Сохраните копию прохождения в «машине времени» Internet-архива.

    4. (2 ед.) Приведите убедительные свидетельства в пользу того, что опубликованное видео было просмотрено не менее, чем 100 раз.

  3. (1 ед.) Найдите в Internet-архиве какое-либо художественное произведение, объемом не менее 5 000 слов. Опишите сюжет. Подкрепите свое описание тремя цитатами из текста.

  4. (2 ед.) Прослушайте запись эпизода какой-либо радиопостановки, из числа представленных в Internet-архиве. Опишите сюжет. Подкрепите свое описание тремя цитатами из записи.

Размещение материалов

Размещение (публикация) материалов во Всемирной паутине представляет собой задачу, которая, в зависимости от контекста, может решаться как крайне просто, так и на удивление сложно.

Во всех случаях ниже, мы считаем необходимым, чтобы фактически опубликованный во Всемирной паутине файл в точности (побайтово) совпадал с исходным; заголовок Content-Type: ответа HTTP так же должен соответствовать назначению и формату исходного файла.

Пример: проверка корректности длины и заголовка Content-Type: опубликованного ресурса выполнением запроса HTTP HEAD.
$ curl -siI -- http://example.com/ 
HTTP/1.1 200 OK^M
Content-Length: 648^M
ETag: "3147526947"^M
Date: Thu, 20 Feb 2020 17:03:37 GMT^M
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT^M
Expires: Thu, 27 Feb 2020 17:03:37 GMT^M
Cache-Control: max-age=604800^M
Content-Encoding: gzip^M
Accept-Ranges: bytes^M
Content-Type: text/html; charset=UTF-8^M
Server: ECS (dcb/7F3B)^M
X-Cache: HIT^M
Age: 433294^M
Connection: keep-alive^M
^M
$ 
  1. (1 ед.) Опубликуйте какой-либо документ HTML. Документ должен успешно проходить формальную проверку с использованием http://html5.validator.nu/ и (или) иных подобных средств.

  2. (1 ед.) Опубликуйте какой-либо файл растрового графического формата (JPEG/JFIF, PNG, etc.)

    Пример: документ HTML, позволяющий проверить корректность Content-Type: опубликованного растрового изображения.
    <!DOCTYPE html>
    <html lang=en>
    <title >HTTP-published raster image test</title>
    
    <article>
    <h1 >HTTP-published raster image test</h1>
    
    <dl>
    <dt >Known good image</dt>
    <dd ><img
    alt="Fliegenpilz (fly agaric, Amanita muscaria) – from Wikimedia Commons"
    src="http://upload.wikimedia.org/wikipedia/commons/7/7b/Fliegenpilz_fly_agaric_Amanita_muscaria.JPG" /></dd>
    <dt >Image being tested</dt>
    <dd ><img
    alt="Example image"
    src="http://example.invalid/pub/raster.image" /></dd>
    </dl>
    </article>
    
  3. (1 ед.) Опубликуйте какой-либо видеофрагмент в открытом, непатентованном формате (например, WebM, Ogg/Theora.)

  4. (1 ед.) Опубликуйте программу для выполнения пользовательским агентом, дающую результат, аналогичный требуемому в задаче на «серверное» программирование. Приведите одно преимущество и один недостаток такой реализации по сравнению с выполнением программы на сервере.

  5. (1 ед.) Опубликуйте какие-либо два файла различных типов используя http://transfer.sh/. Изучите и объясните заголовки ответов HTTP, получаемых при разрешении соответствующих URI.

  6. (1 ед.) Сохраните копию трех опубликованных ресурсов в «машине времени» Internet-архива. Все ресурсы должны быть различных типов.

Сервера HTTP

Запустите какой-либо сервер HTTP (например, Lighttpd, busybox httpd, или иной.)

Обратите внимание, что занятие TCP-порта 80, зарегистрированного IANA для протокола HTTP, является привилегированной операцией в многопользовательских системах. (Как и любого другого порта с номером в диапазоне 0‒1023.) Следовательно, для успешного запуска сервера может потребоваться выбрать какой-либо другой (свободный в данный момент) номер порта.

Пример: запуск busybox httpd.
$ mkdir -- pub 
$ busybox httpd -h pub -p 8580 
$ 
  1. (1 ед.) Удостоверьтесь в работоспособности сервера отправив к нему HTTP-запрос и успешно получив на него HTTP-ответ. Объясните полученный код состояния HTTP и значение заголовка Content-Type:.

    Обратите внимание, что для получения кода состояния и HTTP-заголовков ответа может потребоваться использовать отдельную опцию пользовательского агента (wget -S, curl -i, etc.)

    Пример: выполнение HTTP-запроса с получением заголовков ответа.
    $ curl -si -- http://localhost:8580/res/our/ce 
    HTTP/1.0 404 Not Found^M
    Date: Thu, 20 Feb 2020 17:39:33 GMT^M
    Connection: close^M
    Content-type: text/html^M
    ^M
    <HTML><HEAD><TITLE>404 Not Found</TITLE></HEAD>
    <BODY><H1>404 Not Found</H1>
    The requested URL was not found
    </BODY></HTML>
    $ 
    
  2. (1 ед.) Разместите на сервере какой-либо файл. Получите копию файла и удостоверьтесь, что она совпадает с оригиналом. Объясните код состояния и значения трех заголовков ответа.

    Пример: размещение файла на сервере и проверка его доступности.
    $ printf %s\\r\\n "Hello, world!" > pub/hello.txt 
    $ lynx --dump -- http://localhost:8580/hello.txt 
    Hello, world!
    
    $ 
    
  3. (2 ед.) Разместите на сервере программу, выдающую приветственное сообщение и как-либо нетривиально измененную задаваемую произвольно пользователем часть URI. (Например, обращение к http://example.com/program/notapalindrome может возвращать emordnilapaton.) Проверьте ее работоспособность. Обоснуйте код состояния и заголовки, возвращаемые программой.

    Как вариант, вместо запуска программы HTTP-сервером, сделайте HTTP-сервер частью своей программы. Воспользуйтесь GNU Microhttpd, HTTP::Daemon, Tcllib httpd, или иным «встраиваемым» сервером.

  4. (1 ед.) Сохраните копию трех ресурсов своего сервера в «машине времени» Internet-архива. URI сохраняемых ресурсов должны иметь вид http://имя-сервера:порт/tevej1/имя-ресурса.

  5. (2 ед.) Реализуйте собственную «веб-радиостанцию». (Например, на основе специализированного HTTP-сервера Icecast.)

    Музыкальные произведения для трансляции можно найти, например, на Викискладе; или же, с оговорками, Jamendo, http://remix.kwed.org/ и др.

HTTP proxy

Частным случаем HTTP-сервера является т. н. HTTP proxy, или шлюз прикладного уровня (англ. application-level gateway, ALG) протокола HTTP.

Исторически, кэширующие proxy применялись для «ускорения» доступа на уровне организации (или домашней сети), однако повсеместное распространение HTTP/TLS (HTTPS) сделало такое использование невозможным. (Во всяком случае, без потери «защищенности», обеспечиваемой TLSсм., например, Mitmproxy, Sslstrip, etc.)

Тем не менее, HTTP proxy могут применяться для обеспечения (ограниченного) доступа к Internet без предоставления полной связности. Кроме того, такие сервера могут, в определенных случаях, применяться для ускорения обработки запросов на стороне сервера (т. н. обратный proxy.)

  1. (1 ед.) Запустите какой-либо proxy-сервер (например Polipo.) Удостоверьтесь в работоспособности, выполнив через него запросы к двум различным серверам HTTP.

    Пример: конфигурационного файла Polipo.
    proxyAddress    = "::1"
    proxyPort       = 3480
    proxyName       = "myproxy.example.net"
    logFile         = "polipo.log"
    daemonise       = true
    diskCacheRoot   = ""
    censoredHeaders = from
    
    Пример: запуск Polipo и выполнение HTTP-запроса.
    $ polipo -c .polipo 
    $ http_proxy=http://\[::1]:3480/ curl -si -- \
          http://example.invalid/ 
    HTTP/1.1 504 Host example.invalid lookup failed: Host not found^M
    Connection: keep-alive^M
    Date: Thu, 20 Feb 2020 18:27:56 GMT^M
    Content-Type: text/html^M
    Content-Length: 566^M
    Expires: 0^M
    Cache-Control: no-cache^M
    Pragma: no-cache^M
    ^M
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html><head>
    <title>Proxy error: 504 Host example.invalid lookup failed: Host not found.</title>
    </head><body>
    <h1>504 Host example.invalid lookup failed: Host not found</h1>
    <p>The following error occurred while trying to access <strong>http://example.invalid/</strong>:<br><br>
    <strong>504 Host example.invalid lookup failed: Host not found</strong></p>
    <hr>Generated Thu, 20 Feb 2020 18:27:56 UTC by Polipo on <em>myproxy.example.net:3480</em>.
    </body></html>^M
    $ 
    
  2. (1 ед.) Многие Internet-клиенты поддерживают использование HTTP proxy для установления TCP-соединения с удаленными серверами — в том числе и с использованием протоколов, отличных от HTTP. Еще один протокол, который можно использовать для тех же целей — SOCKS — поддерживается значительно реже. Тем не менее, по меньшей мере Polipo может быть настроен на использование «вышестоящего» SOCKS proxy.

    Перенаправьте поток данных через SOCKS proxy используя HTTP proxy.

    Пример: дополнительные параметры Polipo для использования SOCKS proxy в качестве «родительского».
    socksParentProxy  = "localhost:9050"
    socksProxyType  = socks5
    
  3. (1 ед.) В некоторых случаях, для аутентикации пользователя proxy используется «фирменный» протокол NTLM, поддерживаемый далеко не всеми клиентами HTTP. Для передачи запросов через такой сервер можно включить между ним и целевым HTTP-клиентом специализированный сервер Cntlm.

    Настройте и запустите Cntlm. (Воспользуйтесь, например, разделом Cntlm Викиучебника «Сетевые средства Debian».) Удостоверьтесь в работоспособности, выполнив через него запросы к трем различным http: URI.

Оформление отчета

  1. (1 ед.) Оформите отчет в виде документа HTML.

    Обратите внимание на то, что документ должен не только корректно воспроизводится соответствующим программным обеспечением, но и успешно проходить формальную проверку с использованием http://html5.validator.nu/ и (или) иных подобных средств. Элементы и атрибуты HTML должны быть использованы семантически-обоснованно — сообразно смыслу, которым их наделяет текущая практика и актуальные спецификации.

  2. (1 ед.) Дополните документ нетривиальной стилевой информацией (CSS.) Используйте пять не дублирующих правил (ни друг-друга, ни умолчания пользовательского агента), пять различных селекторов и пять различных свойств. Поясните их использование.

  3. (1 ед.) Опубликуйте отчет во Всемирной паутине. Удостоверьтесь, используя какой-либо специализированный агент Всемирной паутины (Wget, Curl, etc.) в том, что полученный URI действительно разрешается в точную копию опубликованного файла, а HTTP-ответ содержит корректный код состояния и заголовки (в первую очередь — Content-Type:.)

  4. (1 ед.) Сохраните копию опубликованного отчета в «машине времени» Internet-архива.