お初にお目にかかります。 ひよこエンジニアtakei-hです。ぴよぴよ。 さて、amo-k先輩からの課題にやっと手を付けました! さっそく本題です!

1.telnetを用いてHTTPリクエストを発行せよ!

telnetを用いて、僕らの味方「Yahoo!知恵袋」のトップページに対してHTTPリクエスト(GETメソッド)を発行してみましょう。 (リクエストメソッドにはGETのほかにPOSTなどがありますが、今回はGETのみを取り上げます)
telnet chiebukuro.yahoo.co.jp 80[エンター]
GET / HTTP/1.0[エンター][エンター]
上記のコマンドをコンソールで実行すると、webサーバからのレスポンスとして、以下に示されているヘッダーとメッセージボディ(Yahoo!知恵袋のHTML文書)が返ってきます。
HTTP/1.1 200 OK
Date: Wed, 07 Oct 2009 08:15:40 GMT
P3P: policyref="http://privacy.yahoo.co.jp/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Set-Cookie: Ychie=KcPItpD.70E_gAXpes9zvcGQj_3HKkwW; path=/; domain=.chiebukuro.yahoo.co.jp
Cache-Control: private
Connection: close
Content-Type: text/html; charset=UTF-8

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="description" content="あなたの疑問や知りたいことを、他の参加者に質問できるYahoo!知恵袋。疑問に思っていることを質問したり、知っている事柄についての質問に回答することで、参加している方がお互いに知恵や知識を教えあい、分かち合えるQ&Aサイト">
<title>Yahoo!知恵袋</title>
・・・後は省略・・・
ヘッダーには、「HTTP/1.1 200 OK」つまりHTTP/1.1というプロトコルでステータスコード200(取得成功)でメッセージがOKとなっています。ヘッダーとメッセージボディの間に改行(\r\n)が入っています。 このように、HTTPセッションでは本来の目的であるHTML文書のやりとりの前に、様々な情報をお互いやり取りしているのですね。 そして、そのやり取りの手順(プロトコル)がHTTP(HyperText Transfer Protocol)なのですね!

2.任意の言語を用いてTCPソケットを利用したHTTPクライアントを作成せよ!

昔のhonda-h先輩はrubyで実装されていたので、私はpythonで実装してみました。GETで取得して、メッセージボディのみを表示してみましょう。
#!/usr/local/bin/python2.4

import socket

host = "chiebukuro.yahoo.co.jp"
port = 80
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
 sock.connect((host, port))
 sock.send("GET / HTTP/1.0\r\n\r\n")
 msg = ""
 while True:
  data = sock.recv(8192)
  if not data:
   break
  msg += data
 for m in msg.split("\r\n\r\n")[1:]:
  print m
 sock.close()
except socket.error, e:
 print "Error: %s" % e
TCPソケットを使うために
 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
でソケットオブジェクトをつくり、問題1と同じようにGETメソッドを送っています。
 sock.send("GET / HTTP/1.0\r\n\r\n")
そうすると、問題1と同じようなレスポンスが返ってきます。そのレスポンスを"\r\n\r\n"を区切りとしてヘッダーとメッセージボディを切り分けています。 HTTPサーバもクライアントも根本はTCPソケットの張り合い。つまりTCPソケットを制するものは、HTTPを制す!ですね! 勉強になりました! ついでに、pythonにはHTTPクライアントライブラリhttplibがあり、とっても簡単にhttpクライアントが作れるようになっています。
#!/usr/local/bin/python2.4

import httplib

h = httplib.HTTPConnection('chiebukuro.yahoo.co.jp')
h.request('GET', '/')
r = h.getresponse()
if r.status == httplib.OK:
 data = r.read()
 print data