웹 브라우저가 URL의 의미를 조사 후 그 의미에 따라 리퀘스트 메시지를 만듭니다. 그리고 이를 웹 서버로 전송합니다.
프로토콜 스택의 역할
- 메시지를 보내는 것 → 디지털 데이터를 운반하는 구조의 역할
- 메시지를 패킷에 저장하고, 수신처 주소 등의 제어 정보를 덧붙입니다.
- 통신 오류 발생 시 패킷을 고쳐서 보내거나 데이터 통신의 기본을 조절하는 등의 역할을 수행합니다.
- 편지를 우체통에 넣고 오는 비서와 같은 것
허브, 스위치, 라우터
- LAN을 경유하여 인터넷에 접속합니다.
- 우체통에 봉투를 넣으면 그 후에는 집배원이 상대에서 편지를 전달하는 것
프로바이더(통신사)
- 인터넷 접속용 라우터에는 액세스 회선이 연결되어 있고 이는 프로바이더까지 연결됩니다.
- POP(Point Of Presence)라는 설비를 이용하여 패킷을 전국 또는 전 세계로 운반합니다.
- POP는 가장 가까운 우체국의 역할로 우체통에서 회수한 편지는 우체국에서 분류되어 전국 또는 전 세계로 배송
방화벽
- 웹 서버측의 LAN에 도착하면 방화벽에서 패킷을 검사
캐시 서버
- 방화벽을 통과한 데이터 중 다시 이용할 확률이 높은 데이터는 캐시 서버에 저장됩니다.
- 필요로 하는 데이터가 캐시 서버에 존재할 경우 웹 서버를 거치지 않고 응답을 할 수 있습니다.
- 부하 분산 장치로도 사용합니다.
웹 서버
- 패킷을 다시 리퀘스트 메시지로 복원하고 웹 서버 애플리케이션에 넘깁니다. (프로토콜 스택의 역할)
- 리퀘스트에 따른 응답 메시지를 넣어 다시 클라이언트에게 전송. 이는 지금까지의 작동과 반대의 과정을 거쳐 클라이언트에 전달
💡 프로토콜 스택의 역할은 리퀘스트 메시지를 패킷으로 변환하고, 다시 패킷을 리퀘스트 메시지로 변환하는 것입니다.
웹 브라우저
💡 브라우저는 웹 서버에 액세스하는 클라이언트의 역할을 할 뿐만 아니라, 파일을 업로드/다운로드 하는 FTP, 메일 클라이언트 등의 역할을 하는 복합적인 클라이언트 소프트웨어입니다.
💡 브라우저는 URL을 해독하거나 HTTP 메시지를 만들지만, **메시지를 네트워크에 송출하는 기능은 없습니다.**
Request
- 첫 번째 행은 리퀘스트 라인 : <메소드><공백><공백><HTTP 버전>
- 메시지 헤더 : 행 수는 상황에 따라 달라지며, 공백 행까지가 메시지 헤더에 포함됩니다.
- 메시지 본문 : 데이터를 보낼 때 데이터를 넣는 필드
Response
- <HTTP 버전><공백><스테이터스 코드><공백><스테이터스 코드의 의미를 담은 짧은 설명문>
- 메시지 헤더
- 메시지 본문
💡 브라우저의 리퀘스트 메시지를 보내는 것은 URL 뿐만 아니라, 하이퍼링크, 버튼 등이 있습니다.
IP 주소
💡 IP 주소는 네트워크 번호와 호스트 번호의 두 주소를 합친 것인데, 책에서 설명하는 네트워크 번호의 의미는 하나의 서브넷 안에서 사용할 수 있는 호스트 번호들의 범위로 이해하면 될 것 같습니다. 호스트 번호는 해당 서브넷 안에서 각 기기에 부여할 수 있는 번호를 의미합니다.
그럼 여기서 IP 주소의 표기법에 대해서 알아봅시다.
DNS 서버를 통해 IP 주소를 찾는 원리
💡 브라우저는 어떻게 DNS 서버를 조회할 수 있을까요?
DNS 리졸버가 DNS 서버를 조회하는 기능을 가지고 있고 DNS 리졸버는 Socket 라이브러리에 있습니다.
리졸버를 호출하면 리졸버가 DNS 서버에 조회 메시지를 보내고, DNS 서버에서 응답 메시지가 돌아옵니다. 브라우저는 응답 메시지 속에 포함되어 있는 IP 주소를 추출하여 HTTP 리퀘스트 메시지와 함께 송신합니다.
💡 이름과 타입에 따라 조사하는 정보를 지정하고, 그것에 따라 해당하는 것을 찾아 클라이언트에 회답하는 것이 DNS 서버의 기본 동작입니다.
DNS 서버는 정보를 분산시켜서 다수의 DNS 서버에 등록하고, 다수의 DNS 서버가 연대하여 어디에 정보가 등록되어 있는지를 찾아내는 구조입니다. (도메인명을 통해)
Recursive Query
💡 DNS 서버는 캐시 기능으로 빠르게 회답할 수 있습니다.
프로토콜 스택 내부에서는 소켓 통신을 이용하여 데이터를 전달하기 때문에 데이터를 송/수신 하기 전 소켓 연결 과정이 필요합니다.
💡 디스크립터를 통해 각 요청에 대해 생성된 소켓을 식별합니다. 이 디스크립터는 컴퓨터 한 대의 내부에서 소켓을 식별하기 위해서 사용하지만, 포트 번호는 접속 상대측에서 소켓을 식별하기 위해 사용합니다. 서버측의 디스크립터를 클라이언트에서 알 수 없으므로 클라이언트측에서 서버측의 디스크립터를 사용하여 소켓을 지정할 수 없습니다. 포트 번호를 통해 접속 측의 소켓을 식별합니다.
정리
- 애플리케이션이 소켓을 식별하는 것은 디스크립터입니다.
- IP 주소와 포트 번호를 통해 클라이언트와 서버 간에 상대의 소켓을 식별합니다.