
데이터를 사용자에게 전달하는 계층
하위 세 개의 계층(Host-to-Network, Internet, Transport)은 모두 데이터가 한 컴퓨터에서 다른 컴퓨터로 어떻게 전송되는지를 정의하는 데 협력한다.
Application layer은 데이터가 전송된 후에 어떻게 처리할지를 결정한다.
-- 예를 들어, HTTP와 같은 protocol은 웹 브라우저가 그래픽 이미지를 숫자의 긴 스트림이 아닌 그림으로 표시하도록 보장한다.
Application layer은 여러분의 프로그램의 네트워크 부분 대부분이 시간을 보내는 곳이다.
다양한 application layer protocol이 있다
-- 웹을 위한 HTTP
-- 이메일을 위한 SMTP, POP, IMAP
-- 파일 전송을 위한 FTP, FSP, TFTP
-- 파일 접근을 위한 NFS
-- 파일 공유를 위한 Gnutella와 BitTorrent
-- 음성 통신을 위한 Session Initiation Protocol (SIP) 및 Skype 등이 있다.
필요한 경우 고유한 application layer protocol을 정의할 수 있다.
-- Skype protocol은 기본적으로 P2P architecture를 기반으로 하며, 사용자 간의 음성 통화, 비디오 통화, 메시지 전송 등을 가능하게 한다.
-- Skype의 특성 및 보안 요구 사항을 충족하기 위해 개발되었다.
-- Skype만의 위한 비공개 protocol
> GET /index.html HTTP/1.1
> Host: servername
< HTTP/1.1 200 OK
< ....

Transport layer은 데이터 패킷이 전송 순서대로 받아지고 데이터가 손실되거나 손상되지 않도록 보장하는 역할을 한다. 패킷이 손실된 경우, 전송 계층은 송신자에게 패킷 재전송을 요청할 수 있다. IP 네트워크에서는 이를 각 데이터그램에 추가 정보를 포함하는 추가 헤더를 추가함으로써 구현한다.
이 수준에서는 두 가지 주요 프로토콜이 있다.
Transmission Control Protocol (TCP)이 있는데, 이는 높은 오버헤드 프로토콜로서 손실된 데이터나 손상된 데이터의 재전송 및 전송된 바이트의 순서대로 전달을 허용한다.
User Datagram Protocol (UDP)로, 수신자는 손상된 패킷을 감지할 수 있지만 패킷이 올바른 순서로 전달되는 것을 (또는 아예 전달되는 것을) 보장하지 않는다. 그러나 UDP는 종종 TCP보다 빠르다. TCP는 신뢰성 있는 프로토콜로, UDP는 신뢰성 없는 프로토콜이다. 나중에 신뢰성 없는 프로토콜이 앞서 이야기한 것보다 훨씬 유용하다는 것을 보게 될 것이다.
-- 신뢰성 있게 보냄. 순서도 맞춰주고, 데이타가 누락되지 않게 챙겨주고

RFC768 User Datagram Protocol

수신측
-- 수신한 패킷의 ACK 를 전송
송신측
-- 특정 시간(타이머!)동안 보낸 패킷에 대한 ACK 패킷이 없는 경우 retransmission.
-- 송신 패킷이 전달이 안된 경우.
-- 수신 입장에선 적장한 패킷을 받음. 정상 케이스 -
-- 수신(ACK) 패킷이 전달이 안된 경우.
수신 입장에선 같은 패킷을 두 번 받음. 같은 패킷에 대해 다시 ACK



