「体験しながら学ぶ ネットワーク技術入門」を読んで学んだこと


## はじめに
[レバウェル開発部アドベントカレンダー](https://qiita.com/advent-calendar/2024/levwell)23日目になります。

普段、私たちがインターネットを利用する際には、ネットワーク技術の仕組みが背後で動いています。しかし、その仕組みを意識する機会はあまり多くありません。

私自身、資格試験の勉強を通じてネットワークに関する基本的な知識は得ていましたが、それが実際どのように動作しているのか、具体的なイメージをつかむ機会はありませんでした。また、普段の業務ではネットワーク関連に触れることが少なく、学んだ知識を活かす場面も限られていました。

今回は、[「体験しながら学ぶ ネットワーク技術入門」](https://www.sbcr.jp/product/4815618599/)を読んで学んだことをご紹介したいと思います。

![9784815618599-2-468x596.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945788/36f41ba1-5150-dc25-3a24-7cbc287c5a72.jpeg)

## 「体験しながら学ぶ ネットワーク技術入門」

### 本書の構成
第１章「検証環境を構築しよう」
第２章「レイヤー2プロトコルを知ろう」
第３章「レイヤー3プロトコルを知ろう」
第４章「レイヤー4プロトコルを知ろう」
第５章「レイヤー7プロトコルを知ろう」
第６章「総仕上げ」

検証環境を構築するのに必要なツールはWSL(WindowsOSの場合)、docker、[tinet](https://github.com/tinynetwork/tinet)です。
セットアップ用のスクリプトや各章のtinet設定ファイルが用意されているため、簡単に環境構築ができます。

※↓検証環境を可視化した図
![spec_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945788/4dc8f489-7816-64d2-f216-686748c3b01e.png)
| 名称 |  |
|:---------|:------------|
| rt       | ルーター        |
| sv       | サーバー      |
| lb       | ロードバランサー        |
| sw       | スイッチ        |
| fw       | ファイアウォール        |
| ns       | ネームサーバー        |
| cl       | クライアント        |

本記事では、一例として、第４章「レイヤー4プロトコルを知ろう」にある、TCPセグメントをキャプチャして中身を見る方法をご紹介します。
### TCPセグメントをキャプチャしてみよう
cl1 から ns1 にあるファイル(/var/tmp/10KB)をダウンロードして、そのパケットを ns1 でキャプチャします。

### コマンドを実行する
ns1 をTCPサーバーにして、TCPセグメントを待ち受けます。
ns1 にログインして、以下の```nc```コマンドを実行します。宛先ポート番号が 60000 番のTCPセグメントを待ち受けます。
```
root@ns1:/var/tmp# nc -l 60000 < /var/tmp/10KB
```

別タブで```ss```コマンドを実行します。```nc```コマンドのプロセスが 60000 番でパケットを待ち受けていることが確認できます。
```
root@ns1:/# ss -nltp
State          Recv-Q         Send-Q                 Local Address:Port                    Peer Address:Port         Process
LISTEN         0              1                            0.0.0.0:60000                        0.0.0.0:*             users:(("nc",pid=127,fd=3))
LISTEN         0              256                          0.0.0.0:53                           0.0.0.0:*             users:(("unbound",pid=108,fd=4))
LISTEN         0              256                        127.0.0.1:8953                         0.0.0.0:*             users:(("unbound",pid=108,fd=5))
```

同じく ns1 で```tcpdump```コマンドを実行します。インターフェースが net0 であり、宛先ポート番号(or 送信元ポート番号)が 60000 番であるTCPセグメントをキャプチャし、 tcp.pcapng というファイル名で書き出します。
```
root@ns1:/# tcpdump -i net0 -w /tmp/tinet/tcp.pcapng tcp port 60000
tcpdump: listening on net0, link-type EN10MB (Ethernet), capture size 262144 bytes
```


cl1 で ns1 のファイルをダウンロードします。cl1 にログインして、```nc```コマンドを実行します。
ns1(10.1.2.53) のポート 60000 番に接続します。接続完了後、```nc```コマンドを終了します。

```
root@cl1:/var/tmp# nc -v 10.1.2.53 60000 > /dev/null
Connection to 10.1.2.53 60000 port [tcp/*] succeeded!
```

### Wiresharkでパケットの中身を確認
[Wireshark](https://www.wireshark.org/)はGUIでパケットをキャプチャしたり、キャプチャしたパケットをフィルターしたり解析することができるツールです。
画像のように、パケットやその中身を見ることができます。

![スクリーンショット 2024-12-19 050627.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945788/8d3aae5f-ae0f-cdbd-4974-3a0dc72f2e60.png)

#### 黄枠で囲まれた部分
最初のパケットの内容です。
TCPヘッダーが送信元ポート番号や宛先ポート番号など様々なフィールドで構成されていることが分かります。
#### 青枠で囲まれた部分
接続開始フェーズです。SYN → SYN/ACK → ACK の3ウェイハンドシェイクから始まります。
画像のinfo列でフラグが確認できます。
#### 赤枠で囲まれた部分
接続確立フェーズです。3ウェイハンドシェイクが終わると、アプリケーションデータのやり取りを行います。
画像のTCP Segment Len列でTCPペイロードの長さを確認すると、10KBのアプリケーションデータを1448[^1]バイトずつに分割しており、それを送信していることが分かります。

#### 緑枠で囲まれた部分
接続終了フェーズです。cl1 で```nc```コマンドを終了した際に、FIN/ACKパケットを送信します。
3ウェイハンドシェイクで接続終了処理を行っていることが確認できました。


## おわりに
本記事では、ネットワーク環境に関する基本的な操作を取り上げました。実際に自分でネットワーク環境を構築するのは大変な作業ですが、PC一つで仮想ネットワーク環境を構築できる点が非常に便利だと感じました。

記事内には掲載できなかったものの、書籍内の図や表は非常に分かりやすく、実行したコマンドがどのように動作しているのか理解しやすい内容でした。また、ネットワーク構築の実践的な雰囲気を感じられる点も良かったです。

さらに、ネットワーク関連のコマンドには、これまであまり目にしたことのないものが多く、もっと深く学びたいという意欲が湧きました。これを機に、ネットワークの知識をさらに広げていきたいと思います。


[^1]: 1448バイト* = 1500バイト(MTU) - 20バイト(IPヘッダー) - 20バイト(TCPヘッダー) - 12バイト(タイムスタンプ)