[WEB]TCPとHTTPリクエスト

WEB

どうも。つじけ(tsujikenzo)です。このシリーズでは「ノンプログラマーによるWeb周り基礎学習」について全4回でお送りします。今日は3回目です。

前回のおさらい

前回は、「ネットワークとHTTP」 ということで、ネットワークは7つの層で説明がつくということをご紹介しました。「WEBサイトを閲覧する」ということは、さまざまな通信の決まりごとの上に成り立っていましたね。

[WEB]ネットワークとHTTP
どうも。つじけ(tsujikenzo)です。このシリーズでは「ノンプログラマーによるWeb周り基礎学習」について全4回でお送りします。今日は2回目です。前回のおさらい前回は、「ノンプログラマーによるWeb周り基礎学習」 ということで...

今回は、「TCPとHTTPリクエスト」 をお届けします。

TCPによるブラウザとWebサーバのやりとり

身近な「サーバとクライアント」と言えば、「ブラウザとWebサーバ」ですが、この2つはネットワークのさまざまな通信の決まりごとに則ってやりとりをしています。

ブラウザとWebサーバの通信では、「信頼性のある通信を保証しよう」というTCP(Transmission Contorol Protocol)を使用しています。(第4層トランスポート層のきまりごとでしたね。)

今回は、TCPによる「ブラウザとWebサーバ」のやりとりを、Javaを使ってパソコン内で検証してみます。

ソケットライブラリ

TCPでは、データを双方向にやりとりするための出入口として「ソケット」を準備します。「ソケット」の作成は、まさに「ソケットライブラリ」で行います。これは、ほとんどのOS上のプログラミング言語で扱えるライブラリです。

今回は[8001番]というポート番号を持ったソケットを作成します。サーバ側(TcpServer.java)のコードはこのようになります。

new ServerSocket(8001);

一方で、クライアント側(TcpClient.java)のコードはこのようになります。

new Socket("localhost", 8001);

お互いにソケットのインスタンスを生成して、インスタンスの受け渡しを行います。※コードの全文は後ほどご紹介します。

サーバとクライアントのファイルのやりとり

今回のサンプルコードでは、サーバとクライアントで、テキストファイルのやりとりをします。(テキストファイルに意味はありません。)

コマンドプロンプトを2つ起動し、それぞれ、「TcpServer.java」と「TcpClient.java」を起動します。

//サーバ側
C:ファイルパス>java TcpServer
//クライアント側
C:ファイルパス>java TcpClient

それぞれのフォルダに「server_recv.txt」と「client_recv.txt」が作成されていれば成功です。

TCPクライアントをWebブラウザに変更する

それでは、いままでTCPクライアントだったクライアント側を、Webブラウザに交代してもらいましょう。

サーバが保存した「server_recv.txt」の中身をみると、「Webブラウザが通信の際にサーバになにを送っているのか」を確認できます。

Webブラウザからサーバへのアクセスの方法は、プログラミングではなく、ブラウザのアドレスバーに以下を入力します。

http://localhost:8001/index.html

接続が成功して、通信が完了すると、「server_recv.txt」が保存されますので、中身を確認してみます。

1: GET /index.html HTTP/1.1
2: Host: localhost:8001
3: User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36
4: Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
5: Accept-Language: ja,en-US;q=0.9,en;q=0.8
6: Accept-Encoding: gzip, deflate
7: Connection: keep-alive

これが、「HTTPリクエスト」の正体です。

HTTPリクエスト

HTTPの仕様書であるRFC7230では、クライアントから送信されるサーバへのメッセージ処理は、このように定められています。
– リクエストライン
– リクエストヘッダ
– 空行(CR+LF)
– メッセージボディ(もしあれば)

前節で取得したHTTPリクエストも、このような構造になっています。

//リクエストライン
1: GET /index.html HTTP/1.1
//リクエストヘッダ
2: Host: localhost:8001
3: User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36
4: Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
5: Accept-Language: ja,en-US;q=0.9,en;q=0.8
6: Accept-Encoding: gzip, deflate
7: Connection: keep-alive
//空行
8:
//ボディ無し

リクエストライン

リクエストラインは3つの要素から成り立っています。
– GET・・・メソッド(クライアントからサーバに対するリクエストの方法)
– /index.html・・・リクエストURI(リクエスト対象のリソース)
– HTTP/1.1・・・プロトコルバージョン(この通信で使うHTTPのバージョン)

リクエストURIの「/index.html」は「最初に訪問する住所」のようなイメージがあるのではないでしょうか。プロトコルバージョンの「HTTP/1.1」も、とくに深掘りする必要はないかもしれません。

残りの「GETメソッド」については、次回お届けします。

まとめ

以上で、「TCPとHTTPリクエスト」 ということで、TCPにおけるサーバとクライアントのファイルのやりとりを再現してみました。保存されたテキストを確認することで、HTTPリクエストの中身が明らかになりました。

また、HTTPリクエストの1行目に書かれている、「リクエストライン」もご紹介しました。

次回は、「HTTPレスポンスとGET/POSTリクエスト」 をお届けします。

このシリーズの目次

  1. [WEB]ノンプログラマーによるWeb周り基礎学習
  2. [WEB]ネットワークとHTTP
  3. [WEB]TCPとHTTPリクエスト
  4. [WEB]HTTPレスポンスとGET/POSTリクエスト
タイトルとURLをコピーしました