🐈

HTTP理解する為のWeb基本知識 for Beginner

2023/06/23に公開

フロントエンジニアのhttp学習記録

HTTPとは?

ハイパーテキスト転送プロトコル (Hypertext Transfer Protocol, HTTP) は HTML などのハイパーメディア文書を転送するためのアプリケーション層プロトコルです。

?What the hell!! アプリケーション層プロトコル?
いきなりHTTPから入るのは無理だったのかなインタネットから追っていかなければ〜〜〜😢

??なぜインタネットから追っていく? httpはインタネット上で動作するから!!

1.インタネット上でのデータ通信

パソコン2台はどうやって通信するのか? 
ケーブルで繋がっていれはケーブルでデータが移動するだろう、、、

ケーブルで繋がっていないと? インターネットがあればできるけど、、、🤨


インタネットは人工衛星や海底ケーブルを通過するなど数多くの中間サーバを通してデータを転送することだが、、、どうやって?安全にデータを送る事ができる?

それを知るためにはインターネットプロトコルというIP から!! 💢

2.IP(Internet Protocol )

インタネットで海外の友達にメッセージを送るときはIPアドレスが必要!


IP
伝達したいデータ
送信側のIPアドレス
受信側のIPアドレス
「IPパケット」 へ格納し、そのIPパケットを送信する通信規約!!

しかし、IPには下記のような問題があり、

  • 受信側のServerが死んでいても、送信側ではデータを送ってします。向こうで受け取ったかはわからない。
  • 中間サーバが死んでいたら、パケットを失うこともある。
  • パケット送出手順を指定するがその到達は保証しない。

上記の問題を解決してくれるのがTCPというもの

3. TCP(Transmission Control Protocol)

IPの限界をTCPがどうやって解決してくれるかを調べる前に
プロトコルスタック(Protocol Stack)を理解する必要がある😥やれやれ

プロトコルスタックとは、ある通信方式を実現するために、低い階層から順にプロトコル(通信規約)を積み重ねて全体として機能するようにした組み合わせのこと。各プロトコルを処理する機器やソフトウェアの積み重ねを指すこともある。

例え、アメリカに住んでいる友達に Chatアプリケーションで「hello]を送るとしたら、

の順番でカプセル化を行い「hello]が送出される。

※TCPは TCPセグメント単位でデータを転送する。
TCPセグメントには送信側PORT,受信側PORT,制御フラグ,シーケンス番号,確認応答番号,ウィンドウサイズ などが格納される。

TCPは下記の特徴で信頼性の高いプロトコルと言われる

  • コネクション型の通信:通信開始前に相手との間で仮想的な通信路を確保する
    ※3way handshake 確立後データを送る
    1.client → SYN=1:接続を開始していい? → server
    2.client ← SYN=1 ACK=1:OK!こちらからも接続を開始していい? ← sever
    3.clinet → SYN=0 ACK=1:OK! → server

  • 順序保証:シーケンス番号と確認応答番号により各セグメントの順序が分かり、伝送経路の都合で順序が入れ替わってしまった場合でも受信側で本来の順序通りに組み立て直すことができる。

  • データ伝送保証:伝送途上でセグメントが欠落したりペイロードが誤っている場合は再送要求を送ることができる。

しかし、信頼性が高いメリットがあればデメリットもある。3way Handsahke後データを送るとしたら時間がかかるし、パッケとに色んな情報を載せたらサイズも大きくなる。TCPは速度の最適化するのに限界がある。速度を優先にしたい場合使うのがUDP!!

4.UDP(User Datagram Protocol)

TCPと同様にトランスポート層にあるUDPは
コネクションレス型通信(通信開始前に相手との間で、事前のやり取りなし)
TCPのように3way handshake ❌
確認応答 ❌
順序制御 ❌
再送制御 ❌
TCPに比べるとほとんど何もしないプロトコル!!。
TCPと比べて信頼性が高くはないが、速さやリアルタイム性を求める通信に使用される!!
UDPパケットには 送信元ポート、宛先ポート、データ長、チェックサムが入る。

