티스토리 뷰

  1990년대 ISO에서 제안한 OSI 참조모델보다 현재 더 널리 보급된 것이 TCP/IP이다. TCP/IP의 프로토콜은 IETF(Internet Engineering Task Force)를 통해 정해지는데, 여기에 누구든 참가할 수 있도록 OPEN 되어있다. 또한 프로토콜의 사양을 정하는 것보다 실제 통신에 사용될 수 있는 프로그램의 개발을 우선시한다. 즉, OSI 참조모델이 통신 프로토콜의 기능을 중심으로 고안되었다면, TCP/IP는 프로토콜을 적용시키기 위해 어떻게 프로그래밍 할지에 집중된 모델이다. 이러한 표준화 노력으로 TCP/IP는 다른 프로토콜보다 더 빠르게, 더 널리 보급될 수 있었다고 한다.

 

 

[그림1. OSI 참조모델과 TCP/IP 프로토콜의 비교]

 

  TCP/IP 프로토콜은 총 4개 계층으로 나뉘는데, OSI 7계층의 물리/데이터링크 계층은 Network Access Layer에, 네트워크 계층은 Internet Layer에, 전송 계층은 Transport Layer에, 세션/표현/응용 계층은 Application Layer에 해당한다. 이 중 첫번째로 Network Access Layer(네트워크 접근 계층)에 대하여 알아보도록 하자.

 

  * 참고: OSI 7계층 관련 포스팅 - [정보통신기술사/기출/107회][인터넷,TCP/IP] OSI 7계층이란?


 


 

  네트워크 접근 계층은 OSI 참조모델과 마찬가지로 데이터링크 계층에 해당하는 "네트워크 인터페이스층"과 물리 계층에 해당하는 "하드웨어"로 나뉜다. 네트워크 인터페이스층은 이더넷과 같은 통신을 하기 위한 인터페이스가 해당되는 계층이다. 즉, NIC(Network Interface Card)를 작동시키기 위해 OS와 하드웨어를 이어주는 소프트웨어(='디바이스 드라이버')다. 하드웨어는 최하위층에서 물리적으로 데이터를 전송해주며 이더넷, 전화선 등이 있다. (편의상 이 글에서는 네트워크 인터페이스층을 데이터링크층이라고 부르겠음)

 

  * 데이터링크층의 기능에는 1. 프레임 짜기(네트워크 계층으로부터 받은 비트스트림을 Frame 단위로 나눔), 2. 흐름제어(수신자의 데이터 전송률을 고려하여 데이터를 전송하도록 제어), 3. 오류제어(손상 또는 손실된 프레임을 발견/재전송), 4. 혼잡제어(트래픽을 조절하여 네트워크가 혼잡해지지 않도록 조절) 등이 있다. 어렴풋한 기억으로 에러정정까지는 하지 않았던 것 같다.

 

  * 데이터링크의 흐름제어: Stop-and-wait 기법(프레임을 전송한 후 ACK 프레임을 기다렸다가 전송하므로 비효율적임), Sliding window 기법(ACK 프레임을 받지 않더라도 윈도우 사이즈의 프레임 수만큼 버퍼를 두고 여러 개의 프레임을 연속적으로 전송하도록 허용, 윈도우 사이즈는 송신측에서는 ACK가 오기 전에 보낼 수 있는 다음 프레임 갯수를, 수신측에서는 데이터를 수신하여 버퍼에 담아두었을 때 아직 read하지 않은 프레임 갯수를 의미한다.)

 

  * 데이터링크의 오류제어: 오류검출(Error Detection)과 재전송(Retransmission) 과정을 포함한다. ARQ(Automatic Repeat Request)을 통해 프레임이 손상/분실되었을 때 재전송과정을 거친다. Stop-and-wait 흐름제어로는 Stop-and-ARQ(오류발견 시 NAK 프레임이 반환되고 복사된 프레임을 재전송)가 있고, Sliding window 흐름제어로는 Go-Back-n ARQ(NAK 프레임에 시퀀스 번호를 붙여 반환하여 못 받은 순번부터 다시 전송함), SR(Selective-Reject) ARQ(NAK 프레임에 시퀀스 번호를 붙여 반환하고 손상/분실된 프레임만 재전송하며 어긋난 순서로 도착한 프레임은 수신측에서 재정렬함)가 있다.

 

 

 

