ネットワークの接続エラーは、「どの段階で止まったか」で原因が決まります。 名前を調べる → 相手につなぐ → 応答を待つ、のどこで止まったかが、エラーの種類に表れます。

段階 エラー(代表的な表記) 意味 調べる場所
① 名前を調べる UnknownHostException、Could not resolve host ホスト名を IP アドレスにできない ホスト名の綴り、DNS、hosts、Docker のサービス名
② つなぐ Connection refused 相手のマシンには届いたが、そのポートで誰も待ち受けていない 相手のプログラムが起動しているか、ポート番号
② つなぐ Connect timed out 相手から何も返ってこない IP アドレス、ファイアウォール、VPN、経路
③ 応答を待つ Read timed out つながったが、応答が返ってこない 相手の処理が重い・止まっている、タイムアウトの設定
③ 応答を待つ Connection reset つながった後、相手(または途中の機器)が接続を切った 相手のログ、ロードバランサー・プロキシ

この記事では、5つの状態を用意し、Java・Python・curl で同じ条件にアクセスした結果を並べました。言語によって表記は違いますが、どの段階で止まったかは同じです。

確認環境:Ubuntu 24.04、OpenJDK 21.0.10(HttpClient・HttpURLConnection)、Python 3.13+requests 2.34.2、curl 8.5.0、nc(確認日 2026年10月10日)。接続のタイムアウトを3秒、読み取りのタイムアウトを5秒にして実行しました。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Connection refused・Read timed outの違いと直し方」

再現した5つの状態

状態 用意したもの
1. 待ち受けていないポート 何も起動していない 127.0.0.1:18399
2. 応答しないアドレス どこにもつながらない 10.255.255.1:8080
3. つながるが応答しない 接続は受け付けて、何も返さないサーバー
4. つながった直後に切られる 接続を受け付けて、すぐに切る(RST)サーバー
5. 存在しないホスト名 no-such-host.invalid

Java(HttpURLConnection)

http://127.0.0.1:18399/        ConnectException: Connection refused        0.0s
http://10.255.255.1:8080/      SocketTimeoutException: Connect timed out   3.0s
http://127.0.0.1:18383/        SocketTimeoutException: Read timed out      5.0s
http://127.0.0.1:18384/        SocketException: Connection reset           0.0s
http://no-such-host.invalid/   UnknownHostException: no-such-host.invalid  0.0s

Java(HttpClient、Java 11 以降)

http://127.0.0.1:18399/        ConnectException: null                                  0.1s
                                 Caused by: java.nio.channels.ClosedChannelException
http://10.255.255.1:8080/      HttpConnectTimeoutException: HTTP connect timed out     3.0s
http://127.0.0.1:18383/        HttpTimeoutException: request timed out                 5.0s
http://127.0.0.1:18384/        IOException: HTTP/1.1 header parser received no bytes   0.0s
                                 Caused by: java.net.SocketException: Connection reset
http://no-such-host.invalid/   ConnectException: null                                  0.0s
                                 Caused by: java.nio.channels.UnresolvedAddressException

HttpClient は、接続拒否も名前解決の失敗も ConnectException: null になりました。 メッセージだけでは区別できないため、getCause() をたどって一番下の原因を見ます(ログにはスタックトレースを丸ごと出す)。

Throwable root = e;
while (root.getCause() != null) root = root.getCause();
log.error("接続エラー: {} / 原因: {}", e, root);

Python(requests)

http://127.0.0.1:18399/        ConnectionError   0.0s  Failed to establish a new connection: [Errno 111] Connection refused
http://10.255.255.1:8080/      ConnectTimeout    3.0s  Connection to 10.255.255.1 timed out. (connect timeout=3)
http://127.0.0.1:18383/        ReadTimeout       5.0s  Read timed out. (read timeout=5)
http://127.0.0.1:18384/        ConnectionError   0.0s  ('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))
http://no-such-host.invalid/   ConnectionError   0.0s  Failed to resolve 'no-such-host.invalid' ([Errno -2] Name or service not known)

curl

http://127.0.0.1:18399/        exit=7   0.0s  curl: (7) Failed to connect to 127.0.0.1 port 18399 after 0 ms: Couldn't connect to server
http://10.255.255.1:8080/      exit=28  3.0s  curl: (28) Failed to connect to 10.255.255.1 port 8080 after 3002 ms: Timeout was reached
http://127.0.0.1:18383/        exit=28  5.0s  curl: (28) Operation timed out after 5002 milliseconds with 0 bytes received
http://127.0.0.1:18384/        exit=56  0.0s  curl: (56) Recv failure: Connection reset by peer
http://no-such-host.invalid/   exit=6   0.0s  curl: (6) Could not resolve host: no-such-host.invalid

