CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

HTTP実装(3)

イメージ 1

HTTP実装のつづき
さてボード上でHTTPサーバの走らせて、WEBブラウザのアドレス欄に
「http://192.168.0.10/」を入力すると・・

ボードのシリアルモニタでTCPコネクション完了、「G」コマンド受信、HTML送信・・
とまで行くのですがブラウザのステータスラインに「ページhttp://192.168.0.10/を開いています..」が表示されたままロゴマークがくるくる回転するばかりで一向に文字列が表示されません。
データはブラウザまで来ているはずなのですが。

そこでHTTPの仕組みをもう一度調べてみると「1回のセッション毎に接続をサーバー側から切る」という記述がありました。
HTMLデータをサーバーから受信したクライアントはACKを返しますが、そのあとサーバーはFIN+ACKを返して一方的に切断するようです。
たしかにあるサイトのサーバのポート80番に誰かがコネクションしたまま占有していたらほかの人がそのページ見られませんよね?(ここらへんの理解が正しいか、かなり不安)

ところが現在実装してあるTCP処理では接続も切断もすべてクライアント側主導であって、サーバー側から切断するというフェーズがありません。
正しいかどうか判りませんがデータ送信後にクライアントからACKを受けたらFINを返す処理を追加しました。

これで動作させてみると・・今度はうまく行きました。ブラウザに「HTTP_TEST」が表示されます。
おそらくブラウザは受信したデータをバッファリングしておいてセッション終了とともに一気に描画したようです。
これは何かの設定で変わるのか、プロトコルの実装が悪いのか良くわかりませんがとりあえず動作OKです。

上の実験画面では少し色気を出して以下のようなレスポンスを送っています。

"HTTP/1.0 200 OK\n"
"Connection: close\n"
"Content-type: text/html"
"\n"
"<html>\n"
"<body>\n"
"<font face=\"HG丸ゴシックM-PRO\" size=\"7\" color=\"#0000ff\"><I>\n"
"HTTPによるブラウザ表示テスト\n"
"</I></font>\n"
"</body>\n"
"</html>\n"

~あらら、この本文はHTMLタグを書くとそのまま表示に反映してしまうのか
 頭文字を全角文字に直しました