Aye, das war vielleicht wirklich nicht so klar ausgedrückt...
Also nein, ich schicke nicht immer dasselbe los. Nur die Kommandozeile sieht immer gleich aus. Mit dieser Kommandozeile,
telnet www.windowspage.net 80, tue ich genau das, was jeder Browser tut, wenn er irgendeine Datei aus dem Internet per HTTP laden will: ich erstelle eine Verbindung zu diesem Server über seinen Port 80 (der HTTP Port).
Der Servername wird aufgelöst, die Verbindung erstellt. Das sind die drei ersten Zeilen, die von telnet in den Standard Output gedruckt werden.
Trying 62.241.50.14...
Connected to www.windowspage.net.
Escape character is '^]'.Danach steht die Verbindung. Ich habe einen Socket zum Server über seinen Port 80 und kann ihn ansprechen. Nun übermittle ich eine HTTP Request, die tippe ich einfach so und per zweimal Enter drücken (also eine leere Newline) übermittle ich die dann.
Ein HTTP Header ist immer so aufgebaut (ich beziehe mich jetzt natürlich auf die Pakete vom Client zum Server, sprich, HTTP requests):
Erst kommt die Methode. Die geläufigsten sind GET, POST und HEAD.
Genaueres in RFC 2616, Abschnitt 9:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.htmlDann kommt die URI, also das was du eigentlich willst. Meine Experimente hab ich zum Beispiel mit dem Bild in
/board/YaBBImages/home.gif gemacht, das auf dem Server liegt.
Dann kommt die verwendete HTTP Version, die der Server natürlich unterstützen muss
Dann kommt eine Newline (besser gesagt: der CRLF), und dann kommen mehrere header fields. Da stehen diverse Informationen drin, zum Beispiel halt der Referer (das heißt, von wo aus du diese request machst; bzw., wenn du also von Google auf eine Seite klickst, sendest du eine request an den Server, und dein Referer ist Google, genauer gesagt exakt die Adresse, bei der Google die Seite anzeigt, von wo aus du auf den Link geklickt hast; oder wenn du hier im Forum auf einen Thread klickst und dort ein Bild ist, das geladen werden muss, ist der Referer die URL dieses Threads), oder zum Beispiel, ob du gzip komprimierte Dateien akzeptierst, was den Traffic verkleinert und die Kommunikation beschleunigt, usw. Bei HTTP/1.1
muss man, im Gegensatz zu HTTP/1.0, zumindest die
Host Angabe übermitteln, die den Server informiert, von welchem Server man diese URI ursprünglich anfordert.
Genaueres auch hier in RFC 2616, Abschnitt 14:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.htmlNaja, und genaueres zum Aufbau eines HTTP Request Header findest du in RFC 2616, Abschnitt 5:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.htmlEin Header sieht normalerweise ein bisschen komplizierter aus als bei meinen Experimenten. Mein Opera unter Windows hat zum Beispiel dies gesendet (meine Experimente waren ja komplizierter, als ich sie dargestellt hab; da mein Opera unter Windows mir die Icons anzeigt, was ich wusste, und mein Opera unter Linux sie mir nicht anzeigt, war ich unter Windows, bin auf die Forumsseite gegangen und habe mit einem Netzwerkbeobachtungsprogramm (OPAN) geschaut, was genau für einen Header mein Opera an den Server gesandt hat, von dem ich ja wusste, dass der Server damit einverstanden ist und das Bild zurücksendet, um den Fehler zu diagnostizieren):
GET /board/YaBBImages/home.gif HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) Opera 7.11 [en]
Host: www.windowspage.net
Accept: text/html, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: en
Accept-Charset: windows-1252, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Referer: http://www.windowspage.net/cgi-bin/board/YaBB.pl?num=1070100717
If-Modified-Since: Tue, 22 Jul 2003 16:42:52 GMT
If-None-Match: "37c0ec-e6-3f1d698c"
Cookie: WPYaBBusername=einheitlix; WPYaBBpassword=*censored*
Cookie2: $Version=1
Connection: Keep-Alive, TE
TE: deflate, gzip, chunked, identity, trailers
Mein kodiertes Passwort da habe ich mal zensiert, muss ja nicht jeder für mich posten können, der weiß wie er was damit anfangen kann