응용계층 프로토콜에는 ftp, smtp, sip, pop3, imap, snmp 등이 있다.

 

 

 

FTP파일을 전송하기 위한 프로토콜이다.

SMTP 는 메일을 전송하기 위한 프로토콜이다.

sip 는 화상회의할 때 쓰이는 프로토콜이다.

pop3 는 메일 서버가 있고 스마트폰에서 이메일을 다운받을 때 사용되는 프로토콜이다.

imap 도 메일 서버에서 스마트폰, PC 에서 다운받는 메일을 전송받는 프로토콜이다.

snmp 는 망관리 프로토콜이다.

 

 

 

가장 많이 쓰고 있고 현재는 http 로 조금은 바뀌어져 있는

FTP 를 먼저 살펴보자

 

FTP


FTP 는 파일을 전송하기 위한 프로토콜이다.

 

 

ftp 명령어를 치고 ftp 서버에 접속하면 로그인하는 절차가 있고, 여기 서버에선 익명으로 접근을 시켜준다.

여기서 cd, get 명령어를 아스키코드로 전송해서 파일을 전송하게끔하는 프로토콜이다.

 

인터넷이 처음 개발됐을 때는 이렇게 파일을 전송하는 프로그램을 ftp 프로토콜로 많이 전송했었다.

물론 현재는 UI 자체가 웹 환경으로 바뀌었기 때문에 파일 전송 역시 http 로 대체가 되고 있는 상황이다.

 

 

 

 


우리가 메일을 보낼 때 메일을 전송하고, 메일에 접근할 수 있도록 하는 프로토콜이 필요하다.

메일 전송 프로토콜에는 SMTP 가 있고 메일 접근 프로토콜에는 POP3, IMAP, HTTP 가 있다.

메일을 보낼 땐 이 두가지 모두 필요하다.

 

 

메일 전송 프로토콜


 

 

 

SMTP : 메일 전송 프로토콜

첫번째는 smtp 로 서버들 간에 전송을 하게 되는 프로토콜이다.

내가 네이버에 메일 계정을 갖고 있고, 상대는 구글 메일 계정을 갖고 있다면 메일 전송 시 서버 통신이 필요하게 된다. 이 서버간 통신 규약이 smtp 이다.

 

 

메일 서버는 네이버, 다음, 지메일 등이 있다. 

SMTP 는 우리가 쉽게 접근하기엔 어려운데, 일부 서버가 암호화 되어있지 않은 버전에선 telnet 실습이 가능하다.

 


메일 접근 프로토콜


우리는 메일 파일을 스마트폰으로 접속해서 볼 수 있다. 스마트폰이 메일 서버에 접속해서 파일을 다운할 수 있도록 하는 프로토콜이 필요하다. 이를 가능케 하는 것이 POP3 혹은 IMAP 이다.

 

최근에는 핸드폰에서 메일 앱을 깔지 않아도 웹으로도 볼 수 있다. 최근에는 HTTP 도 메일 서버에 접근하는 프로토콜로 활용이 되고 있다고 할 수 있다.

 

메일 서버에 전송하는 프로토콜이 SMTP / 스마트폰이 네이버 또는 지메일 서버에 접속하여 메일을 다운받기, 전송하기 프로토콜 => POP3/ IMAP 

 

 

SMTP 프로토콜 자체는 전송하는 기능이 있지만, 전송할 때 메일이 어떻게 생겼다 규정하는 메시지 폼에 대한 약속이 필요하다.

메일에서는 헤더, 바디 와 같은 구조로 약속이 되어있고, 우리가 사용하는 편지지, 편지봉투와 비슷하다고 여기면 된다.

편지지는 바디고 편지봉투는 헤더이다.

 

바디에는 메일이 어떻게 생겼는지 알려줘야한다. 유니코드인지 아스키코드로 되어있는지 같은 것들 말이다.

우리가 서버에 스마트폰에 있는 메일 앱, PC 의 아웃룩 같은 것으로 메일을 다운받고 전송하는 것을 실행하려면 POP 또는 IMAP 을 통해 메일 파일에 접근한다고 했었다. (물론 HTTP 를 통해 브라우저에서도 접근할 수 있다 )

 

이때 

IMAP 을 통해서는 메일 서버 인증, 메일 서버에서 관리, 메일 서버 폴더 관리를 하고

POP 를 통해 메일 서버 인증, 메일 다운로드를 할 수 있다. 

 

 

 

 

최근에는 웹 기반이 많아서 HTTP 를 이용하는 게 대세이다.

 

728x90

 

 

P2P 프로토콜


:peer 는 서버가 없는 구조를 지칭한다

 

 

순수 P2P 구조

- no always-on server (P2P에서는 alwayas on server가 없다)

- 피어들끼리 직접 통신(많은 피어들이 직접 연결하여 통신한다)

- 피어들끼리 가끔씩 연결되어 IP 주소 교환 ( 피어들은 항상 연결되는 게 아니고 가끔씩 연결될 수 있다)

 

 피투피 구조를 잘 만들기 위해서는 파일을 어떻게 배포하고 파일을 어떻게 찾는지가 주요 이슈가 된다.

 

 

