Chap1에서 우리는 Internet Protocol stack에 대해서 배웠었다.
우리는 1. Applicatoin Layer = Network application
에 대해서 배울 것이다.
우리가 가장 많이 쓰는 application = Web
Network Application = Web
을 어떻게 개발할 것인가?
Our goals :
No need to write software for network-core devices :
Server
:always-on host
:parament IP address
:dynamic auto scaling
:Client
: dynamic IP address
:P2P
:program
: nonvolaitle memory인 HDD, SSD에 저장되어 있는 상태
process
: program이 CPU에 의해 실행되기 위해 memory(RAM)에 loading된 program.
word program, web browser라는 2개의 독립적인 process가 있다고 가정하자.
여기서 두 program 사이에서 data를 어떻게 주고 받을 수 있을까?
IPC(Inter-Process Communication)
이 있다.하나의 system에서 두 process가 통신하기 위한 IPC 얘기가 왜 나왔는가?
network application에서 communication 한다는 것
= 내 host에서 실행되고 있는 network application은 하나의 process이고,
다른 사람의 computer에서 실행되고 있는 network application도 하나의 process이다.
= 멀리 떨어져 있는 process 간의 통신을 한다.
= process간의 통신을 network로 확장한다.
Client process
Server process
socket programming
:
내 computer 안의 process들끼리 통신하게 할 수도 있고,
외부에 있는 process들과 통신하게 할 수도 있다.
Socket
:Internet을 하기 위해 고유한 IP address가 필요하다
어떤 device인지 알아내기 위해서 고유 IP address는 Identifier로 사용된다.
IP address는 123.45.67.8 이런 식으로 4 bytes = 32 bit로 구성되어 있다.
IP address
만 있다면 Internet 통신이 가능할까?
내 computer에서 사용하는 여러 application(Youtube, Insta, Naver, ...)이 있을 텐데
각각의 process를 구분할 수 있어야 하기 때문에
data가 어떠한 process로 가야하는지 identification할 수 있는 port number
가 필요함.
그래서 같은 host 안에서는 동일한 port number를 가질 수 없다.
참고로 우리가 자주 사용하는 application들은 지정된 port number를 갖는다.
HTTP server : 80
mail server : 25
결론 :
IP address와 port number를 알아야
network application을 개발하고 application 간의 통신을 할 수 있다.
(정리)
IP address만 갖고서 application layer로 packet이 도달할 수 없다.
IP address는 내 computer까지만 오는 것이고,
어떤 process에서 그 packet을 가져갈 것인가? 하는 추가적인 port number가 필요하다.
엄밀히 말하면 process마다 할당되는 것은 아니다.
내 process 안에서 여러 개의 port number를 할당할 수 있다.
port는 socket을 만들 때, "이 process에서 이 port number를 쓰겠다"라고 binding해줄 수 있다.
data integrity(reliability)
:timing
:Throughput
:security
:Transport layer
:Internet에서 사용하는 Transport layer의 protocol?
= Application의 message의 속성을 기준 삼아 TCP? UDP?를 설정한다.
해당 application의 message가 loss에 critical하다면? = data integrity가 중요하다? TCP.
해당 application의 message가 throughput과 time sensitivity가 중요하다? UDP.
TCP service
:
UDP service
:
원래 TCP는 encrpytion이 없어서 보안이 약했음
최근에는 TCP와 security가 강화된 SSL 기능이 나옴.
HTTPS가 SSL을 사용한 예시이다.
End-to-end에서 인증이 이루어짐.
SSL 자체는 application에 있지만, TCP로 binding되어 사용됨.
HTTPS service가 application에 있어서 test하기 위해 domain이 있어야 함.
가장 대표적인 internet application이 Web
이다.
Web
은 기본적으로 HTTP
protocol을 사용한다.
web page
는 다양한 objects(동영상, 그림, 포맷 등)
들로 이루어져 있다.
app
은 object들이 우리의 local(스마트폰)에 있다.
web
은 object들이 server에 있어서 URL을 치는 순간, server로 request가 간다.
server에서는 object들을 "~에 ~을 배치하라"하는 기준인 HTML을 통해서 response를 준다.
각각의 object들은 server안에 개별적으로 file로 있다.
(아이콘 1개, 버튼 1개, 이미지 1개, ...)
그 object들은 개별적인 URL이 붙는다.
URL은 host name
과 path name
으로 구성된다.
HTTP
: HyperText Transfer Protocol
server에는 web server(ex : Apache, AWS, 등)가 있어야 함.
client가 browser에서 HTTP protocol을 통해서 먼저 request를 보냄.
Server는 request에 대한 response를 보냄.
Web은 data integrity가 가장 중요하기 때문에 TCP를 사용.
TCP는 connect oriented이기 때문에 application에서 data를 바로 보낼 수 있는 것이 아니라,
circuit switching을 logical하게 구현한 것인 TCP이다.
따라서 data를 보내기 전에 TCP connection
을 먼저 initialization해야 한다.
application에서 network 연결을 시작할 때, server에서 실행하고 있는 port number를 사용한다.
server에서 실행하고 있는 port number. (web은 기본적으로 80)
정리
port 80으로 TCP connection 요청.
server는 해당하는 client와의 TCP connection을 accept.
data를 다 주고 받으면, TCP connection을 끊어버림. (TCP를 연결한 상태로 두면 overhead가 커서)
(이 과정은 나중에 socket에서 자세히)
home page
: web server에 request했을 때, 가장 처음으로 받는 page
web page
: web server에 있는 모든 page
request를 하면, server에서 HTML file 하나를 줌.
browser에서 HTML file을 parsing함.
parsing하면 reference된 object들이 나옴.
그 object들은 각각의 URL이 있기 때문에 그 URL을 통해 server로 또 request.
server는 그 request들을 하나씩 response해줌.
받는 대로 web browser에 보여주고 나서, TCP connection을 끊는다.
HTTP protocol은 기본적으로 stateless(상태가 없는 protocol)
이다.
예를 들어 naver.com을 치면, server에서 보내줌.
또 다시 naver.com을 치면, 또 다시 server에서 다시 보내줌.
stateful한 protocol을 만들기 위해서는 매우 복잡해짐.
모든 user들에 대한 과거 request들을 모두 처리하여 stateful하게 만들 수 없다.
그 중 하나의 방법으로는 login이 있다.
그런데, 어떤 사이트들은 login을 하지 않았는데도 이전에 봤던 검색 기록들이 남아 있다.
이게 login을 하지 않은 진정한 stateful protocol이다.
이를 가능케하는 것이 쿠키
이다. (나중에 배움.)
"쿠키"는 HTTP protocol에서 하는 일은 아니고, 추가적인 기능인 것이다.
기본적으로 HTTP protocol은
stateless protocol
이다.
non-persistent HTTP
:
TCP connection을 한 object마다 연결한다.
예를 들어 받아야 하는 object가 10개라면,
첫번째 connection -> 수립 -> object reqeust -> object response -> 받음
두번째 connection -> 수립 -> object reqeust -> object response -> 받음
...
열번째 connection -> 수립 -> object reqeust -> object response -> 받음
하나의 object 마다마다 connection하고 끊고를 반복..
persistent HTTP
:
한 번에 TCP connection에 multiple objects를 받을 수 있음.
RTT (Round Trip Time)
:Non-persistent HTTP response time
:persistent HTTP response time
:HTTP requeset message는 request line
, header lines
으로 구성되고, ASCII로 되어 있다.
request line
:header lines
: form
: 입력창
기존의 원래 HTTP protocol은 request로 web page에 대한 file을 달라고 request하여
해당하는 reference된 object를 보여주는 것인데,
form에 있는 data는 내가 일방적으로 server에게 보내주는 data이다.
= 기존의 request와는 다른 방식
➡️ 이러한 input form을 upload하는 2가지 방법이 존재한다.
POST method
:GET method(= URL method)
:예전에는 별도의 parsing이 없기 때문에 더 빠른 GET method를 선호했지만,
URL에서 data가 보이기 때문에 security가 약함.
따라서 최근에는 POST method를 더 선호함.
HTTP/1.0
:
HTTP/1.1
:
status line
, header lines
:
status code
: data, requested HTML file
:
response로 object(file = 동영상, 이미지, ...)를 받아야 함.
이러한 data들은 body에 들어가 있다.
login을 하지 않은 상태를 가정하여, Server는 기본적으로 stateless하다.
내가 10번을 request하면, 내가 누군지 모른다.
10명의 서로 다른 사람들로 인식하여 home page를 똑같이 보여주는게 원래 web server의 역할이다.
기존의 web protocol을 사용하면서 stateful한 상태로 유지할 수 없을까? 하여 나온게 cookie이다.
cookie
는 우리가 login을 하지 않고도, 내가 누구인지, 뭘 했는지에 대한 정보를 남기는 것이다.
cookie는 4개의 component가 있다.
cookie header line of HTTP response message
:cookie header line of HTTP request message
: cookie file kept on user's host, mananged by user's browser
:back-end DB at Web site
:client side에 있는 cookie file은 HDD에 해당하는 ID값이 저장되어 있음.
우리는 login을 하지 않았기 때문에 ID값 우리를 구별하기 위한 Identifier임.
amazon server에 처음 접속했다고 가정.
일반적인 HTTP request message를 보냄.
amazon server에서는 그 user를 위한 unique한 ID(1678)를 생성하여 Back-end DB에 entry를 만든다.
그리고나서 amazon server는 response message의 cookie header line에 set-cookie:1678이라는 정보 넣어 보낸다.
client는 login을 하지 않고도 다음 request message에 cookie : 1678을 넣어 보내기 때문에
server는 client에 대한 정보를 계속해서 Back-end DB에 저장한다.
그리고나서 1주일 뒤 다시 접속하면, 해당하는 site에 대한 cookie 정보가 있다면 그 cookie ID(1678)를 갖고 request한다.
➡️ 결국 cookie는 server가 client의 state를 유지할 수 있게 해주는 기능이다.
stateless인 web protocol을 stateful하게 만들어 준다.
언뜻 보면, Cookie는 privacy 문제가 있을 것 같다.
하지만 cookie에는 민감한 개인 정보는 저장이 되지 않는다.
그리고 file이 오가는 것이 아니라 server에 entry만 생성되는 것이기 때문에 지금까지 보안상 문제는 없었다.
cache
:
CPU 외부에 있는 memory에 data를 접근하려면 속도가 느리기 때문에
해당 Process에서 자주 사용하는 data를 cache에 저장하여 사용한다.
cache에서 찾으면 "hit", 없으면 "miss"라고 한다.
cache 실행 시간 = hit rate + miss rate
이러한 cache 기능을 web에서도 사용한다.
Web cache
:
우리 학교의 많은 학생들이 네이버에 동시에 접속한다.
내가 request를 해서 갔다 오는 response와 옆의 학생이 request해서 갔다 오는 response와 같다.
학교에 있는 main router 측면에서 보면, 이는 매우 비효율적이다.
따라서 망 내부에 proxy server
가 있다.
proxy server에는 가장 최근에 client가 접속한 site들의 data를 갖고 있다.
client A가 naver를 요청했다.
proxy server에 naver가 있는지 확인한다.
없으면? proxy server가 대신하여 origin server에 request하고, HTTP response를 갖고 있다.
그리고나서 client B가 naver에 요청했다.
proxy server에서 방금 naver에 대한 정보를 main server로부터 받았기 때문에 외부로 나갈 필요 없이
proxy server에서 naver를 client B에게 response한다.
update를 자주 하지 않는 site를 request하면 좋지 않다.
만약 update를 자주 하는 site라면, main server의 site와 비교하여 proxy server의 site는 outdate.
why web cache?
:hit rate가 높다면,
돈을 늘리지 않고(access link를 늘리지 않고도) local에 web cache를 두는 것이 좋다.
hit rate가 낮다면, web cache의 성능이 굉장히 낮다.
web cache의 가장 큰 문제
:
cache hit가 얼마나 잘 되는지에 따라 성능이 매우 달라진다.
그래서 우리의 browser에서 Web cache의 freshness를 보장하기 위한 방법으로 conditional GET
을 사용한다.
conditional GET
을 쓰면, 주기적으로 해당 site가 update되었는지 아닌지 확인할 수 있다.
request message의 header line에 다음과 같이 넣는다.
우리가 요청하면, 1차적으로 browser에서 검색을 하거나, proxy server에서 갖고 있는 날짜가 있을 것이다.
그 날짜 이후로 update된게 있는지 conditional GET을 server로 보낸다.
만약 object가 update된게 없다면, 304 Not Modified라는 response message만 보낸다.
만약에 browser라면 가장 최근의 object를 보여준다.
proxy server라면 자신이 갖고 있는 object를 보여준다.
만약 해당 날짜 이후로 update가 되었다면, 변경된 data들을 response한다.
Email을 하기 위한 3가지 구성요소
: User Agent
:Mail servers
:SMTP(Simple Mail Transfer Protocol)
:Web
과 가장 큰 차이점 :SMTP는 기본적으로 persistent connection을 유지한다.
message에는 Header(제목, 수신자, 첨부) & Body(본문)가 있다.
SMTP는 CRLF.CRLF로 end of message가 결정된다.
comparison with HTTP
:
Mail access protocol
:Domain Name은 하위 protocol과는 전혀 관계가 없다. (Application Layer에 있다.)
그냥 부가적인 service이다.
원래는 internet 안에서 각각의 host를 구분하는 기준은 IP address를 알아야 한다.
그런데 IP address를 기억하기 어렵기 때문에 사람들이 잘 알 수 있는 text 형태로 matching해주는 것이 DNS(Domain Name System)
이다.
DNS는 일종의 Database이다.
Key, value가 있다.
Key : Domain name (Naver)
Value : IP address (Naver의 IP address)
DNS는 단순히 query(domain name을 물음)를 해서 답(IP address)을 받는다.
DNS server에는 www.naver.com이 어떠한 IP address를 갖는지 알고 있다.
DNS는 network 안쪽으로 들어가지 않고, edge에서 이루어지기 때문에 complexity가 복잡하지 않다.
Host aliasing
:
Host마다 이름이 있다.
Domain이 1개이더라도 host는 여러개일 수 있다.
(host aliasing)@inu.ac.kr
Load distribution
:
부하를 분산시키기 위해서 똑같은 server를 복제하여 여러개 둠.
각 server들마다 개별적인 IP address가 있다.
main server들마다 개별적인 IP address가 있음.
main server에서는 해당하는 server의 IP address 여러 개를 갖고 있는데,
그 중 지역적으로 가장 가까운 server의 IP address를 준다.
지역적인 server 말고 traffic을 보며 상황에 따라 다른 IP address를 넘겨준다.
why not centrailze DNS?
:
DNS server는 centralization되지 않고, 철저히 distribution되어 있다.
만약 DNS server가 하나만 있다면?
그 server가 잘못 된다면, 전세계 사람들은 internet을 사용할 수 없게 된다.
또한 전세계의 모든 traffic을 감당할 수도 없다.
그리고 지역적으로 가까이 있는 client들은 빨리 받고, 멀리 있으면 여러 hop을 거쳐서 service를 받기 때문에 늦게 받는다.
만약 DNS server를 유지, 보수해야 해서 잠시 중단시킨다면 전세계 모두가 중단된다.
hierarchical DB
:
DNS가 모두 대등한 관계라면 관리하기 힘들다.
DNS server를 계층화하여 관리가 쉽고, 전파가 빠르게 만든다.
Root DNS servr는 모든 것을 아는 것이 아니라,
자기한테 붙어있는 하위 1계층의 DNS server들에 대해서만 알고 있다.
모든 DNS server는 이러하다.
TLD(Top-Level Domain) servers
:authoritative DNS servers :
각각의 기관들은 자신의 authoritative DNS server가 있다.Local DNS name server
:resolution
:iterated query
:recursive query
:recursive 방식이 더욱 효율적이므로 recursive 방식이 사용된다.
local DNS server는 한 번 찾은 address를 자신의 DNS table에 저장한다. (DNS server는 Database이기 때문)
하지만 어느정도 시간까지만 저장함.
local DNS(=name) server는 memory overflow의 문제,
또한 보안 문제로 server IP address가 계속 바뀌기도 한다.
따라서 계속 저장하는 DB가 아니라, 어느 정도 시간만 record를 저장하기 때문에 DNS caching
이라고 한다.
각각의 record에는 TTL(Time To Live)
이 있다.
TTL이 expire될 때까지만 저장해야 한다.
보통 이러한 cache형 DB는 각 record에 TTL이 있다.
이러한 temporary한 data들을 memory가 아니라 HDD에 저장했다가, 시간 지나면 자동으로 삭제되니까 효율적으로 이용이 가능하다.
이 mechanism은 IETF standard로 되어 있다.
query and reply message, both with same message format
identification
:flags
:questions
:RR(Resource Record)
:answer
:DDoS attack
Redirect attack
:
name server를 공격하여, 공격자가 만들어 놓은 다른 IP address로 바꿔 놓는다.
다른 사이트로 유도.
전체 internet bandwidth 중에서 Netfilx, Youtube이 50% 넘게 차지함.
어떻게 이렇게 많은 user들에게 OTT service를 제공할 수 있을까?
(single server로는 못하고, traffic, 거리에 따라 속도가 다름, ..
또한 user마다 접속 환경이 다양함 = edge에서 접속하는 host들의 bandwidth가 다 다르다.
throughput은 bandwidth가 가장 작은 곳으로 수렴하는데, bandwidth가 작은 host들에게 어떻게 service를 제공할 것인지?)
➡️ solution : distributed(multi server), application-level infrastructure (service를 network level이 아니라, 상위로 띄움)
한 frame마다마다를 보내면 사이즈가 크기 때문에 encode해야 한다.
encode 방법 2가지
DASH
이다.DASH(Dynamic, Adaptive Streaming over HTTP)
:주기적으로 bandwidth를 측정한다.
작은 packet이 갔다 오는 Round Trip Time을 알 수 있다.
(보낸 packet size와 시간을 아니까 bandwidth를 알 수 있다.)
bandwidth가 좋으면? encoding을 적게 된 것을 받을 수 있고,
그렇지 않으면? encoding rate가 높은 것을 받을 수 있다.
network는 실시간으로 달라지기 때문에 한 번에 한 chunk씩 요청한다.
이는 받고 있는 상태에서 back channel로 다른 채널이 돌고 있기 때문에 overhead가 그렇게 높지 않다.
client가 일을 더 많이 한다.
Client가 bandwidth를 계속해서 check하여 available한 bandwidth에 맞는 URL server에 request를 하기 때문에 "intelligent" at client 라고 한다.
Buffer starvation : buffer가 완전히 비어있다.
Buffer overflow : buffer가 꽉 참.
이러한 것들이 발생하지 않도록 request를 한다.
DASH는 streaming multimedia protocol이었고,
network architecture 자체를 다르게 바꿀 필요가 있다.
challenge : 수백 수천 명의 사용자에게 동시에 stream content를 제공한 것인가?
CDN(Content Distribution Networks)
:
distributed한 server들을 client side로 multiple copies를 만들어 보낸다.
2가지 type이 있다.
현재 1., 2. 중에 뭐가 좋은지는 따질 수 없다.
Enter deep
: push CDN servers deep into many access networks.Bring home
: smaller number of larger clusters in POPs near access networksNetflix도 CDNs을 쓴다.
Netflix의 모든 service는 AWS에서 이루어진다. (AWS에서 location을 설정하는게 나오는데, 그게 CDN이다.)
똑같은 copy를 이곳저곳 저장한다.
분산된 server들도 엄밀히 말하면 개별적인 server라서 각각 IP address가 다름.
하지만 domain으로 접속하여 service를 받기 위해 main server도 필요하다.
처음에 main server에 요청한다.
main server는 traffic을 고려하여 나에게 manifest file(어느쪽에 있는 server의 URL에 접속하라는 정보)을 준다.
해당 server에서 영상을 받는다.
OTT(Over The Top)
:자세한 CDN 동작원리
:Netflix
: