티스토리 뷰

connect() 시스템 콜의 에러 상황을 재현해 보기 
connect () 시스템 콜의 결과로 각각 

ETIMEDOUT, ECONNREFUSED, EHOSTUNREACH(또는 ENETUNREACH) 

가 return되는 3가지 경우를 재현



타임아웃 - 클라이언트가 소켓을 통해 패킷을 서버에게 보냈는데 중간에 있는 라우터에서 그 서버에 해당하는 네트워크에 도달하지 못하고 중간 라우터들 사이에서 뺑뻉이를 돌기 때문에 발생함. 클라이언트가 SYN를 서버에게 보내면 서버는 SYN+ACK를 보내고 이것을 클라이언트가 받게 되면 클라이언트는 연결이 성공했다고 판단하고 ACK를 다시 서버에게 보낸다. ACK를 받은 서버는 그제서야 클라이언트와 연결이 성공했다고 인지하게 된다.


그런데 SYN를 보낸 클라이언트가 SYN+ACK를 받지 못하고 계속 기다린다. 무한정 기다릴 수 가 없으므로 타임아웃이 발생한다.


ECONNREFUSE - 클라이언트가 보낸 패킷이 서버까지 잘 전달이 되었으나 포트번호에 해당하는 소켓이 없거나 소켓이 멀쩡하지 않은 경우 서버는 심각한 오류로 판단하고 그 즉시 클라이언트에게 Reset메세지를 보낸다 그 RST메시지를 받은 클라이언트는 연결이 거절되었다는 에러 메세지를 출력한다.


ENETUNREACH OR EHOSTUNREACAH - 클라이언트가 보낸 패킷이 서버 네트워크까지는 잘 전달 되었다. 그런데 그 네트워크에 있는 디폴트 게이트웨이가 호스트 주소에 해당하는 호스트를 찾기 위해서 ARP메시지를 브로드캐스팅하게 되는데, 아무도 ARP메시지에 응답을 하지 않게 되면 그 디폴트 게이트웨이(라우터)는 클라이언트가 보낸 패킷을 받을만한 서버 호스트가 없다고 판단해서 ICMP메시지를 클라이언트에게 되돌려준다. 그렇게 되면 클라이언트는 no route to host라는 메시지를 출력하게 된다.


connect ( ) 함수를 호출할 때 전달한 argument socket address structure 에는 정해진 상대 방 기계의 IP 주소와 TCP/UDP port 번호가 있는데 상대방 기계에 전달된 port 번호에 연결되어 있는 프로세스가 없는 경우에는 그 사실이 클라이언트 기계에 통보되고 그 TCP 메시지를 통보받 은 클라이언트 기계의 커널은 즉시 -1 return 하며 connect 함수를 종료한다

-> 연결 거절


connect 함수를 호출한 기계의 커널은 최종적으로는 상대방인 서버 기계와 TCP 연결을 설정하 는 것을 목표로 하므로 three way handshaking 동안 TCP 프로토콜에 정해진 메시지들을 서버로 부터 받는 것이 원칙이지만 경우에 따라서는 서버가 아닌 도중의 라우터로부터 ICMP destination unreachable” 메시지를 받을 수도 있다. 이와 같은 경우에는 클라이언트는 정해진 시간 동안 반복 해서 연결을 재시도하지만 그 정해진 시간이 지나면 -1 return 하며 connect 를 종료한다

-> 타임 아웃 발생


5 연결설정을 재시도하도록 되어 있는 시간은 시스템에 따라 다르지만 대략 75 초 정도이다 


댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함