본문 바로가기
CS 기초/Network

네트워크 프로그래밍을 위한 TCP/IP와 OSI 7 layer

by woohyeon 2020. 4. 25.
반응형

개인적으로 공부하는 내용이라 틀린 내용이 있을 수 있습니다.

참고

https://www.youtube.com/watch?v=laBzCcF1414&list=PLXvgR_grOs1BjBZiePPZMR1PmZybazxg6&index=2

https://www.joinc.co.kr/w/Site/Network_Programing/Documents/IntroTCPIP

 
[TCP/IP란?]
TCP/IP란 TCP와 IP라는 두 프로토콜을 함께 가리키는 말이다. TCP와 IP라는 개념을 이해하려면 먼저 프로토콜이 무엇인지 알아야 한다. 프로토콜(Protocol)이란 컴퓨터(호스트)와 같은 통신 장비들이 서로 메세지를 주고받기 위한 통신 규약이다. 이렇게만 말하면 개념이 너무 추상적이라 잘 와 닿지 않는다. 프로토콜은 인터페이스와 비슷한 개념으로 생각하면 이해하기 쉽다. 즉 인터페이스라 하면 주어진 방법(매개체)을 통해 서로가 소통하는 것을 말한다. 인터페이스의 일종인 API 또한 프로그램마다 그 방법이 다르지만, 어쨌든 프로그램과 통신하는 방법을 정해놓은 것처럼 말이다. 프로토콜은 물리적인 개체일 수도, 논리적인 개체일 수도 있다.

* 호스트는 보통 네트워크에 연결된 컴퓨터를 말한다. 여기선 둘다 비슷한 의미로 사용됨  

TCPTransmission Control Protocol의 약자로 우리말로 번역하면 전송 제어 프로토콜이다. TCP는 기본적인 프로토콜의 특징 외에도 다른 특징을 가지고 있다. TCP는 패킷 통신에서 다음과 같은 것들을 보장해준다.

  • 패킷 순서 보장 -> 송신한 순서대로 수신할 것을 보장
  • 패킷 무결성 보장 -> 송신 패킷과 수신 패킷의 내용은 동일함을 보장
  • 패킷 도착 보장 -> 송신한 패킷은 꼭 수신할 것을 보장 (재전송 등을 통해)
  • 흐름 제어(flow control)
  • 혼잡 제어(congestion control) -> 버려지는 패킷 감지 시 스스로 통신량을 줄임

TCP는 IP와 함께 널리 사용되는 연결지향(connection-oriented) 프로토콜이다.

IPInternet Protocol의 약자로 호스트와 호스트가 서로 통신을 할 수 있도록 해주는 프로토콜이다. 주로 TCP/IP 모델의 Internet layer에서 목적지로의 경로를 정확히 배정(라우팅)하기 위해 해당 프로토콜을 이용한다. IP 주소는 우리가 흔히 알고 있는 192.168.0.1과 같은 32비트 형식의 address(IPv4)를 활용하여 호스트에 대한 식별자로 이용할 수 있다. IP는 TCP와 다르게 데이터의 완벽한 전달을 보장하지 못한다. 따라서 TCP와 같이 사용된다.

[OSI 7 layer] 
OSI란 Open Systems Interconnection의 약자로 컴퓨터와 컴퓨터가 효율적이고 성공적인 네트워크 통신 및 상호 작용을 할 수 있도록 도와주는 독립적인 주체들의 집합이다. 즉 OSI 7 layer는 여러 주체들의 역할을 나누어 총 7계층으로 표현한 모델이며, 모든 컴퓨터가 그 구조가 다르더라도 OSI 7 layer라는 동일한 모델을 통해 네트워크 통신을 할 수 있도록 해준다.
 OSI 모델을 하드웨어와 소프트웨어, 커널 영역과 유저 영역에 거쳐서 표현하면  다음과 같다.

OSI 7 layer

각 계층은 하위 계층으로부터 전달된 데이터를 사용하고 상위 계층으로 전달한다.

[L1 - Physical Layer]
L1인 물리 계층은 논리적, 가상적인 인터넷을 구성하기 위한 최소한의 물리적인 기반이다. 주로 케이블, 전기의 신호 등과 같은 하드웨어와 관련되어 있다.


[L2 - Data link Layer]

