カテゴリ: Python 更新日: 2026/08/12

PythonでICMP(Ping)を送信する方法を徹底解説!subprocessとscapyでネットワーク確認

PythonでICMP(Ping)を送信する方法(subprocess & scapy)
PythonでICMP(Ping)を送信する方法(subprocess & scapy)

先生と生徒の会話形式で理解しよう

生徒

「Pythonでネットワークの接続確認ってできますか?」

先生

「できますよ。ICMPという仕組みを使って、Pingを送ることで通信確認ができます。」

生徒

「Pingってよく聞くんですが、どういうものですか?」

先生

「簡単にいうと、相手のコンピュータに『そこにいますか?』と確認するための信号です。」

生徒

「Pythonでもそれができるんですね!」

先生

「はい。subprocessやscapyという方法で実現できます。順番に見ていきましょう。」

1. ICMPとPingの基本を理解しよう

1. ICMPとPingの基本を理解しよう
1. ICMPとPingの基本を理解しよう

ICMPはネットワークの状態を確認するための通信方法です。Pingはその代表的な使い方で、相手の機器が応答するかを確認します。インターネットがつながる仕組みの中で重要な役割を持っています。

たとえば、友達に「元気?」とメッセージを送って返事が来るかを確認するようなイメージです。返事が来れば通信できている、来なければ問題があると判断できます。

2. subprocessでPingを実行する方法

2. subprocessでPingを実行する方法
2. subprocessでPingを実行する方法

Pythonで簡単にPingを使うには、subprocessモジュールを使ってOSのpingコマンドを実行します。これは外部コマンドを呼び出す仕組みです。


import subprocess

result = subprocess.run(["ping", "-c", "3", "google.com"], capture_output=True, text=True)

print(result.stdout)

このコードでは、googleに対して3回Pingを送っています。結果は標準出力として表示されます。

3. 実行結果の確認方法

3. 実行結果の確認方法
3. 実行結果の確認方法

Pingの結果には応答時間やパケットの送受信状況が表示されます。これを見ることで通信状態がわかります。


PING google.com ...
64 bytes from ...
--- ping statistics ---
3 packets transmitted, 3 received

送信と受信が一致していれば正常です。もし受信がゼロなら接続に問題があります。

4. scapyでICMPを直接送信する方法

4. scapyでICMPを直接送信する方法
4. scapyでICMPを直接送信する方法

より細かく制御したい場合はscapyというライブラリを使います。これはネットワークパケットを自由に作成できるツールです。


from scapy.all import IP, ICMP, sr1

packet = IP(dst="8.8.8.8")/ICMP()
response = sr1(packet, timeout=2)

if response:
    print("応答あり")
else:
    print("応答なし")

この方法ではICMPパケットを直接送信しています。より低レベルなネットワーク操作が可能です。

5. root権限が必要な理由

5. root権限が必要な理由
5. root権限が必要な理由

scapyを使う場合、多くの環境で管理者権限が必要です。これはネットワークの低レベル操作がセキュリティ上重要だからです。

初心者の方はまずsubprocessを使った方法から始めるのがおすすめです。

6. 応答時間を取得する方法

6. 応答時間を取得する方法
6. 応答時間を取得する方法

Pingの重要な情報の一つが応答時間です。通信の速さを測ることができます。


import subprocess

result = subprocess.run(["ping", "-c", "1", "google.com"], capture_output=True, text=True)

for line in result.stdout.split("\n"):
    if "time=" in line:
        print(line)

このように文字列を解析することで、必要な情報だけを取り出せます。

7. 複数のホストにPingを送る

7. 複数のホストにPingを送る
7. 複数のホストにPingを送る

複数のサーバーの状態を確認する場合は、リストを使って順番にPingを送ることができます。


import subprocess

hosts = ["google.com", "yahoo.co.jp", "example.com"]

for host in hosts:
    print(f"{host}にPing送信")
    subprocess.run(["ping", "-c", "1", host])

これにより、複数の接続確認を自動化できます。ネットワーク監視の基本になります。

8. subprocessとscapyの使い分け

8. subprocessとscapyの使い分け
8. subprocessとscapyの使い分け

subprocessは簡単で扱いやすく、初心者向けです。一方でscapyは柔軟性が高く、専門的な用途に向いています。

まずはPingの基本を理解し、必要に応じて高度な方法へ進むことで、効率よく学習できます。

まとめ

まとめ
まとめ

ICMPとPingの理解を深めることが重要

今回はPythonを使ったネットワークプログラミングの基礎として、ICMPとPingの仕組みから実践的な使い方までを詳しく解説しました。ICMPはネットワークの疎通確認に欠かせない通信プロトコルであり、Pingはその代表的な活用方法です。PythonでPingを送信する方法を理解することは、サーバー監視やネットワークトラブルシューティングの第一歩となります。

subprocessを使ったPingの実装

初心者にとって最も扱いやすい方法がsubprocessモジュールを使った実装です。OSのpingコマンドをPythonから呼び出すことで、簡単に通信確認ができます。特別な知識がなくても実装できるため、Python初心者やネットワークプログラミング入門者にとって非常におすすめの方法です。


