HTTP/2ーTCPコネクションを確立する手法－午後

応用情報技術者令和元年秋期 午後問5

ファイル：2019r01a_ap_pm_qs.pdf　午後問5

システム性能要件
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/9ac1e4a7-df1e-b764-ed74-86124c4a4e42.png)

１、
**・ソケット**
TCP/IPでサーバーとブラウザが通信を行うために必要なのは、サーバーのソケットです。
サーバーのソケットが最大許す数が設定されています。本題には、128に設定されている。

**ポートとソケット**
プログラムでポートを用いて通信するには、一般にソケットと呼ばれる仕組みを用いる（ソケットはBSDで開発されたため、特にBSDソケットとも呼ぶ）。ソケットとは通信の端点のことで、2台のコンピュータが通信しているとき、その通信路の両端、すなわちそれぞれのコンピュータにソケットが存在する。また、ソケットのインターフェースやソケットを扱うライブラリプログラムも併せてソケットと呼ぶこともある。

ソケットを用いた通信は、以下のような手順で行われる。

サーバ機でサービスを提供するプログラムは、ソケットを作成し、サービス固有のポート番号をソケットに割り当て (bind)、待ち行列を用意し (listen)、クライアントからの接続を待ち受ける (accept)。
サービスを利用するクライアントプログラムは、ソケットを作成し、そのソケットの通信相手としてサーバ機のIPアドレスとサービスのポート番号を指定し (connect)、接続を行う。
サーバは接続を受け付けると、新規にソケットを作成し、そのソケットとクライアントとの間に通信を確立する。もとのソケットは再び待ち受けに戻る（これは、会社などで、受付係が来客を担当者に引き合わせ、その後また受付に戻るようなものと考えることができる）。
通信が終わると、2.および3.で作成したソケットは破棄される。
これらの手順に沿って通信を行うプログラムの形式は、ソケットプログラミングと呼ばれる。


２、
①ブラウザが採用する複数のファイルを並行して受信するための手法は？
ファイルとごでTCPコネクションを確立して転送する
→
同時に複数のTCPコネクションを確立する手法

３、**TCP コネクション確立**
TCPコネクション確立流れは、(※3ウェイハンドシェイク）
・PCから、サーバーに、Synパケットを送信する
・サーバーから、PCに、Syn/Ackを返信する
・PCから、サーバーに、Ackを送信する
・TCPコネクションが成立になりました。

※パケットとは、データ通信する上で細かく分割されたデータのこと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/58371d93-1754-0ae9-7dd0-03dfaba3d4dc.png)

※なぜ３ウェイハンドシェイクが必要とは、
１．送っていい？
２．いいよー！送っていい？
３．いいよー！

の3回のやり取りを経て、接続を確立します。
その際にやり取りするデータは

１．「SYN=1、ACK=0」のパケット　　→SYN　　　 PCからサーバーへ
２．「SYN=1、ACK=1」のパケット　　→SYN/ACK　サーバーからPCへ
３．「SYN=0、ACK=1」のパケット　　→ACK　　　 PCからサーバーへ

です。

すごい疑問ですが、なぜ２つステップで済ませないですかね。。。。
１．「SYN=1、ACK=1」のパケット　　→SYN　　　 PCからサーバーへ　送ってもらっていいよ、送っていい？
２．「SYN=1、ACK=1」のパケット　　→SYN/ACK　サーバーからPCへ　いいよ！

あえて考えると、多分
・１と２はPCからサーバーへ送れるかを確認するため、
・２と３はサーバーからPCへ送れるかを確認するため
ですかね。
１は例え、PCに送ってもらってもいいよ言われても、本当に？は、サーバー側が知らないから。その３ステップにより、両側が送受信がしていたので、接続が確立できたということですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/9acd7ed8-c1cf-b2f2-1fd5-9e0df35ed659.png)


３、では、SYN/ACKなどとは、いったい何でしょうか？
みんながTCPコネクションの通信を制御するフラグでございます。

TCPはヘッダ情報に6つの「フラグ」と呼ばれる情報を持っている（図1）。このフラグはTCPが相手との通信を確実に行なうための制御情報で、通信手順のチェックや送信データの受信確認などに利用される。各フラグは1ビットの情報で、そのフラグの持つ意味を通知したい場合に“1”が設定され、そうでなければ“0”となる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/8308ab5a-ebec-e2ab-8254-2f8c52810f6c.png)

