**Traceroute – 基本的な理解**

| 目的 | ネットワーク経路と遅延時間の確認 |
|------|-----------------------------------|
| 主な機能 | <ul><li>パケットが通過するホップ(ルーター)を列挙</li><li>各ホップへの往復時間(RTT)を測定</li></ul> |

### 使い方の概要

1. **コマンド実行**  
   - Windows: `tracert <ドメインまたはIP>`  
   - Linux/macOS: `traceroute <ドメインまたはIP>`

2. **結果の構成**  
```
 1  router1.example.com (192.0.2.1)  1.234 ms  1.210 ms  1.198 ms
 2  isp-gateway.example.net (203.0.113.5) 12.567 ms 12.543 ms 12.530 ms
 …
```

3. **情報の読み取り**  
   - **ホップ番号**: パケットが通過したルーター数。  
   - **ホスト名/IP**: 各ルーターの識別子。  
   - **RTT(ms)**: TTLごとに送信された3回分の往復時間。平均値・最大値を参考にする。

### 注意点

- 一部ネットワークでは ICMP/UDP の TTL‑Exceeded メッセージがブロックされ、`* * *` と表示されることがあります。  
- `traceroute` のデフォルト設定は TTL を 1 から増加させ、各ホップで 3 回ずつ送信します。  
  - オプションでパケット数やプロトコルを変更可能(例: `-m 30`, `-I` 等)。  
- 結果は「経路」の一部しか示さないため、完全なネットワークトポロジーではありません。

### 応用例

| シナリオ | 確認できること |
|----------|----------------|
| 接続遅延が大きい | 遅延が集中しているホップを特定 |
| パケットロス | `* * *` が多い箇所でルーターまたはファイアウォールの影響 |
| ルーティング変更 | 新旧経路の比較 |

---

**まとめ**

Traceroute は、ネットワークパスと遅延を可視化するためのシンプルかつ強力なツールです。  
正確に理解し、適切に解釈すれば、トラブルシューティングやネットワーク最適化に大いに役立ちます。

2026/04/06 12:40

**Traceroute – 基本的な理解** | 目的 | ネットワーク経路と遅延時間の確認 | |------|-----------------------------------| | 主な機能 | <ul><li>パケットが通過するホップ(ルーター)を列挙</li><li>各ホップへの往復時間(RTT)を測定</li></ul> | ### 使い方の概要 1. **コマンド実行** - Windows: `tracert <ドメインまたはIP>` - Linux/macOS: `traceroute <ドメインまたはIP>` 2. **結果の構成** ``` 1 router1.example.com (192.0.2.1) 1.234 ms 1.210 ms 1.198 ms 2 isp-gateway.example.net (203.0.113.5) 12.567 ms 12.543 ms 12.530 ms … ``` 3. **情報の読み取り** - **ホップ番号**: パケットが通過したルーター数。 - **ホスト名/IP**: 各ルーターの識別子。 - **RTT(ms)**: TTLごとに送信された3回分の往復時間。平均値・最大値を参考にする。 ### 注意点 - 一部ネットワークでは ICMP/UDP の TTL‑Exceeded メッセージがブロックされ、`* * *` と表示されることがあります。 - `traceroute` のデフォルト設定は TTL を 1 から増加させ、各ホップで 3 回ずつ送信します。 - オプションでパケット数やプロトコルを変更可能(例: `-m 30`, `-I` 等)。 - 結果は「経路」の一部しか示さないため、完全なネットワークトポロジーではありません。 ### 応用例 | シナリオ | 確認できること | |----------|----------------| | 接続遅延が大きい | 遅延が集中しているホップを特定 | | パケットロス | `* * *` が多い箇所でルーターまたはファイアウォールの影響 | | ルーティング変更 | 新旧経路の比較 | --- **まとめ** Traceroute は、ネットワークパスと遅延を可視化するためのシンプルかつ強力なツールです。 正確に理解し、適切に解釈すれば、トラブルシューティングやネットワーク最適化に大いに役立ちます。

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

著者は、標準の traceroute を模倣する純粋な Rust の traceroute ツールを構築しました。このツールは、TTL 値を段階的に低くしながら UDP プローブを送信し、ICMP 「Time Exceeded」応答を受信して各ホップを検出します。プローブは UDP ポート 33434 に送られ、パケットが宛先に到達すると ICMP 「Port Unreachable」(タイプ 3)が発生し、到着を示します。

