OSI 7계층 - 표현,세션,응용 계층(주요 프로토콜에 대한 이해 - HTTP, DNS, 메일)
해당 글에서는 OSI 7계층의 표현,세션,응용 계층을 다룰 것인데, 각 계층별로 아키텍쳐상 큰 차이는 없기에 별도의 구분을 나누기 보다는, 일종의 응용프로그램 계층이라고 이해하면 될 것 같다. 편의상 응용계층이라 부르겠다.
앞서, 전송계층에서 TCP, UDP 헤더에서 PORT 번호를 세팅했었다. port번호를 명시함으로서 어떤 애플리케이션과 통신할 것인지에 대한 구분을 짓는 것이었고, 응용계층에서는 각 애플리케이션마다의 프로토콜에 통신방법의 차이에 대해 다루게 된다.
또한 응용계층부터는 네트워크의 영역이라기보다 애플리케이션 각각의 프로그래밍 방식의 영역에 가깝기 때문에, 여기서는 주요 프로토콜에 대한 간단한 개요와 몇가지 포인트만 짚고 넘어가도록 하겠다. 이 중에 HTTP프로토콜을 제외하곤 웹개발자가 직접 프로토콜을 구현해서 개발하는 일은 흔치는 않을테니, 특히 HTTP프로토콜에 대해서는 심층 공부하길 권유드린다.
HTTP
웹 서버 프로그램은 http프로토콜을 사용하고, 포트번호는 80포트를 사용한다. 보안이 강화된 https의 경우 443포트를 사용한다. 흔히들 http는 단방향 통신이라 말한다. 웹브라우저의 요청과 서버의 응답이 끝나고나면 서버와 클라이언트간의 연결이 끊기기 때문이다.
그런데, 또 한편에선 http 프로토콜은 tcp프로토콜 기반위에서 동작한다고 말한다. tcp통신위에서 동작하면서 연결형이 아니라니? tcp프로토콜은 연결형 통신을 지향하지만, http통신은 단방향 통신이면서 비연결형 통신이다. 그러면서 동시에 tcp위에서 동작하는 프로토콜이다.
다소 모순이 있는 것으로 보이지만, 그렇지는 않다. tcp통신 위에 있다보니, http 요청과 응답을 줄때에 tcp 연결이 이루어진다. 그리고 요청/응답이 끝나고나면 tcp의 연결을 끊어 버리는 것이다.
tcp프로토콜은 양쪽에서 소켓이라고 하는 일종의 통신 창구를 가지고, 상시적으로 서로의 상태값을 체크하면서 연결이 되어 있있다. 반면에, http프로토콜은 tcp기반위에서 연결을 맺었다가, 요청/응답이 끝나면 연결이 끊긴다. 그리고 다시 요청이 들어오게 되면 다시 연결 후 연결이 끊어지는 것을 반복하게 된다.
그래서 일반적인 웹서비스의 경우에는 http프로그래밍을 통해 위에서 말한바와 비연결형으로 동작을 하게 되지만, 실시간 채팅과 같은 웹서비스 중에 지속적인 연결이 필요한 경우에는 tcp소켓의 방식을 활용한 웹소켓 프로그래밍을 통해 tcp연결이 끊지 않는 http 서비스를 제공하게 된다.
DNS
Domain Name System의 약자로서, www.naver.com 과 같은 url 문자체계의 주소를 IP주소로 변환해주는 서버를 말한다. DNS서버는 일반적으로 udp프로토콜을 사용한다. 수많은 요청자들이 서버에 질의를 하게 될 것이므로, 항상 연결을 맺는 tcp는 일반적으로 사용되지 않는다. 포트는 53포트이다.
DNS서버에 대한 내용은 단순하나 도대체 이걸 누가 변환해 주는거야? 라는 생각이 들게 된다. DNS서버는 1차적으로 내 컴퓨터의 OS에 구성된 local DNS를 가장 먼저 질의하도록 되어있다. 그래서 만약 www.naver.com의 IP를 내 임의대로 123.123.123.123 이렇게 맵핑 시켜놓았다면 해당 IP로 데이터 전송을 보내게 되어있다.
만약 그렇지 않다면, 순차적으로 global한 도메인 서버에 해당 도메인의 ip가 무엇인지 질의를 보내게된다. 도메인 서버는 계층구조로 구성이 되어있다. 일단, 최상단에 비영리단체가 운영하는 root dns서버가 존재한다. 해당 root 서버는 본인이 아는 선에서 ip를 응답해줄수 있으나 만약 모른다면 그 하위 dns서버에 질의하고, 그 서버 또한 모른다면 그 하위 dns서버에 질의하도록 계층적으로 구성돼 있다.
그래서, 만약에 여러분이 신규 도메인을 직접 등록하고 싶다면 위에서 말한 하위계층 dns 서버 중 global하게 register가 가능한 dns서버에 원하는 도메인을 등록하면 되나, 보통은 이것을 대행해주는 서비스를 통해서 신규도메인이 중복되지 않도록 등록하게 될 것이다.
메일
메일의 송신의 경우 SMTP프로토콜을 사용하고 포트는 25번 포트를 사용한다. 메일 수신의 경우 POP3프로토콜을 사용하고 110포트를 사용한다.
예를들어)
메일송신자 -> SMTP -> 네이버메일서버 -> POP3 -> 메일수신자
송/수신의 프로토콜이 달라지는 이유는 송신은 데이터를 보내는 쪽이다보니, 사용자의 권한 여부와 상관없이 데이터를 보내는 것이 가능하다. 그러나, 수신자의 경우에는 본인이 권한이 있어야지, 네이버메일서버로부터 원하는 메일을 가져갈 수가 있을 것이다. 즉, user/password등 사용자 인증에 관한 이슈가 발생한다. 이를 위해 POP3 프로토콜을 사용한다.
메일 보낼때도 user/password가 있어야 하잖아? 라고 일반적으로 생각할 수는 있다. 물론 당연히 현실세계에서 웹서비스는 그런식으로 구성되어 있다. 그러나, 여기서는 일반서비스에 대한 부분을 말하는 것이 아니라, 특정 서버에 데이터를 넣는 상황과 가져가는 상황이 다르다는 부분을 말하는 것이다. 가장 단순화된 흐름에서 데이터 송신자와 그것을 가져갈 수 있는 수신자의 입장에서 말을 한 것이고, 그것을 실제 서비스로 제공할 때에는 물론 송신에도 적절한 권한 관리가 필요할 것이다.