import subprocess

hosts = ["google.com", "yahoo.co.jp", "example.com"]

for host in hosts:
    result = subprocess.run(["ping", "-c", "1", host], capture_output=True, text=True)

    if "1 received" in result.stdout:
        print(f"{host} は接続可能です")
    else:
        print(f"{host} は接続できません")

このように複数ホストに対してPingを送ることで、ネットワーク監視やサーバー死活監視の自動化も可能になります。実務でもよく使われる基本テクニックです。

scapyを使った高度なICMP操作

より高度なネットワーク制御を行いたい場合には、scapyライブラリを活用することでICMPパケットを直接作成して送信できます。パケットレベルでの操作が可能になるため、セキュリティ検証やネットワーク解析など専門的な用途にも対応できます。


from scapy.all import IP, ICMP, sr1

targets = ["8.8.8.8", "1.1.1.1"]

for target in targets:
    packet = IP(dst=target)/ICMP()
    response = sr1(packet, timeout=2)

    if response:
        print(f"{target} 応答あり")
    else:
        print(f"{target} 応答なし")

scapyは自由度が高い分、管理者権限が必要になる場合があるため注意が必要です。初心者はまずsubprocessで基本を理解し、その後ステップアップとして利用するのが効率的です。

応答時間や通信品質の確認

Pingの結果からは単に接続の可否だけでなく、応答時間やパケットロスなどの重要な情報も取得できます。これらを分析することでネットワークの品質や遅延の原因を特定することができます。特にWebサービス運用やクラウド環境では重要な指標となります。


import subprocess

result = subprocess.run(["ping", "-c", "3", "google.com"], capture_output=True, text=True)

for line in result.stdout.split("\n"):
    if "time=" in line:
        print("応答時間:", line)

このようなログ解析を組み合わせることで、より実用的なネットワーク監視ツールの作成も可能になります。

Pythonでネットワーク監視を自動化するメリット

Pythonを使ったPing送信やICMP通信の実装を習得することで、ネットワーク監視の自動化、障害検知、サーバー管理など幅広い分野に応用できます。特にインフラエンジニアやプログラマーにとっては必須スキルとなりつつあります。

今回紹介したsubprocessとscapyの使い分けを理解することで、用途に応じた最適な方法を選択できるようになります。シンプルな確認にはsubprocess、高度な分析にはscapyという使い分けがポイントです。

先生と生徒の振り返り会話

生徒

「PythonでPingを送る方法がよく分かりました。subprocessなら簡単に使えますね。」

先生

「そうですね。まずは基本としてsubprocessをしっかり理解することが大切です。」

生徒

「scapyは少し難しそうですが、できることが多そうですね。」

先生

「その通りです。パケットを直接扱えるので、ネットワークの仕組みを深く理解できます。」

生徒

「応答時間の取得や複数ホストの監視も実用的だと感じました。」

先生

「実務では非常によく使います。ネットワーク監視や障害対応に役立ちますよ。」

生徒

「Pythonでここまでできるとは思いませんでした。」

先生

「Pythonはネットワークプログラミングにも強い言語です。今回の内容を応用して、ぜひ自分だけの監視ツールも作ってみてください。」

コメント
コメント投稿は、ログインしてください

まだ口コミはありません。

関連記事:
Python のネットワークプログラミングの記事一覧へ
新着記事
New1
Claude
ClaudeにPHPデバッグを相談するコツ!原因候補を仮説に分けて確認する質問例
New2
Python
PythonのCLIで対話型メニューを作る方法(prompt_toolkit)
New3
ChatGPT
ChatGPTでPHPコードを理解する方法!読めない処理をわかりやすく質問しよう
New4
PHP
PHP の定数(define, const)を使った設定方法を徹底解説!
人気記事
No.1
Java&Spring記事人気No1
Python
Pythonで文字列が数値か判定する方法!isdigit()・isnumeric()の違い
No.2
Java&Spring記事人気No2
Python
Pythonのコンストラクタ(__init__)の使い方!初心者でもわかるオブジェクトの初期化
No.3
Java&Spring記事人気No3
PHP
PHP のフォームデータの受け取り($_POST, $_GET)を完全解説!初心者向けガイド
No.4
Java&Spring記事人気No4
Python
PythonでSQLiteを使う方法を完全ガイド!初心者でもわかるデータベース基本操作
No.5
Java&Spring記事人気No5
Python
Pythonでテキストファイルを1行ずつ読み込む方法(readline() / readlines())
No.6
Java&Spring記事人気No6
Claude
ClaudeにPHPリファクタリングを相談するコツ!目的・前提・制約を仕様メモにまとめるコツ
No.7
Java&Spring記事人気No7
Python
Pythonのシェルスクリプトを自動実行する方法(cron & Task Scheduler)
No.8
Java&Spring記事人気No8
PHP
PHPのMVCパターンを完全解説!初心者でもわかるModel・View・Controller