부족하거나 추가되었으면 하는 점은 언제든지 추가 부탁드리겠습니다.
이번 글에서는 기본적인 틀이라고 볼 수 있는 OSI 7Layer와 현재 가장 많이 사용하고있는 TCP/IP에 대해서 정리를 해보려고 합니다.

osi 7 layer
-
Physical layer
- 진짜 케이블을 의미합니다.
케이블이나 리피터 등 같은 그런 것들입니다.
데이터를 전기신호, 빛 신호 등을 이용해서 전달해주는 애들입니다.
리피터는 생겨먹은 것은 장비처럼 생겨서 L1스위치냐라고 물을 수도 있지만 주소가 존재하지 않을 뿐더러 네트워크 통신에서 그 어떠한 헤더를 뜯어볼 수도 없기 때문에 스위치라고 할 수 없습니다.
L1은 그저 하나의 끈으로 묶는다 정도의 느낌입니다.
하나의 host와 host간 물리적인 연결을 보장해주는 레이어라고 생각하시면 될 것 같습니다.중요한 내용은 아니기 때문에 빠르게 스킵하겠습니다.
-
Data Link layer
- L1으로 연결된 두 장치간 전송을 보장하기 위한 레이어입니다.
여기서는 L1을 기반으로 통신을 하고 대표적으로 Ethernet과 같은 프로토콜이 있습니다.
L2의 경우 공유버스를 이용하기 때문에 하나의 Ethernet안에 여러 host가 존재할 수 있어 이 구간 부터는 내 주소와 상대방의 주소가 필요하게 됩니다. 사용하는 주소는 Mac(애플아님)주소로 unsigned 6byte 값을 가집니다 일반적으로 24bit는 제조사 전용 그 이하 비트는 기기당 가지는 비트입니다.
그러다 보니 얘는 L1을 통해 직접 연결되지 않은 않은 host간 데이터 전송 및 연결이 불가능하게 되겠습니다.
안궁금하실수도 있지만 우리가 쓰는 wifi, 5g 는 눈에 보이지 않는 케이블이라고 보셔도 됩니다… 물론 Ethernet사양에 따르는지는 모르겠습니다. 요건 누군가가 수정하시면서 알려주세요
일반적으로 LAN 환경 내부에서 뭔가를 한다고 하면 L2통신이라고 보시면 될 것 같습니다.
- 바로 옆 기기와의 통신을 하기 때문에 과거에는 공유버스를 사용한 네트워킹을 했었습니다.
- 모든 망은 동시에 하나의 데이터밖에 전송을 할 수 없기 때문에 동시에 두개의 데이터가 전송이 되면 Collision이 발생하게 되고 이로 인해 frame이 소멸되는 문제가 있었습니다
- 이런 문제를 해결하기 위해 csma/collision detector를 사용했었습니다.
다만 요즘은 스위치를 통해서 테이블을 형성하고 있고 해당하는 주소에 따른 인터페이스로 내보내기 때문에 이런 collision이 많이 줄어들게 되었습니다(그럼에도 불구하고 collision이라는 것이 완전 사라질 수는 없겠죠..)
- L2는 특이하게 header와 tail이 붙습니다 (유일하게 Encapsulation을 하는 레이어)
- Preamble
- 각 머신마다 cpu clock(rate)가 다르기 때문에 머신간의 동기화가 필요합니다. 그냥 10101010101을 보낸다고 그 머신이 101010101이라고 받아 들일수도있고 cpu clock에 따라 1 1 1 1 1만 받아 들일 수 있기 때문에 존재하는 필드입니다. 공통적으로 10101010 * 7번 10101011 * 1번 반복(8바이트) 시작합니다.
- 아 참… Ethernet 고유 사양은 아니고 IEEE 802.3에서 도입된거라고 합니다.
- DestAddr, SrcAddr
- Length
- unsigned 2byte입니다.
length의 크기에서 알 수 있듯 frame의 크기는 최대 65535입니다.
-
Network Layer
- 사실 우리가 눈여겨 봐야하는 구간은 여기부터입니다.
네트워크 레이어 부터는 논리적인 출발지와 도착지가 존재하는 구간입니다.
이런 논리적 출발지부터 논리적 도착지까지 나아가는 과정을 라우팅이라고 하며 이런 논리적인 주소체계와 라우팅이라는 과정을 통해서 직접 연결이 되어있지 않은 기기와의 통신을 보장받게 됩니다.
- 라우팅
-
라우팅이 뭘까요..? 있는 그대로 말하면 dest에 해당하는 논리적 주소로 가려면 어떤 경로로 가야하는지를 결정하고 내보내는 행위입니다.
-
어떤 라우터든 destination이 내가 아니라면 routing을 해야합니다
그러므로 모든 router는 default가 존재하게 되고 이런 이유로 라우팅 맵은 그래프 모양이지만 실질적으로는 트리와 같은 형태로 되어있습니다. 그리고 root에 해당하는 노드는 서로를 참조하고 있습니다(모든 라우터는 default가 있어야한다는 규칙 때문에)
-
host는 자신의 IP와 도착한 datagram IP를 비교합니다
동일하면 higher level protocol(tcp/udp등) 으로 보내게 되고 다르다면 버립니다.
-
delivery
- 정해진 우선순위에 따라(source의 망 이후 netstat상 metric에 해당하는 값의 순서) subnet mask시도
얻어낸 logical network id와 해당 망의 logical network id가 동일하다면 해당 인터페이스를 통해 전달
-
그럼 라우팅은 어떻게 되는걸까요..?
- 알고리즘은 다음과 같다고 합니다 요거는 저도 원래 몰랐던거라 제가 설명드리는 것 보다 의사코드를 직접 보시는게 좋을 것 같습니다
꼭 필요한 내용은 아니긴합니다만 알아두면 유식한 척 할 수 있을 것 같네요…?


