이 글은2018년 2학기 아주대학교 Paul Rajib 교수님의 Computer Network 수업을 듣고 작성한 수업노트입니다. 부족한 내용이나 오류가 있을 수 있습니다.
Application Layer
응용 프로그램(Application)이 컴퓨터에서 실행되는 상태를 프로세스(Process)라고 한다. Application Layer는 프로세스가 네트워크 상의 다른 프로세스와 연결할 수 있는 인터페이스를 제공해주며, 이를 소켓(Socket)이라고 한다. 소켓은 5-Layer Model 의 시점으로 봤을 땐Application Layer의 데이터를 Transport Layer로 보내주는 역할을 하며, 실제로는 프로세스의 데이터를 OS의 지원을 통해 Network Device(LAN, Wireless)로 내보내게된다.
이 계층에선 실제 응용 프로그램들이 사용자를 위한 여러 기능들을 제공하게 된다. Skype 처럼 음성/영상통화를 제공하거나, 메일, 웹 브라우징, 게임 등을 가능하게 한다. 이런 프로그램들은 아래 구조 중 하나를 택하여 통신한다.
- Client-to-Server Architecture
- Client-to-Server-to-Server Architecture
- Peer-to-Peer Architecture (P2P)
Client-to-Server Architecture
클라이언트(고객)은 서버(제공자)와 통신하며 서버는 클라이언트들이 원하는 데이터를 소유하고 제공한다. 또한 서버의 주소는 항상 고정되어야한다. 아주대학교 홈페이지는 항상 ajou.ac.kr 이다. 이 주소를 통해 학교 홈페이지에 접속할 수 있고, 학교는 클라이언트에게 다양한 서비스를 제공하게 된다. 또 다른 클라이언트가 올린 데이터를 볼 수도 있다. 온라인 커뮤니티에서 다른 사용자가 올린 게시물을 보고 댓글을 다는 것을 생각하면 된다. 이처럼 서버는 클라이언트들의 중개자 역할을 하기도 한다.
Client-to-Server-to-Server Architecture
클라이언트가 서버에서 데이터를 얻으려고 하는데, 서버가 데이터가 없다면 어떡할까? 이 경우 서버가 다른 서버와 연결해서 데이터를 얻어온 후 클라이언트에게 제공한다면, 이것을 Client-Server-to-Server 구조라고한다.
DNS서버가 그 예시로, ajou.ac.kr 도메인의 IP주소를 클라이언트가 요청할 때 DNS서버가 해당 도메인의 IP주소를 갖고있지 않다면 다른 DNS서버에 물어봐서 IP주소를 알아내고 클라이언트에게 제공하게 된다. 자원들이 여러 서버에 나뉘어 저장되어있을 때 사용된다.
Peer-to-Peer Architecture(P2P)
P2P 구조는 네트워크 기기인 피어(Peer)들이 중개자(서버)없이 직접 연결되는 상태를 말한다. 서버가 중개자역할을 하게되면 서버가 전송되는 데이터를 보거나 저장할 수 있다. 또 서버는 여러 클라이언트들과 통신하기위해 네트워크 트래픽을 제한하는데, 크기가 큰 파일을 다운로드할 경우 속도에 제한이 걸리게 된다. 따라서 토렌트 등의 서비스에서 파일을 다운로드받을 때 파일을 갖고있는 피어를 찾아서 해당 피어로부터 직접 파일을 가져오는데 이때 P2P가 사용된다.
하지만 서버가 아닌 네트워크 기기는 IP주소가 고정되지 않고 수시로 바뀌는 경우가 많다. 집주소가 수시로 바뀌는 상황에서 내가 택배를 직접 보내는 건 정말 힘들 것이다. 또 중개자를 거치지 않고 여러 피어가 여러 피어끼리 연결 된 상태는 관리하기가 매우 복잡하다. 하지만 네트워크 속도가 빠르고 많은 데이터를 한번에 보낼 수 있으며, 서버가 데이터를 볼 염려도 없으니 게임이나 토렌트처럼 속도가 중요하거나 보안이 중요한 서비스들에서 사용된다. 또 블록체인에서 사용되기도 한다.
Transport Service
응용프로그램의 통신 데이터는 Transport Layer로 Encapsulate된다. 응용프로그램은 Transport Layer에서 TCP와 UDP 중 하나를 선택해서 네트워크로 전송되게 할 수 있다. 네트워크 상에서 전송되는 데이터는 사라지거나, 변형되거나, 순서가 바뀌어서 전달될 수 있다. 따라서 Transport Layer의 TCP 프로토콜이 이러한 취약점들을 보완해준다.
안정성(Integrity): TCP는 데이터의 무결성을 보장해준다. TCP를 이용해 전송된 데이터는 중간에 네트워크 문제로 변형되지 않게 해준다. 물론 크래커가 악의적으로 데이터를 변형한 경우는 어쩔 수 없다.
흐름제어(Congestion Control): TCP는 데이터의 전송량을 조절해주는 기능을 갖고 있다. 상대방이 데이터를 한번에 많이 받을 수 없다면, 추가적으로 보내는 데이터는 버려질 수 있기 때문이다.
정확한 순서(In-order): TCP를 통해 전달되는 데이터는 정확한 순서대로 전달됨을 보장한다. 동영상 파일을 전달하는데 순서가 잘못되서 앞에 나올 장면이 뒤에 나오고 뒤에나올 장면이 앞에 나오는 일이 발생하지 않는다.
연결 지향(Connection-Oriented): TCP는 데이터를 주고받기 전에 반드시 연결 상태를 만든다. 또 더이상 데이터를 주고받을 일이 없을 때 연결을 종료하겠다는 메시지를 보낼 수 있다.
반대로 UDP는 이런 기능이 없다. 따라서 데이터가 변형되거나 사라질 수 있고, 순서가 뒤바뀔 수 있다. 연결 상태가 없으므로 상대방이 나와 더 통신하고 싶은지 알 길이 없다. 그 대신 TCP보다 훨씬 빠르게 데이터를 전송할 수 있다. 이런 단점들을 보완하는 방식들도 존재한다. 그것들은 추후 다른 글에서 설명하겠다.
이러한 특징들로 인해 응용 프로그램을 데이터를 전송할 때 특성에 맞춰 TCP와 UDP 중 하나를 선택하게된다. 파일/문자 전송 등을 할 땐 데이터의 정확성이 중요하니 TCP를 써야 할 것이다. 하지만 실시간 방송이나 음성채팅등을 할 때는 순서가 바뀌거나 약간의 손실이 발생해도 상관없다. 이 경우 사람들은 잠깐 렉걸렸나보다 하고 넘어간다. 또 게임을 할 때는 빠르게 전송되는 것이 훨씬 중요하므로 UDP를 사용한다. 또 일부 프로토콜은 TCP와 UDP를 둘 다 사용하기도 한다.