(curl は --connect-timeout 3 --max-time 5 で実行しました)

3つの実行環境の対応表

状態 Java(HttpURLConnection) Python(requests) curl
1. 待ち受けていない ConnectException: Connection refused ConnectionError ... Connection refused (7) Couldn't connect to server
2. 応答しないアドレス SocketTimeoutException: Connect timed out ConnectTimeout (28) Failed to connect ... Timeout was reached
3. 応答しない SocketTimeoutException: Read timed out ReadTimeout (28) Operation timed out ... 0 bytes received
4. 直後に切られる SocketException: Connection reset ConnectionError ... Connection reset by peer (56) Recv failure: Connection reset by peer
5. 存在しないホスト UnknownHostException ConnectionError ... Failed to resolve (6) Could not resolve host

かかった時間でも見分けられる

上の結果で、Connection refused・Connection reset・名前解決の失敗はすぐに(0秒で)返り、timed out はタイムアウトの時間(3秒・5秒)だけ待たされました。

症状 考えられる段階
すぐにエラーになる 待ち受けていない(refused)、切られた(reset)、名前が無い
しばらく固まってからエラーになる 経路で止まっている(connect timed out)、相手の処理が終わらない(read timed out)
いつまでも終わらない タイムアウトを設定していない(後述)

原因と直し方

Connection refused(待ち受けていない)

相手のマシンには届いていて、そのポートを使うプログラムが動いていないと返ってきた状態です。

確認すること 方法
相手のプログラムが起動しているか 相手のサーバーで systemctl status サービス名、docker ps
そのポートで待ち受けているか 相手のサーバーで ss -ltn | grep ポート(Windows は netstat -ano | findstr ポート)
待ち受けのアドレス 127.0.0.1:ポート だと、同じマシンからしか接続できない。他のマシンから使うなら 0.0.0.0
接続先のポート番号 設定ファイル・環境変数のポート番号
Docker の localhost コンテナの中の localhost はコンテナ自身。サービス名か host.docker.internal を使う

Connect timed out(応答しない)

相手から何も返ってこない状態です。ファイアウォールが通信を黙って捨てていることが多い原因です(拒否の応答を返す設定なら refused に近い表示になります)。

確認すること 方法
IP アドレス・ホスト名が正しいか 設定値と、nslookup ホスト名 の結果
ファイアウォール・セキュリティグループ クラウドならセキュリティグループのインバウンド、社内なら FW の申請状況
VPN・専用線 接続しているか、経路が設定されているか
相手のマシンが起動しているか 同じネットワークの別のマシンから確認

Read timed out(つながったが応答が返らない)

接続はできていて、相手の処理が読み取りのタイムアウトより長くかかっている状態です。

確認すること 方法
相手の処理時間 相手のログで、そのリクエストの処理時間・止まっている箇所(DB のロック待ちなど)
タイムアウトの値 処理に本当に時間がかかる API なら、読み取りのタイムアウトを延ばす
途中の機器のタイムアウト ロードバランサー・プロキシのタイムアウトのほうが短いと、そこで切られる(504 や reset になる)

読み取りのタイムアウトを延ばすのは、相手の処理時間が正常な範囲だと確かめてからにします。相手が止まっているときに延ばすと、待つ時間が長くなるだけです。

Connection reset(切られた)

つながった後、相手か途中の機器が接続を強制的に切った状態です。相手のプログラムが異常終了した、ロードバランサーの無通信タイムアウトで切られた、接続プールの接続が古くなって使ったときには切れていた、などが原因です。相手のログと、途中の機器のタイムアウト設定を確認します。

コマンドで「つながるか」だけを確かめる

アプリと同じマシン(コンテナならその中)で、TCP でつながるかだけを確かめると、アプリの設定の問題かネットワークの問題かを分けられます。

