メインコンテンツへスキップ

自分で作るTCP/IPスタック入門!第1回:EthernetとARPの基礎を徹底解説

·1 分
2025/03 プログラミング ネットワーク TCP/IP 教育 開発

自分で作るTCP/IPスタック入門!第1回:EthernetとARPの基礎を徹底解説

引用元:https://news.ycombinator.com/item?id=43250093

cihangir 2025-03-04T10:52:02

昔、Cでユーザースペースのネットワークスタックを作ろうとしたんだけど、TUNインターフェースを通して生のパケットを処理するところまではできた。IPアドレスやルートの設定ができるシェルもあって、mbufとsk_bufを参考にした構造体でネットワークパケットを保持してる。UDPの実装までは進んだけど、TCPの実装はやる気がなくて。興味があったらこちらからどうぞ:
https://github.com/cakturk/unet

VWWHFSfQ 2025-03-04T13:48:45

昔、純粋なbashでpcap/tcpdumpのパーサーを書いたことがあるんだ。プログラムを書くのがそれしかできなかったからね。もちろん、超遅くて脆弱なものだったけど、実際に動いたし、ちょっと楽しかった。今でもそのコードがあったらいいなぁ。

jpfr 2025-03-06T20:28:04

多くの組み込みデバイスはlwipのTCP/IP実装を使ってる。lwipの’POSIX port’も同じことをしていて、TUN/TAPデバイスから生のEthernetバイトを受け取るんだ。
https://github.com/lwip-tcpip/lwip/blob/master/contrib/ports

zoobab 2025-03-04T09:49:52

最小のLinuxカーネルをTCP/IPスタックなしでコンパイルすると約400KB。TCP/IPスタックを追加すると800KBになる。温度を送信するプロジェクトのために、ユーザースペースの小さなCプログラムでUDPメッセージに値を送ったら、スペースと複雑さが減ったよ。

chamomeal 2025-03-04T14:33:43

そりゃすごい!何も知らない私からすると、それってTCP/IPの部分がカーネル全体の半分のソースコードってことじゃないよね?

tga_d 2025-03-04T19:12:09

Linuxカーネルのソースコードの大半はデバイスドライバーだよ。ほとんどはデフォルトでカーネルイメージに含まれてないけど、必要に応じてカーネルモジュールとして使えるんだ。たとえば、サーモスタットはわざわざ珍しいゲームコントローラーのドライバーは必要ないから、そんなのは入ってないけど、必要なら追加できる。

miohtama 2025-03-04T14:04:19

IPスタックってなんでそんなに大きいの?400KBのバイナリってかなりのコード量だよ。大規模サーバー用に最適化されてるの?

hylaride 2025-03-04T14:37:38

現代のTCP/IPスタックには、アンチスプーフィングやパフォーマンス向上(ハードウェアネットワークカードとのゼロコピー統合など)、攻撃防止策(SYNフラッドやシーケンス番号のランダム化など)、さまざまなハードウェアオフロード(チェックサムオフロードなどを行うネットワークカードも含む)、IPv6(もともとIPSecの統合も要求されていた)や低レイヤー2プロトコルのサポートが含まれているよ。

kbouck 2025-03-04T08:15:26

ARPを無効にすると、同じネットワークに同じIPを持つサーバーをグループ化できる!もし、ルーティングフロントエンドがMACアドレスでバックエンドサーバーのネットワークインターフェースにパケットを転送できるなら、バックエンドサーバーは自分自身を宛先として認識して、IPを入れ替えてクライアントに直接返事するんだ(ルーティングフロントエンドには戻らない)。同じことは、ARPを無効にすることなく、ループバックインターフェースに共通IPアドレスをエイリアスとして追加することで実現できる。このトリックは90年代から00年代にかけてIBMのWebSphereソフトウェアロードバランサーで使われてた。

citrin_ru 2025-03-04T08:45:28

>このトリックは90年代から00年代にかけてIBMのWebSphereソフトウェアロードバランサーで使われてた。”Cisco IOS SLB”も似たように動作することができるよ。各サーバーにループバックのエイリアスとして追加された仮想IPを使うんだ。一般的なL3バランシングに比べて、IPパケットのヘッダーを再構成する必要が無いという利点がある。

lmz 2025-03-09T02:45:21

DSR(Direct Server Return)って呼ばれてるよ。詳しいことはブログ見てみて。

Bluecobra 2025-03-04T13:23:54

ARPを無効にすれば同じIPのサーバーをグループで使えるけど、スイッチはMACアドレスを学習しないからパケットが全ポートにバンバン流れちゃうんだ。ちゃんとしたVLAN作った方がいいよ!