[그림2. TCP/IP에서의 데이터 송수신 패킷처리 과정]

 

  위 그림은 TCP/IP에서 데이터 송수신 시 패킷처리 과정을 나타낸다. 네트워크 접근계층에서는 데이터링크에 따라 최대전송속도(혹은 최대전송단위, MTU: Maximum Transmission Unit)가 달라진다. MTU 값은 이더넷의 경우 1,500옥텟, FDDI의 경우 4,352옥텟, ATM의 경우 9,180옥텟으로 데이터링크에 따라 크기가 달라진다. 데이터링크가 만들어진 목적에 따라 MTU의 크기가 정해져 있기 때문이다. 데이터링크의 상위 계층인 네트워크 계층(=IP 계층, 인터넷 계층)은 데이터링크층과 별개이므로, MTU에 관계없이 더 큰 패킷을 내려보낼 수 있다. 따라서 큰 IP 패킷을 여러 개의 작은 패킷으로 분할 처리하는 Fragmentation(조각화)이 사용된다. 물론 분할된 패킷은 수신 host(미옥이)에서 다시 하나로 합쳐지며, 이를 재조립이라고 한다.

 

  하지만 패킷 발송 시 패킷 헤더에 DF(Do not Fragment) bit(혹은 Flag)를 설정할 경우, 라우터의 MTU 값이 작아 Fragment를 해야할지라도 조각화해서는 안된다. 이 패킷을 받은 라우터에서는 이 패킷을 Drop 시킨 후 "Can't fragment"라는 ICMP 에러메세지를 송신 host(정봉이)에게 전송한다. 이 메세지는 "패킷의 사이즈를 MTU보다 줄여 재전송하라"는 뜻으로 이 패킷에는 MTU 값도 포함된다. 반대로 DF bit가 0이면 기본 동작하여 패킷을 분할하여 전송한다.

 

  Fragmentation에서는 다음과 같은 단점이 있는데, 조각 중 하나라도 drop 되면 나머지 모든 패킷을 재전송 해야한다는 것이다. 이를 막겠다고 초기 TCP에서 패킷을 애초에 분할하지 않아도 될 정도로 작은 크기로 보냈는데 네트워크 효율성은 저하되었다. 또한 라우터에서 패킷을 조각화하는 과정에 많은 오버헤드가 발생하기도 하고, 어떤 방화벽에서는 조각화된 패킷을 아예 drop 해버리기도 한다. 이러한 문제들을 해결하기 위해 필요한 것이 바로 Path MTU Discovery(경로 MTU 탐색)이다. PMTUD에서는 Path MTU(두 host 간 경로에서 가장 작은 MTU 값)를 먼저 찾고, 송신 host에서 경로 MTU 크기로 데이터를 분할한 후 데이터를 보내기 때문에 중간 라우터에서 분할처리를 할 필요가 없고, TCP에서도 큰 패킷으로 데이터를 보낼 수 있게 되어 네트워크 효율성이 높아진다.

 

  예를 들면 송신 host가 MTU보다 큰 값의 프레임을 보내는데 IP 헤더에 DF="1"이 설정되어 있다면, 라우터에서는 패킷을 drop 시킨다. 그리고 ICMP에 의해 송신 host는 MTU 값을 알게 된다. 이 경로 MTU 값을 MTU로 하여 분할처리하고, ICMP 에러메세지(도착 불능 메세지)가 반환되지 않을 때까지 이 조작을 반복하면 송신 host에서 수신 host까지의 경로 MTU를 얻게 된다. TCP의 경우, 이렇게 알아낸 경로 MTU 크기를 바탕으로 최대 세그멘트 길이(MSS, Maximum Segment Size) 값을 재계산한 후 그 값을 바탕으로 패킷을 보내기 때문에 인터넷층에서 분할처리가 일어나지 않게 된다.

 

  * 그림2에서 하위 계층으로 내려오면서 헤더가 추가되는 과정을 Encapsulation이라 하고, 상위 계층으로 올라가면서 헤더가 제거되는 과정을 Decapsulation이라 한다.

  * MTU 사이즈는 이더넷 헤더를 제외한 "종로, 일요일 5시!"+"TCP 헤더"+"IP 헤더"의 크기이다.

  * Path MTU는 라우팅 경로에 따라 수시로 변경될 수 있고, 같은 host 사이에서도 트래픽 종류(이더넷인지, ATM인지)에 따라서도 달라질 수 있다.

  * 가장 이상적인 MSS 값은 인터넷층에서 분할 처리되지 않는 최대 데이터 길이를 의미함

 

 

 

[그림3. Windows의 MTU 사이즈 확인]

 

  윈도우에서 netsh 명령어를 통해 MTU 사이즈를 확인해보았다. 보이는 것처럼 현재 연결된 무선 네트워크에서 1,500bytes로 확인된다. 이걸 보니까 갑자기 떠올랐는데, 업무 중에도 스위치 간 시리얼 구간을 처음 연결하고 ping test 할 때 1,472bytes로 사이즈를 지정하는데 바로 이 MTU와 연관된 것이었다. 헐.. 찾아보니 이더넷 표준 MTU 1,500bytes에서 IP 헤더 20bytes와 ICMP 헤더 8bytes를 제외한 값이다. 이런 깊은 뜻이 있었다뉘....!!ㅎㅋ

 

 

 

  이번 포스팅에서는 TCP/IP의 네트워크 접근 계층 중 네트워크 인터페이스층에 대해 알아보았다. 이는 OSI 7계층 모델에서 데이터링크층과 물리층에 해당하는데, 데이터링크에 따른 최대전송단위인 MTU와 패킷을 조각화(Fragmentation)하는 과정을 다뤄보았다. 다음 시간에는 가장 널리 보급된 데이터링크인 "이더넷"에 관해 다룰 예정이다.

댓글