ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 네트워크 통신 흐름
    Network 2021. 5. 2. 23:01

    통신 흐름을 보기 전에 네트워크 계층 개념을 정리한 포스팅을 먼저 보는 것을 권장한다.

     

     

     

    사용자가 웹 브라우저에 url을 입력하는 순간부터 데이터가 어떻게 흘러가는지, 네트워크 통신 흐름을 정리하였다.

     

    1. 웹 브라우저가 http 메세지를 만든다.

     

    브라우저

    ① 사용자가 입력한 url 해독

    브라우저는 사용자가 입력한 url에 대해서 해독을 한다.

     

     http 프로토콜 사용하여 웹 서버에 액세스

    #1 c  s 요청 M 만들기

    '무엇을' '어떻게 해서' 하겠다 라는 메세지를 만든다.

    '무엇을'은 uri로, 액세스 대상을 총칭하며, '어떻게 해서' 는 메소드로, 웹서버에 어떤 동작을 하고 싶은 지를 의미한다.

    http 메소드에는 get / post / put / delete 가 있다.

     

    * get과 post 메소드의 차이점

    get 메소드 : client가 폼에 입력한 값이 request M의 request line에서 보임.

    post 메소드 : client가 폼에 입력한 값이 body에 들어가서 더 안전함.

     

    request M, response M

     

    request M에는

    본문(body)이 사용될 때가 있다. get 메소드에서는 이를 사용하지 않고 post 메소드 사용 시, 사용자가 입력한 폼 입력 값을 전달하고자 할 때 사용된다.

    요청 메세지와 응답 메세지는 하나씩 번갈아 전송되며,

    하나의 요청에는  하나의 응답이 이루어진다는 점!

     

     

    브라우저가 http 요청 메세지를 만들었으면, 이제 송출을 해야하는데 브라우저는 송신의 기능을 할 수 없다. 따라서 os에 의뢰해야 한다. 수신처의 IP주소를 가지고 'x.x.x.x에 요청m를 송신해주세요' 라고 의뢰해야 하는 것이다. 의뢰에 앞서 수신처의 ip주소를 조회해서 알아내야 한다.

     

     

    #2 DNS 서버에 IP주소 조회

     

    IP 주소의 개념을 먼저 정리해보자.

    클라이언트들을 허브로 연결해 서브넷을 구성하고, 서브넷들을 라우터로 연결해 다른 LAN끼리 통신할 수 있게 된다.

    출처 https://blog.daum.net/tlos6733/76

    네트워크 번호는(ex.OO동) 서브넷에 할당되고 호스트번호(ex.OO번지) 는 클라이언트에게 할당된다.

    이 네트워크 번호 + 호스트 번호 = IP주소 가 되는 것이다. IP주소는 32bit로, 어디까지가 네트워크번호인지를 나타내기 위해 서브넷 마스크 개념을 사용한다.

     

    dns서버에 ip 주소를 조회하는 동작을 자세히 설명해보자면, (이 부분은 자세히 알 필요는 없다)

    DNS서버에 IP주소를 질의하기 위해서는 어플리케이션의 socket 라이브러리를 사용해야 한다 (컴퓨터 내부는 여러 계층으로 쌓여 있어 역할 분담을 통해 하위계층에게 실행의뢰를 하는 것을 알 수 있다. 계층구조는 아래 [그림5] 참조). socket 라이브러리 내 리졸버 라는 부품화된 프로그램이 os 내 프로토콜 스택을 통해 dns 서버에 질의하는 것이다.

     

     

    자신과 가까운 DNS 서버에게(TCP/IP에 설정된 DNS 서버) 질의하게 되고, DNS 서버에 찾는 IP주소가 없다면(캐시되어 있지 않다면) 루트 DNS 서버, 하위 DNS 서버로 차례대로 질의응답을 통해 알아낸다.

     

    ③ 프로토콜 스택에게 메세지 송신 의뢰

    IP주소를 알아내서 수신처를 지정할 수 있다면 이제 해당 수신처로 요청 M를 보내도록 OS에 의뢰할 차례이다.  어플리케이션은 수신처로 메세지를 보내도록 프로토콜 스택에게 의뢰할 것이다. 의뢰를 했으면 이제 소켓을 통해 데이터의 송수신이 이루어진다. 

    [그림 5] 계층구조

     

     

    2. TCP/IP와 LAN 드라이버를 통한 데이터 통신

     

    ① 소켓을 통한 데이터의 송수신

    # 소켓 (socket)

    소켓이란 데이터를 주고 받는 실질적인 창구역할, 데이터의 입출구이다. tcp계층에서 동작하는 소켓을 주로 사용하며 이를 tcp/ip 소켓이라 한다. 보통 서버측에서 소켓을 생성하고 클라이언트가 연결해 접속하기를 기다린다. 이때 어느 대상 소켓과 통신할 것인지를 나타내기 위해 ip주소와 포트번호를 사용한다. 소켓은 <프로토콜, ip주소, 포트번호>로 정의된다.

     

    소켓 통신 흐름

    - 클라이언트

     

    1) 소켓 생성 socket()

    통신을 위해 소켓을 생성한다. 소켓이 만들어졌을 때는 통신 대상 정보라든지 어떤 정보도 기록되어 있지 않다.

     

    2) 소켓 연결 connect()

    connect (디스크립터, ip주소, 포트번호)

    초기에 생성된 소켓에는 어떤 정보도 기록되어 있지 않기 때문에 ip 주소와 포트번호를 지정해줘야 한다. ip주소로 어떤 pc와 통

    신할 지는 알아도 어떤 소켓과 통신하는지는 모르기 때문에 포트번호도 지정해주는 것이다. 제어정보를 주고 받았다면 데이터 송수신이 가능한 상태가 된다. 여기서 제어정보라는 것은 바로 TCP 헤더이다. 참고로 어플리케이션에서는 각 소켓을 디스크립터로 식별한다.

    tcp 헤더

     

    3) 데이터 송수신 send()/recv()

    연결단계에서 제어정보를 주고 받았으면 이제 데이터의 송수신이 이루어진다. 이때 송신 data가 바로 http request 메세지이다. 

     

    4) 연결 끊기 close()

    데이터 송수신이 완료되면 소켓을 닫아 소켓을 말소시킨다.

     

    - 서버

     

    1) 소켓 생성 connect()클라이언트와 동일하다.

     

    2) 소켓 바인딩 bind()

    클라이어트에서 접속할 수 있는 주소를 설정해준다. 소켓에 ip 주소와 포트번호를 지정해줘서 통신에 사용할 수 있도록 해준다.

     

    3) 클라이언트 연결 요청 대기 listen()

    클라이언트에게서 연결 요청이 올 때까지 기다린다.

     

    4) 연결 승인 accept()

    클라이언트의 접속 요청을 허락하면 클라이언트와 통신을 위한 새 socket을 생성한다.

     

    5) 데이터 송수신 send()/recv()

    클라이언트와 동일하다.

     

    6) 연결 끊기 close()

     

     

    어플리케이션이 호출함으로써 os내 프로토콜이 서버와 소켓을 통해 통신하는 과정을 살펴보았다. 어플리케이션이 호출하여 tcp 담당부분이 제어정보인 tcp 헤더를 만들면 이를 ip 담당부분에 건네주어 데이터의 송신이 이루어지는 것. 이렇게 네트워크를 통해 패킷이 송신되면 서버 또는 통신 대상의 ip 담당부분이 이를 받아 tcp 담당 부분에게 건네주고, 이후 서버측의 tcp 담당부분이 tcp 헤더정보를 확인해 수신처의 포트 번호에 해당하는 소켓을 찾아낸다. 이런 과정을 거쳐 데이터의 송수신이 이뤄진다. 그렇다면 ip 담당부분은 어떻게 패킷 송수신을 하는지 살펴보자.

     

    ② ip와 이더넷의 패킷 송수신 동작

    TCP 담당 부분은 TCP 헤더를 부가해 IP담당부분에게 전달한다. 이를 받은 IP담당부분은 어디로 패킷을 전달해야하는지를 나타내기 위해 수신처 IP주소를 지정해 IP 헤더를 붙인다. IP 헤더를 만들었으면 MAC 헤더를 붙인다. MAC 헤더에 수신처의 MAC주소 정보를 지정해줘야 하는데, 패킷을 건네줄 상대의 mac 주소는 모르기 때문에 arp 프로토콜을 통해 mac 주소를 조사한다. 이와 같은 과정을 거쳐 mac 헤더를 만든다.

    이렇게 만들어진 패킷이 전송되는 과정을 살펴보자. 클라이언트에서 목적지의 서버 ip주소를 기록한 ip헤더와 수신처인 다음 라우터의 mac 주소를 기록한 mac헤더를 붙여 패킷을 전송한다(①). 이를 수신한 허브는 받은 패킷의 mac 헤더와, 허브 내 이더넷 표를 보고 mac주소를 비교한 후, 어느 라우터로 보내야 하는지 판단한 후  데이터를 보낸다(②). 허브가 복수이면 허브를 순차적으로 경유하여 패킷이 중계된다. 데이터를 받은 라우터는 ip표인 라우팅 테이블을 참고해서 다음에 어느 라우터에 패킷을 중계하면 좋을지를 결정한다. 그리고 다음 라우터에 패킷을 전달하기 위해 라우터의 mac 주소를 조사하고 헤더에 기록한 후 패킷을 다음 라우터에 송신한다(③). 허브를 경유하여 다음 라우터에 도착하는 이 과정이 반복되면 패킷은 목적지에 도달하게 된다.

    패킷 송신 과정

     

     

     

     

     

    [참고 도서 - 성공과 실패를 결정하는 1%의 네트워크 원리, 성안당]

    'Network' 카테고리의 다른 글

    네트워크 계층 개념 정리(OSI 7계층)  (0) 2021.04.06

    댓글

Designed by Tistory.