Programing

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

lottogame 2020. 3. 30. 08:42
반응형

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


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

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

편집하다:

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

WSAEINVAL (10022) 잘못된 인수

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


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


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


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

nc -l 8099

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

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


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

http://example.com:81

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

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


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().


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

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


나는 모든 사람의 관심을 경로에 지적 하고 싶다

설정에서 (예제에서 가져온) 200:b@100:dr임의로 연결이 끊어집니다.


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

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


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

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


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

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

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


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

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

JSON 페이로드 :

{
    "timeout_length": 15000
}

API 응답 (15 초 후) :

{
    "response": "ok"
}

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


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


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


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

ssh -L 12345:realserver.com:80 localhost

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

ssh -L 12345:localhost:8080 localhost

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


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


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

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

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


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


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

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


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

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

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

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


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

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


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

참고 URL : https://stackoverflow.com/questions/100841/artificially-create-a-connection-timeout-error

반응형