W5100 DHCP Client구현

안녕하십니까.

W5100으로 제품 개발진행 중에 문의사항이 있어서 글을 올립니다.

현재 예제를 바탕으로 W5100과 내부 네트워크와 TCP IP 송수신 테스트는 완료 하였습니다.

그런데 외부 공인 IP에 접속하려면 DHCP로 부터 IP를 받아야 접속이 가능하다고 하더군요.

그래서 DHCP 예제를 보고 코딩중에 있습니다.

SPI 설정후

init_dhcp_client(0, 0, 0);
함수와
getIP_DHCPS();
함수 모두 리턴 OK를 받았습니다.

이상황에서 SourceIP를 읽어보니
192.168.0.32 가 뜨더군요. SourceIP는 맨처음 아무것도 넣지 않은 상황에서 GetIP_DHCPS 이후에 SourceIP가
변경된것을 보면 제대로 IP를 DHCP 서버로 부터 수신한것 같은데

공인IP 및 내부 IP 둘다 접속이 되지 않았습니다.

이때 PING을 해보면 192.168.0.32에 핑이 되지 않고
socket(Socket2, Sn_MR_TCP, sourcePort, 0x20); //<== Socket2 는 1
socket 함수는 리턴 OK를 받았는데
connect(Socket2, MyDestinationIP, Port);
connect 함수에서 리턴 fail을 받습니다.

MAC Address는 사용하지 않는 랜장비의 MAC Address를 사용하였습니다.

질문 1. MCU 및 초기화 → init_dhcp_client(0, 0, 0) 함수 호출후 → getIP_DHCPS() 해당 함수 호출로 DHCP의 IP 할당 받는 작업이 끝나는 것이
맞는것인지요?

질문 2. Socket 1번을 사용하면 안되고 DHCP socket인 0번소켓을 재설정해서 접속해야 하는것인지?
어느 레지스터를 확인해보면 정상인지 아닌지 확인이 가능한지요?

질문3. DHCP는 주기적으로 DHCP서버에 일정 시간안에 갱신을 해주어야 해당 IP를 계속 사용할 수 있는것으로 알고 있습니다만…
check_DHCP_state(0); 이 함수를 주기적으로 호출하면 해당 State에 따라 갱신되는것으로 보이는데 맞는지요?

감사합니다.

안녕하세요.

말씀하신대로 공유기를 공인IP로 설정한 후,

공유기에서 연결된 Peer에 DHCP로 사설IP를 할당해야 외부로 통신이 가능합니다.

질문하신 사항을 짐작하여 보니 DHCP IP 할당이 안되는 것 같습니다.

그렇다면, DHCP의 동작을 다시 한번 짚어봐야 할 것 같은데요.

DHCP가 IP 요청을 정상적으로 시행하고 있는지, 그리고 요청된 IP를 정상적으로 응답받고 있는지

정확한 확인이 필요합니다.

Wireshark tool을 이용해서 확인이 가능하니 확인해주세요.

질문하신 부분 중

소켓에 대한 질문은 Socket 0번을 사용하셔도 상관없고 1번을 사용하셔도 무방합니다.

소켓 1개로 충분히 통신 가능합니다. 다만 DHCP용 Port가 정해져있으니 꼭 확인해주세요.

그리고 DHCP IP갱신 부분을 말씀 해주셨는데요.

이 부분은 먼저, DHCP IP 할당을 받고 정상적으로 PING이 된다면, 그 이후에 확인하셔도 괜찮을 것 같습니다.

먼저 DHCP 패킷이 정상적으로 송/수신 되는지 확인해주세요.

감사합니다.

답변 감사드립니다.

1.949554 0.0.0.0 255.255.255.255 DHCP 590 DHCP Discover - Transaction ID 0x12345678
1.954954 192.168.0.1 255.255.255.255 DHCP 590 DHCP Offer - Transaction ID 0x12345678
2.052053 0.0.0.0 255.255.255.255 DHCP 590 DHCP Request - Transaction ID 0x12345678
2.057532 192.168.0.1 255.255.255.255 DHCP 590 DHCP ACK - Transaction ID 0x12345678