socket2
クレートを使用して、プログラムは各プローブの TTL を設定し、応答を取得するために raw ICMP ソケット(
SOCK_RAW
ICMPV4
)を開きます。IP ヘッダー(12–15 バイト)から送信元アドレスを解析し、20 バイト目で ICMP タイプ(11 = Time‑Exceeded、3 = Destination Unreachable)を判定します。結果は
ProbeResult
列挙型(
Hop
Reached
Timeout
)に包まれ、各項目には
Instant::now()
で測定された経過時間が付与されます。TTL ごとに 3 本のプローブを送信し、ホップ IP が変わった時のみ出力を表示することで、1 ホップあたり 3 つの RTT 値が得られます。ループはプローブが
Reached
を返した瞬間に終了するため、ツールは最大 TTL 15 まで走ることはありません。
現在の実装では、システム traceroute が提供するいくつかの機能(DNS 逆引き、UDP ポートの増分指定、ICMP エコーモード
-I
、TCP モード
-T
、IPv6 サポート)が欠けています。要約では、一部のホップが
*
と表示される理由を説明しています―これは通常 ICMP レートリミットやファイアウォールによるものであり、特権要件(raw ソケットは root が必要、macOS では
IPPROTO_ICMP
を持つ unprivileged
SOCK_DGRAM
が使用可能)についても触れています。
著者は欠落している機能を追加し、WireGuard/Tailscale のコントロールプレーン内部を調査し、IPv6 サポートの拡張も検討しています。完全なソースコードは GitHub に公開されており、ネットワーク経路解析やカスタム診断に関心がある開発者向けに、軽量でオープンソースな代替手段として提供されています。

本文

Rustで書くトレーサウト – すっきり整理版


トレーサウトは何をするものか?

トレーサウトは、TTL(Time To Live)が減少していくパケットを送信し、ルータが TTL が 0 になったパケットをドロップした際に返される ICMP “Time Exceeded” メッセージを受信して経路を調べます。
各応答にはそのルータの IP アドレスが含まれているため、途中のすべてのホップを確認できます。


コアアイデア

  • TTL を指定した UDP パケットを送る。
  • 生 ICMP ソケットで応答を受信する。
  • 各 ICMP メッセージから送信元 IP を取り出し、ホップを判定する。

1 回のプローブ(サンプルコード)

use socket2::{Domain, Protocol, SockAddr, Socket, Type};
use std::mem::MaybeUninit;
use std::net::{Ipv4Addr, SocketAddrV4};
use std::time::{Duration, Instant};

fn probe(target: Ipv4Addr, ttl: u32) -> std::io::Result<ProbeResult> {
    // パケット送信用 UDP ソケット
    let send_sock = Socket::new(Domain::IPV4, Type::DGRAM, Some(Protocol::UDP))?;
    send_sock.set_ttl_v4(ttl)?;

    // ICMP 応答受信用生ソケット
    let recv_sock = Socket::new(
        Domain::IPV4,
        Type::from(libc::SOCK_RAW),
        Some(Protocol::ICMPV4),
    )?;
    recv_sock.set_read_timeout(Some(Duration::from_secs(2)))?;

    let dest = SockAddr::from(SocketAddrV4::new(target, 33434));
    let start = Instant::now();
    send_sock.send_to(&[0u8; 32], &dest)?;

    let mut buf = [MaybeUninit::<u8>::uninit(); 512];
    match recv_sock.recv(&mut buf) {
        Ok(n) => {
            let buf: &[u8] =
                unsafe { std::slice::from_raw_parts(buf.as_ptr() as *const u8, n) };
            if buf.len() >= 21 {
                let ip = Ipv4Addr::new(buf[12], buf[13], buf[14], buf[15]);
                let elapsed = start.elapsed();
                match buf[20] {
                    11 => Ok(ProbeResult::Hop(ip, elapsed)),
                    3 if ip == target => Ok(ProbeResult::Reached(ip, elapsed)),
                    3 => Ok(ProbeResult::Hop(ip, elapsed)),
                    _ => Ok(ProbeResult::Timeout),
                }
            } else {
                Ok(ProbeResult::Timeout)
            }
        }
        Err(_) => Ok(ProbeResult::Timeout),
    }
}
  • TTL – パケットが通過できるホップ数を制御します。
  • 生 ICMP ソケット – “Time Exceeded” を受信するために必要(
    sudo
    が必須)。
  • ポート 33434 – 従来のトレーサウトで使われる宛先ポート。サービスはリッスンしていないので、最終的にパケットを受け取った際に “Port Unreachable” を返します。

