본문 바로가기

Programming

내 컴퓨터가 http 요청 메시지 보내는 과정 정리


먼저  사이트에 접속하기 위해서는 너희 컴퓨터에 IP 주소가 할당되어 있어야 해.

IP 주소는 고정 IP주소와 유동 IP주소 2가지가 있는데, 

나를 포함한 대부분은 유동 IP 주소를 사용하고 있어.


따라서 인터넷에 접속하기 위해서는 

먼저 IP 주소를 ISP 업체에게서 할당받아야 인터넷에 접속이 가능해.

여기서 ISP 업체는 너희들이 인터넷을 사용할 수 있도록 

IP주소나 망 등을 사용하게 해주는 kt나 sk 등등을 의미해.





이해를 돕기 위해 그림으로 설명해볼게. 

왼쪽에 보이는 컴퓨터가 오늘도 할일없이 컴퓨터를 하고있는 너희들의 컴퓨터를 나타낸 그림이야.

그리고 위 그림에서 DHCP 서버가 보이지? 

DHCP 서버는 방금 말한, 너희들의 컴퓨터에 IP 주소를 할당해주는 역할을 해.

너희의 컴퓨터가 DHCP 서버에게 아이피 주소 할당을 요청하는 메시지를 보내면, 

DHCP서버가 이에 응답하는거지.


근데 여기서 문제가 있어. 


어딘가로 패킷을 보내기 위해서는 먼저 너희들의 컴퓨터가 IP 주소를 가지고 있어야 한다고 말했었지?

거기다가 추가로 내가 보내려는 해당 목적지의 아이피 주소 또한 알고 있어야 패킷을 해당 목적지로 보낼 수가 있어.

그런데 너희들의 컴퓨터는 보다시피 아직 아이피주소도 할당 받지 못했고, DHCP 서버의 아이피 주소도 알지 못해


이 상황에서 너희들의 컴퓨터가 어떻게 DHCP 서버에게 아이피 주소를 달라고 요청할 수 있을까?


정답은 브로드캐스트를 통해 요청을 하게 되는데, 

간단하게 말하면 "야 내가 IP주소 할당받고 싶다!!" 라고 길거리에서 외치는것처럼

너희 주변에 있는 다른 너희의 컴퓨터나 서버들에게 요청 메시지를 무식하게 뿌리는 거야. 민폐ㅇㅈ?

그럼 그중에 DHCP 서버가 "호옹이?!" 하면서 너희의 요청메시지에 반응하게 되고, 

너희에게 IP주소를 할당해주게 되는거지.


이제 아이피 주소도 할당받았으니 다음 과정을 설명할게




너희들은 구글에 접속하기 위해서 단순히 www.google.com을 입력하고 들어갈거야.

하지만 구글 사이트에 접속하려면 실제로는 구글 서버의 아이피 주소를 알고 있어야 돼.


매번 서버의 아이피 주소를 입력하는게 넘무 불편하기 때문에 

우리가 기억하기 쉬운 www.google.com 과 같은

도메인 네임이라는게 만들어진거야. 만든사람 똑똑ㅇㅈ?


따라서 우리는 도메인 네임을 단순히 입력하지만 

실제로는 www.google.com이 아이피 주소로 변환되는 과정이 필요해.


위의 그림을 보면 DNS 서버가 보일거야. 

DNS 서버의 역할은 너희들이 www.google.com의 아이피 주소를 물어보면,

해당 서버의 아이피 주소를 알려주는 역할을 해.


그럼 여기서 문제를 한가지 내볼게.


아이피 주소를 할당받은 너희의 컴퓨터는 어떻게 DNS 서버에 요청 메시지를 보낼 수 있는걸까?

DNS서버에 요청 메시지를 보내려면 DNS 서버의 아이피 주소를 알아야 하지 않겠어?

참고로 DHCP서버에 요청 메시지를 보냈을때는 "야 내가 IP 주소 할당받고 싶다!!" 라고 너희 주변에다가

브로드 캐스트를 했기 때문에 따로 목적지의 아이피 주소를 알지 못해도 메시지를 보낼 수 있었어.

그럼 이번에도 브로드 캐스트를 하면 되지 않음? 이라고 생각하겠지만 

매번 자신의 주변에다가 브로드 캐스트를 하는건

사람들이 북적이는 지하철 안에서 샤우팅 하는 너희 마냥 주변에 안좋은 소리를 들을수가 있어.


우리는 선비처럼 DNS 서버에게만 귓속말로 

"구글사이트의 아이피 주소를 알고싶어(속닥속닥)" 라고 속삭이는 방법을 사용할거야.

그리고 그렇게 하기 위해서는 DNS 서버의 아이피 주소를 알아야 할 필요성이 있는 거지.


그럼 DNS 서버의 아이피 주소를 어떻게 알 수 있을까?

근데 사실 우리는 DNS 서버의 아이피 주소를 알 필요가 없어. 왜냐고?

DHCP서버가 너희들에게 IP 주소를 제공하면서 DNS 서버의 아이피 주소도 같이 알려주거든ㅎㅎ


일반적으로 kt나 sk같은 ISP업체가 너희들에게 인터넷을 할 수 있도록 IP 주소나 망을 제공하는데, 그 외에도 DHCP 서버나

DNS 서버도 제공해주는 역할을 해. 한달에 2만원 낼만한 가치가 있지?


그럼 이제 DNS 서버의 아이피 주소도 알고 있으니 www.google.com의 아이피 주소를 알아올 수 있는걸까?

여기서 또 한가지 문제가 있어.


