인위적으로 연결 시간 초과 오류 생성


291

연결 시간 초과가 발생하면 소프트웨어에 버그가 발생했습니다. 이러한 오류는 매우 드물다 (보통 내부 네트워크에 의해 연결이 끊어 질 때). 이러한 종류의 효과를 인위적으로 생성하여 소프트웨어를 테스트하려면 어떻게해야합니까?

중요한 경우 응용 프로그램은 CAsyncSocket 클래스를 사용하여 C ++ / MFC로 작성됩니다.

편집하다:

존재하지 않는 호스트를 사용해 보았는데 소켓 오류가 발생합니다.

WSAEINVAL (10022) 유효하지 않은 인수

다음 시도는 다른 포트에 연결 하는 Alexander 의 제안 을 사용 하는 것입니다 (예 : 81 (내 서버에서)). 잘 작동했습니다. 연결이 끊어진 것과 정확히 동일합니다 (60 초 대기 후 오류). 감사합니다!


안녕 마크, 나는 당신을 위해 작동하는 솔루션을 시도했지만 내가받는 것은 # 503 (서비스를 사용할 수 없음)입니다. # 504 (게이트웨이 시간 초과), # 599 (네트워크 연결 시간 초과 오류), # 598 (네트워크 읽기 시간 초과 오류) 중 하나가 아니어야합니다 .
CoDe

답변:


297

기존 호스트에 연결하지만 단순히 TCP SYN 패킷을 삭제하는 방화벽에 의해 차단 된 포트에 연결하십시오. 예 : www.google.com:81


6
이 답변은 간단하며 아래 @emu의 답변과 동일하게 작동합니다. 이 답변이 google.com:81을 사용하도록 제안하지는 않았지만 여기서 요점은 차단 된 다른 포트를 사용하는 것입니다. 따라서 언제든지 <your-own-ip> : <blocked-port>를 사용할 수 있습니다.
James Selvakumar

6
자체 서버가 아니라면 테스트를 위해 다른 서버를 공격하는 것이 무례합니다. 아래에 언급 된 것과 같은 문명 솔루션을 사용하여 10.255.255.1과 같이 라우팅 할 수없는 IP 주소를 설정하거나 테스트 목적으로 자신의 가상 서버를 설정하십시오.
zeeshan

2
Google이이 포트를 차단했을 수 있습니다. Chrome으로 테스트 할 때 "서버를 사용할 수 없습니다." 아래에서 @emu의 트릭을 사용하면 연결이 예상대로 중단됩니다. 뭔가 빠졌습니까?
entpnerd

OP는 자신의 서버 에서 포트 81 연결 했으며 시간 초과가 발생 했다고 말합니다 . 그것은 나에게도 효과가 있었다. emu의 솔루션으로 Android에서 UnknownHostException이 발생했습니다.
Barry Fruitman

2
이것은 연결 시간이 초과되지 않았 습니다.
Mehdi

425

라우팅 할 수없는 IP 주소 (예 : 10.255.255.1)에 연결하십시오.


12
나는 google.com:81이 언젠가 도달 할 수 있기 때문에 이것이 더 나은 대답이라고 생각합니다.
Gui13

138
... 그리고 단위 테스트에서 다른 사람의 서버로 임의의 패킷을 보내는 것은 무례하기 때문에.
Glenn Maynard

15
항상 작동하지는 않습니다. 예를 들어 Python의 urllib경우 '호스트에 대한 경로 없음'예외가 반환됩니다. 참고
Mike Shultz

8
10.0.0.0, 10.255.255.255, 172.16.0.0, 172.31.255.255, 192.168.0.0, 192.168.255.255 모두 라우팅 할 수 없습니다.
rajesh_kw