結果型

enum ProbeResult {
    Hop(Ipv4Addr, Duration),     // Type 11 – Time Exceeded
    Reached(Ipv4Addr, Duration), // Type 3 – Destination Unreachable
    Timeout,                     // タイムアウト(応答なし)
}

メインループ

プログラムは TTL ごとに 3 本のプローブ を送り、宛先に到達したら停止します。

fn main() -> std::io::Result<()> {
    let target = Ipv4Addr::new(8, 8, 8, 8); // Google DNS
    for ttl in 1..=15 {
        let mut reached = false;
        let mut last_ip: Option<Ipv4Addr> = None;
        print!("{:>2}  ", ttl);

        for _ in 0..3 { // 1 ホップあたり 3 本のプローブ
            match probe(target, ttl)? {
                ProbeResult::Hop(ip, rtt) | ProbeResult::Reached(ip, rtt) => {
                    if last_ip != Some(ip) {
                        print!("{}  ", ip);
                        last_ip = Some(ip);
                    }
                    print!("{:.3} ms  ", rtt.as_secs_f64() * 1000.0);
                }
                ProbeResult::Timeout => print!("*  "),
            }
        }

        println!();
        if reached { break; }
    }
    Ok(())
}

実行例

 1  <tailscale-ip>   5.713 ms  4.993 ms  4.739 ms
 2  <router-ip>      5.355 ms  5.082 ms  4.998 ms
 3  *  *  *
 4  *  *  *
 5  *  *  *
 6  *  *  *
 7  <isp-hop-1-ip>   15.658 ms 12.088 ms 11.362 ms
 8  72.14.223.26    11.978 ms 12.555 ms 12.344 ms
 9  *  *  *
10  8.8.8.8          14.246 ms 13.244 ms 12.892 ms

なぜ
sudo
が必要か

プログラムは 生 ICMP ソケット (

SOCK_RAW
) を開きます。
生ソケットはすべてのネットワークトラフィックを嗅ぎ取れるため、特権が要求されます。カーネルは root 権限を必要とするので
sudo
が必須です。一方、システムにインストールされた
traceroute
バイナリは set‑uid ビットで実行され、明示的な
sudo
を不要にしています。


実装がカバーしている機能

機能本物の tracerouteRust 版
TTL 増加✔︎✔︎
ICMP タイプ確認✔︎✔︎
RTT 計測✔︎✔︎
ホップあたり 3 プローブ✔︎✔︎
DNS リバースルックアップ(オプション)✔︎
プローブポートの増分✔︎✘ (固定 33434)
ICMP Echo モード (-I)✔︎
TCP モード (-T)✔︎
IPv6 対応✔︎

トレーサウトで得られない情報

  • 非対称経路 – ICMP 応答が別ルートを通ることがあります。
  • MPLS トンネル – 1 ホップにまとめて表示される、または全く見えなくなる場合があります。
  • ロードバランサの分岐 – 同一 TTL のプローブが異なるルータへ到達する可能性があります。
  • ICMP レートリミッティング – 応答がドロップされ、
    * * *
    が連続して表示されることがあります。

参考文献

  • Tailscale exit node の投稿(インスピレーション元)
  • WireGuard ホワイトペーパー
  • GitHub 上の Traceroute‑Rust ソースコード
  • Van Jacobson のオリジナルトレーサウト論文
  • RFC 792: ICMP
  • socket2 クレートドキュメント
  • pnet クレートドキュメント(よりイディオム的なパケット解析用)

楽しいトレースライフを!

同じ日のほかのニュース

一覧に戻る →

2026/04/09 0:40

私、macOS XをNintendo Wiiにポート(移植)いたしました。

