ネットワークスペシャリスト - SE娘の剣 -

左門至峰によるネットワークスペシャリストの試験対策サイトです。勉強方法、合格体験談、合格のコツ、過去問解説、基礎知識などの紹介します。

TCP(Transmission Control Protocol)

1.TCP(Transmission Control Protocol)

女性直立



TCPはTransmission Control Protocolとう名前のとおり、伝送(Transmission)を”制御(Control)”するプロトコルである。
▼TCPの特徴
・コネクション型通信。
・再送制御、順序制御などの機能を持つ。
(順序制御はTCPヘッダの中のSequence numberで管理しているので確認してほしい)
・ネットワークスペシャリスト試験の過去問では、TCPのフロー制御に関して、「確認応答がない場合は再送処理によって
データ回復を行う(H18NW午前 問21)」と述べている。
・その分、UDPに比べて速度が遅い。ストリーミングなどの高速な通信にはUDPが向く。

▼具体的なアプリケーション
・UDPの例
 DNS(問合せ)、SNMP、DHCP、TFTP、NTPなど
※ストリーム配信でもUDPを使うが、使用するプロトコルは様々である

・TCPの例
HTTP、SMTP、POP3、SSH、FTP、Telnet、DNS(ゾーン転送)など

▼フレームを見てみよう
tcp
UDPと比べると、その違いは一目瞭然である。

nw.seeeko.com

▼その他
TCPの通信では、ひっきりなしにACKを返している。1パケット(1500バイト)に対し、1ACKを返すようなイメージである。ただ実際にはスライディングウィンドウの機能により、ウィンドウサイズ分をまとめてACKを返すので、4~5パケットで1つのACKを返しているのが実際であろう。
これに対し、UDPではACKをまったく返さない。だからTCP/IPのオーバヘッドが少ない。

◆ポイント
・TCPとUDPの違いを意識してTCPを理解する。
・再送制御、順序制御を行っている。(どうやって実現しているかを確認しよう)

2.TCPのヘッダフォーマット

フレームフォーマットを確認しましょう。
その前に、今はどの部分を見ているのか、L2のイーサネットフレームから順に理解しておきましょう。
frame

項目 長さ(bit) 説明
1 送信元ポート番号 16  
2 宛先ポート番号 16  
3 シーケンス番号 32 ・0から始まるわけではなく、コネクション確立時に乱数を用いて決定される。
・取りうる値は、32ビットなので、0~2の32乗-1。これにより、パケットの順番を制御す。
4 確認応答番号 32 どのデータまでを受け取ったかを示す
5 データオフセット 4 TCPヘッダの長さを示す
6 予約 6 将来の拡張のために予約されている
7 フラグ 6 ・順にURG,ACK,PSH,RST,SYN,FINフラグがある。
・URG(Urgent)は緊急を示す。緊急で処理すべきパケットの場合は、URGフラグを1にする。
・ACKとSYNは3ウェイハンドシェイクで利用するから有名ですよね。
・RESETは強制終了で、IDSなどでTCP通信を強制切断する際に利用するフラグ。
・FINは3ウェイハンドシェイクを終了させるときに利用する。
8 ウィンドウサイズ 16 ウィンドウサイズを指定
9 チェックサム 16  
10 緊急(Urgent)ポインタ 16 URGフラグがONの場合、ここに緊急データのサイズを指定できる。
11 オプション 可変 省略可
12 Padding 可変 詰め物。省略可

毎度のことですが、Wiresharkでキャプチャして確認しましょう。以下は、ブラウザからyahoo!のサイトを見た場合のキャプチャです。実際のデータを見ると、より理解が深まることでしょう。
tcp

TCPのヘッダに関して、ネットワークスペシャリスト試験の過去問があるのでチャレンジしていただきたい。
はっきり言って難しい。とても午前問題とは思えない。

過去問(H19NW午前 問30)
問30 TCPのデータ転送に関する記述のうち、適切なものはどれか。