피투피 모델에 대해 파일 배포방식으로 비교를 해보자

Server-Clinet 방식과 P2P 방식에서

1개의 서버가 N개의 피어에게 파일을 배포할때 얼마나 오래 걸릴까?

클라이언트-서버 방식

-서버가 N개의 파일을 순서대로 보내는 시간  N*F/U_s time

- i 번째 클라이언트가 다운받는 시간               F/d_i time to download

 

만약 아주 많은 클라이언트가 접속했다면 클라이언트-서버 모델에선 파일 다운 속도가 굉장히 오래 걸릴 수 있다.

 

피투피 방식

- 서버는 1개의 파일을 업로드하는 시간: F/U_s time

- i번째 클라이언트는      F/d_i time

- 전체적으로 N*F bits 업로드

 

업로드하는 쪽에서 N이 등장하였다. N 이 등장하면 분자도 커지고 분모도 커지게 된다. N이라는 숫자에 따라 선형적으로 증가하진 않는 다는 의미이다. 

클라이언트 서버에서는 N이 증가함에 따라 선형적으로 증가하지만 P2P는 선형적으로 증가하지 않는다. 따라서 N 이 커지게 되면 클라이언트-서버 방식보다 P2P 방식이 성능이 뛰어날 수 있다.

 

 

BitTorrent

P2P의 예시로 BitTorrent 가 있다. 피투피는 모든 클라이언트들이 파일을 전송하고 다운받는다. 따라서 peer list 들을 관리해야한다. 

빗토렌트는 여러 버전이 있는데 파일을 큰 덩어리가 아닌 아주 작은 조각으로 본다는 특징이 있다. 파일을 256KB chunks 의 작은 조각으로 분할하여 피어들끼리 교환할 수 있도록 한다. 피어들은 자유롭게 가입, 탈퇴가 가능하다.

 

특징

  • 파일을 256kb의 덩어리로 쪼갠다
  • torrent에 있는 peer들이 file 덩어리를 보내고 받는다.
  • Tracker : torrent에 참여하는 peer들을 추적한다
  • Torrent : 파일 덩어리를 교환하는 peer들의 그룹
  • torrent에 조인하는 peer
    • 처음엔 아무것도 없지만 점차 시간이 지날 수록 다른 peers의 chunk가 축적된다
    • tracker에 등록해서 peer의 목록을 가져오고, peers("neighbors")의 하위 집합에 연결한다.
  • 다운로드 하는 동안 peer는 chunks를 다른 peers에게 업로드한다.
    • peer는 chunk를 교환하는 peers를 바꿀 수 있다.
    • 만약 peer가 전체 파일을 갖게 되면, 그것은 떠날 수도, torrent에 남아 있을 수도 있다.

 

 

 

송수신은 청크라는 단위로 한다. 따라서 청크 자체의 리스트도 관리를 해야한다. 어느것을 먼저 받아야할지의 문제이다.

 

수신 청크들

  • 어느 시간에나, 다른 peer는 파일 chunk의 다른 부분을 가지고 있다.
  • 주기적으로 피어는 이웃들에게 그들이 가지고 있는 chunk 목록을 요청한다.
  • 피어는 가장 드문(?) missing(없는?) chunk부터 peers에게 요청한다.(rarest first)

송신 청크들 : tit-for-tat

  • 피어가 4개 이웃에게 chunk를 전송한다.
    • 다른 peers는 Alice에게 질식한다(choked) ; 그녀로부터 chunks를 받지 못함
    • 10초마다 상위 4개를 재평가한다.
  • 30초마다 무작위로 다른 peer을 골라서 chunks를 보낸다
    • Optimistically unchoke this peer
    • 새로 선택한 peer가 top 4에 join 할 수 있다.

 

 

다음을 파일을 어떻게 찾을 지에 대한 문제이다.

우리가 원하는 파일이 어느 피어들에게 저장되어있는지 찾기위해 

DHT(Distrivuted Hash Table) 자료구조를 사용한다.

 

 

DHT

해시를 이용하긴 하지만 분산되어 있다. 해시테이블을 분산하여 만든 것이다.

- (key, value) 쌍으로 찾게 된다.  / key : content , value: IP 주소 / 피어들은 DB에 키로 물어보고 DB 는 키에 매칭되는 IP 주소 값을 반환한다.

- 피어는 (key, value) 를 삽입할 수 있다.

- 각 피어는 정수 식별자로 할당한다. [0, 2^n-1] / 각 식별자는 n bit 로 표시

- 각 키는 특정 범위내의 정수여야한다. 정수 키값을 얻기 위해서는 원래 키값에 대해서 해슁한다. key = h("Led Zeppelin LV")

 

(키, 밸류) 페어를 피어들에게 어떻게 할당할지에 관한 이슈

- 규칙: 키를 가장 가까운 ID 를 가진 피어에게 할당함 (가장 가까운이란 키의 가장 인접한 이웃이라는 의미이다)

ex) n = 4 / peers : 1,3,4,5,8,10,12,14

     key = 13, then successor peer = 14

     key = 15, then successor peer = 1

 