10000truths 2025-03-04T14:29:46

ARPはLANデバイスのためのもので、L2スイッチはARPを使わずに送信元MACで転送テーブルを作れるんだよ。行き先MACが分からない時はブロードキャストするけど、全デバイスが1回はフレームを送ると止まる。

mannyv 2025-03-04T19:48:03

F5にはARPプロキシ設定があって、それ使えば手間が省けるけど、DHCPが壊れることがあるから注意してね。

KeplerBoy 2025-03-04T08:20:10

低レベルのことをやるならdpdkをいじるのもアリだよ。ARPはデフォルトで無効になってるし。

globular-toast 2025-03-04T06:58:34

Pythonで似たようなことをやったよ。多分、あんまりうまく書けてないけど。ICMPでインターネットホストにpingも飛ばせた。自分のはノートに収まってるから、全体を把握しやすいかな。でも、TCPのとこは難しすぎて興味が薄れた。プログラミングに興味あるならやってみると面白いよ!

intrasight 2025-03-04T14:06:44

昔、原発でクライアントサイドの開発をしてた時、TCP/IPの経験で雇われたんだ。でも、そのプラントのコンピュータにはTCP/IPスタックがなかったから、作らなきゃいけなかった。

kasajian 2025-03-04T15:06:51

記事の最初で、「dmacとsmacは自己説明的なフィールド」って書いてあるけど、これで分からない人は読む気失うよね。

howerj 2025-03-04T15:24:02

完全な引用は「dmacとsmacは自己説明的なフィールドで、通信する当事者のMACアドレスを含んでいる」って感じ。記事はネットワークスタックを作る内容だから、ちょっとは知識がある人が読むべきかな。

petee 2025-03-04T15:23:47

多分、更新されたんだと思うけど、次の文ではちゃんと説明があったよ。「通信する当事者のMACアドレスを含んでいる」って書いてある。

もっとコメントを表示(1)
dang 2025-03-04T05:48:52

関連:
“Let’s code a TCP/IP stack (2016)”
-
https://news.ycombinator.com/item?id=27654182
- 2021年6月(コメント49件)
“Let’s code a TCP/IP stack, 1: Ethernet & ARP (2016)”
-
https://news.ycombinator.com/item?id=17316487
- 2018年6月(コメント47件)
“Let’s Code a TCP/IP Stack: TCP Retransmission”
-
https://news.ycombinator.com/item?id=14701199
- 2017年7月(コメント30件)
“Let’s code a TCP/IP stack, 1: Ethernet and ARP”
-
https://news.ycombinator.com/item?id=11234229
- 2016年3月(コメント49件)

p4bl0 2025-03-04T07:06:15

著者がARP解決テストに使った10.0.0.4ってIPアドレスの出どころが分からないんだけど、これは何のアドレスなの?作ったEthernetデバイスがアクセスする偽のデバイス?それとも実際に著者のネットワークにあるデバイスなの? 誰か教えて。

globular-toast 2025-03-04T07:28:06

記事に書かれてないけど、著者はインターフェース初期化時にこれをハードコーディングしてるよ:
>“https://github.com/saminiir/level-ip/blob/e9ceb08f01a5499b85…”
TAPデバイスはソフトウェアでエミュレートされたEthernetリンクみたいなもので、パケットを送るとユーザーレベルのプログラムに直接届く。プログラムがどのIPアドレスを持つかやARPの返信をどうするか決めるのはプログラム次第。通常こういうことはOSが扱うから、インターフェースにIPアドレスを追加するにはroot権限が必要なんだよね。

p4bl0 2025-03-04T07:33:57

ああ、ありがとう!記事でこれを明示しなかったのは大きな見落としだと思う。ARPの部分が重要な情報が抜けてるみたいに感じられるし、実は前の部分が何かを欠いているんだよね。再度ありがとう!

mannyv 2025-03-04T19:50:55

確か、ARPは自分のローカルセグメントでしか機能しないよね。ルーターが自分のアドレスを埋めてパケットを転送するんだ。それとRARPもあって、これは‘ネットワーク’に自分のIPアドレスを尋ねる方法の一つだよ。RARPが現実でまだ使えるかは知らないけど。

revskill 2025-03-04T05:18:11

記事の非仮定的説明が非常に良いと思った。よくできてる。

記事一覧へ

海外テックの反応まとめ
著者
海外テックの反応まとめ
暇つぶしがてらに読むだけで海外のテックニュースに詳しくなれるまとめサイトです。