Expand description
TCP/IPネットワークスタック。
Link 層(イーサネット)から Application 層(DNS/HTTP)までを自前実装する。
各層の設計方針・API境界の事前条件検証は spec/DESIGN.md §2「ネットワークスタック
アーキテクチャ」を参照。カーネル外部(アプリ)との境界は crate::kernel::net_stack
の TcpIpStack::web_get/web_post/web_get_binary に一本化されている。
Modules§
- addr_
util 🔒 - arp 🔒
- arp_
cache 🔒 - dhcp 🔒
- dns 🔒
- eth_
frame 🔒 - L2: Ethernet フレームの解析と振り分け(純粋ロジック)。
- http 🔒
- icmp 🔒
- reassembly 🔒
- TCP 受信側の順序外セグメント再構成バッファ。
- tcp 🔒
- tcp_
state 🔒 - tx_
queue 🔒 - L2: NIC 送信キューの容量判定(純粋ロジック)。
- udp 🔒
- udp_
queue 🔒
Structs§
- ArpEntry
- Dhcp
AckInfo 🔒 - Dhcp
Lease - DnsCache
Entry 🔒 - Http
GetResult - Https
GetResult - Network
State - NicTx
Entry 🔒 - Ping
Reply - TcpSocket 🔒
- UdpDatagram
Enums§
Constants§
- ARP_
CACHE_ 🔒SIZE - DNS_
CACHE_ 🔒NAME_ MAX - DNS_
CACHE_ 🔒SIZE - DNS 解決結果キャッシュ(host→IP, TTL付き)。画像が多いページで同一ホストを 何度も引く無駄をなくし、UDP RX キューの競合を激減させる。
- DNS_
CACHE_ 🔒TTL_ MS - DNS_
SRC_ 🔒PORT_ BASE - DNS_
SRC_ 🔒PORT_ RANGE - NIC_
TX_ 🔒MAX_ PAYLOAD - NIC_
TX_ 🔒QUEUE_ SIZE - 【2026-07-30】NIC 送信キューの長さ。
- TCP_
SOCKET_ 🔒TABLE_ SIZE - UDP_
RX_ 🔒QUEUE_ SIZE
Statics§
- ARP_
CACHE 🔒 - ARP_
NEG_ 🔒IP - ARP 解決の否定キャッシュ(直近に解決失敗した宛先1件のみ)。DNS の複数回リトライ (3回 × 複数サーバ) が同じ到達不能な next-hop に対して毎回 2秒のブロッキング ARP 再試行を払うのを防ぐ。ゲートウェイ/DNSサーバが応答しない環境では、これが 無いと「DNSがタイムアウトするまでに十数秒かかる」原因になる。
- ARP_
NEG_ 🔒UNTIL_ MS - ARP_
TICK 🔒 - DHCP_
ASYNC_ 🔒ATTEMPT - DHCP_
ASYNC_ 🔒DEADLINE_ TICK - DHCP_
ASYNC_ 🔒REBINDING - DHCP_
ASYNC_ 🔒RENEWING - DHCP_
ASYNC_ 🔒STATE - DHCP_
ASYNC_ 🔒XID - DHCP_
AUTO_ 🔒PENDING - DHCP_
LAST_ 🔒AUTO_ ATTEMPT_ TICK - DHCP_
LEASE_ 🔒START_ TICK - DHCP_
NEXT_ 🔒RENEW_ TICK - DHCP_
RENEW_ 🔒STAGE - DHCP_
SERVICE_ 🔒TICK - DHCP_
XID 🔒 - DNS_
CACHE 🔒 - DNS_
SRC_ 🔒PORT - DNS クエリの送信元ポート。クエリ毎にローテーションして並行クエリ間の 応答取り違えを防ぐ(固定ポートだと複数スレッドの DNS が同一ポートを共有し、 txid 不一致で応答を読み捨ててタイムアウトしていた)。アトミック化でレース解消。
- DNS_
TXID 🔒 - DNS トランザクション ID。複数スレッド(browser_loader / img_load)が同時に DNS を引くため、非アトミックだと採番が衝突して応答照合を誤る。アトミック化。
- HTTPS_
ATTEMPT_ 🔒ORDINAL - 【2026-07-25診断用】同一ブート内でのHTTPS接続の通し番号。「ブート後 最初の接続(メインHTML取得)は成功しやすいが、直後に連続する2件目 以降(CSS/フォント取得)は失敗しやすい」という今回のセッションで 繰り返し観測された現象が、接続の「順序」自体に起因するのか、単なる ホスト依存かを定量的に切り分けるための通し番号カウンタ。
- LAST_
PING_ 🔒REPLY - NET_
LOCK 🔒 - NET_
STATE 🔒 - NIC_
TX_ 🔒DROPS - 【2026-07-26診断】送信キュー枯渇で捨てたパケットの累計。
送信失敗は呼び出し側の大半が
let _ =で戻り値を捨てるため不可視だった。 - NIC_
TX_ 🔒QUEUE - NIC_
TX_ 🔒TICK - PING_
SEQ 🔒 - TCP_
EPHEMERAL_ 🔒PORT - TCP_
SOCKETS 🔒 - UDP_
RX_ 🔒QUEUE - UDP_
RX_ 🔒TICK
Functions§
- arp_
cache_ lines - build_
arp_ request - build_
dns_ query - build_
icmp_ echo_ request - dhcp_
acquire - dhcp_
release - dhcp_
start_ async - dhcp_
status_ line - dhcp_
tick - dns_
cache_ 🔒insert - DNS キャッシュへ登録(既存の同名/期限切れ/最古エントリを上書き)。
- dns_
cache_ 🔒lookup - DNS キャッシュを検索。期限内の有効エントリがあれば IP を返す。
- dns_
query_ a_ via_ udp - extract_
http_ body_ binary - force_
release_ locks - format_
ipv4 - format_
mac - get_
next_ hop_ ip - http_
get_ binary - http_
get_ real - http_
post_ real - http_
request_ real - 任意メソッド(GET/POST/PUT/DELETE/PATCH 等)の平文 HTTP リクエスト。 body が空かつ GET/HEAD/DELETE 等の場合は Content-Type / Content-Length を付けない。 メソッドは呼び出し側で検証済み(英大文字トークン)である前提。 CRLF はエスケープ事故を避けるためバイト値で組み立てる。
- https_
get_ real - ingest_
ethernet_ frame - ingest_
nic_ ethernet_ frame - ingest_
nic_ ipv4_ packet - init
- next_
dns_ 🔒src_ port - クエリ毎に DNS 送信元ポートを 1 つ進めて返す(53000..=53511 を循環)。アトミック。
- next_
dns_ 🔒txid - クエリ毎に DNS トランザクション ID を 1 つ進めて返す。アトミック。
- next_
https_ attempt_ ordinal - nic_
backend_ name - nic_
debug_ info - nic_
pop_ tx_ ipv4_ packet - nic_
take_ tx_ ipv4_ chunk - ntp_
query - ntp_
sync - parse_
dns_ a_ response - parse_
http_ response - parse_
http_ response_ bytes parse_http_responseのバイト保存版。ヘッダ部分は ASCII 前提で文字列化するが、 ボディはextract_http_body_binaryの chunked 復号をそのまま使い、ロスの無い 生バイト列で返す(画像/zip 等のバイナリダウンロード向け)。 戻り値: (status_code, reason, headers, body_bytes)- parse_
icmp_ echo_ reply_ ipv4 - parse_
ipv4 - parse_
mac - ping_
once_ real - register_
usb_ ethernet - self_
test 🔒 - send_
udp_ ipv4 - set_
dhcp_ auto_ pending - status
- status_
line - tcp_
close_ real - 【2026-08-05 検証済み・入れていない】ロック無しの「読むべきものがある」印。
- tcp_
connect_ real - tcp_
current_ snd_ seq - 現在の
snd_nxt(次に使われる送信シーケンス番号)を取得する。再送時に 「このデータを送った時点でのシーケンス番号」を正しく再利用するため、 呼び出し側がtcp_send_realの直前に取得しておく用途。 - tcp_
is_ socket_ closed - tcp_
recv_ peek_ nonempty - tcp_
recv_ real - tcp_
retransmit_ real - 【2026-07-24追加】
tcp_send_realが呼ばれる度に無条件でsnd_nxtを進めて しまうため、同一データを“再送“する目的でtcp_send_realを再度呼ぶと、 実際には既に進んだ(誤った)シーケンス番号で送信してしまい、相手側の TCP/TLSストリームを破壊するバグを発見した(kernel/tls.rsのTcpIoWrapper書き込み再送機構で使用)。この関数はsnd_nxtを一切 変更せず、呼び出し元が明示的に指定したseqのみで再送パケットを 組み立てて送出する(正しいTCP再送のセマンティクス)。 - tcp_
send_ real - tcp_
socket_ lines - transmit_
nic_ ethernet_ frame - transmit_
nic_ ipv4_ packet - udp_
queue_ lines - udp_
recv_ next_ datagram - udp_
recv_ next_ line