[네트워크] OSI 7 Architecture Layer
강의시간에 배운 OSI 7 Architecture layer에 대해 정리해보고자 한다.
OSI 7 Architecture Layer
OSI 7계층은 국제표준기구 ISO(International Standards Organization)에서 정의하였는데, 서로 다른 다양한 Device 들이 서로 통신을 가능하게 할 수 있도록 표준화한 네트워크 표준 모델 이다.
총7계층으로 나누었는데 다음과 같다.
- 1계층(물리 계층) : Data <-> Signal
- 2계층(데이터링크 계층) : 에러제어, 흐름제어, 접근제어
- 3계층(네트워크 계층) : 라우팅, IP
- 4계층(전송 계층) : 종단간전송, TCP/UDP
- 5계층(세션 계층) : Session관리, 전이중/반이중
- 6계층(표현 계층) : 백업,보안
- 7계층(응용 계층) : 응용프로그램
OSI 7계층은 유럽에서 주도하여 만들어졌지만 현재는 미국에서 주도하여 만들어진 TCP/IP 5계층을 사용하고 있다.
하나하나 뜯어서 살펴보자
물리계층
통신은 DTE 라는 장치에서 만들어진 Data 를 DCE를 통해서 Signal 로 바꾸어 전달하면, 수신측의 DCE에서 Signal 을 Data로 바꾸어 DTE에서 받아 처리하는 과정을 수행한다.
물리계층은 이러한 물리적 링크를 확립하고, 통신과정에 이 링크를 유지하고 끝나면 해제하는 과정으로써 컴퓨터와 모뎀을 연결하는 핀의 규격이라던지, 모뎀과 거리확장의 장비들과 그들간의 케이블링과 같은 물리적 장비들의 규격을 프로토콜로써 정의한다.
즉, 물리적인 것들인 컴퓨터, 모뎀, 리피터, 브릿지, 라우터, 게이트웨이, 케이블 들 모두에 대해 규정한 것이 물리계층이다.
또한, 물리계층에서의 통신단위는 Bit 이다.
데이터링크 계층
데이터링크 계층의 핵심은 흐름제어, 에러제어, 접근제어 이다.
흐름제어와 에러제어는 IEEE 802.3 에서 정의한 LLC에서 수행하며, 접근제어는 MAC에서 수행한다.
데이터 링크 계층에서는 상위 계층(네트워크 계층)에서 생성된 패킷에 이더넷 헤더와 트레일러를 삽입하여 프레임을 구성하고, 물리계층으로 전달한다.
이더넷 헤더에는 MAC주소가 삽입되고, 트레일러에는 에러제어 정보가 삽입된다.
흐름제어
흐름제어란 송신측에서 보낸 데이터가 수신측의 버퍼에 담기고, 버퍼의 데이터를 컴퓨터에서 처리하는데 걸리는 시간 차이로 인해 수신측의 버퍼의 공간을 초과하여 Overflow 가 발생하지 않도록 하기 위한 기법이다.
흐름제어의 기법에는 대표적으로 2가지 종류가 있다.
- Stop And Wait
송신측에서 패킷 하나를 보낸후에 기다린다. 이후 수신측에서 데이터를 잘받았으면 ACK(확인신호)를 보내어주고, 송신측에서 ACK를 받으면 다음 패킷을 보내고, 오류가 있었다면 NAK를 보내어 송신측에서 재전송을 유도한다.
이방식은 패킷하나를 보내고 기다리는데 걸리는 시간이 발생하여 통신효율이 떨어져서 성능이 떨어진다는 단점이 존재한다.
이를 개선한 방식이 Sliding Window 방법이다.
- Sliding Window
Sliding Window는 수신측에서 패킷을 받으면 ACK에 남은 버퍼 공간크기를 TCP헤더에 담아 보내면, 송신측에서 남은 공간만큼 가변적으로 패킷을 전달하는 형태로 확인신호가 오기 전까지 기다려야 했던 Stop And Wait의 단점을 보완한 방법이다.
에러제어
에러제어는 에러 검출(Error Detection)과 에러 정정(Error Correction) 으로 두가지로 나뉜다.
Error Detection
에러 검출은 대표적으로 패리티비트, LRC(블록합 검사), CRC, CheckSum 이 있다. 하나씩 살펴보자.
- 패리티비트 : 가장 기초적인 방법으로 한블록의 끝에 한비트를 추가한뒤 짝수 패리티 혹은 홀수 패리티 방식에 따라 에러를 검출하는 방법이다.
짝수 패리티였다면 블록의 비트들중 1이 짝수개였으면 에러가 없는것이고, 홀수개 였다면 에러가 있었다는 의미로 에러가 검출되면 재전송을 요구한다. 또한 홀수 패리티 방식은 그와 반대다.
패리티비트 방식의 단점은 에러가 짝수개가 발생했을 때 검출이 불가능 하다는 점이다.
2개비트에서 에러가 났다고 가정해보자. 홀수 패리티든 짝수 패리티든 에러가 났다고 확인이 안된다.
- LRC (블록합 검사) : 2차원 패리티 검사라고도 불리며 전달된 블록들을 일정크기로 묶어서 2차원 배열 형태로 만들고 행/열 의 끝에 한 블록씩을 추가하여 에러를 검출하는 방법이다.
기존의 패리티비트 방식을 일정량을 묶어서 2차원 배열형태로 만드는 것인데, 블록합 검사의 경우 같은 열의 짝수개의 에러를 검출할 수 없다는 단점이 존재한다.
- CRC(순환 중복 검사) : 한블록의 Original 데이터에 송수신측에서 동일하게 정의한 다항식으로 캐리가없는 Modulo-2 연산 을 적용하여 발생한 나머지를 CRC필드로 추가하여 송신측에서 데이터 CRC필드를 더하여 보냈을때 수신측에서 받아 같은 다항식으로 캐리가없는 Modulo-2 연산을 적용했을 때 나머지가 0이면 에러가 없고, 0이아니면 에러가 존재하는 방법으로 검출한다.
예를들어, 01101011 이라는 데이터를 CRC-8의 에러검출 알고리즘으로 전송한다고 가정해보자
다항식은 이미 정해져있는 x^8 + x^2 + x + 1(CRC-8) 이 되며, 이것으로 XOR 연산하였을 때 나머지가 00010110 이며, 이것이 CRC필드가 된다.
그럼 original 데이터에 CRC필드를 더하여(이어붙여서) 0110101100010110 을 전송하고, 수신측에서 동일한 정해진 다항식으로 XOR 연산한 것이 0이면 에러가없고, 0이아니면 에러가있어서 재전송을 요구하게 된다.
CRC의 경우 유럽의 표준이 CRC-CCITT(16비트) 이며, CRC-32는 IEEE802와 Ethernet에서 사용하여 두개의 방식이 가장 많이 사용된다.
- CheckSum : 송신측에서 전송할 데이터(Original Data)들을 모두 더하여 1의 보수화한 뒤에 Original Data에 이어붙여서 전송한후 수신측에서 모든 데이터를 더하여 1의 보수화를 했을때 0이면 에러가없고, 0이아니면 에러가 있음을 통해 검출하는 방법
2, 4바이트 CheckSum을 가장 많이 사용하며 IP, TCP/UDP에서 2Byte CheckSum을 이용하고 있다.
Error Correction
에러 정정은 대표적으로 ARQ와 FEQ로 나뉜다.
ARQ란 에러가 Detection 되면 재전송을 요구하는 방법이고, FEQ는 에러를 수신측에서 직접 Correction 하는 방법이다.
ARQ를 먼저 보자면, Stop And Wait ARQ, Go back -N ARQ, Selective Repeat ARQ로 대표적으로 3가지가 있다.
- Stop And Wait ARQ : 흐름제어에서 설명한 Stop And Wait 방식에서 재전송을 요구하는 방법이다.
송신측에서 데이터를 전송하면, 수신측에서 에러가 없으면 ACK를 보내고 송신측에서 ACK를 받으면 다음데이터를 전송한다.
만약 에러가 발생했다면, 수신측에서 NAK를 보내고 송신측에서 동일 데이터를 재전송 한다.
이는 위에서 서술한 바와 같이 하나를 보내고 기다려야 해서 통신효율이 떨어진다는 단점이 있다.
- Go back -N ARQ : 송신측에서 데이터를 기다리지 않고 연속적으로 보내어 에러가 발생했을 때 발생한 에러의 데이터부터 다시 순서대로 보내는 방법이다.
예를들어 1,2,3,4,5,6,7,8,9,10 순으로 데이터를 보낸다고 가정해 보자.
1, 2, 3 까지는 수신측에서 에러가 없었는데 4에서 에러가 발생했다.
하지만 송신측은 연속적으로 데이터를 보내기 때문에 5,6,7 까지 이미 전달된 상황이다.
수신측에서 NAK4 를 보내면 송신측에서 4부터 다시 4,5,6,7 순으로 재전송 하게 된다.
- Selective Repeat ARQ : Go back -N과 달리 에러가 발생한 데이터만 다시 선택적으로 보내는 방법이다.
위의 동일한 상황에서 NAK4를 송신측으로 보내면 송신측은 4를 재전송하고, 나머지 데이터인 8,9,10 을 보내게 된다.
현재는 Selective Repeat 보다 Go back -N 방식을 많이 사용하고 있다.
Seletive Repeat의 경우 중간의 데이터를 선택적으로 전송하면, 수신측에서는 1,2,3 과 5,6,7 사이에 4를 연결해야 하는 Memory Management가 발생한다.
이는 추가적인 메모리내의 연산을 발생시켜서 성능적으로 더 안좋다고 한다.
따라서 에러 발생지점부터 순차적으로 다시 보내어 Memory Management가 발생하지 않는 Go back -N 방법을 많이 사용한다고 한다.
다음으로 FEQ를 보자.
FEQ는 ARQ와 달리 에러를 수신측에서 직접 정정해야 하기 때문에 추가적인 에러 확인 용도의 비트가 추가된 데이터를 받아야 한다.
즉, 전달되는 정보의 크기가 커서 통신효율이 떨어진다는 단점이 있다. 따라서 잘 사용되지 않는 방법이다.
하지만 위성과 같은 거리가 아주 먼 통신을 할 때는 사용된다.
예를들어 위성의경우 수백km~ 수천km 만큼 멀리 떨어진 곳에 통신해야 하는데 ARQ같은 재전송 알고리즘을 사용하면 재전송 받기까지 시간이 오래걸려서 오히려 통신효율이 떨어진다.
따라서 이럴때는 한번 보낼때 에러정정코드를 삽입하여 보내어 통신효율을 증대한다.
FEQ에는 대표적으로 해밍코드(단일비트 오류정정), 상승코드(다중비트 요류정정) 가 있다.
해밍코드와 상승코드는 너무 길어지므로 생략하겠다.
접근제어
접근제어는 특정순간에 어느 시스템이 회선을 점유할 것인지를 결정하는 기능으로 LAN 에서 설명했듯이 MAC 과 관련있다.
가입자망은 90퍼센트 이상이 LAN을 사용하고, LAN의 토폴로지는 Sharing 회선(버스, 링, 스타, 트리)으로 구성되기 때문에 회선을 공유할 때 충돌이 발생하지 않도록 하기 위해 접근제어가 필수적이다.
LAN 의 CSMA/CD 소개에서 자세히 설명해 두었으니 참조하면 될거같다.
네트워크 계층
네트워크 계층의 주된 목적은 논리주소를 물리주소로 변환하여 목적지로 최대한 빠르게 데이터를 전송하는 것이다.
최대한 빠르게 전송한다는 의미는 최단경로를 바탕으로 목적지 주소를 찾아간다는 의미이다.
이를 ‘라우팅’ 이라고 하는데, 라우팅 테이블에 정해진 알고리즘에 따라 목적지 주소로 가는 최단경로를 통해 데이터를 전송하는 것을 말한다.
그리고 이때의 논리주소는 IP를 말하고, TCP/IP 계층의 IP를 의미한다.
라우팅은 두가지의 방식으로 나뉜다.
-
동적라우팅 : 라우터가 폴링방식으로 다른 라우터에게 신호를 보내 해당 라우터가 유효한 상태인지 확인하여, 그에 따라 라우팅 테이블을 갱신하는 방법이다.
-
정적라우팅 : 라우팅 테이블의 논리적 경로가 한번 정해지면 바뀌지 않는다. 따라서 관리자가 직접 라우팅 테이블을 갱신 및 관리 하여야 한다.
네트워크 계층에서 만들어지는 데이터 단위는 패킷 이다.
IP Header
IP의 헤더는 최소 20바이트 ~ 최대 60바이트 까지 존재할 수 있다. IP 헤더를 한번 까보자
가장 먼저 보이는 것은 Version 이다. Version은 현재 사용되고 있는 IP 프로토콜의 버전 정보인데, IPv4 혹은 IPv6 인지를 나타낸다.
그다음의 Length는 options를 포함한 전체 헤더의 크기를 워드단위로 나타낸다.
1워드는 32비트이고, 이는 4바이트로 해당 길이값이 1이라면 4바이트 길이를 말하는 것이다. 헤더의 최소길이는 20바이트 이므로 길이의 최소값은 5이다. (즉, 0101 이다)
Type of Service는 해당 패킷의 우선순위를 나타낸다. 그다음의 Identifier는 식별자로써 패킷의 길이가 길어서 단편화된 상태로 목적지까지 전달됬다면 식별자로 정의된 유일한 값으로 패킷들을 하나의 덩어리(데이터그램)로 만들수있다.
그다음은 Flag값들과 단편화오프셋인데, 플래그들은 3개의 비트로 구성되는데 첫번째는 예약, 두번째는 DF, 세번째는 MF이다.
DF는 Don’t fragment로 단편화 할수 없는 패킷임을 나타내는 상태값으로 이값이 1이라면, 단편화 할수없어 쪼개야 하는 상황이 발생할 때 ICMP(Internet Control Message Protocol) 로 송신측에 에러메세지를 전달한다.
MF는 More Fragment로 단편화 되어 있음을 나타내는 상태값이다. 이 상태값이 1이라면 패킷이 단편화되어 있어 뒤에 패킷들이 더 있음을 나타낸다.
그다음은 Time to live인데 이는 무한루프를 방지하기 위한 홉카운트를 나타내고 8바이트로 구성되어 0~255 까지 표현할 수 있다. 라우터를 지날 때 마다 카운트가 1 씩 감소되어 0이되면 해당 패킷은 폐기되고 송신지에는 ICMP로 에러메세지를 전달 받는다.
다음은 프로토콜로 상위 프로토콜이 무엇인지를 나타낸다. TCP인지 UDP인지 혹은 응용 프로토콜은 무엇인지 등등..
그다음은 Error Detection을 위한 체크섬 필드이고, 그이후에 32비트짜리 송신지와 목적지의 IP주소가 삽입된다. 추가로 Options 필드에는 추가적으로 넣어질 기능들이 삽입되어 최대 40바이트 만큼 만들어질 수 있다.
IP 주소
IP 주소는 네트워크 장비에 할당되는 세계에서 유일한 주소값으로, 32비트로 표현되어 설계 당시(1981년)에는 충분한 경우의 수라고 판단했지만, 2000년대 에는 모든 IOT 디바이스를 포함해서 IP주소가 삽입되다 보니 주소가 부족해졌고, 네트워크와 호스트 파트로 나누어 분리하여 관리하기 시작했다.
처음에는 네트워크와 호스트 파트로 나누어 각 Class A,B,C,D,E 로 나뉘었는데 Class A는 첫비트가 0, B는 10, C는 110, D는 1110, E는 1111로 시작하는 형태이다.
Class A의 범위는 0000 0000 ~ 0111 1111 이되게 되고 이는 10진수로 0~127이다. 그에 따라 클래스 B는 128~192이고 클래스 C는 193~223 와 같은 형태로 나뉘게 된다.
문제는 이런 범위로 나누었을 때 폭이 너무 커서 특정 값 만큼으로 네트워크와 호스트 파트를 나눌 수 없었다는 점이다. 그래서 이를 해결 하기 위해 1비트 단위로 네트워크와 호스트파트를 나누는 서브넷팅이 등장한다.
서브넷팅은 네트워크 파트를 호스트 파트로 사용하는 것으로 서브넷 마스크로 IP주소를 AND 연산하면 1인부분은 네트워크파트이고, 나머지는 호스트파트로 구분한다.
반대로 슈퍼넷팅은 호스트파트를 네트워크 파트로 이용하는 것이다.
하지만 IPv4의 근본적인 주소부족 문제를 해결하기는 어려웠고, 128비트를 가지는 IPv6가 등장한다.
전송 계층
전송 계층의 주된 목적은 송신지에서 수신지 까지 전달되는 데이터를 응용 계층과 연결해주는 작업이다. 전송 계층에는 포트넘버가 존재하고 TCP와 UDP 프로토콜이 있다.
포트넘버는 송신지 포트넘버와 수신지 포트넘버로 나뉘어 어떤 프로세스로 전달할 것인가를 결정한다.
즉, 인터넷 브라우저의 1~4번창이 있을 때 어느 창에 전달된 세그먼트 인지를 결정하는 요인인 것이다.
전송 계층에서 전송되는 데이터 단위는 세그먼트 이다.
TCP
TCP의 특성은 다음과 같다.
- 연결형 (Connection Oriented) : 송신지와 수신지 사이에 연결을 확립한다.
- 신뢰성 : 송신지와 수신지가 연결되어 있으므로 흐름제어와 혼잡제어가 가능하여 세그먼트를 잃어버리지 않는 신뢰성이 확보된다.
- 흐름제어 : 위에서 설명한 ARQ, Seletive Repeat, Go back -N 등과 같은 흐름제어를 수행할수 있는 수신측의 버퍼공간 Window 크기를 알수 있게 된다.
- 혼잡제어 : 혼잡제어란, 특정 시간에 수신측에 너무 많은 전송이 몰려서 수신측에서 모든 패킷을 처리하지 못해 유실이 생기고, 해당 유실을 흐름제어로 다시 ARQ했을 때 더많은 패킷이 몰려서 악순환이 되는 상황속에서 송신측의 전달 속도를 강제로 줄이는 것을 말한다.
TCP Header
TCP 헤더도 IP와 마찬가지로 최소 20바이트에서 최대 60바이트의 크기를 가질 수 있다.
가장 먼저 보이는 첫줄은 송신지와 수신지의 포트 넘버이다. 이는 위에서 설명햇듯이 전달할 세그먼트를 띄울 프로세스를 결정한다.
다음은 Sequence number인데 UDP와 달리 TCP는 세그먼트들의 순서를 보장하기 때문에 단편화된 세그먼트의 순서를 유지하기 위한 값으로 사용하며 32비트로 표현된다.
그다음은 Acknowledgement Number인데 이는 다음 세그먼트의 순서번호를 나타내어 단편화된 세그먼트의 끝이 어딘지를 알려주는 역할을 한다.
즉 Sequnce Number는 바이트 스트림단위로 1바이트씩 순서번호를 매기어 보내면, 수신측에서 Acknowledgement Number에 정의된 값 까지 읽어들여서 합치게 된다.
그다음은 TCP 헤더의 길이를 나타내는 HLEN이고 이것도 마찬가지로 워드단위로 구성되어 최소값이 1001(5)이다. 그다음으로 예약필드 6비트가 오고 상태필드들이 온다.
상태필드들중 URG는 Urgent(긴급한)를 의미하여 이값이 1이라면 Urgent Pointer 필드가 유효함을 의미하고 해당 필드에 긴급한 데이터를 삽입하여 보낸다.
그밖의 SYN은 연결을 설정하기 위한 상태필드로 해당 Sequence Number를 0으로 초기화한다. FIN은 Finish의 의미로 연결이 종료됨을 의미하는 상태필드 이다.
그외에 Window Size는 수신측의 버퍼 공간을 말하고, Error Detection을 위한 체크섬 필드와 Urgent Pointer, Options로 구성된다.
UDP
UDP는 TCP와 달리 비연결형의 특성을 가지므로 신뢰성이 없으므로 잃어버려도 상관없는 정보들을 보내는데 사용된다.
이는 TCP의 연결과정인 3 way or 4 way hand shake를 사용하지 않게 되어 오버헤드가 적어 실제 세그먼트의 전달 속도가 빠르다는 장점이 있다. 따라서 스트리밍 이나 게임과 같은 서비스에서 사용되며 특히 DNS 프로토콜이 UDP 프로토콜을 이용한다.
UDP는 헤더가 8바이트로 구성되고 4바이트중에 2바이트씩 송신지와 목적지의 포트넘버로 사용하고, 헤더의 길이로 2바이트 그리고 CheckSum 필드로 2바이트를 사용한다.
흐름제어와 혼잡제어 같이 순서를 보장할 이유가 없고, Error Detection이 되어도 어디서 보냈는지 알수 없기 때문에 ARQ를 할 필요도 없다. 따라서 헤더가 경량화된 크기로 구성된다.
댓글남기기