**「URG（Urgent）」フラグ**は、すぐ処理したい緊急データがあることを示すフラグだ。緊急データがある場合にURGフラグに「1」を設定するとともに、緊急ポインタに緊急データのサイズが設定される。

**2つ目の「ACK（Acknowledge）」フラグ**は、確認応答番号（以下ACK番号、38ページ参照）が有効であることを示すフラグである。TCPの通信が開始される際の最初のパケットは「0 」が設定されるが、その後は通信が終了するまで「1」が設定され、ヘッダ内に有効なACK番号が設定される。

**3つ目の「PSH（Push）」フラグ**は、受信したデータをすみやかに上位アプリケーションに引き渡すように要求するためのフラグである。おもに受信側の処理を促し応答性能を上げるために利用される。Telnetで文字を送信する際は、PSHに1が設定されている。

**4つ目の「RST（Reset）」フラグ**は、TCPコネクションを強制的に切断する（初期状態に戻す）場合に使用するフラグである。Webブラウザでファイルをダウンロード中に停止ボタンを押したり、Webブラウザそのものを終了させたりした場合に、RSTを1に設定したパケットが送信される。

**5つ目の「SYN（Synchronize ）」フラグ**は、TCPのコネクションを確立するために使用するフラグである。

**最後の「FIN（Finish）」フラグ**は、TCPコネクションを終了する正常な手続きの中で使われるフラグである。


４、ポート
よく使うのは、
25  SMTP
110 POP
443 HTTPS(SSL通信)
80　HTTP

５、一つのTCPコネクション以内における、ブラウザとサーバ間の通信
まずは、単純ですが、１つのTCPコネクションで複数ファイルをサーバーに要求できること。

HTTP/1.1 over TLSを用いて通信＋ブラウザのHTTPパイプラインがOFFとすると、
ファイルは順次１つずつサーバーへ要求し取得する
本題の画像より見えますね：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/c57d9c49-c203-af54-8020-132958d3a6e4.png)


**本題の通信全体図**
現状利用しているHTTP/1.1 over TLSでは、
・複数のTCPコネクションが確立している
・ただ、TCP確立用のソケットがサーバで枯渇（こかつ）しているので、いっぱいTCP確立要求が断られている
・一方、一つのTCPの中で、ファイルが順次一つずつ要求し取得している
ので、画像が多い画面では、遅くなって、システム性能に満たられませんでした。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/a75f2206-78b1-6a13-9f45-b7309777b4ff.png)


**解決方法**
HTTP/2を採用するとのこと。
HTTP/2では、一つのTCPコネクションを用いて、複数ファイルを並行して受信するストリームという仕組みなど、多くの新しい仕組みが追加されていること。

では、節約されているお時間は、前のファイルの受信完了待ちのお時間ですね。

**改善後、HTTP/2によって、新システムが許容できる最大の同時アクセス数は幾つになるかとは**
一つのアクセスで一つのTCPコネクションが足りるので、基本は、TCPコネクションできる数と同じですね。ソケット数は最大128ですので、最大の同時アクセス数は128になりますね。

ですけど、CPU、メモリ、ネットワーク回線、ディスクのI/O負荷率も注意しなきゃくいけないですね。本題では、３２ユーザは
CPU　10％
メモリ　10％
ネットワーク回線　10％
ディスクのI/O負荷率　20％
ので、32ユーザー　X　５＝160ユーザーでもサーバーが耐えられますね。
ですが、サーバーソケットは最大128ですので、128ユーザは正しいですね。





参照：



ポートとソケット
https://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%BC%E3%83%88_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF)

TCP コネクション確立
https://milestone-of-se.nesuke.com/nw-basic/grasp-nw/example-of-http/

パケット
https://wa3.i-3-i.info/word176.html

３ウェイハンドシェイク
https://wa3.i-3-i.info/word15428.html


通信を制御するフラグ
https://ascii.jp/elem/000/000/619/619702/

ポート番号とは何ですか
https://jp.globalsign.com/support/faq/345.html