4
@FHI에서 언급 한 "호스트로 라우팅 안 함"오류는 일반적으로 다음 두 가지 조건에서 나타납니다. (a) 로컬 LAN에서 연결할 수없는 호스트에 연결하려고 할 때 ARP 타임 아웃 "). 그리고 (b) 라우터가 해당 ICMP 오류를 반환 할 때. 첫 번째 경우는 테스트하는 개인 IP와 동일한 서브넷에있는 경우에 발생합니다. 두 번째 경우 라우터가 패킷을 대상으로 라우팅하는 방법을 모르지만 경우에 따라 ICMP 오류를 보내지 않고 패킷을 삭제하기 만합니다.
Ale

47

유닉스 머신에 있다면, netcat을 사용하여 포트 청취를 시작할 수 있습니다 :

nc -l 8099

그런 다음 http : // localhost : 8099 / some / sort / of / endpoint 와 같이 해당 포트에 일반적으로 수행하는 모든 작업을 호출하도록 서비스를 수정 하십시오.

그런 다음 서비스에서 연결을 열고 데이터를 쓰지만 응답을 얻지 못하므로 연결 거부 대신 읽기 시간 초과가 발생합니다.


1
응용 프로그램이 추진하는 모든 데이터를 볼 수 있기 때문에 유용합니다. 애플리케이션이 응답을 요청하는지 확인할 수 있습니다.
Paul

이것은 언급 한 것처럼 일종의 끝점으로 이동하는 경우에 해당하지만 다른 방법으로 연결하려고하면 연결이 거부됩니다. 지금은 조롱하려고하는 동작이 아닙니다.
AlanSE

@AlanSE-다른 방법은 무엇입니까? 포트 번호 뒤에는 아무 것도 가질 수 없습니다. 그것은 어떤 URL을 처리하기 위해 아무것도 없습니다로 netcat을 상관하지 않습니다
톰의 전관

@TomChamberlain 아 잠깐, 내가 뭘 잘못했는지 알 겠어. ssh 연결 시간 초과를 시뮬레이션하려고합니다. 그래서 localhost, 포트 8099를 제공하고 있지만 이전에는 사용자 이름을 제공하지 않았기 때문에 그냥 무언가를 넣으면 그렇게 ssh alanse@localhost -p 8099하는 것처럼 보입니다.
AlanSE

7
소켓 수준에서 연결 시간 초과를 테스트하려면 nc 프로세스를 kill -STOP <pid>(또는 백그라운드에 두지 않고 CTRL-Z로) 고정하십시오. 시스템은 서버가 실행중인 것처럼 작동하지만 서버가 연결을 수락 할 때까지 기다리면 연결 시간이 초과됩니다 (errno 110).
philant

27

다음 URL은 항상 시간 초과를 제공하며 위의 @Alexander 및 @Emu의 답변을 결합합니다.

http://example.com:81

example.com:81example.com은 DNS 표준에 의해 예약되어 있기 때문에 Alexander의 답변에 대한 사용 이 개선되었으므로 google.com:81Google과 같이 항상 도달 할 수 없으며 Google과 같은 느낌이 든다면 변경 될 수 있습니다. 또한 example.com도달 할 수없는 것으로 정의되어 있기 때문에 Google 서버가 과도하게 사용되지 않습니다.

@ emu의 대답보다 개선 된 것이라고 말하고 싶습니다. 기억하기가 훨씬 쉽기 때문입니다.


2
현재 example.com93.184.216.34로 해결되는 것을 보았고 실제로는 예제 도메인임을 설명하는 짧은 HTML을 제공합니다 ... 포트 81은 여전히 ​​응답하지 않습니다.
Beni Cherniavsky-Paskin

문제는 실제로 example.com을 그런 식으로 사용해야하는지 여부입니다. 그들이 공식적으로 테스트 패킷으로 넘칠 수없는 경우에만이 도메인은 다른 어떤 상용 도메인보다 더 좋습니다. 허가없이 그러한 목적을 위해 도메인을 사용하는 것은 비 윤리적입니다. 말하자면 불법적이지 않더라도 이러한 패킷을 처리하는 데 비용이 많이 들기 때문입니다. httpstat.us그의 답변에서 @AndyTheEntity가 지적한대로 사용 하는 것을 고려하십시오 .
마누엘