말씀하신대로 Wireshark로 패킷을 찍어보았습니다.

제가 프로그램상 접속 실패할경우 리셋되어 처음부터 동작하도록 짜놓아서 그런지

위와 같은 패킷들이 주기적으로 올라오는데요. 3.2.6.5 의DHCP Client 데이터를 보면 위 순서대로가 맞아 보입니다만…

DHCP STATE를 확인해보니 DISCOVER → REQUEST → LEASED 로 변경되고 getIP_DHCPS(); 종료가 됩니다.

이때 패킷을 보니 라이브러리 코드를 봐도 ACK 수신하고 LEASED로 스테이터스가 변경되면서 완료가 되고

이후 state를 읽어서 LEASED에서 일정시간되면 REREQUEST로 넘어가서 갱신하는것처럼 보입니다만…

wireshark 에서 bootstrap Protocol을 보니

offer 에서
client IP Address 0.0.0.0
your IP Address : 192.168.0.32
로 뜨고

request에서
client IP Address 0.0.0.0
your IP Address : 0.0.0.0

ACK에서
client IP Address 0.0.0.0
your IP Address : 192.168.0.32

로 뜨고 있습니다.

외부 네트워크 접속시 2가지 방법이 있습니다.
이는 PC도 같은데요.

DHCP 서버(공유기)를 통해 IP를 할당받는 방법 PC에서 자동으로 IP설정하는 것이 이에 해당합니다.
인터넷회사에서 받은 IP를 직접 입력하는 방법 PC에서 고정 아이피 설정하는 것이 이에 해당합니다.

DHCP Server에게 IP를 할당을 받기위해선 DHCP Client 기능이 있어야합니다.

보내주신 패킷의 내용을 보니 DHCP Server에게 IP 할당을 받는 것은 정상적으로 작동하는것 같습니다.

공인 IP 및 내부 IP 둘다 접속이 되지않는다는 말씀을 하셨는데 ping을 쏘는 PC는 네트워크가 어디에 연결이 되어있나요?
192.168.0.32의 네트워크와 만약 다른 네트워크라면 PING이 되지않습니다.
ping은 외부접속하는 IP로 ping을 하셔야 ping이 정상적으로 됩니다.

예를들어 212.32.55.1이라는 외부망 접속가능한 고정아이피가 있다고 하면 공유기는 이 IP를 가지고 192.168.0.1이라는 가상 IP를 셋팅하게되고 DHCP Client에게 가상 IP인 192.168.0.32라는 IP를 주게됩니다. 이렇게 된 후 192.168.0.32의 IP는 192.168.0.1의 IP로 데이터를 보내게 되고 192.168.0.1의 IP를 가진 공유기는 212.32.55.1이라는 외부망이 접속가능한 IP로 밖으로 나가게 됩니다.
외부에서는 내부 가상 IP인 192.168.0.32를 찾을 수 없습니다. 따라서 212.32.55.1이라는 밖으로나가는 IP로 Ping 테스트를 해보셔야합니다.

내부에서 이를 구분하기위해 Port를 사용합니다.

212.32.55.1:5000 = 192.168.0.32 이런식의 테이블을 만들게 되고 212.32.55.1:5000으로 접속하는 외부 IP에게 내부 192.168.0.32와 연결을 시켜주게됩니다.

답변이 되었으면 좋겠습니다.

감사합니다. :slight_smile:

요세 공유기에는 거의다 포트 포워딩이라는 기능이 붙어 있어요.

외부에서 공유기에서 설정해 놓은 포트로 쏴주면 공유기는 해당 포트로 들어온 데이터를 미리 지정해 놓은 IP로 "토스"만 합니다.

이런식으로 외부에서 내부 네트워크로 접근이 가능합니다. 참고하세여~ ^^