네트워크 애플리케이션 개발의 중심은 다른 위치의 종단 시스템에서 동작하고, 네트워크를 통해 서로 통신하는 프로그램을 작성하는 것
Ex) 사용자의 호스트에서 실행되는 브라우저 프로그램과 웹 서버 호스트에서 실행되는 웹 서버 프로그램
2개의 종단 시스템에서 프로세스는 컴퓨터 네트워크를 통한 메시지(message) 교환으로 서로 통신한다. 송신 프로세스는 메시지를 만들어서 네트워크로 보내고, 수신 프로세스는 메시지를 받고 역으로 메시지를 보냄으로써 응답한다. 프로세스 간의 통신에서 클라이언트와 서버는 다음과 같이 정의할 수 있다.
두 프로세스 간의 통신 세션에서 통신을 초기화(다른 프로세스와 세션을 시작하려고 접속을 초기화)하는 프로세스를 클라이언트라 하고, 세션을 시작하기 위해 접속을 기다리는 프로세스를 서버라고 한다.
프로세스는 소켓(socket)을 통해 네트워크로 메시지를 보내고 받는다. 소켓은 호스트의 애플리케이션 계층과 트랜스포트 계층 간의 인터페이스이며, 네트워크 애플리케이션이 인터넷에 만든 프로그래밍 인터페이스이므로, 애플리케이션과 네트워크 사이의 API라고도 한다.
특정 목적지로 우편 메일을 보내기 위해서는 목적지가 주소를 갖고 있어야 한다. 마찬가지로, 한 호스트상에서 수행되는 프로세스가 패킷을 다른 호스트에서 수행되고 있는 프로세스로 패킷을 보내기 위해서는 수신 프로세스가 주소를 가지고 있을 필요가 있다. 수신 프로세스를 식별하기 위해서는 다음과 같은 두 가지 정보가 명시되어야 한다.
트랜스포트 계층 프로토콜이 그것을 이용하는 애플리케이션에게 제공할 수 있는 서비스들은 넓은 범위에서 신뢰적 데이터 전송, 처리율, 시간, 보안으로 분류할 수 있다.
패킷들은 컴퓨터 네트워크 내에서 손실될 수 있다. 예를 들어, 패킷은 라우터의 버퍼에서 오버플로 되거나, 패킷의 비트가 잘못되면 호스트 혹은 라우터에 의해 버려질 수 있다. 재무 애플리케이션 같은 경우 데이터 손실은 위험한 결과를 초래할 수 있다. 따라서 이러한 애플리케이션을 지원하기 위하여 한 애플리케이션이 보낸 데이터가 올바르고 완전히 다른 애플리케이션에 전달되도록 보장하기 위해 조치를 취해야 한다. 만약 프로토콜이 보장된 데이터 전송 서비스를 제공한다면 이를 신뢰적 데이터 전송(reliable data transfer)을 제공한다고 한다. 트랜스포트 프로토콜이 신뢰적 데이터 전송을 제공하지 않을 때, 송신 프로세스가 보낸 데이터는 수신 프로세스에 전혀 도착하지 않을 수 있다. 이것은 손실 허용 애플리케이션(loss-tolerant application)의 경우, 어느 정도의 데이터 손실을 참아낼 수 있는 실시간 오디오/비디오 같은 멀티 애플리케이션에서 받아들여 질 수 있다.
네트워크 경로를 따라 두 프로세스간의 통신 세션에서 송신 프로세스가 수신 프로세스로 비트를 전달할 수 있는 비율을 나타낸다. 트랜스포트 프로토콜은 가용한 처리율이 항상 적어도 r bps임을 보장한다. 만약 트랜스포트 프로토콜이 이 처리율을 제공할 수 없다면, 애플리케이션은 낮은 속도로 인코딩하거나 포기해야한다. 처리율 요구사항을 갖는 애플리케이션은 대역폭 민감 애플리케이션(bandwidth-sensitive application)이라고 한다.
대역폭 민감 애플리케이션들이 특정 처리율 요구사항을 갖고 있는 반면에, 탄력적 애플리케이션(elastic application)은 가용한 처리율을 많으면 많은 대로 적으면 적은 대로 이용할 수 있다.
트랜스포트 계층 프로토콜은 시간 보장(timing guarantee)을 제공할 수 있다. 예를 들면 송신자가 소켓으로 내보내는 모든 비트가 수신자의 소켓에 100ms 내에 도착하게 하는 것이다. 이러한 서비스는 인터넷 전화, 가상 환경, 원격회의 같은 실시간 상호작용 애플리케이션에 매력적이다. 비실시간 애플리케이션의 경우 낮은 지연이 항상 높은 지연보다 선호되지만 종단 간 지연에 엄격한 제약을 받는 것은 아니다.
트랜스포트 프로토콜은 애플리케이션에 하나 이상의 보안 서비스를 제공할 수 있다.
인터넷은 애플리케이션에게 2개의 전송 프로토콜, 즉 UDP(User Datagram Protocol)와 TCP(Transmission Control Protocol)를 제공한다.
연결지향형 서비스 : 애플리케이션 계층 메시지를 전송하기 전에 TCP는 클라이언트와 서버가 서로 전송 제어 정보를 교환하게 한다. 이 핸드셰이킹 과정이 클라이언트와 서버에 패킷이 곧 도달할 테니 준비하라고 알려주는 역할을 한다. 핸드셰이킹 단계를 지나면, TCP 연결이 두 프로세스 소켓 사이에 존재한다고 말한다. 이 연결은 두 프로세스가 서로에게 동시에 메시지를 보낼 수 있기에 전이중(full-duplex) 연결이라고 한다. 애플리케이션이 메시지 전송을 마치면 연결을 끊어야 한다.
신뢰적인 데이터 전송 서비스 : 통신 프로세스는 모든 데이터를 오류 없이 올바른 순서로 전달하기 위해 TCP에 의존한다. TCP는 애플리케이션의 한쪽이 바이트 스트림을 소켓으로 전달하면 그 바이트 스트림이 손실되거나 중복되지 않게 수신 소켓을 전달한다.
웹의 애플리케이션 계층 프로토콜인 HTTP(HyperText Transfer Protocol)는 웹의 중심이다. HTTP는 두가지 프로그램으로 구현된다.(클라이언트 프로그램과 서버 프로그램). 각기 다른 종단 시스템에서 수행되는 클라이언트 프로그램과 서버 프로그램은 서로 HTTP 메시지를 교환하여 통신하며, HTTP는 메시지의 구조 및 클라이언트와 서버가 메시지를 어떻게 교환하는지에 대하여 정의하고 있다.
사용자가 웹 페이지를 요청할 때, 브라우저는 페이지 내부의 객체에 대한 HTTP요청 메시지를 서버에게 보낸다. 서버는 요청을 수신하고 객체를 포함하는 HTTP 응답 메시지로 응답한다.
HTTP 서버는 클라이언트에 대한 정보를 유지하지 않으므로, HTTP를 비상태 프로토콜(stateless protocol)이라고 한다.
HTTP는 디폴트로 지속 연결을 사용하지만, HTTP 클라이언트와 서버는 비지속 연결을 사용하도록 설정될 수 있다.
페이지가 기본 HTML파일과 10개의 JPEG 이미지로 구성되고, 이 11개의 객체가 같은 서버에 있다고 가정하자. 기본 HTML파일의 URL은 다음과 같다.
연결 수행 과정은 다음과 같다.
비지속 연결은 몇 가지 단점이 있다.
지속 연결에서 서버는 응답을 본내 후에 TCP 연결을 그대로 유지한다. 같은 클라이언트나 서버 간의 이후 요청과 응답은 같은 연결을 통하여 보내진다. 특히 앞선 예에서의 전체 웹 페이지를 하나의 지속 TCP 연결을 통해 보낼 수 있다. 이들 객체에 대한 요구는 진행 중인 요구에 대한 응답을 기다리지 않고 연속해서 만들어질 수 있다.(파이프라이닝) 일반적으로 HTTP 서버는 일정 기간 사용되지 않으면 연결을 닫으며, 서버가 연속된 요구를 수신할 때, 서버는 객체를 연속해서 보낸다.
Get /somedir/page.html HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accpet-language: fr
HTTP 요청 메시지의 첫 줄은 요청 라인(request line), 이후의 줄들은 헤더 라인(header line) 이라고 부른다.
요청 라인은 3개의 필드, 즉 방식(method) 필드, URL 필드, HTTP 버전 필드를 가진다.
Host : www.someschool.edu는 객체가 존재하는 호스트를 명시하고 있다.
Connection: close 헤더 라인은, 브라우저는 서버에게 지속 연결 사용을 원하지 않는다는 것을 말하고 있다.
User-agent: 헤더 라인은 서버에게 요청하는 브라우저 타입을 명시하고 있다.
Accpet-language: 헤더는 사용자가 객체의 프랑스어 버전을 원하고 있음을 나타낸다.
HTTP/1.1 200 OK
Connection: close
Date: Tue, 18 Aug 2015 15:44:04 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tue, 18 Aug 2015 15:11:03 GMT
Content-Length: 6821
Conent-Type: text/html
(data.....)
응답 메시지는 총 3개의 섹션인 초기 상태라인, 헤더라인, 개체 몸체로 나뉘어져 있다.
HTTP 서버는 상태를 유지하지 않지만, 서버가 사용자 접속을 제한하거나 사용자에 따라 콘텐츠를 제공하기 원하므로 웹사이트가 사용자를 확인하는 것이 바람직할 때가 있다. 이 목적으로 HTTP는 쿠키(cookie)를 사용한다.
쿠키 기술은 네 가지 요소를 포함한다.
쿠키가 동작하는 과정은 다음과 같다.
이베이 사이트에 방문한 적이 있는 사람이 처음으로 아마존닷텀에 접속했다고 가정한다.
웹 캐시(Web cache, 프록시 서버(proxy server)라고도 함)는 기점 웹 서버(origin Web server)을 대신하여 HTTP 요구를 충족시키는 네트워크 개체이다. 웹 캐시는 자체의 저장 디스크를 가지고 있어 최근 호출된 객체의 사본을 저장 및 보존한다. 브라우저는 사용자의 모든 HTTP 요구가 웹 캐시에 가장 먼저 보내지도록 구성될 수 있다.
캐시는 서버이면서 클라이언트이며 웹 캐시의 장점은 다음과 같다.
웹 캐싱이 사용자가 느끼는 응답 시간을 줄일 수 있지만, 새로운 문제를 야기한다. 캐시 내부에 있는 복사본이 최신이 아닐 수 있다. 이 문제는 조건부 GET(conditional GET)을 사용하면 해결할 수 있다. HTTP 요청메시지가 (1)Get 방식을 사용하고, (2) If-Modified-Since: 헤더 라인을 포함하고 있다면, 그것이 조건부 GET 메시지다.
브라우저의 요청을 대신해 프록시 캐시는 요청 메시지를 웹 서버로 보낸다.
GET /fruit/kiwi.gif HTTP/1.1
HOST: www.exotiquecuisine.com
웹 서버는 캐시에게 객체를 가진 응답을 보낸다.
HTTP/1.1 200 OK
Date: Sat, 3 Oct 2015 15:39:29
Server: Apache/1.3.0 (Unix)
Last-Modified: Wed, 9 Sep 2015 09:23:24
Content-Type: image/gif
(data...)
캐시는 요청하는 브라우저에게 객체를 보내주고 자신에게도 객체를 저장한다. 중요한 것은 캐시가 객체와 더불어 마지막으로 수정된 날짜를 함께 저장한다는 것이다.
일주일 후에 다른 브라우저가 같은 객체를 캐시에게 요청하면 객체는 여전히 저장되어 있다. 이 객체는 지난 주에 웹 서버에서 수정되었으므로 브라우저는 조건부 GET으로 갱신 조사를 수행한다.
GET /fruit/kiwi.gif HTTP/1.1
Host: www.exotiquecuisine.com
If-modified-since: Wed, 9 Sep 2015 09:23:24
If-modifed-since 헤더 라인 값이 Last-Modified 헤더 값과 같다면 다음과 같은 응답 메시지를 보낸다.
HTTP/1.1 304 Not Modified
Date: Sat, 10 Oct 2015 15:39:29
Server: Apache/1.3.0 (Unix)
응답 메시지를 보내지만 요청된 객체는 포함되어 있지 않다. 이는 클라이언트에게 요청된 객체의 캐싱된 복사본을 사용하라는 것을 의미한다.