@Manuel 당신이 요점을 잃어 버렸습니다 ... example.com상업 도메인이 아니며, 명시 적으로 사용할 수없는 것으로 지정된 몇 가지 도메인 이름 중 하나입니다. 아무도 소유 할 수 example.com없으며 DNS 라우터는 실제 주소로 라우팅되지 않는다는 것을 알고 있습니다. 이 사람의 서버 시간을 비용하지, 그래서 그것을 사용하여 아무것도 잘못이
speedplane을

@speedplane IANA는 규정에 따라 도메인을 소유하고의 목적을 설명하는 웹 페이지를 제공하는 웹 서버를 유지 관리합니다 example.com. 도메인 뒤에는 인프라가 있으므로 요청마다 IANA 비용이 발생합니다. 허용되는 사용은 RFC 2606 및 RFC 6761에서 참조되며 flodding, 언급 한 것처럼 다른 서버 대신 원하는 목적으로 도메인을 자유롭게 사용할 수 없습니다 . 귀하의 주장 example.com is defined to be unreachable이 잘못되어 도달 할 수 있습니다. 현재 포트 81에 접근 할 수 없지만 앞으로 보장 될 포트는 어디입니까?
마누엘

DNS 테스트를 위해 특별히 지정한 RFC 이 .test아닌 최상위 도메인 을 사용하는 것이 example.com좋지만 이러한 도메인은이 목적을 위해 명확하게 설정되었습니다. 예, IANA에 약간의 비용이 듭니다. 그러나 이것이 제공하는 서비스입니다. 우리의 DNS 비용이 지불하고 있습니다.
speedplane

23

좋은 답변은 많지만 가장 깨끗한 해결책은 이 서비스 인 것 같습니다

http://httpstat.us/504?sleep=60000

제한 시간 (최대 230 초) 및 최종 리턴 코드를 구성 할 수 있습니다.


16

Python REPL을 사용하여 데이터를받는 동안 (예 : 연결이 설정된 후) 시간 초과를 시뮬레이션 할 수 있습니다. 표준 파이썬 설치 만 있으면됩니다.

Python 2.7.4 (default, Apr  6 2013, 19:54:46) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)        
>>> s.bind(('localhost', 9000))
>>> s.listen(0)
>>> (clientsocket, address) = s.accept()

이제 들어오는 연결을 기다립니다. 테스트하려는 대상을에 연결하십시오 localhost:9000. 그렇게하면 파이썬은 연결을 수락하고 accept()반환합니다. 을 통해 데이터를 보내지 않으면 다음 clientsocket에 호출자의 소켓이 시간 초과됩니다 recv().


나를 위해 작동하지 않습니다; 뭔가가 빠졌다. 아마 s.listen(5)전에 s.accept()?
bmaupin

@bmaupin 그것은 합리적으로 들리지만, 나는 그것을 잊어 버린 것 같습니다. 백 로그 대기열이 0 인 지금 수정했습니다. 감사합니다.
Henrik Heimbuerger

1
청취를 듣고 부품을 while True:루프 에 넣을 수 있었고 테스트를 위해 내구성이 뛰어난 타임 아웃 목적지를 만드는 것처럼 보입니다.
AlanSE

2
작동하지만 "읽기 시간 초과"오류가 발생합니다. "연결 시간 초과"와 동일하지 않습니다.
timur

13
  • 10.0.0.0
  • 10.255.255.255
  • 172.16.0.0
  • 172.31.255.255
  • 192.168.0.0
  • 192.168.255.255

이것들은 모두 라우팅 할 수 없습니다.


