1. 사전 지식.
네트워크 환경에 들어가서 IP 주소를 보면, 192.168.1.47. 항상 같이 다니는 서브넷 마스크는 255.255.255.0. 라우터는 192.168.1.1. 그리고 DNS라는 탭이 있습니다. 우리가 인터넷을 하기 위해서 가장 기본적으로 알고 있어야 되는 정보들입니다. 인터넷에 연결되기 위해서는 각자 IP와 서브넷 마스크가 있어야 합니다. 그래서 어디까지가 prefix인지, 네트워크 아이디인지 알려준다고 했는데, 지금 255.255.255.0니까 서브넷의 ID가 192.168.1.0/24 가 됩니다.
2. 그림과 함께 설명
외부로 패킷을 보내기 위해서 전달해야 할 라우터의 IP 주소가 "네트워크 세팅"에 적혀있습니다. Destination에 구글 적어서, 라우터한테 보내야 갑니다. 라우터가 없으면 포워딩, 포워딩 테이블, 라우팅도 없게 됩니다. 라우터는 주소를 보면 같은 네트워크에 있습니다. 그리고 같은 네트워크 중에서 보통 첫 번째입니다. (아닌 경우도 있습니다.)
그리고 이 DNS는 우리가 웹 브라우저를 열어가지고 www.naver.com을 검색하면 그때 패킷이 바로 네이버로 가는 게 아니라, 네이버의 IP 주소를 알아야 합니다. 그 IP 주소를 알기 위해서 로컬 네임 서버의 IP 주소가 DNS 탭에 적혀 있습니다. 그런데 DNS 주소는 라우터 주소랑 같습니다. 즉, 로컬 네임 서버 프로세스가 라우터에서 동작하고 있습니다.
Dynamic Host Configuration Protocol(DHCP)에서 가장 중요한 단어는 host configuration 즉, 우리가 노트북 사용할 때 제일 처음에 config하는 그런 일을 해주는 프로토콜 이라는 겁니다. dynamic하게 한다는 얘기는 동적으로 알아서 이런 정보들을 장소마다 다르게 받아와 주는겁니다. 반대로 자신만의 고정된 IP와 라우터를 쓰는 경우도 있습니다. Static IP라고 직접 설정을 하기도 합니다.
How does host get IP address?
1. hard-coded by sysadmin in config file (e.g., /etc/rc.config in UNIX) (직접설정 한다)
2. DHCP: Dynamic Host Configuration Protocol: dynamically get address from as server (DHCP가 자동으로 설정해 준다.)
• “plug-and-play
goal: host dynamically obtains IP address from network server when it “joins” network (호스트가 빠르게 network에 접글할수 있게 도와준다.)
- can renew its lease on address in use (사용중이면 알아서 추가 사용 갱신,)
- allows reuse of addresses (only hold address while connected/on) (이미 사용했던 IP 주소가 있으면 다시 재사용,)
- support for mobile users who join/leave network
(모바일에서 DHCP 자동으로 지원.)
DHCP discover은 broadcast로 DHCP 서버가 있는지 요청 하는 것 입니다. DHCP discover 메시지를 보면 소스 주소는 아직 IP 주소를 할당 받지 못했기 때문에 0.0.0.0 입니다. 그리고 목적지는 IP가 255.255.255.255 이거 32 bit로 봤을 때는 전부 다 1 입니다. 그러니까 모든 address 비트가 1인 경우 broadcast 입니다.
broadcast는 서브넷에 있는 모든 멤버들에게 보내는 것 입니다. DHCP 서버는 포트 넘버는 67번 입니다. 그리고 transaction ID는 offer와 request를 위해서 ip 대신으로 우리를 특정하기 위해 랜덤하게 부여받는 번호입니다. 그러면 이 DHCP discover 메시지를 이 서브넷에 있는 모든 멤버들이 받습니다.
그런데 이 DHCP discover 메시지를 이 서브넷에 존재하는 모든 호스트들이 받지만, DHCP 서버만 받아들이고 나머지는 드랍하게 됩니다. 왜냐하면 67번 포트를 향해서 메시지가 보내지는데, DHCP 서버가 돌고 있는 멤버만 67번 포트를 열어서 listen하고, 나머지는 포트를 열지 않고 서버를 돌리지 않고 있기 때문입니다. 그래서 중간에 67번 포트가 없어서 드랍됩니다.
그래서 67번 포트를 열고 기다리고 있는 DHCP 서버만 이 discover 메시지를 받아서 offer를 줍니다. offer 메시지에 source IP와 포트 넘버는 서버 자신 이고, destination은 broadcast 입니다. 왜냐하면 아직 우리는 IP를 할당 받지 않았기 때문에 broadcast를 하고, transaction ID와 68번 포트가 열려있는 것으로 우리를 특정짓게 됩니다.
offer에 담긴 의미는 앞으로 너는 내가 부여한 새로운 주소를 지금부터 1시간 동안 사용을 할 수 있다는 offer를 주는 겁니다. 그럼 우리는 이 offer를 받아서, 이 offer가 마음에 들면 offer를 수락합니다. 그래서 offer를 수락한다는 의미로 다시 이 offer에 대한 request를 보내야 합니다.
이 offer에 대한 request 보낼 때, 소스는 아직 이름이 없습니다. 왜냐면 아직까지 이 IP도 확정된 게 아니기 때문입니다. 그래서 소스 주소는 0.0.0.0이고, 보내준 IP를 사용하고 싶다는 의미로 아까의 transaction ID에서 하나 플러스 1 시켜서 request의 의미로 보내게 됩니다. 그래서 이게 응답이 오면 우리는 이제부터 이 IP 주소를 우리의 IP로 사용하게 되고 통신이 가능해 집니다. offer에는 부여할 IP 주소뿐만 아니라, 라우터 IP, DNS IP도 들어 있습니다.
offer만 받아도 될 것 같은데 offer에 request하는 이유가 있습니다. discover 메시지는 "도와주세요." 라고 요청한 것입니다. 그런데 보통의 경우는 서브넷 안에 DHCP 서버가 한 개 있지만, 어떤 경우는 서버가 여러 개 있을 수도 있습니다. 만약 서버가 두 개면 각각 두개의 offer가 옵니다. 그 후 offer들 중에 한개를 선택하게 됩니다.
discover 메시지의 destination이 다 255.255.255.255인 것에 대해서 추가 설명하자면 여기 DHCP request의 destination도 broadcast 입니다. destination에다가 offer를 보낸 DHCP 서버 주소 쓰면 안 되는 이유는 내부에 DHCP 기능을 하는 서버가 여러 개 있을 수가 있어서 우리한테 준 offer가 선택이 안 됐다는 걸 간접적으로 알려주기 위해서 저렇게 하는 것 입니다.
Connecting laptop will use DHCP to get IP address, address of firsthop router, address of DNS server.
DHCP REQUEST message encapsulated in UDP, encapsulated in IP, encapsulated in Ethernet
Ethernet frame broadcast (dest:FFFFFFFFFFFF) on LAN, received at router running DHCP server
DHCP server formulates DHCP ACK containing client’s IP address, IP address of first-hop router for client, name & IP address of DNS server
encapsulated DHCP server reply forwarded to client, demuxing up to DHCP at client
client now knows its IP address, name and IP address of DNS server, IP address of its first-hop router