각 노드는 인접 노드만 알고있다. 피어들은 오버레이 네트워크 상에서 인접노드로 서로 서로 연결되어 있다. 아래는 예시에 대한 그림이다.

 

노드끼리 지름길을 설정할 수도 있다. 지름길을 통해 더 빨리 파일을 찾을 수 있다.

 

 

SKype 

스카이프도 P2P 케이스에 속한다. VolP 특성상 사용자간 P2P 통신이다. 

전용 응용 프로토콜(VolP프로토콜) 을 사용한다. 

계층적 구조를 가진다. (수퍼노드 존재)

 

 

 

정리

P2P 프로토콜은 클라이언트-서버 프로토콜에 비해 성능이 우월하나 관리(피어구조, 파일찾기)가 힘들다. 피어들이 자유롭게 조인, 탈퇴를 할 수 있어서 안정적이라고 할 수는 없다. 

728x90

 

 

이번 시간에는 응용 계층 프로토콜 중 DNS 에 대해 공부할 시간이다.

 

 

 

 

 

DNS


인터넷에 연결된 컴퓨터의 이름과 IP 주소를 매핑하는 분산 시스템이다. 이름하고 IP 주소를 매핑한다.

www.cnu.ac.kr  <-> 168.188.253.130

 

DB(데이터베이스) 와 유사하다. 다만 이 DB가 한개만 있는 게 아닌 것이 DNS 이다. 

전세계 기관은 다 도메인 네임 관련된 테이블을 갖고 있다. 전 세계에 수백만개의 DB(데이터베이스)가 있고 이 녀석들이 따로 놀면 안되니깐 연결시켜 준 것이 DNS 이다.

DNS 는 굉장히 복잡하다. 그러나 DNS는  우리 인터넷이 돌아가는데 중요한 자원 중 하나이다. 

 

 

IP 주소를 얻기 위해서는 터미널에

dig {웹사이트}

 

을 입력하면 아이피주소를 반환해준다.

 

 

 

도메인 체계

가장 위에는 .(루트)가 존재한다. 예를 들어 우리가 www.google.co.kr 에 접속하였다면 뒤에 루트 서버인 . 이 생략된 것이라 할 수 있다. 원래는 www.google.co.kr. 이다.

 

 

 

 

DNS 흐름도

 

만약 

dig {웹사이트} +trace

치면 트레이스까지 알 수 있다.

 

DNS 계층도

https://en.wikipedia.org/wiki/Domain_Name_System

 

Domain Name System - Wikipedia

From Wikipedia, the free encyclopedia System to identify resources on a network The Domain Name System (DNS) is a hierarchical and distributed naming system for computers, services, and other resources in the Internet or other Internet Protocol (IP) networ

en.wikipedia.org

 

Root Name Server( 13개 지역) 

https://en.wikipedia.org/wiki/Root_name_server

 

Root name server - Wikipedia

From Wikipedia, the free encyclopedia Name server for the DNS root zone A Cisco 7301 router and a Juniper M7i, part of the K root-server instance at AMS-IX A root name server is a name server for the root zone of the Domain Name System (DNS) of the Interne

en.wikipedia.org

 

Root Name Server 공격

무식하게 udp 로 데이터(트래픽)를 막 보냄(무한루프 돌려서) 보내면 대부분 뻗는다. 이것이 예전엔 통했다. 

2002 : Botnet 이용 13개 root name server 대한 ICMP ping 공격 -> 실패

2007: 2개 root server 공격 : heavy traffic

2015: 초당 5백만 쿼리 공격 : timeout 발생

 

 

DNS 관련 인터넷 사고

1.25 인터넷 대란

: 2023년 1월 25일에 대한민국의 인터넷망이 분산 서비스 거부 공격, 소위 말하는 디도스로 마비되어 혼란에 빠진 사건이다. 원인은 마이크로소프트의 SQL 서버의 보안 취약점을 악용하여 공격하는 동시에 자신을 감염시키는 악성코드인 슬래머 웜이었으며 이 사건으로 인해 취임한지 얼마 안 된 정보통신부 장관이 책임을 지고 사임했다.

 

MS SQL 서버 취약점 -> Slammer Worm 바이러스로 인한 트래픽 과부하 -> KT DNS 서버 공격 -> DNS 서버 다운 -> 인터넷 마비

 

https://namu.wiki/w/1.25%20%EC%9D%B8%ED%84%B0%EB%84%B7%20%EB%8C%80%EB%9E%80

 

1.25 인터넷 대란 - 나무위키

이 저작물은 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다. (단, 라이선스가 명시된 일부 문서 및 삽화 제외) 기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권

namu.wiki

 

Slammer Worm 막으려면 망원경을 쓴다.

Network telescope

IPv4 주소 공간은 32억개의 주소 공간이 있다. 그 중 안쓰는 IP 주소를 망원경으로 이용하여 다른 패킷들을 감시한다. Sample IP 주소(부분집합)의 패킷을 모니터링함.

 

 

한국의 NameServer

15개의 name server 가 있다.

.kr 과 .한국 도메인이 있다.

 

 

 

 

DNS 패킷 구조


 

전통적으로는 UDP 였는데 최근은 UDP , TCP 같이 쓰고 있다.

 

