Notice
Recent Posts
Recent Comments
Link
nathan_H
[Network] 웹 네트워크 탐험과 데이터 송수신 흝어보기 본문
What is the Internet?
- 컴퓨터, 핸드폰, 스마트 Tv 등등 지금 시대는 인터넷이 사용 안되는 곳이 거의 없고, 인터넷을 통해 많은 사람들이 서로 연결되고 소통을 할 수 있다. 그렇다면 과연 '인터넷'은 무엇이고 어떻게 동작하고 수 많은 데이터는 어떻게 주고 받게 되는 것 일까??
인터넷
- 인터넷은 Network of networks로 수 많은 Network가 연결된 하나의 망이라고 보면 됨.
- 여기서 Network는 다양한 Protocols을 통해 Message을 주고 받으면서 Control되게 되어 있음.
프로토콜
-
프로토콜은 네트워크에서만 사용하는 용어가 아니라 범용적으로 사용하는 용어인데, 인간도 암묵적으로 하나의 프로토콜을 가지고 소통을 하고 있음.
Person 1: 안녕~ Person 2: 오 오랜만이야~ Person 1: 우리 오늘 몇시에 만날까? Person 2: 저녁 7시 홍대 어때?
- 가령 친구를 만나고, 약속을 잡는 과정을 보면 우선 친구와 '연결'이 된 후 각자의 대화 목적 '내용'을 전달해 최종적으로 '약속(목적)'을 달성하게 됨.
- 이렇듯 Network도 HTTP, TCP와 같은 Protocol을 통해 통신을 주고 받고 통신의 주 목적을 달성하게 됨.
웹 동작 흐름
- Network는 가전기기, 앱, 웹 브라우저 등등 다양한 디바이스 그리고 프로그램에서 사용되어지고 있는데 그 가운데 가장 흔히 사용하는 웹 브라우저를 통해 Network 동작 방식 및 흐름에 대해 살펴보고자 함.
웹 브라우저에서 웹 서버까지의 경로
https://webdir.tistory.com/261
웹 네트워크 탐험
HTTP 리퀘스트 메시지 작성
- 웹 네트워크 탐험의 시작점은 사용자가 웹 브라우저에 URL을 입력하는 곳이고, 그 URL을 해독하는 곳부터 브라우저의 동작이 시작이 됨.
- 다음으로 URL의 의미에 따라 리퀘스트 메시지를 만든 후 브라우저는 리퀘스트 메시지에 따라 웹 서버에 무엇을 하려는지를 전달.
웹 서버의 IP 주소를 DNS 서버에 조회
- 리퀘스트 메시지를 만들면 OS에 의뢰해서 웹 서버에 송신하는데, 이때 메시지를 넘기는 상대의 IP 주소를 OS에 통지해야 함.
- 리퀘스트 메시지는 OS을 통해 송신이 이루어 짐.
- 여기에서 브라우저는 웹 서버의 IP 주소를 조사하게 되고, URL 안에 있는 도메인 명을 DNS 서버에 조회해 IP 주소를 받아 OS에 전달 해주게 됨.
프로토콜 스택에 메시지 송신을 의뢰
- IP 주소를 조사하면 메시지를 웹 서버에 송신하도록 OS에 의뢰하는데, 이때 세밀한 규칙을 따라 의뢰를 해야하는데, 그것을 프로토콜 스택에 송신을 외뢰한다고 함.
URL과 브라우저
https://www.codns.com/b/B05-195
- 보통 URL이라고 하면
http:
로 시작하는 것이라고 알고 있지만,file:
mailto:
와 같이 목적에 따라 다양하게 존재함. - 브라우저에서는
http
프로토콜을 통해 웹 서버에 접근해 원하는 데이터 및 페이지를 가져오게 되는 것임.
HTTP 기본 개념
https://eso0609.tistory.com/14
- URL을 해독하면 어디에 엑세스해야 하는지 판명이 되는데, 브라우저는 HTTP 프로토콜을 사용하여 웹 서버에 액세스하게 됨.
- HTTP 프로토콜은 클라이언트와 서버가 주고받는 메시지의 내용이나 순서를 정한 것이지만, 기본적인 개념은 단순함.
- 먼저 클라이언트에서 서버를 향해 리퀘스트 메시지를 보낸 후 메시지의 안에는 '무엇을', '어떻게 해서'하겠다는 내용이 쓰여 있음.
- '무엇을'에 해당하는 것을 URI라고 하는데, 보통 페이지 데이터를 저장한 파일의 이름이나 CGI 프로그램의 파일명을 URI로 씀.
- 예를 들어, 'dir/file.html'이나 '/dir/program1.cgi'와 같은 식.
- 즉 URI는 엑세스 하는 대상을 통칭하는 말
- '어떻게 해서' 에 해당하는 것은 메소드로, 이 메소드에 의해서 어떤 동작을 하고 싶은지를 전달.
- 메소드는 아래 그림을 살펴보면 메소드로 어떤 동작을 요구할 수 있는지 알 수 있음.
- '무엇을'에 해당하는 것을 URI라고 하는데, 보통 페이지 데이터를 저장한 파일의 이름이나 CGI 프로그램의 파일명을 URI로 씀.
https://eso0609.tistory.com/14
참고 (URL vs URI)
- URI (Uniform Resource Identifier)
- 요청하는 자원의 식별자 (규약)
- 자원을 고유하게 식별하고 위치를 지정할 수 있다.
- URI의 하위 개념으로 URL이 포함된다. 즉, URI > URL
- URL (Uniform Resource Locator)
- 특정 웹 서버의 특정 자원에 대한 구체적인 위치 (규약의 형태)
- 자원의 정확한 위치와 접근하기 위한 방법을 알려준다.
- Ex) URL 이면서 URI인 경우
- https://gmlwjd9405.github.io/tags.html
- 자원의 고유한 식별자이면서 구체적인 위치를 명시한 형태
- Ex) URL이 아니면서 URI인 경우
- https://www.networkstudy/post/10
- https://www.networkstudy/list?page=2
- URL: https://www.networkstudy/list
- URI: URL + ?page=2
- 자원에 접근할 수 있는 위치는 'https://www.networkstudy/list' 이며, 이를 URL이라고 할 수 있다.
- 하지만 원하는 자원을 얻기 위해서는 추가적인 식별자인 page=2가 필요하고 이를 포함한 내용까지가 URI라고 할 수 있다.
HTTP Message
- 브라우저에서 생성한 HTTP Request 메세지를 웹 서버에 전송하면, 메소드(POST, GET)그리고 요청 바디에 맞게 서버가 응답 메시지를 보내줌
- 위 과정을 통해 웹 브라우저 상에서 유저와 서버의 데이터 송 수신이 이루어지게 됨.
웹 서버의 IP 주소 조회
- HTTP 메시지를 만들면 다음에는 이것을 OS에 의뢰하여 웹 서버에게 송신을 함.
- 브라우저는 URL을 해독하거나 HTTP를 만들지만, 메시지를 네트워크에 송출하는 기능이 없으므로 OS에 의뢰해서 송신하게 됨
- 이때, URL 안에 쓰여있는 도메인명에서 IP 주소를 조사해야하고, OS에 외뢰할 때는 도메인명이 아닌 IP 주소를 전달해 메세지를 받을 상대를 지정하게 됨.
IP 주소의 기본
- 인터넷이나 사내 LAN은 TCP / IP의 개념에 기초하여 만들어졌으므로, TCP / IP의 기본이 되는 개념부터 알아보자.
- TCP / IP는 서브넷이라는 작은 네트워크를 라우터로 접속하여 전체 네트워크가 만들어짐.
- 여기서, 서브넷이란 허브에 몇 대의 PC가 접속된 것이라고 생각하면 됨.
- 엑세스 대상의 서버까지 메시지를 운반할 때는 이 IP 주소에 따라 엑세스 대상이 어디에 있는 판단하고 운반
- 송신측이 메시지를 보내면 서브넷 안에 있는 허브가 운반하고, 송신측에서 가장 가까운 라우터까지 도착함. 그리고 라우터가 메시지를 보낸 상대를 확인하여 다음 라우터를 판단하고, 거기에 보내도록 지시하여 송신 동작을 실행한 후 다시 서브넷의 허브가 라우터까지 메시지를 보냄.
IP 주소의 표기 기법
https://medium.com/@jyson88/aws-network-ip와-subnet-655c49fc356f
- 실제 IP 주소는 32 비트의 디지털 데이터로, 8비트씩 점으로 구분하여 10진수로 표기
- 이 형태가 보통 IP주소인데, 이것만으로는 어느 부분이 네트워크 번호인지 또는 호스트 번호인지 알 수 없음
- IP 주소의 규칙에서는 네트워크 번호와 호스트 번호의 두 가지를 합쳐서 32비트로 한다는 것만 결정되어 있을 뿐 내역은 결정되어 있지 않음
- 즉 네트워크를 구출할 때 사용자가 직접 내역을 결정할 수 잇다는 것.
- 이 내역을 나타내는 정보를 필요에 따라 IP 주소에 덧붙이는데, 이 정보를 '넷마스크'라고 함.
넷마스크
-
IP 주소에서 32비트 부분의 디지털 데이터이며, 왼쪽에 1이 나열되고 오란쪽에 0이 나열된 값
-
그리고 넷 마스크가 1인 부분은 네트워크 번호를 나타내고, 넷마스크가 0인 부분은 호스트 번호를 나타냄.
-
이 넷마스크를 IP주소와 같이 8비트씩 구분하여 표기하고 IP주소의 오른쪽에 병기한 표현은 아래와 같음.
10.11.12.13/255.255.255.0 ---IP ---- ---넷마스크----
-
위 표현식도 길어 한 부분의 비트 수를 10진수로 나타내고 IP 주소를 병기한 것은 아래와 같음
10.11.12.13/24
-
호스트 번호 부분의 비트 값이 모두 0인 또는 1인 경우는 특별한 의미를 나타냄
- 호스트 번호 부분이 모두 0인 IP 주소는 각각의 기기를 나타내는 것이 아니라 '서브넷' 자체를 나타냄
- 호스트 번호 부분이 모두 1이면 서브넷에 있는 기기 전체에 패킷을 보내는 '브로드캐스트'를 나타냄
데이터 송 수신 동작의 개요
https://jongmin92.github.io/2019/02/28/Java/java-with-non-blocking-io/
- IP 주소를 조사했으면 IP 주소의 상대, 여기에서는 엑세스 대상 웹 서버에 메세지를 송신하도록 OS 내부에 있는 프로토콜 스택에 의뢰
- 데이터를 송 수신하는 동작은 브라우저뿐만 아니라 네트워크를 이용하는 애플리케이션 전체에 공통
- Socket 라이브러리를 활용해 데이터 송 수신 동작이 이루어 지는데, 데이터를 송 수신하는 컴퓨터 사이에 데이터의 통로 같은 것이 있고, 이것을 통해 데이터가 흐르면서 상대측에 도착하는데, 통로는 파이프와 같은 것이라고 생각하면 됨
- 한쪽 끝에서 파이프에 데이터를 쏟아부으면 파이프 안에 통해 반대쪽 끝까지 도착하고,거기에서 데이터를 추출
- 데이터를 송 수신할 때의 개념은 이것뿐이지만, 중요한 것이 한 가지 더 있는데, 송 수신 동작을 하기 전에 송 수신하는 양자 사이를 파이프로 연결하는 동작이 필요함.
- 이 부분의 요점은 파이프의 양끝에 있는 데이터의 출입구라고 하고 '소켓'이라고 부름
- 실제로는 먼저 서버측에서 소켓을 만들고, 소켓에 클라이언트가 파이프를 연결하기를 기다림
- 즉, 서버와 클라이언트는 소켓을 통해 연결을 한 후 데이터 송 수신을 하게 됨.
- 정리하면 데이터 송 수신 단계는 아래와 같음.
**데이터 송 수신 단계**
1. 소켓을 만듬.
2. 서버측의 소켓에 파이프를 연결
3. 데이터를 송 수신
4. 파이프를 분리하고 소켓을 말소
- 위 4가지 동작을 실행하는 것이 바로 OS 내부의 프로토콜 스택임.
- 브라우저 등의 애플리케이션은 자체에서 파이프를 연결하거나 거기에 데이터를 쏟아붇지 않고, 프로토콜 스택에 의뢰해서 파이프를 연결하거나 데이터를 쏟아부음
1. 소켓의 작성 단계
- 데이터 송 수신을 의뢰하는 애플리케이션 프로그램의 동작을 보면, DNS 서버에 조회를 보낼 때와 같이 Socket 라이브러리의 프로그램 부품을 호출 하게 됨
- DNS 서버의 경우 DNS 서버의 gethostbyname이라는 프로그램 부품을 호출했지만, 이번에는 몇 개의 프로그램 부품을 결정된 순번대로 호출
- 클라이언트측의 소켓을 만드는 것은 간단한데, 소켓 라이브러리의 socket이라는 프로그램 부품만 호출하면 됨
- socket을 호출한 후의 동작은 리졸버를 호출했을 때와 같이 socket 내부에 제어가 넘어가서 소켓을 만드는 동작을 실행하고, 이것이 끝나면 애플리케이션에 제어가 돌아옴
- 소켓이 생기면 디스크립터라는 것이 돌아오므로 애플리케이션은 이것을 받아 메모리에 기록해둠
- 디스크립터는 소켓을 식별하기 위해 사용하는 것으로, 다음과 같이 생각하면 됨
- 브라우저가 웹 서버에 엑세스하는 동작에만 착안하며 알아차리지 못할 수도 있지만, 컴퓨터의 내부에서는 복수의 데이터 송 수신 동작이 동시에 진행되는 경우가 있음. 이 경우 2개의 데이터 송수신 동작이 진행되므로 2개의 소켓을 만들어야함 이 경우 하나하나의 소켓을 식별해야 하는데, 이것이 디스크립터라고 생각하면 됨
- 디스크립터 = 애플리케이션의 번호표 라고 보면 됨
2. 파이프 연결하는 '접속' 단계
- 애플리케이션은 Socket 라이브러리 connect라는 프로그램 부품을 호출하여 이 의뢰 동작을 실행
- connect를 호출 할 때 지정하는 디스크립터, 서버의 IP 주소, 포트 번호라는 세 가지 값
- 디스크립터를 보고 어느 소켓을 서버측의 소켓에 접속할지 판단
- IP 주소는 DNS 서버에 조회하여 조사한 엑세스 대상 서버의 IP 주소
- 데이터 송 수신 동작을 실행할 때는 송 수신하는 상대의 IP 주소를 프로토콜 스택에 알릴 필요가 있음
IP 주소와 포트 번호
IP주소
- 네트워크에 존재하는 각 컴퓨터를 식별하기 위해 각각에 서로 다른 값을 할당한 것
- IP 주소만으로는 소켓을 지정할 수 없음
포트 번호
- 접속할려는 소켓을 식별하는 번호.
IP 주소와 포트 번호의 두 가지를 지정해야 어느 컴퓨터의 소켓과 접속할지를 분명히 지정할 수 있음
- 소켓 자성의 설명에 등장한 디스크립터를 사용하면, 소켓을 지정할 있다고 생각할 수 있지만, 이 방법은 좋지 않음
- 디스크립터는 소켓을 만들도록 의뢰한 애플리케이션에 건네주는 것이지, 접속 상대를 건네주는 것이 아니므로 접속 상대측에서는 그 값을 모름
- 즉 서버측 소켓의 디스크립터를 클라이언트에서 알 수 없으므로 포트 번호를 통해 접속 상대측의 소켓을 식별하는데 사용
3. 메시지를 주고받는 송 수신 단계
- 애플리케이션은 송신 데이터를 메모리에 준비, 사용자가 입력한 URL을 바탕으로 HTTP 리퀘스트 메시지가 여기에서 말하는 송신 데이터
- 송신 데이터는 네트워크를 통해 전부 그대로 엑세스 대상의 서버에 도착하고 서버는 수신 동작을 실행하여 받은 데이터의 내용을 조사하고 적절한 처리를 실행하여 응답 메시지를 반송
4. 연결 끊기 단계에서 송 수신이 종료
- 브라우저가 데이터 수신을 완료하면 송 수신 동작이 끝이남. 그 후 Socket 라이브러리의 close라는 프로그램 부품을 호출하여 연결 끊기 단계로 들어가도록 의뢰 그러면 소켓 사이를 연결한 파이프와 같은 것이 분리되고 소켓도 말소됨
Comments