$ nc -vz -w 3 127.0.0.1 18399
nc: connect to 127.0.0.1 port 18399 (tcp) failed: Connection refused
$ nc -vz -w 3 127.0.0.1 18383
Connection to 127.0.0.1 18383 port [tcp/*] succeeded!
$ nc -vz -w 3 10.255.255.1 8080
nc: connect to 10.255.255.1 port 8080 (tcp) timed out: Operation now in progress
OS コマンド つながったときの表示
Mac・Linux nc -vz -w 3 ホスト ポート succeeded!
Windows(PowerShell) Test-NetConnection -ComputerName ホスト -Port ポート TcpTestSucceeded : True
curl が使える環境 curl -v --connect-timeout 3 http://ホスト:ポート/ Connected to ...

nc でつながるのにアプリだけエラーなら、アプリの接続先の設定(URL・ポート・プロキシ)や、TLS・認証の問題です。nc でもつながらなければ、ネットワークか相手側の問題です。

タイムアウトは必ず設定する

Python の requests は、タイムアウトを指定しないと、応答が返らないサーバーをいつまでも待ちます(接続の段階は OS の設定で打ち切られますが、つながった後の応答待ちには上限がありません)。「3. つながるが応答しない」サーバーに、タイムアウトなしで接続すると、10秒で打ち切るまで終わりませんでした。

$ timeout 10 python -c "... s.get('http://127.0.0.1:18383/') ..."
exit=124   ← 10秒たっても終わらず、timeout コマンドで打ち切った
実行環境 接続のタイムアウト 読み取りのタイムアウト 指定しないと(応答待ち)
Python requests timeout=(3, 30) の1つ目 2つ目 待ち続ける
Java HttpClient HttpClient.newBuilder().connectTimeout(...) HttpRequest.newBuilder().timeout(...) 待ち続ける
Java HttpURLConnection setConnectTimeout(ミリ秒) setReadTimeout(ミリ秒) 待ち続ける(0=無制限)
curl --connect-timeout 秒 --max-time 秒(全体) 待ち続ける(接続だけは既定で5分)

requests の公式ドキュメントでは、接続のタイムアウトは「3の倍数より少し大きい値」(TCP の再送の間隔に合わせる)がよいとされています。

確認の手順(チェックリスト)

順番 確認すること 方法
1 エラーの種類(一番下の原因) Java は Caused by: をたどる
2 すぐに出たか、待たされたか ログの時刻、上の「かかった時間」の表
3 名前が引けるか nslookup ホスト名
4 TCP でつながるか nc -vz、Test-NetConnection
5 相手が待ち受けているか 相手側で ss -ltn、netstat -ano
6 途中の機器 ファイアウォール、セキュリティグループ、ロードバランサーのタイムアウト
7 タイムアウトの設定 接続・読み取りの両方を設定しているか

よくある質問

Q. Connection refused と Connect timed out は、どちらがファイアウォールの問題ですか。 A. 多いのは Connect timed out です。ファイアウォールは通信を黙って捨てることが多く、相手から何も返らないため、タイムアウトまで待たされます。Connection refused は、相手のマシンまでは届いていて、ポートで待ち受けているプログラムが無い状態です。

Q. ブラウザでは開けるのに、サーバーのプログラムからだと Connect timed out になります。 A. ブラウザは社内プロキシを通って接続していて、サーバーのプログラムはプロキシを使わずに直接つなごうとしている可能性があります。プログラムのプロキシ設定(Java は -Dhttps.proxyHost など、Python は環境変数 HTTPS_PROXY)を確認します。

Q. Read timed out が出るたびにリトライしてよいですか。 A. 読み取りのタイムアウトは、相手が処理を終えている可能性があります。登録・決済のような処理をそのままリトライすると、二重に実行されることがあります。リトライするなら、同じリクエストを何度送っても結果が変わらない作り(冪等性)にしておきます。

まとめ

  • どの段階で止まったかで原因が決まる:名前を調べる(UnknownHost)→ つなぐ(refused・connect timed out)→ 応答を待つ(read timed out・reset)
  • refused は「相手は居るが、そのポートで誰も待っていない」。起動・ポート・待ち受けアドレスを確認
  • connect timed out は「相手から何も返らない」。IP・ファイアウォール・VPN を確認
  • read timed out は「つながったが応答が遅い」。相手の処理時間と途中の機器のタイムアウトを確認
  • Java の HttpClient は ConnectException: null になることがある。getCause() で一番下の原因を見る
  • タイムアウトは接続・読み取りの両方を必ず設定。requests は指定しないと待ち続ける

参考・出典

確認日はいずれも 2026年10月10日です。

  • Requests ドキュメント「Advanced Usage(Timeouts)」:https://requests.readthedocs.io/en/latest/user/advanced/#timeouts
  • Microsoft Learn「Test-NetConnection」:https://learn.microsoft.com/en-us/powershell/module/nettcpip/test-netconnection

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Connection refused・Read timed outの違いと直し方」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?