UDP : 작은 패킷 (<= 512 바이트)

TCP: 큰 패킷 (> 512 바이트)

 


DNS Query Type 

 

A: 레코드 A는 주어진 호스트에 대한 IP 주소 (IPv4)를 알려준다. A 레코드는 도메인 이름을 해당하는 IP 주소로 변환하는 데 사용된다.

 

AAAA: 레코드 AAAA (quad-A 레코드이기도 함)는 주어진 호스트에 대해 IPv6 주소를 알려준다. A 레코드와 같은 방식으로 작동하며 차이점은 IP 주소 유형이다.(IP 버전6)

 

CNAME : CNAME 레코드는 도메인 이름의 별칭을 만드는 데 사용된다. CNAME 레코드는 도메인을 외부 도메인으로 별칭을 지정하려는 경우 유용하다. 경우에 따라 CNAME 레코드를 제거하고 A 레코드로 대체하면 성능 오버 헤드를 줄일 수도 있다.

 

 


 

TLD

 

DNS 는 아무나 관리하면 안된다. 따라서 TLD ( Authritative DNS Servers) DNS 관리하는 서버를 둔다.

 

 

DNS Caching

 

DNS 가 자주가면 캐싱을 하면 빠를 것이다. 최신 브라우저들은 Browser DNS caching 을 탑재하고 있다.

 

 

DDOS

 

DDNS 는 Dynamic DNS 로 IP 주소가 변경될때 DNS 정보를 갱신한다. ip 주소는 변하기 때문에 필요하다. 가정의 공유기에서 자주 쓰이는 기술이다.

 

 


DNS는 암호화되지 않음

DNS 는 암호화 되지 않아서 DNS 패킷을 보면 개인의 방문 웹 사이트를 알 수 있다. 공격의 대상이 되기 쉽다는 말이다. 

그래서 여러 DNS 공격이 있을 수 있다.

 

 

1. DNS Spoofing : 중간자 공격, DNS 서버로 전송되는 쿼리 가로채서 변조된 결과 전송

2. 피싱(phishing) : 가짜 사이트, 실제 도메인 네임과 유사한 이름 사용

3. DNS cache poisoning : 캐시 정보 조작, 파밍

 

 

여러 보안 이슈가 있어서 최근에는 암호화된 DNS 기술을 사용하고 있다.

DNSSEC(암호화는 아님), TLS를 통한 DNS(DoT), HTTPS 를 통한 DNS(DoH)

 

1. DNSSec

: DNS Security Extenstion

데이터의 위조-변조 공격을 방지하기 위한 표준 기술, 공개키 암호화방식의 전자 서명 도입

 

2. DNS over HTTPS(DoH)

: DNS 내용을 json 형식 데이터로 만들어 HTTPS 전송 : TCP 443

 

3. DNS over TLS

: TLS 직접 쓰는 것 첫번째 협상할 때보면 server name indication extension 보면 naver.com 볼 수 있다. -> 차단 가능 

 

 

 

 

웹 사이트의 TLS SNI 필드 캡처하기


 

시크릿모드 창 띄우고 와이어샤크 실행 -> 방문 웹 사이트 -> Wireshark 의 filter tls 이용 ( TLS 의 Client Hello 메시지의 Extension: server_name field ! )

728x90

 

 

 

인터넷 속도 측정


 

https://www.sppedtest.net/ 

 

http://ww25.sppedtest.net/?subid1=20230925-1614-1283-a30f-95b7c8d1368b

 

ww25.sppedtest.net

 

서버를 물리적으로 가까운 곳에 위치시켜야 성능 좋게나옴. 한국 서버로 접속해서 파일 전송하고 측정하거나 해야됨

 

 

크롬 개발자 도구

 

서버를 개발하면 html, css, js 돌릴 때 서버 얼마나 빠른지 자세한 분석 필요.

 

관련 브라우저가 잘 만들어져있음

크롬 개발자도구 들어가면 network 클릭하면 방문한 사이트에 굉장히 많은 오브젝트들이 전송되는 것 확인가능 응답시간도 확인 가능

(객체마다 응답시간 어떻게 되는지 볼 수 있음)

 

 

일반적인 성능 지표를 알아보자

 

 

 

 

 

인터넷 성능 지표


 

대역폭 : 초당 비트 전송률 / 속도 / 단위 시간당 얼마나 보내냐 

기본적인 단위는 비트 per 세컨드이지만 아닐 때도 있어서 비트인지 바이트인지 단위를 확인할 필요가 있다. 

 

일반적인 도구로 가장 유명한 것은 iperf 이다.

speedtest 는 개발사마다 만든 것인데 iperf 같은 기본 도구를 사용해서 만든것이라 할 수 있다.

종단간(엔드포인트, 서버 -> 클라이언트)의 사이에서 속도를 측정할 수 있다.

 

 

지연 시간: 지연시간이 어떻게 되는가는 단방향은 한쪽방향 양방향으로는 왕복 지연시간(RTT)이 있다. 왕복 지연시간이 우리가 실제로 체감하는 시간이다.