단순히 DNS 서버의 아이피 주소만 알고있다고 해서 요청 메시지를 보낼 수 있는게 아니야. 너희들 머리 복잡해지노?

그림으로 쉽게 설명해볼게.




위의 그림을 보면 검은색 기계가 보일거야. 

이는 라우터 라는 장비를 표현한 그림인데,

실제로 너희들이 인터넷으로 패킷을 주고 받고 하기 위해서는 수많은 라우터들을 거쳐야 해.

그리고 이러한 라우터들이 집단적으로 깔려있는 일종의 망을 ISP 업체에서 제공해주고 있는거야.

유선 인터넷의 경우 랜선을 컴퓨터에 꽂아 쓰잖아. 

그 랜선이 너희와 가장 가까운 라우터에 연결되어 있다고 보면 돼.


그래서 너희들이 싸지르는 똥들은 먼저 너희와 연결된 라우터로 전송되고 

다수의 라우터들이 너희들의 똥을 나르는 역할을 하지.


아무튼 DNS 서버에 컨택을 하려면 먼저 너희와 연결되어 있는 라우터에다가 패킷을 보내야 할거야.

근데 라우터에다가 패킷을 보내려면 라우터의 아이피 주소 또한 알아야 하는 것 아니겠어?


너희와 연결되어 있는 라우터의 아이피 주소는 어떻게 알 수 있는걸까?


DNS서버와 마찬가지로, 라우터의 IP주소 또한 DHCP서버에서 IP주소를 할당받을 때 DHCP서버에서 제공해줘.


DHCP 서버 착함ㅇㅈ?

근데도 이상황에서 우리는 DNS 서버에 요청 메시지를 보낼 수가 없어

DNS 서버에 접촉하기 위해서 DNS 서버의 아이피 주소도 알아냈고, 

너희와 연결되어 있는 라우터의 아이피 주소도 알고 있고

못하는게 없는데, 왜 요청 메시지를 보낼 수 없을까?


그 이유는, 너희의 컴퓨터가 전송하는 패킷에 목적지 아이피 주소를 적게 되어있는데, 

동시에 두개를 적어 보낼 수가 없기 때문이야.


한번에 하나의 목적지로만 패킷을 보낼 수 있는거지.

그럼 어떻게 DNS 서버에 패킷을 보낼 수 있을까?

정답은 너희와 연결된 라우터의 맥주소를 이용하는 거야.

너희들의 컴퓨터 본체에 NIC 카드에도 적혀있고, 

통신 관련 장비나 너희들의 스마트폰에도 

맥주소가 하나씩 유니크하게 배정되어 있는데, 


실제로 패킷을 보낼때는 목적지의 아이피 주소 뿐만 아니라 

목적지의 맥주소도 적게 되어있어.


따라서 우리는 목적지의 맥주소를 너희와 연결된 라우터로 정하고, 

목적지의 아이피 주소는 DNS 서버로 정해서 패킷을 보낼거야.


이를 위해서는 유감스럽지만 라우터의 맥주소를 알아야 하는 수고를 한번 더 거쳐야해. 

슬슬 짜증나기 시작하지?


하지만 이번 과정만 거치면 나머지는 존나 간단하니까 마음을 다스리자.

맥주소를 알아내기 위해서는, ARP 프로토콜 이라는 녀석을 이용할건데, 

이녀석의 역할은 해당 아이피 주소에 맞는 맥주소를 알려주는역할을 해. 

간단하게 라우터의 아이피 주소를 적고서 ARP 메시지를 보내면 

라우터가 이 메시지를 받고 자신의 맥주소를 너희에게 알려주게 되지. 

DHCP 서버에서 했던 것 처럼 이때 역시 브로드캐스트를 사용해서 메시지를 보내게 되지.


그럼 이제 라우터의 맥주소를 알게 되었으니, 

패킷의 목적지 아이피 주소는 DNS 서버로 하고, 

목적지 맥주소는 너희와 연결된라우터로 정해놓고 패킷을 보내보자. 


그럼 먼저 맥주소에 적힌 라우터로 패킷이 전송되고, 

패킷을 받은 라우터는 목적지 아이피를 보고서 

DNS 서버쪽으로 패킷을전송하게 돼. 


그럼 성공적으로 패킷이 DNS 서버에게 전달이 되고, 

DNS 서버가 너희에게 구글사이트의 아이피 주소를 알려주게 되지.


여기까지의 과정을 통해 너희들은 이제 자신의 컴퓨터에 IP도 할당받았고 

구글사이트의 아이피주소도 알고 있고못하는게 없어. 

이제 구글 사이트로 HTTP 요청 메시지만 보내면 돼ㅎㅎ



DNS 서버에게 메시지를 보낼때와 마찬가지로, 

보낼 메시지의 맥주소에다가는 너희와 연결된 라우터의 맥주소를 적고,

목적지 아이피 주소에다가는 알아낸 구글 사이트의 아이피 주소를 적어서 보내면 success!!


아! 내가 HTTP 요청 메시지 보냈다!


너희의 HTTP 요청 메시지를 받은 구글 서버는 이제 

너희에게 구글저장소의 컨텐츠를 보내줄거고, 

인터넷 브라우저는 받은 컨텐츠들을 해석해서 

너희들에게 구글 화면을 보여줄거야.


여기까지의 과정을 전부 보았다면 

구글에 접속하기 위해서 존나 복잡한 짓을 해야한다는 사실을 알았을 거야.

근데 이러한 과정들이 너희들이 www.google.com을 입력하자마자 

1초도 안되는 시간에 다 이루어지는게 신기하지 않냐?