L2는 데이터링크 계층으로 H/W 영역에 그렸지만 S/W와 H/W 경계에 걸쳐져 있다고 생각하면 된다. L2의 대표적인 예로는 이더넷(Ethernet)이라는 네트워크 기술 및 규격이며, 해당 계층에선 LAN(Local Area Network)을 예로 들 수 있다. LAN은 보통 물리적으로 설명할 수 있는 네트워크를 의미하며, Private network로도 불린다. 데이터 링크 계층의 송수신 단위는 프레임(Frame)으로 흔히 사용되는 패킷이라는 용어와는 다른 단위이다. 패킷은 L3 네트워크 계층의 송수신 단위이다.

해당 계층에서 중요한 정보는 하드웨어의 고유한 주소인 MAC address(맥 주소)이다. 맥 주소는 다음과 같이 16진수로 표현되며, 48비트로 구성된다.

MAC 주소

맥 주소는 NIC(Network Interface Controller)라는 하드웨어에 부여되는 고유한 주소이다. 그래서 물리적 주소, 하드웨어 주소라고도 한다. 근거리 네트워크라면 네트워크 장비가 맥 주소를 통해 경로를 선택할 수 있으며, 이를 L2 스위칭(Switching)이라 한다. 해당 계층의 주요 기능은 오류제어와 흐름제어(flow control)이다. 

다른 호스트와의 통신을 위해 패킷을 전달할 때 발신자의 네트워크 계층(L3)은 해당 계층으로 패킷을 전달하게 된다. 그러나 패킷은 네트워크 계층의 송수신 단위로 아까 언급했던 프레임과는 다르다. 패킷엔 네트워크 계층에서 얻은 IP 주소 데이터만 포함되어 있는데, 데이터 링크 계층의 단위인 프레임엔 MAC 주소가 추가로 필요하다. 다행히 해당 계층엔 주소 결정 프로토콜(ARP: Address Resolution Protocol)이라는 프로토콜이 존재한다.

ARP는 IP 주소를 통해 물리 주소(MAC Address)를 얻어오는 역할을 한다. ARP는 ARP 테이블을 관리하며 여기에 IP 주소와 MAC 주소가 하나의 쌍으로서 저장되어 있다. 그래서 보통 맥 주소는 IP 주소와 쌍을 이룬다. ARP는 곧 살펴 볼 네트워크 계층(L3)에도 존재한다. 이 프로토콜은 어느 한 영역에 딱 존재한다기 보다 두 계층 사이의 다리 역할을 한다고 생각하자.

 


[L3 - Network Layer]

L3는 네트워크 계층으로 IP(Internet Protocol), ARP와 같은 프로토콜이 사용된다.
IP 프로토콜을 통해 IPv4와 같은 주소를 부여하고, 이러한 IP 주소를 가지고 데이터 전달을 위한 경로를 배정(Routing)한다. IP주소는 Host(컴퓨터)에 부여되는 논리적인 주소이며 식별자이다. 라우터라는 일종의 스위치(Switch)가 IP 주소를 기반으로 경로를 배정한다.(L3 Switching) 라우터는 라우팅 테이블(Routing table)이라는 곳에 경로를 저장해놓고, IP 헤더와 함께 비교하여 최적의 경로를 찾는다. 참고로 해당 계층에서부터 만들어지는 Logical, Virtual한 네트워크를 WAN(Wide Area Network)이라고 한다.  해당 계층의 주요 기능은 라우팅, 혼잡 제어(congestion control)이 있다.

라우터의 경로 배정

 

[L4 - Transport Layer]
L4는 전송 계층으로 상대방에게 데이터를 전송하는 방법을 정의하는 프로토콜이 위치한다. TCP라는 신뢰성 있는 프로토콜이 제일 중요하다. TCP는 위에서 설명했듯이 데이터의 손상 없이 완벽한 전달을 보장한다. UDP(User Datagram Protocol)는 완벽한 전달을 보장하지 않기 때문에, TCP에 비해 오버헤드가 적고 속도가 빠르다. 때문에 UDP는 신뢰성보다 속도가 중요한 곳에 자주 사용되는 프로토콜이다.

해당 계층에서 중요한 정보는 Port 번호이다. 포트 번호는 유저 모드의 애플리케이션이 네트워크에 연결되기 위해 필요한 정보이다. 유저모드의 애플리케이션이 네트워크에 연결되기 위해서는 소켓(Socket)이 필요한데, 소켓은 커널 영역에 접근하기 위해 운영체제가 제공하는 시스템 파일이라는 일종의 인터페이스다. 