양방향 단방향 측정하는 이유는 갈 때 올 때 시간이 다르기 때문이다. 도로에서도 갈때와 올때 시간이 동일하다고 할 수 없다. 교통 체증이 있는 쪽이 더 시간이 오래 걸릴 것이다. 따라서 네트워크에서도 양방향, 단방향 구분이 필요하다.

 

측정할 일반적 도구로는 ping, traceroute 가 있다.

ping은 종단간 측정하고(서버->클라이언트). traceroute 는 구간별(라우터-호스트)를 측정한다.

 

 

손실률은  %로 나타낸다. 측정 방법은 패킷 전송 카운트이고 측정도구는 ping이다. 이것은 종단간, 구간별 측정이 가능하다.

 

 

 

 

대역폭, 지연시간

 

저 사이에 굉장히 많은 라우터, 선을 거침.

 

 

 

하나씩 자세히 살펴보자

 

 

 

1.  인터넷 성능지표: 속도

 

속도는 비트전송률이다. 속도는 특정 크기의 데이터(파일)을 전송 후 계산한다.

 

해당 이미지에선 포트번호 5001인데 바뀔 수도 있음.

 

 

 

2.  인터넷 성능지표: 지연시간

 

지연시간 구성요소

1. 전송시간: 1개의 비트가 컴퓨터에서 전송되는 시간이다. 네트워크 카드가 100Mbps 가지고 있다, 1Gbps 가지고 있다 등등에 따라 바뀌는 시간이다. 컴퓨터가 가지고 있는 네트워크의 대역폭에 따라 달라진다. 내 컴퓨터가 1비트 쫙 내보내는 시간이 있다. 그 순간이 전송 시간이고 이 비트들을 이동하는 시간이 전파시간이니 헷갈리지 않도록 주의하자. 전송시간은 대역폭에 따라 달라지므로 어느정도 고정적이다. 

 

2. 전파시간:  전파란 패킷이 전선을 타고 이동하는 과정이다. 그러나 무선에서도 발생할 수 있다. 거리에 따라 결정되는 시간이다. (마치 빛의 속도처럼 멀리 있을 수록 오래걸리는..) 주로 대륙간 이동처럼 , 아주 원거리 사이에서 발생할 수 있다. 컴퓨터와 컴퓨터 사이에서 발생한다. 거리는 줄일 수 없기 때문에 전파 시간은 고정되어 있다고 할 수 있다.

 

3. 큐잉시간 : 큐는 대기하는 자료구조, 점심시간에 대기하려고 웨이팅하는 시간이랑 비슷, 컴퓨터 또는 라우터에서 처리되는 것을 기다리는 지연시간이다. 큐잉 지연은 클라이언트, 서버, 라우터(공유기)에서 다 발생할 수 있다. 네트워크 카드가 있으면 다 발생할 수 있다. 큐잉 시간은 가변적이다. 수강신청 서버 생각하면 수강신청 안할 때는 잘 들어가지지만 수강신청 할 때는 오버플로 발생할 수 있는 것처럼..

 

4. 처리시간: 우리가 만든 메시지를 와이어샤크로 캡처하면 헤더를 보고 분석을 해야한다. 그러한 헤더를 처리하는 시간을 처리 시간이라고 한다. 경로테이블 찾는 시간도 처리 시간이다.네트워크 카드를 가지면 발생 가능하다. (클라이언트, 서버, 라우터 등등)

 

 

 

 

 

웹 사이트 지연시간 측정하기

 

- 웹페이지가 뜨는 시간 -> web page load time(PLT)

 : chrome 웹 브라우저 -> 개발자도구 -> console 에서 

 

val = loadTime =

window.performance.timing.domContentLoadedEventEnd-

window.performance.timing.navigationStart; loadTime;

 

 

3.  인터넷 성능지표: 손실률

 

패킷 단위 전송 가정

- 100개의 패킷을 보냈을 때 99개의 패킷이 전송 성공 -> 1% 손실률

 

 

 

 

 


 

 

웹 페이지는 엄청나게 많은 객체를 사용한다.

 

TCP 연결의 개수를 확인하기

https://stackoverflow.com/questions/41572418/how-to-measure-how-many-tcp-connections-were-made-in-a-page

자바 스크립트로 har ( json) 파일 분석 -> connection ID

 - 13개의 TCP 연결이 121개 객체 전송에 사용된 것 확인 가능

 

har file viwer

https://toolbox.googleapps.com/apps/har_analyzer/

 

HAR Analyzer

 

toolbox.googleapps.com

 

728x90

 

 

우선 실습 진행을 위해 도커를 설치해야한다.

 

도커는 컨테이너를 만들고 사용할 수 있도록 도와주는 컨테이너 플랫폼이다

컨테이너란 한 운영체제 여러 애플리케이션을 개별적으로 실행하고 관리하도록 도와주는 기술 중 하나다

 

 컨테이너 안에는 실행할 수 있는 애플리케이션과, 이를 위한 라이브러리, 환경설정 등이 들어있어서 컨테이너만 잘 받아오면 누구든 따로 실행 환경을 셋팅할 필요 없이 바로 구동할 수 있게 된다. 컨테이너에는 백엔드 프로그램, DB서버, 메시지 큐 등 어떠한 프로그램도 추상화되어 들어있을 수 있고, 어떤 환경에서든 컨테이너만 받아 오면 프로그램의 배포 및 관리가 쉬워진다.

 