ア ウィンドウサイズはACKを待たずに送信できるデータ量で、ネットワークごとに一定の値が決められている。
イ 順序番号は送信データストリーム中のセグメントのオクテット位置を示し、0~2の32乗-1の値をとる。
ウ 制御ビットフィールドの緊急フラグが有意のセグメントは、そのセグメントを緊急に送るべきであることを表すが、緊急データの長さを指定することはできない。
エ パケットの重複や順序誤りなどのエラーを検出するためにチェックサムの計算を行う。






 正解:イ

3.3ウェイハンドシェイク

まず問題。

過去問(H22NW午前Ⅱ問14)
問14 TCPコネクション確立方式である3ウェイハンドシェイクを表す図はどれか。
sway






正解はそれほど難しくないでしょう。
参考までに、実際のパケットを見てみましょう。
3wayハンドシェーク
これは、192.168.1.1のPCからWebサーバ(203.0.113.1)にgazou.pngファイルを取得したHTTP通信です。
4行目のHTTP通信の前に、3wayハンドシェークが行われていることが分かります。

前置きが長くなりましたが、さきほどの答えはアです。

女性ハテナ


さて、なぜこんな面倒なことをするの?
3ウェイハンドシェイクをしなくても、通信はできますよね。
現にUDPはこれがありません。
かなりざっくりいうと、信頼性を向上させるためである。
TCPはUDPと違ってコネクション型なので、通信の前にコネクションを確立する。これが3ウェイハンドシェイクのフェーズである。セキュリティを高めるためにやっているわけではない。パケットをキャプチャすればこれらの情報を簡単に入手できるからだ(セキュリティの意味がないわけではない)。
一方的な通信を受け入れるのではなく、両者で確認メッセージを送り、しかも番号の整合性もチェックすることで、不正な通信を排除し、整合性の高い通信を可能にする。

◆シーケンス番号と確認応答番号
試験にあまり細かいのは出ませんが、両者の例は以下です。
①→ SYN
 シーケンス番号 1000 確認応答番号 0 (Length 0)
※確認応答番号は存在しないと考えた方がいい。ただ、値としては0が入る。
②← SYN+ACK
 シーケンス番号 2000 確認応答番号 1001 (Length 0)
③→ ACK
 シーケンス番号 1001 確認応答番号 2001 (Length 0)

(1)シーケンス番号
各端末(PCやサーバ)が、自分で管理しているパケットの通番です。送信側と受信側で異なる番号を使います。ただ、基本的には受け取ったパケットの確認応答番号がそのままシーケンス番号になります。
※なお,シーケンス番号は0からではなく、ランダムな値から開始されることがあります。
(2)確認応答番号
受け取ったシーケンス番号にLengthを加えたものになる。意味は、「次に送信するシーケンス番号を伝える」ことである。
・3ウェイハンドシェイクが終わった後の実際の通信では、以下のようにLengthの値が各番号に付加される。
①→ ACK 
 シーケンス番号 1100 確認応答番号 2100 (Length 5)
②← ACK 
 シーケンス番号 2100 確認応答番号 1105 (Length 4)
③→ ACK
 シーケンス番号 1105 確認応答番号 2104 (Length 6)

ただ、3ウェイハンドシェイクのLengthは0であるが、1を加える。なので、「受信したシーケンス番号+1」が確認応答番号です。
では問題。

以下のa,b,cに当てはまる数字を答えよ。
キャプチャ
※①のSYNの確認応答番号は存在しないと考えた方がいい。ただ、何かを入れないとデータにならないので、値としては0が入る。






さて、正解は以下である。
a:1001,b:1001,c:20013way
偽装したパケットであれば、シーケンス番号を知らないから、正しい③のACKを返せない。

ネットワークスペシャリスト試験の過去問(R1NW午後Ⅱ問2)をみてみましょう。
DoS攻撃の内容になっているので、若干仕組みは異なりますが、キーワードは同じです。

②SYNパケットの情報などを基に計算した値を、TCPヘッダ中の【 イ 】番号にセットして、SYN/ACKパケットを返送する。
③受信したACKパケットの情報などを基に計算し、TCPヘッダ中の【 ウ 】番号の値が計算値に【 エ 】を加えた値と一致するかどうかをチェックする。






▼解答例 
イですが、確認応答番号は、受信したシーケンス番号+1と決められています。自ら決めることはできません。今回は、自分で計算した値を入れているので、シーケンス番号です。

イ:シーケンス  ウ:確認応答  エ:1

◆セッションの終了
女性腕組み



たしかTCPの場合、接続の開始だけでなく、接続を終了するときも同じような処理をするんですよね?
そうですね。
過去問(H19秋SW午後1問1)を見てみましょう。
このように、FIN、ACK、FIN、ACKの流れでコネクションを終了します。
ネットワークスペシャリスト_3ウエイハンドシェーク

実際には、①FIN+ACK、②ACK、③FIN+ACK、④ACKの4段階で送られます。
具体的にみていきましょう。サーバでは、通信が完了すると、PCに対してセッションを終了していいかというパケット(FIN+ACK)を送ります(①)。PCでは、通信を受け取ったことを了承するACKを送ります(②)。次に、PCからもサーバに対してセッションを終了するパケット(FIN+ACK)を送ります(③)。サーバからの応答(ACK)が届き(④)、セッションが終了します。

以下は、Wiresharkのパケットです。サーバからのデータ通信が終わった後、サーバからFIN、ACKパケットが送られ、終了処理が始まります。
aaa

補足ですが、終了処理にはFINとRST(RESETの意味)の2つがあります。
①FIN
 正常に終了する。3ウェイハンドシェイクの手順を踏んで確認応答も行う。
②RST
 強制終了。確認応答を行わない。RSTを受信したホストは、その段階でコネクション情報を破棄する。たとえば、ブラウザを「X」で閉じてもRSTを送る。

4.TCPのスライディングウィンドウ

女性指差し
・TCPの通信高速化を実現する技術
・まず、TCPの通信ではバッファをする必要がある。
相手に送信きちんとできない(確認応答が無い)場合には再送する必要があり、送信データはバッファに保存しておく。また受信データもアプリケーションに渡し終わるまではバッファをする。
・確認応答を都度実施していると遅くなるので、ウィンドウサイズ分だけまとめて確認応答をする。それまでは連続して送信する。これにより、TCP/IPのオーバーヘッドを少なくして高速化することができる。
・過去問ではTCPヘッダ中のウィンドウサイズの説明として「受信側からの確認応答を待たずに、データを続けて送信できるかどうかの判断に使用される(H21春SC午前2問15)」と述べられている。
・スライディングウィンドウの言葉は、バッファは一つ確認応答が来たら削除し、次の新しいバッファを利用できる。????。こんなイメージ。
・ただ実際には、これが今の高速化技術としていえるかというと疑問である。WAN最適化装置ではもっと画期的な方法で高速化している。

5.HTTP(TCP)のフレーム

HTTP(TCP)のフレームを示す。
今回はGoogleにアクセスした。

以下の赤線部分のみ見てもらえばいい。
1.Ethernet ・・・ イーサネットヘッダ
(1)宛先MACアドレス ・・・ 00:0d:02:xx:xx:xx
(2)送信元MACアドレス ・・・ 00:19:d2:xx:xx:xx
(3)タイプ ・・・ IP (ここから次はIPフレームであることを示している)
2.Internet Protocol ・・・ IPヘッダ
(1)プロトコル ・・・ TCP
(2)送信元IPアドレス ・・・ 192.168.1.111
(3)宛先IPアドレス ・・・ 66.249.89.99
3.Transmisson Control Protocol ・・・ TCPヘッダ
(1)送信元ポート番号 ・・・ 3192 (1024番以上)
(2)あて先ポート番号 ・・・ 80
(3)シーケンス番号 ・・・ TCP固有
HTTPのパケット