はじめに
HTTPとTCPの違いについて、TCP/IPにおいてのレイヤーが違うことしかわからない状態で、HTTPサーバーを立てようとしたらわからないことだらけで詰んだ。根本的なHTTPとTCPの違いについて調査した内容をまとめる。
HTTPとTCP
結論から言うと、HTTPとTCPの違いは、TCP/IP階層モデルの層の違いである。
TCP/IP階層モデルで比較
インターネットを実現しているTCP/IP階層モデルにおいて、HTTPは第4層のアプリケーション層であり、TCPは第3層のトランスポート層にである。
TCP/IPでは、リクエストを送信する際に、上位層(ここではアプリケーション層)から下位層(ここではトランスポート層に向けてデータが流れていく。
また、1つ層が下がるごとに各層で通信に必要となるヘッダーが上位層から送られてきたデータに付加される。
つまり、HTTPリクエストを送信する手順は以下の通りだ。
- HTTPで単に送りたいデータを作成する
- 下位層であるTCPにデータを渡し、TCPヘッダーが付加される、今度はこれがデータとなる
- さらに下位層であるネットワーク層にデータを渡し、IPヘッダーが付加される、またこれがデータとなる
- さらに下位層であるデータリンク層にデータを渡し、イーサネットヘッダが付加される、これが最終的なデータとなる
- ネットワークを通してデータを送信する
参考: How Does the Internet Work?
実装で比較
TCP/IP階層モデルで比較の説明からわかるように、HTTPはTCPがベースとして存在している。
また、HTTP通信を実装しようと思ったら、HTTPライブラリを使うこともできる。
つまりより理解を深めようと思えば、HTTPライブラリを使用せずに、HTTPのライブラリ内部で行なってくれているTCPベースから実装することも可能であるということだ。TCPベースから実装する場合、もしHTTPライブラリが、HTTPの古いバージョンであるHTTP0.9に対応していなくても自分で実装することが可能である。
コマンドで比較
curlコマンドでhttpリクエストを送信することができる
また、netcatコマンドでTCPのパケットを送信することができる。
curlコマンドはHTTPのRFC通りに実装されている。
HTTP0.9に対応していないため、HTTP0.9でリクエストを送信するにはTCPレベルのnetcatコマンドで送信する必要がある。
以下はHTTPのバージョンによるリクエストを比較した記事である。
また、curlコマンドとnetcatコマンドの通信内容を比較したのが以下の記事である。
おわりに
HTTPとTCPの違いについてまとめた。別物だということがわかった。