우리는 웹 서버를 구축하고 싶다. 만약 도커가 없다면 직접 아파치, nginx 등을 설치해서 웹 페이지를 올려야한다. 도커를 사용하면 우리가 사용하고 싶은 환경 설정을 격리된 컨테이너 안에서 함으로써 환경이 나중에 어지럽게 되는 것을 방지할 수 있다.

 

웹 서버는 아파치, nginx 같은 것이 있다. 웹 서버란 클라이언트와 서버가 http 통신을 할 수 있도록 돕는 역할을 한다. 클라이언트와 서버사이의 중간다리 역할을 한다고 보면 된다.

 

아무튼 도커를 설치해보자

https://docs.docker.com/desktop/install/mac-install/

 

Install Docker Desktop on Mac

Install Docker for Mac to get started. This guide covers system requirements, where to download, and instructions on how to install and update.

docs.docker.com

해당 사이트에서 도커를 설치할 수 있다. 나는 맥북이므로 맥용으로 설치하였다. 

 

 

 

그 후, 

웹 서버 구축을 위해 nginx 를 설치해야 한다.

docker pull nginx 

를 입력하면 된다는데 나는 

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

와 같은 에러 메시지가 떴다

 

찾아보니 맥북에서 나는 에러로 도커 어플리케이션을 구동시킨 후 명령어를 입력해야한다고 한다.

도커 어플리케이션에 켠 후 다시 명령어를 입력하니 정상적으로 진행되었다.

 

 

 

dokcer image ls 

명령어를 입력하면 현재 구동되고 있는 image 를 볼 수 있다.

 

 

 

 

docker run --name comnet-nginx -p 8080:80 -d nginx

명령어를 통해 nginx 이미지를 가지고  comnet-nginx 라는 이름을 가진 컨테이너(-d : 컨테이너명지정) 를 새로 만들어서 8080 으로 요청시 80포트를 가지고 있는 nginx 로 연결되도록 (-p : 8080:80) 하였다.

그 후 http://localhost:8080 으로 들어간 결과 다음처럼 창이 뜬 것을 확인할 수 있다.

 

 

그 후 와이어샤크를 통해 패킷 캡쳐를 진행하였다.

패킷 캡쳐시 로컬호스트 패킷은 Loopback 인터페이스를 사용한다. (나에게로 다시 돌아오는 패킷)

 

 

 

 

 

 

728x90

1. telnet 명령어 활용 실습

telnet [IP 또는 도메인] [포트]

telnet 명령어는 윈도우에서 해당 포트에 연결가능한지 확인하는 명령어입니다.

 

저는 맥북을 사용중이라 바로 telnet 을 쓰지는 못합니다.

그래서 홈브루를 통해 telnet 을 깔았습니다.

 

 

 

homebrew 는 아래 사이트에 들어가서 절차에 따르면 설치할 수 있습니다.

 

https://brew.sh/

 

Homebrew

The Missing Package Manager for macOS (or Linux).

brew.sh

 

 

homebrew 가 깔리고 난후

brew install telnet

명령어를 입력합니다.

 

 

 

그 후 telnet [IP도메인] [port번호] 

를 입력하면 해당 도메인에 연결된것을 알 수 있습니다. 저는 실습 자료에 있는 도메인과 포트번호를 입력하였습니다.

그러다가

Connection closed by foreign host 

이라는 메시지가 떴습니다.

 

이 메시지의 의미를 찾아보니 서버/클라이언트 사이에 해당 포트는 모두 열려 있어서, 일단 정상적인 접속은 됐으나, 어떤 원인에 의해 서버가 접속을 close 한다는 뜻이었습니다.

 

 

 

2. 패킷 캡쳐 실습

다음으로는 Wireshark 를 설치하여

웹페이지 클릭 시 발생되는 패킷을 캡쳐하는 실습을 진행하였습니다.

와이어샤크를 사용해 패킷을 캡쳐하였습니다.

GET / HTTP.1.1 로 요청을 한 후 HTTP/1.1 302 Found 의 답을 받음을 알 수 있습니다. 이는 통신 방법은 HTTP/1.1로  GET 방식으로 요청을 하고  그에 대한 대답을 받은 것을 알 수 있습니다다.

HTTP 302 응답 코드 는 클라이언트가 요청한 리소스가 헤더에 주어진 URL에 일시적으로 이동되었음을 가리키는 리다이렉트 상태 응답 코드입니다.

 

 

 

 

 

 

3. HTTP 란 무엇일까

 

HTTP 는 socket 을 이용한 웹 페이지 전송 프로토콜입니다.

HTTP 는 TCP 를 기반으로 합니다.

웹 페이지를 전송한다고 했는데, 여기서 웹 페이지는 객체들의 집합이라고 할 수 있습니다.

객체란 HTML file 이나 JPEG image 나 audio/video 파일 등등을 말합니다.

우리가 웹페이지를 식별하기 위해서는 URL 이란 것을 사용합니다.

이 URL 는 universal resource locator 의 약자로