Socket

 

다음과 같이 소켓은 커널 모드에 접근하기 위한 파일과 네트워크 연결에 필요한 포트 번호, IP 주소 및 TCP/UDP와 같은 프로토콜의 종류 등을 묶어(binding) 하나의 소켓으로 표현한다. 이러한 작업을 서버 측에선 bind라고 표시하며 클라이언트 측에선 connect로 표시한다.

Socket = File + α

 

포트 번호는 unsigned integer 타입이며 1~65535(2^16-1) 범위의 값을 가진다. 유저 레벨에서 포트 번호는 소켓을 통한 프로세스 추적이 가능하기 때문에 프로세스에 대한 식별자이기도 하다. 즉 포트 번호가 프로세스를 판별할 수 있는 근거가 된다. 만약 서버가 모든 포트 번호(65535개)를 사용하고 있다면 클라이언트는 해당 서버에 더 이상 네트워크 연결이 불가능하다. 해당 계층의 주요 기능은 오류 복구(제어)와 흐름 제어 기능을 제공한다. (데이터 링크 계층에서도 존재)

[L5 - Session Layer]
L5는 세션 계층으로 양 끝단(i.e: 호스트와 호스트)의 애플리케이션이 통신을 관리하기 위한 방법을 정의한다. session이라는 말 자체가 클라이언트와 서버가 서로 연결되듯 어떠한 두 지점이 서로 연결되어 있는 상태를 말한다. 서버 사이드 코드를 작성해 보았다면 쿠키와 비슷한 세션 기능을 사용해 보았을 것이다. 이처럼 서로 연결된 호스트들을 동기화하고, 세션을 설정, 해제, 유지를 한다. 이 계층에서 호스트에 대한 정보를 담을 수도 있다.

[L6 - Presentation Layer]
L6는 표현 계층으로 주로 데이터의 변환, 암호화 등 데이터를 표시하는 방법을 정의한다. 주로 코드 변환, 데이터 압축, 데이터 암호화 등이 있다. 

[L7 - Application Layer]
L7은 응용 계층으로 사용자가 애플리케이션을 통해 직접 접하는 최상위 계층이다. 사용자는 응용 계층 아래에 대해서 신경쓸 필요가 없으며, 사용자를 위한 많은 서비스들이 존재한다. 가장 중요한 것은 클라이언트와 서버가 request/response로 통신하는 HTTP 프로토콜이며, 그 밖에 파일 전송에 관련된 FTP 등이 있다.

 

[TCP/IP 통신]
TCP/IP를 통신을 간단하게 그림으로 나타내면 다음과 같다.

TCP/IP 통신


우선 양 끝에 대칭적으로 호스트(Client)와 호스트(Server)가 존재한다. 클라이언트(프로세스)가 서버(프로세스)에 무언가를 요청(Request)하기 위해 데이터(Payload: 핵심 데이터)를 보낸다. TCP 프로토콜은 데이터를 목적지까지 안전하게 전송하기 위해 기존 데이터에 segment라는 TCP 헤더를 덧붙인다. IP 프로토콜은 TCP에서 받은 데이터에 추가로 자신과 목적지에 대한 정보를 첨가하여 전체적인 데이터를 캡슐화한다. 이 캡슐화된 정보를 패킷(Packet)이라고 하며, 네트워크로 전송될 수 있는 형태가 된다. 이러한 패킷들이 많다면 데이터 링크 계층을 거쳐 프레임(Frame)이라는 또 하나의 덩어리가 되어 전송된다.

이러한 데이터들은 NIC 또는 게이트웨이(Gateway)라는 출구(or 입구)를 통해 현재 호스트를 빠져 나간다. 그러면 LAN 또는 WAN을 통해 상대방의 게이트웨이 또는 NIC로 접속하게 된다. 다음부턴 각 계층에 맞게 추가되었던 정보들(IP주소, Port번호 등)을 분석하여 상위 계층으로 전달하여 끝 점(Endpoint)에 전달된다. 따라서 호스트와 호스트의 각 계층은 직,간접적으로 통신하다고 볼 수 있다. 클라이언트의 L3와 서버의 L3는 직접적으로 통신이 아닌 간접적인 통신이다.  




댓글