OSI 7계층: 네트워크 통신이 일어나는 과정을 7단계로 나눠 정의한 네트워크 표준 모델
7계층(응용): 응용 프로세스와 직접 관계해 응용 서비스 수행 (사용자와의 인터페이스 제공)
6계층(표현): 전달하거나 받는 데이터의 표현방식을 결정 (데이터 변환, 압축, 암호화 등)
5계층(세션): 세션 연결/해제, 세션 메세지 전송 등
4계층(전송): 컴퓨터간 신뢰성 있는 데이터를 주고 받을 수 있도록 함
3계층(네트워크): 실제 네트워크 간 데이터 라우팅
2계층(데이터 링크): 네트워크 기기 간 데이터 전송 및 물리 주소 결정
1계층(물리): 시스템 간 물리적인 연결과 전기 신호 변환/제어
[라우팅?: 네트워크 안에서 통신 데이터를 최대한 빠르게 보낼 최적의 경로를 선택하는 과정]
[데이터 송수신 과정]
송신측에서 각 계층을 지날 때마다 header가 붙고, 최종적으로 물리 계층에서 비트 단위로 전송
수신측에서는 역순으로 헤더를 떼면서 분석해서 응용 계층에선 최종적으로 data를 볼 수 있음
(encapsulation & decapsulation, 상자에 넣고 넣고 넣고,, 보낸 다음 빼고 빼고 빼고)
모든 네트워크 응용 프로그램은 클라이언트-서버 모델에 기초한다. 응용 프로그램은 이 모델을 사용해 한 개의 서버 프로세스와 여러 개의 클라이언트 프로세스로 구성된다.
클라이언트-서버 모델의 동작방식은 트랜잭션이다.
[클라이언트-서버 트랜잭션]
1. 클라이언트가 서버에 요청(request)을 보내 트랜잭션 개시ex) 웹 브라우저가 파일을 필요로 할 때, 웹 서버로 요청을 보냄
- 서버가 요청을 받고 해석/조작
ex) 웹 서버가 브라우저로부터 요청을 받을 때, 디스크 파일 읽음
- 서버가 요청에 대한 응답을 클라이언트에게 보낸 후, 다음 요청을 기다린
ex) 웹 서버는 이 파일을 다시 클라이언트로 돌려보냄
- 클라이언트는 응답받은 결과를 처리함
ex) 웹 브라우저가 서버로부터 페에지를 받은 후, 스크린에 디스플레이함
클라이언트와 서버는 프로세스며, 한 개의 호스트는 서로 다른 많은 클라이언트/서버를 동시 실행 가능하다. 또한 트랜잭션은 동일하거나 다른 호스트에 존재할 수 있다. 모델은 클라이언트와 서버의 호스트로의 매핑과 관계없이 동일하다.
[호스트?: 네트워크에 연결된 컴퓨터]
인터넷 클라이언트와 서버는 connection을 통해 연속된 바이트(바이트 스트림)을 주고 받는 방식으로 통신한다.
이 connection은 두 개의 프로세스를 연결한다는 점에서 point-to-point 연결이며, 데이터가 동시에 양방향으로 흐를 수 있다는 의미로 완전양방향(full-duplex)다.
여기서 소켓(socket)이 연결의 종단점
각 소켓은 IP 주소, port로 이루어진 소켓 주소를 가진다 (address:port)
클라이언트의 소켓 주소 내 포트는 클라이언트가 연결 요청을 할 때 커널이 자동으로 할당 = 단기 포트
반면 서버의 소켓 주소 내 포트는 대개 잘 알려진 포트(well-known port)며 서비스 이름과 영구적으로 연결되어있음
연결은 두 개의 종단점의 소켓 주소에 의해 유일하게 식별된다.
이 두 개의 소켓 주소는 소켓 쌍 = Tuple로 나타냄
(clientaddr:clientport, serveraddr:serverport)
약간 쉽게 말하면 socket = port를 식별하기 위한 주소
소켓 생성과 통신
+) TCP의 ‘3-way handshake’
1. 클라이언트가 서버에 SYN 패킷을 보내 연결 요청
2. 서버는 SYN-ACK 패킷으로 응답해 연결 요청 받았음+연결 준비 되었음을 알림
3. 클라이언트는 ACK 패킷을 서버로 보내 연결 확정
운영체제에서 파일이나 다른 입출력 리소스에 대한 접근을 추상화하는데 사용되는 정수.
리눅스 체제 내에서는 모든게 파일로 관리됨
그 때 파일을 관리하기 위해 할당해주는 고유 번호
이 파일 디스크립터를 통해 운영체제는 파일/파이프/소켓 등 다양한 입출력 리소스를 일관된 방식으로 관리 가능
UNIX/Linux 시스템에서의 파일 디스크립터 번호
표준 입력 = 0
표준 출력 = 1
표준 에러 = 2
((추가 공부필요))
WebServer?
: 클라이언트로부터 HTTP(프로토콜) 요청을 받아들이고, 그에 따른 응답을 제공하는 소프트웨어
[웹 브라우저 요청 흐름]
- 웹 브라우저에서 HTTP 요청 메세지 생성
- 소켓 라이브러리는 이 메시지를 TCP/IP 연결 후 데이터 전달
- TCP/IP는 HTTP 메세지가 포함된 패킷 생성
- 이 패킷은 LAN 드라이버를 통해 인터넷을 타고 서버로 전달
((+) WAS 추가공부하기))
[웹 컨텐츠]
- 정적 컨텐츠: 웹 서버에 미리 저장되어 있는 파일, 수정 없이 서버가 파일을 그대로 클라이언트에게 제공
ex) HTML, CSS, 이미지 파일, 비디오 파일 등
- 동적 컨텐츠: 서버 측에서 클라의 요청에 따라 동적으로 생성되는 컨텐츠
ex) 장바구니, 조회수 등
- MIME: 웹 서버가 클라이언트에게 제공하는 컨텐츠의 종류를 식별하기 위한 라벨
ex) type/subtype 구조 (= 파일 종류/파일 포맷)
- CGI: 웹 서버와 외부 프로그램 간 표준 인터페이스
CGI를 사용하면 웹 서버는 클라이언트의 요청을 받아들이고, 해당 요청을 처리하는 외부 프로그램을 호출 -> 외부 프로그램은 요청을 처리하고 동적 컨텐츠 생성 후, 결과를 웹 서버에 반환 -> 서버는 CGI 프로그램의 실행 결과를 MIME 타입 설정해 클라이언트에 전달한다
[읽어보기]
HTTP?
: Hyper Text Transfer Protocol, 즉 HTML 같은 하이퍼 미디어 문서를 전송하기 위한 응용 계층에 있는 통신 프로토콜로 Stateless Protocol이다.
= 인터넷에서 데이터를 주고 받을 수 있는 통신 규약
Stateless?
: 서버가 두 요청 간 어떠한 데이터(상태)도 유지하지 않음을 의미
헤더?
요청(request)
: 클라이언트가 서버로 전달해 서버의 액션이 일어나게끔 하는 메시지
응답(response)
: 요청에 대한 서버의 답변
<상태코드/HEAD 메소드 추가 정리하기>
클라이언트와 서버 사이 중계기로 통신 수행
클라이언트가 직접적으로 end server와 연결해 리소스를 얻는 것 대신 프록시와 연결되어 통신 수행
-> 프록시는 클라이언트로부터 받은 요청을 end server에게 보내 응답을 받은 후, 해당 응답을 클라이언트에게 보냄
end server?
: 클라이언트 입장에선 중간에 있는 proxy를 서버라고 착각하기 때문에 모든 리소스를 가지고 있는 원천 server를 end server로 통칭]
Forward Proxy
클라이언트가 서버로 요청할 때 직접 요청하지 않고 먼저 프록시 서버를 통해 요청하는 방식
[특징]
1. 클라이언트가 요청한 내용 캐싱이전에 요청을 통해 얻은 리소스를 저장해놓고 추후에 다시 서버로 요청하지 않아도 해당 리소스를 얻을 수 있음 -> 전송시간 절약, 불필요한 외부전송x -> 네트워크 병목 현상 방지
- 클라이언트가 누구인 지 end server에게 감출 수 있음 = 익명성 보장
실제로는 클라이언트가 요청을 보냈지만, end server 입장에선 마치 프록시가 요청한 것처럼, 요청한 대상에 대한 정보를 프록시 정보라고 인식하게 할 수 있음
Reverse Proxy
클라이언트가 서버를 호출할 때 Reverse Proxy를 호출하게 되고 프록시 서버가 서버를 요청해 받은 응답을 클라이언트에게 전달하는 방식
[특징]
1. 클라이언트가 요청한 내용 캐싱
2. 서버정보를 클라이언트로부터 숨겨 보안성 제공클라이언트는 reverse proxy를 실제 서버라고 생각하고 요청을 보내기 때문에 실제 서버 IP가 클라이언트에게 노출되지 않음
- Load Balancing 기능 제공
Load Balancing?: 클라이언트의 요청으로부터 서버 측에 쌓이는 부하를 분산시켜주는 기능 하나의 인터넷 서비스에 발생하는 트래픽이 많을 때, 여러 대의 서버들이 적절히 분산처리해 해결해주는 것