다음과 같은 구조로 구성되어 있습니다. 가장 앞에 있는 http 는 프로토콜 / 그 다음 나오는 networks.cnu.ac.kr 는 도메인 / 그 후 path나 파라미터나 fagment 가 존재합니다. 여기서 말하는 path 가 바로 파일의 경로를 가리킵니다. 해당 도메인에서 어떠한 폴더에 접근해줘~! 라는 느낌입니다. 

 

그렇다면 HTTP 프로토콜에 대해 알아봅시다. 클라이언트가 서버에게 요청 메시지를 보낼때는 GET 을 사용합니다.

아래 그림과 같은 메시지로 요청했다고 합시다.

GET /restapi/vi.0 HTTP/1.1 에서 요청 내용을 알 수 있습니다.

 

 

 

 

 

 

 

4. 웹 서버 접속시 우리가 개발해야하는 부분은 무엇인지?

 

전통적으로는 socket API를 이용한 TCP socket을 이용한 HTTP 요청 파싱과 응답 모듈을 개발해야 했습니다.

 

여기서 말하는 소켓이란 서로 멀리 떨어져있는 host(컴퓨터)간에 데이터를 주고 받을 수 잇도록 프로그램으로 구현한 것을 말합니다.

인터넷에서 컴퓨터들간 정보를 주고받기 위해선 프로토콜이 필요합니다. 프로토콜이란 언어 같은 존재로 예를들면 프랑스어와 한국어로는 대화할 수 없듯이 통신을 하는 기기 사이에선 같은 프로토콜을 사용해야합니다. 인터넷 프로토콜 슈트(모음) 중에선 TCP/IP 가 가장 많이 사용됩니다. TCP, IP 는 별개지만 합쳐서 주로 사용됩니다.  TCP/IP 를 사용하겠다는 것은 IP 주소 체계를 따르고 IP Routing 을 이용해 목적지 도달하며 TCP의 특성을 활용해 송신자와 수신자의 논리적 연결을 생성하고 신뢰성을 유지하도록 함을 의미합니다.

HTTP, FTP, SMTP 등의 어플리케이션 프로토콜은 TCP 를 기반으로 하고 IP 위에서 동작합니다.

 

아무튼 전통적으로는 이 TCP 소켓을 이용하여 HTTP 요청 파싱와 응답 모듈을 개발해야했지만,

현재는 Web framework를 이용합니다.

프레임워크 위에서 개발을 하면 우리는 일을 하기위한 전체 구조와 동작방식을 만들지 않습니다. 프레임워크로 개발을 할 경우 전체 동작방식은 프레임워크가 제공하고 우리는 프레임워크의 일정 부분만 개발합니다.

 

웹프레임워크

Python Django, Flask, FastAPI

Java Netty, Spring

JavaScript: Node.js, Express.js, Ruby on Rails ASP.NET

 

 

 

728x90

 

 

실습에서 도커로 Nginx를 구동시키는 실습이 있었다.

실습 진행 중에 내가 모르는 단어가 너무 많아 한번 정리하기로 하였다.

 

우선 Nginx 란 무엇인지 먼저 알아보자

 

Nginx

nginx 는 쉽게 말하면 웹 서버이다. 서버란 무엇이냐 ! 서버는 아주 쉽게 생각하면 컴퓨터이다. 다만 사람에도 종업원과 고객 이 있듯이 컴퓨터에도 종업원과 고객이 있다 . 서버는 고객, 즉 클라이언트에게 무언가를 제공하는 컴퓨터이다.

클라이언트는 어떤 서비스를 이용하기위해 네트워크를 통해 요청을 보낸다. 네트워킹은 그러한 과정을 의미하며 html, css 등의 파일을 연결을 통해 다른 컴퓨터로 보내는 것이다. 이러한 연결망이 네트워크라고 할 수 있다. 

웹 개발에서의 클라이언트는 크롬, 사파리, 익스플로어 등 인터넷 브라우저라고 할 수 있다.

 

 

 

웹 서버는 아파치, nginx 등이 있으며 html , css, js 와 같은 정적 파일들을 클라이언트의 요청에 따라 제공하는 소프트웨어를 말한다.

웹 서버는 클라이언트와 통신하기 위해 http 프로토콜을 사용한다.

 

프로토콜은 상호간에 정의한 규칙을 의미한다. 특정 기기간 데이터를 주고받는 통신을 하기 위해선 이 규칙에 따라야한다. 웹 프로토콜에는 http 뿐만 아니라 FTP, SMTP 등 각 서비스에 맞는 통신규약이 존재한다. 

 

흔히들 http 와 https 들을 봤을 것이다. s 의 의미는 무엇일까? s 는 secure 보안을 의미한다. http 를 암호화하여 인증서를 추가한 것이 바로 https 이다.

 

 

다음은 WAS 에 대해 알아야한다.

