이 글에는 OSI 7 Layer의 각 계층에서 어떤 일이 벌어지는지 자세히 기술하지 않는다. 예전에 그런 것을 공부해보았지만, 오히려 큰 그림을 제대로 설명하는 포스팅이 없다고 느꼈고, 네트워크 지식이 필요하게 된 상황이라 조금 더 큰 맥락으로 글을 작성하게 되었다.

 

TCP/IP와 OSI 7 Layer

이 Application Layer라는 것은, 논리적인 모델인 OSI 7 계층 또는 TCP/IP 계층의 최상단에서 확인할 수 있다.

OSI 7 Layer Model과 TCP/IP Model / GeeksforGeeks

 

OSI 7 Layer는 Basic Referecne Model로 특정 기술에 국한된 것이 아니라 모든 네트워크에 관한 모델에 대해 설명할 수 있는 범용적인 모델이다. 하지만 TCP/IP 모델은 이름에서 알 수 있듯이 인터넷 계층에서는 IP(IPv4, IPv6)를 전송 계층에서는 TCP, UDP를 사용하는 특정한 모델이다. 즉, 인터넷 계층(OSI 7 Layer기준 L3)가 IP기반으로 동작하는 인터넷에 대해 설명하기 위해 만든 실용적인 모델이다.

 

 

그래서, TCP/IP의 계층 구조를 살펴보면 네트워크 레이어는 IP만을 포함하여 설명하는 것을 볼 수 있다.

 

그래서 TCP 자체가 IP 위에서 동작하는 프로토콜이며, 데이터의 전달을 보증하고 보낸 순서대로 받게 해준다(UDP는 이를 보장하지 않음). 즉, 4계층과 3계층의 프로토콜들은 서로의 호환성이 존재한다. TCP/UDP같은 L4는 IP 위에서 정보를 어떻게 식별, 검증 할 것인지 표준으로 정해져 있지만 IP가 아닌 L3를 사용하려면 L3와 L4를 어떻게 연결할지에 대한 표준이 별도로 필요하다.

 

또한 인터넷 프로토콜 스위트(Internet Protocol Suite)는 인터넷에서 컴퓨터들이 서로 정보를 주고받는데 쓰이는 프로토콜의 모음이다. 이 중 TCP와 IP가 가장 많이 사용되기에 TCP/IP 프로토콜 슈트라고도 부른다.

 

 

Application Layer

어플리케이션 레이어는 추상화계층으로 사용자가 직접 하드웨어나 전송 방식(TCP, UDP)같은 세부 동작을 신경 쓰지 않고, 공통적으로 정의된 프로토콜과 인터페이스 방식만 알면 통신이 가능하도록 해준다. 그래서 네트워크에 연결된 호스트(컴퓨터, 서버)가 서로 데이터를 주고 받을 때 어떤 프로토콜(HTTP, FTP, ...)을 쓸지와, 어떤 인터페이스(API, 시스템 호출 등)로 접근할지를 정의하는 계층이 어플리케이션 레이어다. 이는 사용자가 HTTP를 쓰겠다고 결정만하면 운영체제와 네트워크 스택에서 알아서 TCP 플래그를 세팅하고 IP 헤더를 구성하게된다.

 

 

Socket

서로 다른 컴퓨터에서 실행되는 프로세스의 통신은 네트워크를 통한 메시지 교환으로 서로 통신한다. 한 쪽의 프로세스가 메시지를 보낼 때 다섯 계층의 프로세스 스택을 지나며 캡슐화된다. 하나의 프로세스부터 다른 프로세스로 보내는 메세지는 네트워크를 통해 움직인다. 프로세스는 소켓을 통해 네트워크로 메시지를 전송하고 받는다. 이 때문에 프로세스는 집으로, 소켓은 문으로 비유된다.

 

특정 프로세스로 메시지를 보내기 위해서는 목적지의 호스트 주소를 가지고 있어야 한다. 수신 프로세스를 식별하기위해 두 가지의 정보가 명시될 필요가 있다. 하나는 호스트의 주소이고, 또 하나는 호스트 내의 수신 프로세스이다. 호스트는 IP 주소로 식별되고, 수신 호스트에서는 수행되고 있는 수신 프로세스도 식별해야 하기 때문에 목적지 포트 번호를 사용한다.

 

그리고 Network Interface, Intertet, Transport 레ㅐ이어는 모두 운영체제에 구현되어있으므로 어플리케이션 개발자들은 신경쓰지 않아도 되는 부분이다. 그래서 따로 개발자가 특별히 패킷을 생성해 줄 필요없이, 자동으로 패킷들이 생성되어 전송된다.

 

어플리케이션에서는 패킷이 자동으로 생성, 전달되지 않아서 생성되는 메시지를 전달해주는 과정이 필요하며 이를 소켓을 활용한다. 소켓은 인터넷 프로토콜 슈트를 기준으로 어플리케이션 레이어와 트랜스포트 레이어 사이에 존재하며, 프로세스는 소켓이 제공하는 API나 함수를 통해 메시지를 송수신한다. 

 

 

 

 

 

 

참고 자료