2
(허용 된 답변에 대해 언급했듯이) Node.js에서 XMLHttpRequest를 테스트 할 때 시간 초과가 아닌 EACCES 오류에 연결 10.0.0.0하고 10.255.255.255발생했습니다. 10.255.255.1, 172.16.0.0, 172.31.255.255, 192.168.0.0, 및 192.168.255.255그러나, 타임 아웃을했다.
Jamie Birch


8

소프트웨어 솔루션은 어떻습니까?

애플리케이션 서버에 SSH 서버를 설치하십시오. 그런 다음 소켓 터널을 사용하여 로컬 포트와 애플리케이션 서버의 원격 포트 사이에 링크를 작성하십시오. ssh 클라이언트 도구를 사용하여이를 수행 할 수 있습니다. 클라이언트 응용 프로그램이 대신 맵핑 된 로컬 포트에 연결되도록하십시오. 그런 다음 연결 시간 제한을 시뮬레이션하기 위해 소켓 터널을 마음대로 중단 할 수 있습니다.


4

활성 연결을 사용하려는 경우 http://httpbin.org/delay/# 을 사용할 수도 있습니다 . 여기서 #은 응답을 보내기 전에 서버가 대기하는 시간입니다. 시간 초과가 지연 시간보다 짧으면 효과를 시뮬레이션해야합니다. 파이썬 요청 패키지와 함께 성공적으로 사용했습니다.

민감한 정보를 전송하는 경우 요청을 수정하고 싶을 수 있습니다. 요청 된 데이터는 어떻게되는지 모릅니다.


최대 10 초이지만 (더 높은 숫자를 입력하면 10 초 후에 응답합니다)
Harry Wood

2

서버가 응답하는 데 걸리는 시간을 지정하는 API를 호출하여 원래 시간 초과를 인위적으로 만들 수있는 서비스가 있습니다. macgyver의 서버 시간 초과가 그러한 서비스의 예입니다.

예를 들어 응답하는 데 15 초가 걸리는 요청을 테스트하려면 macgyver API에 게시 요청을하면됩니다.

JSON 페이로드 :

{
    "timeout_length": 15000
}

API 응답 (15 초 후) :

{
    "response": "ok"
}

macgyver의 서버 시간 초과 프로그램
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u


1

별도의 인터페이스를 만드는 Microsoft Loopback 드라이버를 설치할 수 있습니다. 그런 다음 자신의 서비스 (자신의 호스트)에 연결할 수 있습니다. 그런 다음 네트워크 연결에서 해당 인터페이스를 비활성화 / 활성화 할 수 있습니다 ...


1

OP가 어떤 테스트를 원하는지 확실하지는 않지만 존재하지 않는 호스트 / 포트에 연결을 시도하는 것과 이미 설정된 연결이 시간 초과되는 것에는 차이가 있습니다. Rob과 함께 연결이 작동 할 때까지 기다린 다음 케이블을 당깁니다. 또는 편의상 가상 머신을 테스트 서버 (브리지 네트워킹 사용)로 작동하고 연결이 설정되면 가상 네트워크 인터페이스를 비활성화하십시오.


1

임의 연결 시간 초과를 시뮬레이션하기 위해 자주 사용하는 기술은 ssh 로컬 포트 ​​전달을 사용하는 것입니다.

ssh -L 12345:realserver.com:80 localhost

그러면 localhost : 12345의 트래픽이 realserver.com:80으로 전달됩니다. 원하는 경우 자신의 로컬 컴퓨터에서도이를 순환 할 수 있습니다.

ssh -L 12345:localhost:8080 localhost

따라서 응용 프로그램을 로컬 호스트 및 사용자 지정 포트를 가리키면 트래픽이 대상 호스트 : 포트로 라우팅됩니다. 그런 다음이 셸을 종료 할 수 있습니다 (종료 후 ctrl + c 셸을 사용해야 할 수도 있음). 전달이 종료되어 앱에서 연결이 끊어집니다.


0