같은 일을 하는 서버가 매번 다른 포트를 사용하면 통신하기 어려울 것.
프로토콜에 고정 포트번호를 부여하는 경우 (꼭 그래야할 필요는 없음)
HTTP 80 - 브라우저에 주소창에 명시하지 않아도 http 프로토콜은 80 포트를 사용
http://naver.com , http://naver.com:80
DNS 53
SMTP 25
네트워크의 다음 계층은 여러분이 관심을 가지게 될 첫 번째 계층이며, OSI 모델에서는 네트워크 계층이라고 더 일반적인 이름으로 불립니다. 네트워크 계층 프로토콜은 데이터의 비트와 바이트가 패킷이라고 불리는 더 큰 그룹으로 어떻게 구성되는지, 서로 다른 기기가 서로를 찾는 데 사용되는 주소 지정 방식을 정의합니다. 인터넷 프로토콜 (IP)은 전 세계에서 가장 널리 사용되는 네트워크 계층 프로토콜이며, Java가 이해하는 유일한 네트워크 계층 프로토콜입니다.
사실, 이것은 두 가지 프로토콜입니다. IPv4는 32비트 주소를 사용하며, IPv6는 128비트 주소를 사용하며 경로 설정을 돕는 몇 가지 다른 기술 기능을 추가합니다. 이 글을 작성하는 시점에서 IPv4는 인터넷 트래픽의 90% 이상을 여전히 차지하고 있지만, IPv6는 빠르게 증가하고 다음 판의 이 책이 나오기 전에 IPv4를 앞서갈 가능성이 높습니다. 이 두 가지는 매우 다른 네트워크 프로토콜이며 특별한 게이트웨이나 터널링 프로토콜 없이 동일한 네트워크에서 상호 운용하지 않지만, Java는 거의 모든 차이점을 숨깁니다.
IPv4와 IPv6 모두 데이터가 데이터그램이라고 불리는 패킷을 통해 인터넷 계층을 통해 전송됩니다. 각 IPv4 데이터그램에는 20~60바이트 길이의 헤더와 최대 65,515바이트의 데이터를 포함하는 페이로드가 있습니다. (실제로 대부분의 IPv4 데이터그램은 몇십 바이트에서 조금 더 8킬로바이트를 넘지 않는 작은 크기를 가지고 있습니다.) IPv6 데이터그램에는 더 큰 헤더와 최대 4기가바이트의 데이터가 포함될 수 있습니다.


1 ICMP Internet Control Message [RFC792]
2 IGMP Internet Group Management [RFC1112]
6 TCP Transmission Control [RFC-ietf-tcpm-rfc793bis-28]
8 EGP Exterior Gateway Protocol [RFC888][David_Mills]
9 IGP any private interior gateway (used by Cisco for their IGRP) [Internet_Assigned_Numbers_Authority]
17 UDP User Datagram [RFC768][Jon_Postel]
라우터를 통하지 않고 갈 수 있는 네트워크
223.1.1 , 223.1.2 , 223.1.3
포워딩
-- 데이타를 전달한다.
-- 포워딩 테이블을 참조하여 데이타를 전달.
-- 네트웍 ID 기준
라우팅
-- 포워딩 테이블을 만든다.
라우팅 테이블



