パケットキャプチャをしよう ③ (TCP)
前回まで
①データリンク層、②ネットワーク層と解析してきたので、この回ではトランスポート層のTCPを解析していきます。
TCP(Transmission Control Protocol)
TCPは、「送信元ポート番号」、「宛先ポート番号」、「シーケンス番号」、「確認応答番号」、「データオフセット」、「予約」、「コントロールフラグ」、「ウィンドウサイズ」、「チェックサム」、「緊急ポインタ」、「オプション」、「パディング」により構成されている。
Source Port(送信元ポート番号)について
送信元ポートは16ビットで構成されており、送信元のポート番号を示す。
ポート番号は大きく3つに分けられており、
となっている。(より詳細なポート番号は省きます。)
図では、「Source Port : 443」と表されているので、送信元ポート番号は、System Ports内の443番を使用していることがわかる。
また、System Portsの443番はHTTPSを表しているので、HTTPSを使用していることがわかる。
Distination Port(宛先ポート番号)について
宛先ポート番号は16ビットで構成されており、宛先のポート番号を示す。
図では、「Destination Port : 50000台の値」と表されていたので、Dynamic and Private Portsを使用していることがわかる。
Sequence Number(シーケンス番号)について
シーケンス番号は32ビットで構成されており、TCPのセグメントを分裂させて送信している時に、分裂したデータを元に戻す時に使用する。
シーケンス番号は、「0」や「1」のような定まった数値ではなく、OSがランダムに決めた値をシーケンス番号として与えている。
図では、「Sequence number : 328272」と表されている。
Aknowledgment number(応答確認番号)について
応答確認番号は32ビットで構成されており、TCPのセグメントが分裂して送られてきたと時に、次に送信してもらいたいセグメントの番号を示す。
※応答確認番号は、ACKフラグが「1」の時のみ有効となる。
図では、「Aknowledgment number : 157708」となっており、シーケンス番号と比較するとかなり数値が違いますが、今のところ理由はわかりません。(わかり次第更新します)
Header Length(データオフセット)について
データオフセットは4ビットで構成されており、TCPのヘッダの長さを示す。
※ネットワーク層のIPv4のHeader Lengthと同じ動きをする。
図では、「0101 . . . . = Header Length : 20 bytes (5) 」と表されており、TCPのヘッダが20バイトということがわかる。
Flags(コントロールフラグ)について
コントロールフラグは現在使用されていない予約のビットを含めると12ビットで構成されており、意味が設定されているビットに「1」が入ると、意味に沿った機能が動く。
- Reserved:将来使用するための拡張用ビット
- Nonce:実験用のビット
- Congestion Window Reduced(CWR):TCPのふくそう通知に使用される
- ECN-Echo:CWRと同様にTCPのふくそう通知に使用される。
- Urgent:緊急に処理したいデータが含まれている時に使用される。
- Acknowledgment:確認応答番号が有効の時に使用される。
- Push:受信したデータをアプリケーションに渡すときに使用される。
- Reset:TCPコネクションを強制的に切りたい時に使用される。
- Syn:TCPコネクションを確立したい時に使用される。
- FIN:TCPコネクションを切りたい時に使用される。
図では、「Acknoeledgment」のビットのみが「1」となっているので、確認応答を返していることがわかる。
Window size(ウィンドウサイズ)について
ウィンドウサイズは16ビットで構成されており、受信側のPCやサーバーが受け取れるデータの大きさを示す。
Checksum(チェックサム)について
チェックサムは16ビットで構成されており、TCPが壊れていないかや、欠損部分が無いか等を調べるために使用される。
Urgent pointer(緊急ポインタ)について
緊急ポインタは16ビットで構成されており、コントロールフラグのUrgentが「1」の時のみ有効となる。
緊急で処理を行いたいデータが存在するときに、データがどこの場所にあるかを示す。
まとめ
今回、①データリンク層、②ネットワーク層、③トランスポート層とTCPまでのパケットを見てきたことにより、今日、私たちが当たり前のように使用しているインターネットの中に多くの知識が詰め込まれていることが少し理解できたと思う。
今後、機会があればIPv6やDNS、UDP、HTTPS、SSL(TLS)などの様々なプロトコルをWiresharkでキャプチャを行い、パケットの解析を行いたいと思いました。