Programing

연결 거부 오류의 원인은 무엇입니까?

lottogame 2020. 8. 28. 07:49
반응형

연결 거부 오류의 원인은 무엇입니까?


다른 클라이언트를 사용하여 C로 서버 프로그램을 작성하려고합니다. 예를 들어 포트 2080을 통해 연결하려고하면이 오류가 발생합니다.

connection refused

이 오류의 원인은 무엇입니까?


여러 가지 이유가있을 수 있지만 가장 일반적인 이유는 다음과 같습니다.

  1. 대상 컴퓨터에서 포트가 열려 있지 않습니다.

  2. 대상 컴퓨터에서 포트가 열려 있지만 보류중인 연결의 백 로그가 가득 찼습니다.

  3. 클라이언트와 서버 사이의 방화벽이 액세스를 차단하고 있습니다 (로컬 방화벽도 확인).

방화벽을 확인하고 포트가 열려 있는지 확인한 후 텔넷을 사용하여 IP / 포트에 연결하여 연결을 테스트합니다. 이렇게하면 응용 프로그램에서 잠재적 인 문제가 제거됩니다.


오류는 수신 소켓의 OS가 인바운드 연결 요청을 인식했지만 의도적으로 거부하도록 선택했음을 의미합니다.

중간 방화벽이 방해가되지 않는다고 가정 할 때 OS가 인바운드 연결 요청을 거부하는 이유는 두 가지뿐입니다. 한 가지 이유는 이미 여러 번 언급되었습니다. 연결된 청취 포트가 열려 있지 않습니다.

아직 언급되지 않은 또 다른 이유가 있습니다. 수신 포트가 실제로 열려 있고 활발하게 사용되고 있지만 대기중인 인바운드 연결 요청의 백 로그가 최대 값에 도달했기 때문에 인바운드 연결 요청을 대기 할 공간이 없습니다. 순간. 서버 코드가 새 대기열 항목에 대해 사용 가능한 슬롯을 지우는 데 아직 충분한 시간 동안 accept ()를 호출하지 않았습니다.

잠시 기다렸다가 다시 연결해보십시오. 안타깝게도 "포트가 전혀 열려 있지 않음"과 "포트가 열려 있지만 지금 너무 바쁘다"를 구분할 방법이 없습니다. 둘 다 동일한 일반 오류 코드를 사용합니다.


다른 호스트에 대한 TCP 연결을 열려고 할 때 "연결이 거부되었습니다."라는 오류가 표시되면

  1. TCP SYN 패킷을 다른 호스트로 보냈습니다.
  2. 그런 다음 응답으로 TCP RST 패킷을 받았습니다.

RST는 연결을 재설정해야 함을 나타내는 TCP 패킷의 비트입니다. 일반적으로 다른 호스트가 사용자의 연결 시도를 수신하고 적극적으로 TCP 연결을 거부하고 있음을 의미하지만, 때때로 개입 방화벽이 사용자의 TCP SYN 패킷을 차단하고 TCP RST를 사용자에게 다시 보낼 수 있습니다.

https://tools.ietf.org/html/rfc793 69 페이지를 참조 하십시오 .

SYN 수신 상태

   If the RST bit is set

     If this connection was initiated with a passive OPEN (i.e.,
     came from the LISTEN state), then return this connection to
     LISTEN state and return.  The user need not be informed.  If
     this connection was initiated with an active OPEN (i.e., came
     from SYN-SENT state) then the connection was refused, signal
     the user "connection refused".  In either case, all segments
     on the retransmission queue should be removed.  And in the
     active OPEN case, enter the CLOSED state and delete the TCB,
     and return.

연결이 거부 됨은 연결하려는 포트가 실제로 열려 있지 않음을 의미합니다.

따라서 잘못된 IP 주소 또는 잘못된 포트에 연결 중이거나 서버가 잘못된 포트에서 수신 중이거나 실제로 실행되고 있지 않습니다.

일반적인 실수는 네트워크 바이트 순서로 바인딩하거나 연결할 때 포트 번호를 지정하지 않는 것입니다.


서버 측에서 포트 2080에서 수신 대기 중인지 확인하십시오. 먼저 해당 포트에 텔넷을 발행하여 서버 시스템에서 확인하십시오.

텔넷 로컬 호스트 2080

듣고 있으면 응답 할 수 있습니다.


귀하의 상황에 해당하지 않는 것 같지만 때로는 연결 거부 오류가 네트워크에 IP 주소 충돌이 있음을 나타낼 수도 있습니다. 다음을 실행하여 가능한 IP 충돌을 검색 할 수 있습니다.

 arp-scan -I eth0 -l | grep <ipaddress>

arping <ipaddress>

AskUbuntu 질문에는 더 많은 정보가 있습니다.


1. 서버 상태를 확인하십시오.

2. 포트 상태를 확인하십시오.

예 : 3306 netstat -nupl|grep 3306.

3. 방화벽을 확인하십시오. 예를 들어 3306을 추가하십시오.

vim /etc/sysconfig/iptables
# add
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT

Checkpoint 방화벽의 관점에서 실제로 Reject를 Action으로 선택하면 방화벽의 메시지가 표시되어 공격자에게 서버 앞에 방화벽이 있음을 노출합니다. 방화벽은 정책과 일치하지 않는 모든 연결을 자동으로 삭제합니다. 연결 거부는 거의 항상 서버에서 발생합니다.


업무용 컴퓨터에서도 같은 문제가 발생합니다. 문제는 localhost를 입력하면 로컬 주소가 아닌 프록시의 주소로 이동한다는 것입니다.이 단계를 따르십시오.

Chrome => 설정 => 프록시 설정 변경 => LAN 설정 => 로컬 주소에 대해 프록시 서버 우회를 선택합니다.


In Ubuntu, Try sudo ufw allow <port_number> to allow firewall access to both of your server and db.


Try to pass port parameter "-p":

sudo iperf -c 127.0.0.1 -p 443

I had the same message with a totally different cause: the wsock32.dll was not found. The ::socket(PF_INET, SOCK_STREAM, 0); call kept returning an INVALID_SOCKET but the reason was that the winsock dll was not loaded.

In the end I launched Sysinternals' process monitor and noticed that it searched for the dll 'everywhere' but didn't find it.

Silent failures are great!

참고URL : https://stackoverflow.com/questions/2333400/what-can-be-the-reasons-of-connection-refused-errors

반응형