네트워크 관점에서 스위치는 보이지 않는 존재
-- IP 도 없고,
-- MAC 도 없고
하지만, L2, L3, L4 스위치등 각 layer별로 처리하는 스위치가 사용됨
-- L2 스위치는 MAC 주소를 가지고 있으면서 해당 포트로 패킷을 전달
-- L3 스위치는 IP 주소를 가지고 있으면서 해당 포트로 패킷을 전달(Router)
L3 Switch
-- L3 스위치는 라우팅 기능을 수행할 수 있는 네트워크 스위치
-- OSI model의 네트워크 계층(layer 3계에서 작동하며 IP 주소를 사용하여 라우팅 결정
-- MAC address를 기반으로만 트래픽을 전달하는 기존 스위치(L2 switch)와 달리 L3 스위치는 서로 다른 VLAN 또는 서브넷 간에 트래픽을 라우팅할 수 있음
이점
-- 브로드캐스트 트래픽을 줄여 네트워크 성능 향
-- 네트워크를 더 작은 subnet으로 분할하고 VLAN을 사용하면 브로드캐스트 트래픽이 각 subnet 내에 포함되어 정체가 줄어들고 전반적인 효율성 향상
-- OSPF, BGP 등 여러 프로토콜을 지원하므로 기업 네트워크, 데이터 센터, 서비스 제공업체 네트워크 등 다양한 환경에서 사용 가능
Hypertext : Hyperlink를 통해 한 문서에서 다른 문서로 즉시 접근할 수 있는 텍스트<!DOCTYPE html>
<html>
<head>
<title>Welcome, NHN Academy</title>
</head>
<body>
<h3> Welcome </h3>
<p> Hello, NHN Academy. </p>
<p>
<a href="http://nhnacademy.com">
<img src="logo.png" />
</a>
</p>
</body>
</html>
<scheme>://[<username>:<password>@]<host>[:<port>]<Request-URI>[?<query>#<fragment>]
Ex).
https://nhnent.dooray.com/project/to?userWorkflowClass=registered,working
https , http , ftp , file (= protocol)nhnent.dooray.com (= server)/project/touserWorkflowClass=registered,workingGET /welcome.html HTTP/1.1
Host: test-vm.com:3000
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
DNT: 1
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: ko
If-Modified-Since: Sat, 15 Jan 2022 18:23:48 GMT
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/2.7.13
Date: Sat, 15 Jan 2022 19:09:33 GMT
Content-type: text/html
Content-Length: 358
Last-Modified: Sat, 15 Jan 2022 18:23:48 GMT
<!DOCTYPE html>
<html>
<head>
<title>Welcome, NHN Academy</title>
</head>
<body>
<h3> Welcome </h3>
<p> Hello, NHN Academy. </p>
<p>
<a href="http://nhnacademy.com">
<img src="logo.png" />
</a>
</p>
</body>
</html>
-- 리소스를 요청하기 위한 메서드
<!DOCTYPE html>
<html>
<head>
<title>Welcome, NHN Academy</title>
</head>
<body>
<h3> Welcome </h3>
<form action="./welcome.html" method=GET >
name: <br/>
<input type="text" name="name" > <br/>
content: <br/>
<input type="textarea" name="content"> <br/>
<input type="submit" name="send" value="send">
</form>
</body>
</html>
GET /welcome.html?name=TEST-NAME&content=TEST-CONTENT&send=send HTTP/1.1
Host: test-vm.com:3000
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
DNT: 1
Referer: http://test-vm.com:3000/form-get1.html
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: ko
If-Modified-Since: Sat, 15 Jan 2022 23:30:56 GMT
-- 서버에 입력 데이타를 전송하기 위한 메서드
-- 주로 HTML 폼을 사용하기 위하여 많이 사용됨
<!DOCTYPE html>
<html>
<head>
<title>Welcome, NHN Academy</title>
</head>
<body>
<h3> Welcome </h3>
<form action="./welcome.html" method=POST>
name: <br/>
<input type="text" name="name" ><br/>
content: <br/>
<input type="textarea" name="content"><br/>
<input type="submit" name="send" value="send">
</form>
</body>
</html>
POST /welcome.html HTTP/1.1
Host: test-vm.com:3000
Connection: keep-alive
Content-Length: 45
Cache-Control: max-age=0
Origin: http://test-vm.com
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
DNT: 1
Referer: http://test-vm.com:3000/form-post1.html
Accept-Encoding: gzip, deflate, br
Accept-Language: ko
name=TEST-NAME&content=TEST-CONTENT&send=send
요청 주소:
GET: /welcome.html?name=TEST-NAME&content=TEST-CONTENT&send=send
POST: /welcome.html
헤더
GET: Content-Type , Content-Length 헤더 없음.
POST: Content-Type: application/x-www-form-urlencoded , Content-Length: 45
RFC6265 HTTP State Management Mechanism
서버가 클라이언트에 붙여둔 일종의 스티커(?)
서버가 클라이언트에게 쿠키를 세팅 요청(Set-Cookie:) 하면 (스티커를 붙이면),
클라이언트는 이후 서버에게 보내는 요청 헤더에 쿠키(Cookie: )를 표시해서 전송 (스티커를 붙인 채 다시 돌아와야 함)
Session Cookie(세션 쿠키)
-- 사용자가 브라우저를 사용하는 동안만 유효함.
-- 브라우저는 사용자가 브라우저를 사용하는 동안 Cookie 정보를 서버로 전달.
Persistent Cookie(지속 쿠키)
-- 사용자가 브라우저를 종료하더라도 유지되는 쿠키
-- Expires 혹은 Max-Age 가 같이 설정되는 쿠키
대칭키 암호화 알고리즘 (Symetric Encryption Algorithm)
비대칭키 암호화 알고리즘 (Asymetric Encryption Algorithm)
키 교환 알고리즘 (Key Exchange Algorithm)
인증서 (Certificate)
인증기관 (Certificate Authority)