IPHeader
-
Fragmentation
- L3의 IP 프로토콜은 mtu크기에 맞춰 frafmentation을 합니다.
mtu는 물리레이어에서 가질 수 있는 최대 패킷크기를 말합니다.
ip header는 destination host에서의 assemble을 위해서 fragment offset과 flags를 가지고 있으며 마지막 fragment인 경우 flags의 특정 비트가 1인 상태로 도착하게 됩니다.
해당 비트 중에서는 do not fragment bit도 존재하며 이 플래그를 켜는 경우 fragment하지 않는 방향으로 routing을 하게 됩니다. 하지만 fragment를 필수적으로 해야하는 경우 실패를 뱉어내게 됩니다. [ErrorType:DestinationUnreachable][ErrorCode:FragmentationNeeded]
이론상 mtu의 크기는 unsigned 2byte까지 가능합니다.
-
TimeToLive
- TimeToLive는 패킷의 라이프 사이클을 관리하는 용도로 사용됩니다.
모든 라우터는 default를 가지고 있기 때문에 본인이 관리하는 네트워크의 망에 존재하지 않는다면 default로 보내버리는 성질이 있습니다.
만약 논리적 주소가 잘못된 주소여서 영원히 라우터를 떠돌게 된다면 이는 traffic요소로 많은 라우터들에게 부하를 주게 될 것입니다.
그런 이유로 라우터를 지날 때 마다 time to live값을 1씩 감소시키며 0이되면 사라집니다.
-
ICMP
- Datagram의 처리가 불가능 한 경우 Router에서 source host에게 전달하는 내용입니다. IP는 datagram의 전송은 보장해주지만 도착하였는지 여부는 보장해 주지 않기 때문에 ICMP라는 프로토콜을 통해서 이를 보안하고 있습니다.(하지만 재전송은 해주지 않습니다) 단지 전송에 실패했다고 report하는 정도의 역할만을 수행합니다.
-
TransportLayer
- L3까지는 src host와 dest host간의 통신과정이었습니다.