W/System.err(5490): java.net.ConnectException: failed to connect to /192.168.123.103 (port 5505): connect failed: ETIMEDOUT (Connection timed out)

 

간혹 위의 에러를 이해할 수 없을 때가 있을 것이다. 주소도 잘 맞췄고 포트도 틀리질 않았는데 왜 안되는가? 구체적인 시나리오는 공인 IP한대에 공유기가 물려있고 그 공유기 아래에 또 다른 공유기가 물려있다. 하지만 포트포워딩을 쓰기 귀찮아서 같은 공유기내에서 각각 사설 IP를 물려받아 데스크탑에 서버를 열고 안드로이드 클라이언트를 물렸다. 그런데 왜 ConnectException이 뜰까?

 

아이피와 포트번호가 틀리지 않았다면 보통 이런 문제는 방화벽등으로 막혀있거나 라우터테이블 같은 곳에서 ip를 찾을 수 없는 문제라고 볼 수 있다. 근데 나는 방화벽 설정도 문제가 없을뿐더러 공유기 내부에 두개(서버와 클라이언트)가 물려있어서 ㅄ이 아닌이상 아이피와 포트번호를 헷갈린 문제도 아니었다. 만약 그랬더라면 바로 찾았을터... 정말 방화벽도 내가 실수한 것도 아니라면 한번 간단하게 분석해보자!

 

우선적으로 우리가 통신하는 것에 대한 이해가 필요할듯 하다. 네트워크에서 통신을 할때 상대의 IP주소도 알아야하지만 실제적으론 MAC 주소를 알아야 통신할 수 있다. 하지만 "IP는 알 수 있어도 MAC주소는 어떻게 제공받는가?"라는 문제가 생긴다. 그래서 ARP(Address Resolution Protocol)가 존재한다. 그리고 이를 통해 통신할 상대의 MAC주소를 가져오고 관리하는 것이다. 그리고 이 MAC주소를 ARP table이란놈으로 관리를 하는데 윈도우 도스창 또는 리눅스의 터미널에서 에서 arp명령어로 간단히 알 수 있다. 그러면 처음에 MAC주소를 어떻게 얻어올까? 바로 IP주소를 통해 MAC주소를 알아온다. 나와 통신할 상대ip주소를 ARP packet에 담아 공유기(스위치)로 request메시지를 보내주면 공유기는 MAC주소를 ff.ff.ff.ff.ff.ff로 설정해서 연결된 모든 MAC주소로 ARP request 메시지를 Broadcasting한다. 그러면 상대의 IP가 일치하는 곳에서 response메세지로 상대 MAC주소가 오게 되고 이를 ARP table에 업데이트하고 업데이트된 후부터는 Unicasting되어서 사용하는 것이다.

 

그러니까 ip는 Logical Address로 라우팅을 위한(최단거리를 찾아가기위한) 목적을 가지고 있고 실질적인 통신은 Physical Address인 MAC Address로 상대방을 구분하여 통신을 하는 것이다. 그러므로 내가 ip와 port번호가 맞았다고 한들 MAC주소를 알아내지 못하니 통신이 불가능

한것...

 

이를 해결하기 위해 데스크탑 ARP table이든 안드로이드 ARP table이든 간에 서로의 MAC주소를 등록시켜줘야 하는 것인데 의문인 것은 위에서 설명했던것처럼 내가 이미 소켓 연결을 하려고 할때 이미 ARP table을 업데이트 하고 통신하는 것이 정상이다. 근데 왜 안되는 것일까?

 

------------------------------------------------------------------------------------------------------------------------------

결국 결론은 공유기 문제인것 같다. LG공유기로 바꾼 후 부터 인터넷이 자주 끊기는 문제가 잦았고 문제가 많았다. 아마 LG 공유기라서 이러한 문제가 있는것 같다. 기존의 공유기에서는 이러한 문제도 없었을 뿐더러 다른 집이나 학교의 공유기에선 전혀 문제가 없었다.

또 LG공유기에 사설 IP를 고정으로 할당하는 기능이 없다. 이런 쓰레기같은... 역시 LG는 디스플레이말곤... 노답이다.

Posted by duehd88
,