우리가 볼 수 있는 html, css, js 와 같은 파일들은 정적 파일로 웹 서버에서 제공할 수 있다. 다만 동적인 처리를 위해서는 이 WAS 가 필요하다. 예를 들어 회원가입이나 로그인 등의 로직을 처리하거나 데이터베이스 연동, 트랜잭션 관리, 보안, 로깅 등의 일 말이다. WAS 를 통해 웹 어플리케이션의 안정성과 성능을 향상시킬 수 있으며 개발자들은 어플리케이션 개발에만 집중할 수 있다. WAS의 예로는 톰캣, nodejs 등이 있다. 

 

 

 

다음으로 DB 데이터베이스에 관해서도 알아야한다.

데이터베이스는 조직 또는 개인이 정보를 저장, 관리, 검색할 수 있는 시스템을 말한다. 

 

 

 

웹 서비스를 요청할 때는 클라이언트 -> 웹 서버 -> WAS -> DB 의 순으로 요청된다. 크롬과 같은 브라우저가 Nginx와 같은 서버에 DB 관련 요청을 하면 톰캣이나 nodejs 같은 WAS 에서 DB에 접근한다. 요청에 응답할 때는 반대의 순서로 응답된다. 

 

 

 

 

 

그렇다면 우리는 nginx 와 같은 서버를 왜 사용하는 지를 알아야한다.

Nginx는 리버스 프록시 사용이 가능하다. 프록시란 언어는 범용적으로 사용되나, 여기서는 "대리"라는 의미로 이해하자. 인터넷 접속을 할 때 중간 대리 역할을 하는 게 프록시 서버이다.

 

프록시는 포워드 프록시와 리버스 프록시로 나눌 수 있다.

 

 

포워드 프록시는 클라이언트(단말기기와 같은)와 인터넷 사이에서 흐름을 대신 처리하는 것을 의미한다. 특징으로는 캐싱이 있는데 클라이언트가 요청한 내용을 캐시에 둔다. 저장을 하기 때문에 시간을 줄일 수 있다. 두번째 특징으로는 익명성이 있다. 클라이언트가 요청을 했지만 포워드 프록시가 요청을 한 것처럼 서버에게 전송할 수 있다. 

 

리버스 프록시는 인터넷과 서버들 사이에 위치하고 있다. 특징에는 캐싱과 보안이 있다. 캐싱의 역할은 포워드 프록시와 비슷하다. 보안은 서버 정보를 클라이언트에게 숨길 수 있다는 이점을 가진다. 클라이언트는 요청시 리버스 프록시가 실제 서버라고 생각하여 요청하므로 실제 서버의 IP가 노출되지 않는다. 마지막은 로드밸런싱이다. 이것은 하는 경우도 있고 하지 않는 경우도 있다. 로드 밸런싱이란 해야할 작업을 나눠서 분산시키는 일이다. 요청을 각각 원하는 대로 나누어 주는 것이다. 한 마디로 서버들에게 요청을 나눠준다. 

 

 

정리하면 Nginx는 리버스 프록시 사용이 가능하여 로드 밸런싱, 백엔드 라우팅, 캐싱과 같은 이점을 갖기 때문에 

사용한다.

 

 

 

 

 

 

 

 

 

 

 

#컴공 #강의 #네트워크 #리버스프록시 #Nginx #웹서버

728x90

 

L3 Packet

( Packet 은 단위 데이터 ) ( L2 에서는 Frame 이 단위 데이터)

( 16진수 덩어리로 되어있다)

ㅇ Packet 이라는 말은 L3 IP Packet 으로 외운다.

ㅇ Header(주소, Src -> Dst) 와 Payload(전달내용) 로 나뉘며 이는 상대적인 분류이다.

최대 크기는 MTU

 


WireShark

: 패킷 분석 도구

 


 

Encapsulation

 

우리는 택배를 보낼 때 상자에 무언가를 담는다. 이 물건을 포장하는 것과 같다. 이런걸 "단위화"라고 한다. 박스에 넣어두면 무엇이 들었는지 모르기 때문에, 캡슐화도 내용을 모르게 담는 것과 같다.

DataLink L2 계층 뜯었더니 L3 계층이 있고, 또 뜻으면 Transport 있고 이런 식으로 캡슐화 해서 보냄

 Decapsulation 은 반대로 생각하면 된다. 포장을 푸는 개념!


패킷의 생성과 전달

 철수가 영희에게 책을 보낸다고 하자. 책을 보내기 위한 수단이 필요하다. 예를 들어 택배로 보낸다고 가정해보자. 처음 준비해야 할 것은 보낼 물건인 책을 준비하는 것일 테고, 그 후 상자를 구해야한다. 그렇게 물건을 담고, 송장을 붙여서 택배 기사님께 전달한다. 기사님은 트럭에 택배들을 취합하여 담고 여기저기에 배송한다. 영희네 집에도 갈 것이다.  그러나 영희네 집에는 영희의 부모님, 형제 자매 또한 살고 있다. 그렇기 때문에 송장에는 집 주소 뿐만 아니라 받는 사람 이름 또한 써야한다. 

이 비유에서, 영희나 철수는 프로세스이고, 책은 데이터이다. 택배는 패킷이다.  택배 기사님은 GateWay 이다.  송장에 적힌 목적지 주소는 IPv4  Dst 에 적혀있다. 영희네 집이 host 이고, 받는 사람의 이름을 Port 번호라고 한다.

 

728x90

+ Recent posts