## Japanese Translation: --- ## 改良された要約 Mac OS X 10.0(Cheetah)は、Nintendo Wii 上でネイティブに動作するようにポートされ、コンソールをキーボード/マウス入力と GUI サポート付きの完全機能型デスクトップへ変貌させました。プロジェクトのコアは、*ppcskel* をベースに最初から書き直されたカスタムブートローダーです。このブートローダーは、Wii の PowerPC 750CL CPU を起動し、メモリレイアウトを設定し、最小限のデバイスツリー(root → cpus → PowerPC,750; memory)を作成します。SD カードから XNU カーネルをロードし、実行中にカーネルバイナリをパッチ(MEM1/MEM2 用の BAT 設定と USB Gecko へのコンソール出力)し、制御を XNU に渡します。 ブートローダーが提供する主要ドライバーは次の通りです: - **SD‑カードドライバー**:Starlet MINI IPC コマンド(IPC_SDMMC_SIZE, READ, WRITE)を介して IOBlockStorageDevice を実装し、XNU が SD カードからルートファイルシステムをマウントできるようにします。 - **フレームバッファドライバー**:0x01700000 に RGB フレームバッファ(640×480 @ 16 bpp)を提供し、Wii のアナログテレビ出力用に YUV へ変換して Mac OS X GUI を実現します。 - **USB サポート**:PCI デバイスのニブ(NintendoWiiHollywoodPCIDevice)を作成し、AppleUSBOHCI をパッチして受け入れさせ、OHCI ドライバーからバイトスワップ処理を除去することでリバースレトルエンディアンハードウェアに対応し、USB キーボード/マウス機能をフル実装します。 ブートローダーは Apple Partition Map を解析し、起動可能なパーティションを一覧表示し、/chosen/memory‑map ノード経由でカーネル拡張を直接メモリにロードできるようにするため、改変されていない Mac OS X インストーラーパーティションからのインストールも可能です。必要なカーネル変更は最小限(BAT 設定、“hollywood” I/O ベース取得、フレームバッファキャッシュ整合性修正)で済み、その他すべてのドライバーはブートローダーが提供します。 この成果は、歴史的にサポートされていなかったプラットフォーム――Nintendo Wii――でも Mac OS X Cheetah をエンドツーエンドで動作させることを示し、ホビイストに低コストのレトロコンソールとして機能するデスクトップコンピュータを提供します。

2026/04/09 4:23

**ソフトウェア開発者のためのUSB:ユーザースペース USB ドライバー作成入門**

## Japanese Translation: ``` USB デバイスの操作は、libusb を使用してユーザー空間だけで完全に処理できるため、カーネルレベルのドライバ開発は不要です。 例として、Fastboot モード(VID 18d1 / PID 4ee0)にある Android フォンを挙げます。接続すると `lsusb` は「Google Inc. Nexus/Pixel Device (fastboot)」と表示し、カーネルドライバは付いていません。また、ベンダー固有クラスインターフェースが 2 つのバルクエンドポイントを公開します:コマンド送信用 OUT 0x02 とレスポンス受信用 IN 0x81。 libusb のホットプラグコールバックはこのデバイスの到着を検出し、Fastboot コマンドを自動的に発行できます。典型的な手順は次のとおりです: 1. `libusb_control_transfer` を使用して GET_STATUS リクエストを送信します。2 バイトの応答はデバイスがセルフパワーであり、リモートウェイクアップをサポートしないことを示します。 2. GET_DESCRIPTOR リクエストを送信して完全なデバイスディスクリプタ(ベンダー/プロダクト ID、USB バージョン等)を取得します。 3. バルク OUT 0x02 を介して Fastboot コマンドを発行します(例:「getvar:version」を 64 バイトにパディング)。 デバイスは IN 0x81 で 4 文字のステータス(「OKAY」または「FAIL」)と任意のペイロードを返します。 同じユーザー空間アプローチは、バルク転送に依存する他の USB プロトコルにも適用できます。主な作業はカーネルコードを書く代わりにプロトコルロジックを実装することです。これにより OEM 向けドライバ開発が簡素化され、ブートローダーのテストが迅速化し、カーネルモジュールなしでカスタム USB デバイスの高速プロトタイピングやデバッグが可能になり、組込み開発者と広範な USB エコシステムに恩恵をもたらします。 ```

2026/04/08 17:53

**コードを読む前に実行しておくべき一般的な Git コマンド** - `git fetch --all` *リモートの全ブランチとタグを取得します。* - `git status` *現在のブランチと未コミットの変更点を確認します。* - `git checkout <branch>` *対象となる機能やバグ修正用ブランチに切り替えます。* - `git pull --rebase` *ローカルブランチを最新の upstream コミットで更新します。* - `git log --oneline --graph --decorate -5` *簡潔なコミット履歴を表示し、文脈を把握します。* - `git diff origin/<branch>..HEAD` *まだプッシュしていない変更点を確認します。* - `git rev-parse HEAD` *現在のコミットハッシュを取得(参照に便利)。* - `git tag --list` *利用可能なタグ一覧を表示し、バージョン管理に役立てます。* - `git show <commit>` *特定のコミットの詳細と差分を調べます。* これらのコマンドで、コードを掘り下げる前にリポジトリの状態を素早く把握できます。