5.PORT

同時に2つ以上のServerにRequestする場合はどうなる?
例え、友達とGameしながら、Zoomで会話して、Amazonで買い物もするとしたら

TCP/IPパケットを見てみよう!!

TCPセグメントにPort情報が入る事が分かる。
IPアドレスが目的地のServerの番地だとしたら、Portは目的地のアプリケション番地だと理解すればいい。

これによってパソコン内のプログラム別にパケットを送る事ができる。

Port番号

  • 0 ~ 65535 割り当てる事が可能
  • 0 ~ 1023 : ウェルノウンポート(通信方式(プロトコル)により登録されている)、使用しない方がいい
    代表的なポート番号
  • FTP :20,21
  • TELNET:23
  • HTTP :80
  • HTTPS:443

6.DNS(Domain Name System)

インタネットで通信する為にはIPアドレスが必要で、該当するWebサーバのIPアドレスを記憶しておく必要がある。
しかし、IPアドレスを覚えるのは難しい😓
また、覚えたとしても何らかの理由でIPが変更されることもある🤨

それで利用するのがDNS!!
 IPアドレスを人間がわかりやすい形式の住所(ドメイン名)で登録しておいて、必要に応じてドメイン名をIPアドレスに変換してくれるシステム

7.URI(Uniform Resource Identifier)

RFC 3986:

  • Uniform : 統一
  • Resource: 資源
  • Identifier:職別子

抽象的または物理的なリソースを識別するためのコンパクトな文字列のことである。また、一定の書式によってリソース(資源)を指し示す識別子である。1998年8月に RFC 2396 として規定され、2005年1月に RFC 3986 として改定された。URI はUniform Resource Locator (URL) の考え方を拡張したものである。

URL:Uniform Resource Locator

リソースの「場所」を識別する。ネットワーク内の位置を示してリソースを同定する。

URN:Uniform Resource Name

リソースの「名前」を識別する。もしネットワーク上にリソースが無くなっても、一意で永続的な識別を行えるようにする。

2001年URLとURNとはすべてURIと呼ばれることになった。

URL表現

scheme://[userinfo@]host[:port][/path][?query][#fragment]

  • スキーム(scheme):protocole情報(例:http、https、ftp、、、)
  • ユーザー情報(userInfo):ユーザー情報、認証情報、ほとんど使用しない。
  • ホスト(host):ホスト名、ドメイン名 。省略することはできない。
  • ポート(port):スキームのデフォルトポートであれば省略可能。http:80, https:443
  • パス(path):リソースpath、階層的に構成されたデータが含まれ、階層は/で区切る。
  • クエリ(query):?の区切り文字から始まる。key=value構造、&で追加可能。
  • フラグメント(fragment):#の区切り文字から始まる。html内bookmarkで使用。

Web Browser request 流れ

ブラウザのアドレス欄にURLを有力するとDNSサーバでIPを取得、PortNoが分かれば
HTTP リクエストメッセジーを作成する。

Web BrowserがHTTP メッセジーを作成するとClientのSOCKETライブラリーを通じてTCP/IPへ送る。
TCP/IPではHTTPメッセジーをパケットで包みネットワークインターフェース層に送る。その後インタネットを流れ受信先Serverまで流れる。

参考

https://developer.mozilla.org/ja/docs/Web/HTTP
https://e-words.jp/w/プロトコルスタック.html
https://www.infraexpert.com/study/tcpip.html
https://e-words.jp/w/TCPセグメント.html#:~:text=TCPセグメントとは、TCP,格納されて運ばれる。
https://cloudapi.kddi-web.com/magazine/what-is-udp#:~:text=「UDP(User Datagram Protocol),通信規格」のことです。

Discussion