Zuletzt geändert: Do, 07.07.2005

«11C» HTTP.latex «PDF», «POD»



Download
\documentclass[12pt]{beamer}
\usepackage{amsmath}
\usepackage{url}
\usepackage{ucs}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}

\newcommand{\ui} [1]{\color{blue!50!black}#1\color{black}}
\newcommand{\imp}[1]{\color{red!50!black}#1\color{black}}

\title{Hypertext Transfer Protocol}
\author{Ingo Blechschmidt \\\texttt{<iblech@web.de>}}
\institute{LUGA}
\date{6. Juli 2005}

\usetheme{Warsaw}
\usecolortheme{seahorse}
\setbeamercovered{transparent}

\begin{document}

\frame{\titlepage}

\frame[t]{
  \frametitle{Inhalt}
  \tableofcontents
}

\section{Allgemeines}
\subsection{Geschichte}
\frame[t]{
  \frametitle{Geschichte}

  \begin{itemize}
    \item Erster RFC für HTTP/1.0: RFC 1945, Mai 1996
    \item Erster RFC für HTTP/1.1: RFC 2616, Juni 1999
    \item Viele weitere RFC bis jetzt
  \end{itemize}
}

\subsection{Verwendung von HTTP}
\frame[t]{
  \frametitle{Verwendung von HTTP}

  \begin{itemize}
    \item World Wide Web (inkl. Web Services)
    \item Aufbauend: \\
          WebDAV (WWW Distributed Authoring and Versioning), \\
          Subversion (Versionskontrollsystem)
    \item Ähnlich: SIP (Session Initiation Protocol) u.a. für VoIP
  \end{itemize}
}

\section{Protokollbeschreibung}
\subsection{Typischer Ablauf}
\frame[t]{
  \frametitle{Typischer Ablauf}

  \begin{itemize}
    \item Wunsch: \texttt{http://www.pro-linux.de/berichte/}
    \item Also Verbindung zu \texttt{www.pro-linux.de:80} per TCP:
          \pause\texttt{\footnotesize%
            \ui{GET /berichte/ HTTP/1.1\\
            Host: www.pro-linux.de\\
            Connection: close\\
            \ \\}\pause
            HTTP/1.1 200 OK\\
            Date: Mon, 04 Jul 2005 18:17:33 GMT\\
            Server: Apache\\
            Last-Modified: Sun, 10 Apr 2005 21:20:54 GMT\\
            Content-Length: 10883\\
            Content-Type: text/html\\
            \ \\\pause
            <!DOCTYPE html\textit{[...]}
          }
  \end{itemize}
}

\subsection{Request-Methoden}
\frame[t]{
  \frametitle{Request-Methoden}

  \begin{itemize}
    \item Request-Methode als erste Zeile des Requests
    \item Generell: \texttt{\textit{Methode} \textit{Pfad} HTTP/\textit{1.1}}
  \end{itemize}

  \vfill
  \begin{block}{Verfügbare Methoden}
    \begin{tabbing}
      \texttt{CONNECT}: \= \kill
      \texttt{GET}:     \> Normales Herunterladen einer Seite \\
      \texttt{HEAD}:    \> "`Ich möchte bitte nur die Header."' \\
      \texttt{POST}:    \> Schicken von Daten an den Server (z.B.  Formulare) \\
      \texttt{TRACE}:   \> Zurücksenden des gesamten Requests (Debugging!) \\
      \texttt{CONNECT}: \> Direkte Weiterleitung auf TCP-Ebene \\
                        \> (SSL, Proxyketten)
    \end{tabbing}
  \end{block}
}

\subsection{Header-Felder}
\frame[t]{
  \frametitle{Header-Felder}

  \begin{itemize}
    \item Format ähnlich wie bei RFC 822-konformen Mails
    \item Header beginnend mit \texttt{X-}: nicht standardisiert
  \end{itemize}

  \begin{block}{Oft verwendete Header}
    \vspace*{-0.5em}
    \begin{tabbing}
      \texttt{Content-Length}: \= \kill
      \texttt{Host}:           \> Direkte Adressierung (Virtual Hosts!) \\
      \texttt{Date}:           \> Datum der Antwort \\
                               \> (nützlich für z.B.  Zeitsynchronisation) \\
      \texttt{Last-Modified}:  \> Datum der letzten Änderung \\
      \pause
      \texttt{Server}:         \> Server-Software (z.B. Apache) \\
      \texttt{User-Agent}:     \> Client-Software (z.B. Lynx, ELinks) \\
      \pause
      \texttt{Content-Length}: \> Länge in Bytes des Antwort-Dokuments \\
      \texttt{Content-Type}:   \> MIME-Typ des Antwort-Dokuments \\
                               \> (z.B. \texttt{text/html},
                               \texttt{application/xml})
    \end{tabbing}
  \end{block}
}

\subsection{Keep-Alive}
\frame[t]{
  \frametitle{Keep-Alive}

  \begin{itemize}
    \item Früher, bei HTTP/1.0: \\
          Eine TCP-Verbindung für jeden Request
    \item Nachteil: Ständiges Öffnen und Schließen von TCP-Verbindungen
          ineffizient
    \item Daher, seit HTTP/1.1: \\
          Keep-Alive -- Offenhalten der Verbindungen
    \item Neuer Header: \texttt{Connection: close}
  \end{itemize}
}

\section{Proxyketten}
\subsection{Nutzen von Proxies}
\frame[t]{
  \frametitle{Nutzen von Proxies}

  \begin{itemize}
    \item Üblicherweise: Client ↔ Server
    \item Mit Proxies: Client ↔ Proxy ↔ Server

    \vfill
    \item Traffic- und Zeiteinsparungen (Cache!)
    \item Möglichkeit der detaillierten Zugangsbeschränkung
    \item Ausfiltern von invaliden und möglicherweise die Sicherheit
          kompromittierenden HTTP-Requests
    \item (Aber: Möglicherweise Sicherheitslücken auch in den Proxy-Daemonen)
    \item U.U. Erhöhung der Anonymität
  \end{itemize}
}

\subsection{Proxies bei HTTP}
\frame[t]{
  \frametitle{Proxies bei HTTP}

  \texttt{%
    \ui{GET }\imp{http://www.pro-linux.de}\ui{/ HTTP/1.1\\
    Host: www.pro-linux.de\\
    \ \\}
    HTTP/1.1 200 OK\\
    \textit{[...]}
  }

  \vfill\begin{itemize}
    \item Kurz: Statt dem Pfad die vollständige URL im Request
    \item Andere Header wie üblich
    \item Übliche Header-Ergänzungen durch Proxies: \\
          \texttt{Via}, \texttt{X-Forwarded-For}
  \end{itemize}
}

\subsection{\texttt{CONNECT}-Methode}
\frame[t]{
  \frametitle{\texttt{CONNECT}-Methode}

  \texttt{\footnotesize%
    \ui{CONNECT \only<1-3>{www.pro-linux.de:80}\only<4->{proxy\only<5->{1}:3128} HTTP/1.1\\
    Host: \only<1-3>{www.pro-linux.de}\only<4->{proxy\only<5->{1}:3128}\\
    \ \\}\pause
    HTTP/1.1 200 Connection established\\
    \ \\
    \only<5->{\imp{CONNECT proxy2:3128 HTTP/1.1\\Host: proxy2:3128\\\ \\}HTTP/1.1 200 Connection established\\\ \\}
    \ui{GET \only<4->{http://www.pro-linux.de}/ HTTP/1.1\\
    Host: www.pro-linux.de\\
    \ \\}\pause
    HTTP/1.1 200 OK\\
    \textit{[...]}
  }
}

\subsection{Proof-of-Concept-Implementierung}
\frame[t]{
  \frametitle{Funktioniert das denn wirklich?}

  \begin{itemize}
    \item Ja. :)
    \item \texttt{%
            \$ \ui{./proxychain --listen=8000 -- \textbackslash\\
            \ \ proxy1:3128 proxy2:3128 \textit{[...]}}}
    \item Im Browser: Setzen der Proxy auf \texttt{localhost:8000}
    \item \texttt{http://whatismyip.com/},
          \texttt{http://www.augustakom.de/speedtest/}

    \pause
    \item Meistens sogar Schleifen möglich: \\
          \texttt{%
            \$ \ui{./proxychain --listen=8000 -- \textbackslash\\
            \ \ p1:3128 p2:3128 p3:3128 p1:3128 \textit{[...]}}}
  \end{itemize}
}

\section{Siehe auch}
\frame[t]{
  \frametitle{Siehe auch}

  \begin{itemize}
    \item RFC 1945: Hypertext Transfer Protocol -- HTTP/1.0
    \item RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1
    \item \url{http://freshmeat.net/projects/theguide/}: \\
          Hitchhiker's Guide to the Internet
    \item
    {\url{http://m19s28.vlinux.de/iblech/proxychain-luga-20050706.pl}}: \\
          Proof-of-Concept-Implementierung
  \end{itemize}

  \vfill\begin{center}\Large Fragen?\end{center}
}

\end{document}