どうも。つじけ(tsujikenzo)です。このシリーズでは「ノンプログラマーによるWeb周り基礎学習」について全4回でお送りします。今日は3回目です。
前回のおさらい
前回は、「ネットワークとHTTP」 ということで、ネットワークは7つの層で説明がつくということをご紹介しました。「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リクエスト」 をお届けします。