평소 모호하게 이해하고 있던 패킷의 이동 경로에 대해 이번 스터디에서 함께 이야기해보기로 했다.
대체 데이터가 어떤 방식으로, 어디를 통해, 어떤 모습으로 이동하기에 우리가 여러 외국 사이트들도 문제 없이 빠르게 볼 수 있는 것인지! 알아보자.
네트워크에서 패킷의 이동 과정을 OSI 7계층을 응용하여 전체적으로 이해해 보았다.
패킷의 이동 과정
패킷의 이동과정은 전반적으로 이렇다. Source host 가 나의 컴퓨터라고 하고, Destination host는 내 친구의 컴퓨터, 또는 www.google.com이라고 가정하자. 이 때 www.google.com은 DNS를 통해 IP 주소를 찾아야 한다는 것을 제외하고는 통신 방법은 동일하다. [DNS 에 대한 개념 먼저 살펴보기]
A 컴퓨터(source host)에서 B 컴퓨터(destination host) 로 데이터를 전송한다고 하자. 아래와 같이 switch와 router들을 거쳐 대칭적으로 데이터가 전달되어 B컴에 도달하게 된다.
A -> switch -> router -> router -> switch -> B 와 같은 대칭 형태이며, 7에서 1계층으로 이동할 때 데이터가 캡슐화, 1계층에서 7계층으로 이동할 때 역캡슐화된다는 특징을 기억하며 아래의 흐름을 따라가보자 !!
광섬유(1계층, Physical Layer)
광섬유로 이루어져 있으며 빛의 회절로 통신한다. 해외 서버에도 자유롭게 접근할 수 있는 이유가 바로 이 광섬유 덕분이다. 해저 케이블도 있고 우리 나라 곳곳에 있는 케이블들로 서로 통신할 수 있다.
광섬유와 같은 물리적인 전선과 Phy 칩 등을 통해 컴퓨터가 이해할 수 있는 0과 1로 나열된 신호를 통신한다.
허브와 리피터(1계층, Physical Layer)
허브는 브로드캐스트 방식으로 데이터를 연결된 모든 곳에 뿌린다.
작은 규모의 네트워크에서 여러 장치를 연결하는데 사용되며, 목적지가 없어서 데이터 충돌이 자주 발생할 수 있다.
리피터는 위에서 봤던 아날로그 신호를 증폭시켜 다음 구간으로 재전송시켜주는 역할을 한다.
신호가 물리적인 전선을 통과하다가 약해지면 중간중간에 놓인 이 리피터를 사용해 신호를 증폭해준다.
스위치(2계층, DataLink Layer)
스위치는 한 네트워크에서 서로 다른 여러 디바이스에 데이터를 전송하는 역할을 한다. 주로 라우터와 헷갈리는데,, 라우터는 여러 네트워크 간 데이터 전송이고, 스위치는 한 네트워크 속 서로 다른 디바이스 라는 점에서 차이가 있다는 걸 인지하자. 사실 요즘은 L3, L4, L7 스위치 라고 해서 이 둘을 굳이 분리하지 않고 하나로 구현하는 추세(우리가 잘 아는 공유기)라고 한다.
아무튼, 이 스위치 속 스위치 테이블을 이용해 MAC 주소를 조회한다. 이 스위치 테이블에 내가 찾고자 하는 MAC 주소가 없다면(=즉, arp 테이블에 캐시되어있지 않았다면) ARP request & reply 통신 한다. 이 통신 방법은 주로 broadcast 형태인데, 그냥 죄다 물어봐서 있는 애를 가져오는 방법이다.
스위치, Mac 주소 테이블과 함께 알면 좋은 개념으로는 Learning, Flooding, Fowarding, Filtering, Aging 이 있다. 간단히 말하면, MAC 주소를 조회하기 위해서 주변에 주소를 죄다 물어보는 flooding 방식, 송수신을 위한 학습(learning)과정 등의 과정을 거친다.
또한 이 Data-Link의 중요한 역할에는 Framing 기능이 있다. 신호들이 여러 컴퓨터들에서 동시에 온다고 하자.
01110, 01001, 00011 신호들이 한꺼번에 들어오면 어디에서 이 신호들을 잘라야 할지 혼란스럽다. 이 때 이 신호묶음들의 구분자 마냥 시작부분과 끝부분에 특정 frame을 두어 구분한다. 아래와 같은 형태이다.
ARP(Address Resolution Protocol)
ARP는 2,3계층을 걸친 프로토콜로, IP 주소를 MAC 주소로 변환하는 데 사용된다. 네트워크나 라우터에서 주로 사용하며, ARP는 주로 로컬 네트워크에서 사용한다. 우선 broadcast로 해당 IP 주소의 MAC 주소가 있는 곳을 찾고, 찾으면 unicast하는 방식을 사용한다.
라우터(3계층, Network 계층)
이제 같은 네트워크 간에 MAC 주소로 데이터를 주고받았다면 다른 네트워크 간에도 데이터를 주고받아야 한다.
라우터는 여러 네트워크를 구분(NAT) 시켜주면서, 연결 및 중계(라우팅 프로세서) 해주는 역할을 한다.
NAT(Network Address Translation)
NAT은 IP 주소의 부족 문제를 해결하기 위한 수단이다. 로컬 네트워크 내의 여러 디바이스가 하나의 공인된 IP 주소를 공유할 수 있게 해준다. 우리 집 공유기에 연결되어 있는 내 휴대폰, 내 아이패드, 내 맥북 등이 아래와 같이 공유된다. 외부로는 하나의 공인 IP 만이 노출되고(공유기), 내부로 여러 개의 가상 IP(192.xx) 를 사용하는 방식이다.
내 컴퓨터로 요청이 들어왔을 때 우선 공인 IP로 받고, PAT(Port Address Translation) 로 공인 IP -> 사설 IP를 매칭하여 올바른 목적지에 전달해준다.
라우팅 테이블과 라우팅 프로세스
또한 라우팅 프로세서를 이용해 네트워크 간 연결 및 중재를 해준다.
스위치와는 달리 라우팅 테이블을 참조하며 라우팅 프로세서는 목적지 IP 주소를 사용하여 패킷을 어떤 출력 포트로 보낼지 결정한다.
도착지 IP 주소는 알고 있다! 따라서 이 IP 를 라우팅 테이블에서 찾아 다음 라우터에게 데이터를 넘겨주는(forwarding) 과정을 거친다.
방금 도착지 IP 주소는 알고 있다고 했다... 이 쯤 DNS 에 대해 알아야 한다 !!
이 라우팅 테이블을 작성하기 위해서는 다른 라우터들로부터 정보를 얻는다. 라우팅 프로토콜(<- 라우팅 정보 교환을 위한 약속)에는 IGP, RIP, OSRP 등이 있으며 라우팅 알고리즘(<-경로 계산 시 사용하는 알고리즘)에는 링크상태(LS) 알고리즘(다익스트라) 과 거리벡터(DV) 알고리즘 (벨만포드) 이 있다. 이에 대한 자세한 설명은 여기(데이터평면- 네트워크 장비 간의 통신을 관리하고 제어하는 과정)와 여기(제어평면- 실제로 데이터를 전송하고 전달하는 과정)에서 볼 수 있다.
TCP/UDP(4계층, Transport 계층)
호스트(컴)끼리 통신할 수 있도록 하기 위한 통신 규약으로, 연결형이며 신뢰성이 강한, 스트림 기반의 프로토콜 의 TCP와 비연결형이고 신뢰성 없는 전송 프로토콜 의 UDP 이 있다.
말해뭐해.. 너무 유명하니까 세세한 설명은 생략한다.
TCP와 UDP 통신할 때 어떻게 연결을 시작하고 끊는지(handshake), 오류/흐름/혼잡 제어 방식, datagram에 어떤 정보들이 포함되는지 등을 키워드로 공부하면 좋다 !
ssh, tls (5 계층 , Session Layer)
요즘에는 7, 6, 5 에 대한 명시적인 구분이 없어 Application 계층으로 뭉뚱그려 (TCP/IP 계층) 사용하는 경우가 많다.
그래도 하나씩 알아보자 !
5계층, session layer은 응용 시스템간의 세션을 여닫고 관리하는 역할을 한다. 이 때 tcp/udp handshaking과는 다른 개념이니 구분해서 이해할 필요가 있다 ! 세션 레이어에 대한 설명 을 참고하면 이 레이어는 RPC를 사용하는 어플리케이션 환경에서 주로 사용된다고 한다. 그 예시로는 비디오 및 오디오 스트리밍과 같이 데이터 교환의 정확성이 필요한 애플리케이션이 있다.
세션 레이어는 ssh, tls, rpc 등이 있으며, 포트 번호를 기반으로 연결한다.
ssh는 22번 포트 ! 우리가 aws 에 접속할 때 많이 사용하는 프로토콜로, 원격 호스트에 접근할 때 아래와 같이 접속해본 기억이 있을 것이다. 이 세션 레이어를 통해 데이터 통신 방법을 단순 통신/반이중/전이중 중 어떤 걸 사용할지 결정할 수도 있다. 예를 들어, TV 의 경우에는 단순통신, 무전기의 경우에는 반이중 통신, 채팅은 전이중 통신을 선택해 사용한다.
재밌는 것 중에(재미는 없음) SQL이 세션 계층 의 예시 중 하나로 표현되는데, 그 이유는 sql 이 응용 계층과 데이터베이스 서버 간 상호 작용을 위한 쿼리 언어로 사용되며 Transaction에서 통신을 열고 닫는 과정을 세션과 유사한 개념으로 볼 수도 있다고 한다. (참고)
MIME, 암호화, 인코딩 (6계층, Presentation Layer)
이제 이 데이터들을 응용 계층에 보내기 위해서 데이터를 어떻게 표현할지 정해야 한다. 데이터가 JPEG 형식일 수도 있고, ASCII 형식일 수도 있으니 이런 확장자의 개념을 추가한다. 서로 다른 문자 코드를 사용하는 시스템이라도 OSI 표준 표현 방식으로 전송할 수 있고, 자신의 시스템에 맞게 데이터를 재구성할 수 있다.
또한 데이터의 인코딩, 디코딩 / 암호화, 복호화 기능을 통해 데이터를 안전하게 전송하도록 도우며, 데이터 압축을 통해 데이터가 더 효율적으로 전송하도록 돕는다.
TELNET, SMTP, POP, HTTP , DNS (7계층, Application Layer)
이제 우리가 잘 아는 가장 상위의 애플리케이션 계층이다. 메일 서비스나 웹 서비스를 작동시키기 위한 여러 프로토콜 Telnet, POP, HTTP 등이 이에 속하고, 특정 도메인의 IP를 찾는 과정, DNS 또한 여기에 속한다.
주요 통신 모델로 client-server 모델과 p2p 모델, 이렇게 두 개로 나눌 수 있는데,
client-server 모델에서 서버는 listen 상태로 항상 켜져 있으며, 다수의 클라이언트가 자신이 원하는 때에 서버에 요청하는 모델이고, 웹, 파일 전송, 원격 로그인, 전자메일이 이에 해당한다.
반대로 p2p 모델에서는 특정 서버를 통하지 않고, peer라는 간헐적으로 연결된 호스트 쌍이 서로 직접 통신하며, 피어들은 서비스 제공자가 소유하지 않고 대신에 사용자들이 제어하는 데스크톱과 랩톱이 소유한다. peer는 대부분 가정, 대학, 사무실 사람들이라고 보면 된다. 이 구조에는 인터넷 전화 Skype, IPTV, 파일 분배 비트토렌트 등이 해당한다.
이에 추가로 알면 좋을 두 가지 개념에 대해 준비해보았다. 바로 DNS와 CDN 이다.
정말 많이 보게되는 면접 질문을 착안하여 좀 더 공부하게 되었다.
www.google.com을 검색했을 때 일어나는 일
패킷이 이동하는 과정의 흐름은 위에서 말한 방식과 일치하고, DNS와 CDN이라는 개념을 추가로 알아두면 이 질문에 자신있게 ! 대답해볼 수 있다.
우선 DNS와 CDN은 OSI 7계층 중 7, application layer에 해당한다.
DNS
dns는 사람이 읽기 쉽게 만든 도메인 네임 서버(www.google.com)를 의미하고, 우리는 DNS를 이용해 IP를 찾는 과정이 필요하다.
아래의 그림 형태를 이해하면 좋다.
1. 우선 PC 속 로컬 DNS 서버에 해당 domain 명이 캐싱되어 있는지 찾아본다. 이 Local DNS 서버는 주로 통신사 것으로 세팅되어 있다. 만약 이 안에 DNS 기록이 캐싱되어 있다면 그냥 가져오면 된다. (이 때 DNS 기록은 브라우저 캐시 -> OS 캐시 -> 라우터 캐시 -> ISP 캐시 순서대로 가져오게 된다.)
2. DNS 기록이 없다면 이제 ISP의 DNS 서버(=DNS Recurser)가 DNS 쿼리로 해당 domain 명의 서버의 IP 주소를 찾는다.
3. 이 때 Recursive Query, Iterative Query 방법을 사용해 찾는다. 간단히 recursive query는 DNS 서버가 클라이언트를 대신하여 DNS 쿼리를 계속해서 수행하는 반면, iterated query는 DNS 서버가 클라이언트에게 질의 결과를 제공하면서도 다른 DNS 서버에게 도움을 요청하는 방식으로 작동한다.
4. 이 Recurser는 계층적 구조에 따라 질의하는데, 가장 큰 단위부터 kr(root, top-level)-> hanmon.kr(second-level) ... 차근차근 찾는다.
5. IP 주소를 찾았다 ! 브라우저는 이제 해당 서버와 TCP 연결을 위해 위에서 말한 여러 패킷 통신 방법을 거친다...
6. 서버가 결과적으로 보낸 HTTP 응답이 브라우저를 통해 html로 보여진다.
CDN
IP를 dns 로 찾으면 된 거 아냐? CDN은 왜 필요한건데?? 라고 한다면,,
요즘은 하나의 domain 서버만 사용하지 않고, 하나의 DNS라고 하더라도 여러 edge들로 분산시켜 , 우리가 가장 빠르게 서비스를 제공할 수 있는 edge를 선택해 IP를 제공해준다.
만약 www.google.com에 대한 dns 질의를 하면 original server는 미쿡에 있겠지만 우리는 우리랑 가장 가까운 일본이나 중국의 google Edge 서버를 사용할 수 있게 되는 것이다.
아래는 DNS를 질의할 때 CDN이 어떻게 끼어드는가에 대한 처리 과정 구조도 이다.
DNS 서버에 질의하는 과정에서, 이 DNS는 가장 가까운 또는 트래픽이 적은 CDN 서버의 IP 주소를 가져오게 된다.
그러면 어떻게 edge 서버들이 original 사이트와 동기화되는 걸까?
시도 때도 없이 바뀌는 데이터들과 업로드되는 여러 글, 댓글들이 동기화되기 위해서
캐시가 유지되는 기간(TTL)을 정해 이 기간이 끝나면 동기화되도록 강제하거나, 정적 컨텐츠(html, css)만을 edge 서버에 두거나, 또는 동적 컨텐츠를 가져오는 데 걸리는 시간을 줄이는(tcp handshaking 과정 단축) 방법 등을 통해 극복한다고 한다.
결론
라우터, 스위치 차이라던가,, TCP/IP header 까보기 라던가,, 위에서 나온 RPC 개념 등
여러 세세한 부분은 여기에서 확장해서 알아보는 형태로 공부하면 좋겠다 !
참고
https://thisiswoo.github.io/development/osi-7-physical-layer.html
https://www.scaler.com/topics/framing-in-data-link-layer/
https://blog.naver.com/sung_mk1919/221177021021
https://www.youtube.com/watch?v=1pfTxp25MA8
https://www.youtube.com/watch?v=TBUaVzNkxFg
'CS > 네트워크' 카테고리의 다른 글
[네트워크] Link Layer, Lans (0) | 2023.06.20 |
---|---|
[네트워크] Network Layer : 제어 평면 (1) | 2023.06.18 |
[네트워크] Network Layer : 데이터 평면 (0) | 2023.06.13 |
[네트워크] 혼잡 제어 (0) | 2023.04.23 |
[네트워크] 트랜스포트 계층 - 신뢰적인 데이터 전송 (RDT) (0) | 2023.04.22 |