네트워크 케이블을 다른 연결 / 케이블이없는 스위치에 꽂습니다. 그것은 imho 작동합니다.


0

과거에 네트워킹 문제를 시뮬레이션하기 위해 사용한 몇 가지 전술이 있습니다.

  1. 네트워크 케이블을 뽑습니다
  2. 기계와 "대상"기계 사이에서 스위치를 끄십시오 (컴퓨터에 전원이 연결되어있는 스위치로 기계가 "네트워크 연결"을 유지하도록하는 것이 가장 좋습니다)
  3. 수신 된 데이터를 자동으로 삭제하는 대상 시스템에서 방화벽 소프트웨어를 실행하십시오.

이러한 아이디어 중 하나는 필요한 시나리오를 예술적으로 생성 할 수있는 수단을 제공 할 수 있습니다.


0

설치 / 사용 가능한 방화벽 소프트웨어에 따라 나가는 포트를 차단할 수 있어야하며 방화벽 설정 방법에 따라 연결 요청 패킷을 삭제해야합니다. 연결 요청 없음, 연결 없음, 시간 초과가 발생합니다. 라우터 수준에서 구현 된 경우 (재설정을 보내지 않고 패킷을 삭제하는 경향이 있거나 상황에 맞는 것이 무엇이든) 더 잘 작동하지만 트릭을 수행하는 소프트웨어 패키지가 있어야합니다.


0

가장 쉬운 방법은 CurrPorts를 사용하여 연결을 끊는 것 입니다.

그러나 예외 처리 코드를 단위로 테스트하려면 네트워크 연결 코드를 추상화하고 필요할 때 예외를 발생시키는 스텁, 모의 또는 데코레이터를 작성해야합니다. 그러면 실제로 네트워크를 사용하지 않고도 응용 프로그램 오류 처리 논리를 테스트 할 수 있습니다.


CurrPorts를 사용하면 연결을 닫을 수만있는 것 같지만 (다음 연결이 recv()즉시 실패하게 됨) 시간 초과를 시뮬레이션하는 방법을 찾을 수 없었습니다 (즉, 더 이상 데이터가 전송되지 않지만 연결은 열린 상태로 유지됨).
Henrik Heimbuerger

요청시 연결 예외를 조롱하는 단위 테스트를 제안한이 답변에 감사했습니다.
Danny Bullis

0

나는 당신이하는 것과 같은 문제를 겪었습니다. 소프트웨어 동작을 테스트하기 위해 적절한 시간에 네트워크 케이블을 뽑았습니다. 케이블을 분리하기 직전에 중단 점을 설정해야했습니다.

내가 다시하고 있다면 네트워크 케이블에 스위치 (일반적으로 닫힌 순간 푸시 버튼 1)를 넣을 것입니다.

물리적 연결 해제로 인해 다른 동작이 발생하면 컴퓨터를 저렴한 허브에 연결하고 위에서 언급 한 스위치를 허브와 기본 네트워크 사이에 둘 수 있습니다.

-편집-대부분의 경우 프로그램의 특정 지점에 도달 할 때까지 네트워크 연결이 필요합니다. 그런 다음 제공된 여러 제안 중 하나를 사용하여 연결을 끊고 싶을 것입니다.


0

나를 위해 가장 쉬운 방법은 대상 네트워크를 기반으로 사무실 라우터에 고정 경로를 추가하는 것이 었습니다. 응답하지 않는 호스트 (예 : 컴퓨터)로 트래픽을 라우팅하면 요청 시간이 초과됩니다.

나에게 가장 좋은 점은 정적 경로를 웹 인터페이스를 통해 관리하고 쉽게 활성화 / 비활성화 할 수 있다는 것입니다.


-1

외부에서 사용할 수없는 포트에서 잘 알려진 웹 사이트 중 하나에 연결을 시도 할 수 있습니다 (예 : 200). 대부분의 방화벽은 DROP 모드에서 작동하며 시간 초과를 시뮬레이션합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.