## 日本語訳: 以下の文章を日本語に翻訳してください。 ### 修正版要約 この記事は、ソースファイルを検査する前にコードベースの簡易監査が隠れた健康リスクを明らかにできる方法を示しています。これは5つの簡潔な Git コマンドを実行することで達成されます。 1. `git log --format=format: --name-only --since="1 year ago" | sort | uniq -c | sort -nr | head -20` 過去 1 年間で最も変更頻度が高い上位 20 ファイルを一覧表示し、潜在的な「ドラッグ」スポット(高い変更率)をフラグ付けします。 2. `git shortlog -sn --no-merges` コミット数で貢献者をランク付けします。単一人物が 70 % 超を占める場合はバスファクターが低く、過去 6 ヶ月にその貢献者がいない場合は危機的状況を示唆します。 3. `git log -i -E --grep="fix|bug|broken" --name-only --format='' | sort | uniq -c | sort -nr | head -20` バグ関連コミットが最も多いファイルを特定し、変更率データと照合して最高リスクコードをピンポイントします。 4. `git log --format='%ad' --date=format:'%Y-%m' | sort | uniq -c` 月ごとのコミット数を表示し、活動の加速または減退(例:半月間のドロップ)が重要人物の離脱を示す可能性があります。 5. `git log --oneline --since="1 year ago" | grep -iE 'revert|hotfix|emergency|rollback'` リバートとホットフィックスの数をカウントします。頻繁なリバートはデプロイ/テストが不安定であることを示し、ゼロの場合は安定性またはコミットメッセージ不足を意味する可能性があります。 これらの指標(変更ホットスポット、バスファクター問題、バグクラスタ、プロジェクトモーメンタム、火災対策頻度)は、コード複雑度測定だけよりも欠陥予測精度が高いと示されています(Microsoft Research 2005)。記事はスクワッシュマージワークフローが著者データを歪めることを警告しています。最初の監査に1時間を費やした後、筆者は特定されたリスクスポットに対して週単位で詳細調査を計画しています。関連研究としてはエンジニアリングチーム速度、Vim 使用、レガシー Rails 監査、Rails `default_scope` が引用されています。この手法は開発者に迅速なコミット履歴ベースの診断を提供し、高リスクファイルへの詳細コードレビューを集中させることでバグ削減、チームレジリエンス、およびリリース信頼性の向上を実現します。

**Traceroute – 基本的な理解** | 目的 | ネットワーク経路と遅延時間の確認 | |------|-----------------------------------| | 主な機能 | <ul><li>パケットが通過するホップ(ルーター)を列挙</li><li>各ホップへの往復時間(RTT)を測定</li></ul> | ### 使い方の概要 1. **コマンド実行** - Windows: `tracert <ドメインまたはIP>` - Linux/macOS: `traceroute <ドメインまたはIP>` 2. **結果の構成** ``` 1 router1.example.com (192.0.2.1) 1.234 ms 1.210 ms 1.198 ms 2 isp-gateway.example.net (203.0.113.5) 12.567 ms 12.543 ms 12.530 ms … ``` 3. **情報の読み取り** - **ホップ番号**: パケットが通過したルーター数。 - **ホスト名/IP**: 各ルーターの識別子。 - **RTT(ms)**: TTLごとに送信された3回分の往復時間。平均値・最大値を参考にする。 ### 注意点 - 一部ネットワークでは ICMP/UDP の TTL‑Exceeded メッセージがブロックされ、`* * *` と表示されることがあります。 - `traceroute` のデフォルト設定は TTL を 1 から増加させ、各ホップで 3 回ずつ送信します。 - オプションでパケット数やプロトコルを変更可能(例: `-m 30`, `-I` 等)。 - 結果は「経路」の一部しか示さないため、完全なネットワークトポロジーではありません。 ### 応用例 | シナリオ | 確認できること | |----------|----------------| | 接続遅延が大きい | 遅延が集中しているホップを特定 | | パケットロス | `* * *` が多い箇所でルーターまたはファイアウォールの影響 | | ルーティング変更 | 新旧経路の比較 | --- **まとめ** Traceroute は、ネットワークパスと遅延を可視化するためのシンプルかつ強力なツールです。 正確に理解し、適切に解釈すれば、トラブルシューティングやネットワーク最適化に大いに役立ちます。 | そっか~ニュース