본문 바로가기
프로그래밍/네트워크

[네트워크] OSI 모델 3계층_IP 프로토콜

by 준보틱스 2024. 6. 24.

IPv4 프로토콜

● IPv4가 하는 일

IPv4 프로토콜은 멀리 있는 다른 네트워크 상에서 데이터를 교환하기 위한 프로토콜이다. 하지만 IPv4 프로콜은 데이터가 정확하게 전달될 것을 보장하지는 않는다, 중복된 패킷을 전달하거나 패킷의 순서를 잘못 전달할 가능성도 있다. 이것을 악의적으로 이용되면 DoS 공격이 된다. 데이터의 정확하고 순차적인 전달은 그보다 상위 프로토콜인 TCP에서 보장한다.

● IPv4 프로토콜 구조

IPv4 프로토콜은 20바이트이다. 최대 10개 옵션이 붙을 수 있는데 한 옵션 당 4바이트이기 때문에 최대 60바이트이다. 그러나 대부분 옵션 없이 사용한다.

  • Destination Address : 도착지 IP, 4바이트
  • Source Address : 출발지 IP, 4바이트
  • Version : IP 프로토콜의 버전, 4 or 6인데 16진수 하나 4만 온다, 4비트
  • IHL : 헤더의 길이(Header Length), 16진수로 "5", 4비트
  • TOS(Type Of Service) : 옛날 버전에 사용하던건데 지금은 그냥 비워둠, "0"으로 작성, 1바이트
  • Total Length : 헤더의 길이가 뿐만 아니라 뒤의 페이로드까지 합쳐진 길이를 의미(전체 길이), 2바이트
  • Identification, IP Flages, Fragment Offset : 데이터가 크면 최대 전송범위가 있기 때문에 나눠서 전송하는데, 나눠진 것을 알아보기 위해 사용되는 값들

- Identification : 하나의 데이터에서 나눠진 데이터들이 같은 데이터에서 나눠진 데이터라는 것을 알려주기 위해 ID를 부여해준다, 그 ID 값, 2바이트

- IP Flages : 첫번째는 아예 안쓰고, 두번째는 패킷을 보내는 사람이 데이터를 안쪼개서 보내겠다는 것을 명시하는 것이지만 데이터가 보내지지는 않음, 세번째는 쪼개서 보낼 때 다른 패킷들도 있다는 것을 알려주는 값(2진수 1로 표시), 3비트

- Fragment Offset : 쪼개진 데이터를 원래대로 복구하려면 원래의 순서대로 복구가 되어야 하는데, 순서를 알아볼 수 있게 Offset을 지정한다, 13비트

  • Time To Live(TTL) : 패킷이 살아있을 수 있는 시간 지정, (window : 128로 지정, Linux : 64로 지정), 8비트
  • Protocol : 상위 프로토콜이 무엇인지 알려주는 값, 8비트
  • Header Checksum : Header가 오류가 있는지 없는지 확인하는 값, 2바이트

ICMP 프로토콜

● ICMP가 하는 일

ICMP(Internet Control Message Protocol, 인터넷 제어 메세지 프로토콜)는 네트워크 컴퓨터 위에서 돌아가는 운영체제에서 오류 메세지를 전송 받는데 주로 쓰이는 프로토콜을 말한다. 즉, 특정 대상과 내가 통신이 잘되는지 확인하는 프로토콜이다. 프로토콜 구조의 Type과 Code를 통해 오류 메세지를 전송 받는다.

● ICMP 프로토콜 구조

총 8바이트로 구성되어 있다.

  • Type : 2바이트, 8(요청), 0(응답), 통신 확인할 때 8번, 응답할 때는 0번
  • Code : 2바이트, 3(목적지에 도달할 수 없음, 가는 경로 상에 문제), 11(요청시간이 만료되었음, 상대방의 문제 ex. 방화벽)
  • Checksum : Header가 오류가 있는지 없는지 확인하는 값
  • Other message specific information : 4바이트

라우팅 테이블

3계층의 대표적인 역할은 최적의 경로를 찾아가는 것인데, 최적의 경로를 지도처럼 저장한 것을 라우팅 테이블이라고 한다.

cmd에서 netstat -r 명령어를 통해 확인할 수 있다. 여기서 나오는 네트워크 대상만 찾아갈 수 있고, 라우팅 테이블에 없는 다른 대역들은 찾아갈 수 없다.

다른 네트워크와 통신 과정

A 컴퓨터가 다른 네트워크 대역에 있는 B 컴퓨터와 통신할 때, A의 라우팅 테이블에 B의 네트워크 대역이 있어야지만 통신이 가능하다. 네트워크 대역이 있다면 ICMP 요청 프로토콜을 작성한다.

(1) A에서 B로 갈때 B의 네트워크를 확인하고 그 주소를 보고 통신한다. ICMP로 통신을 확인하기 위해서 Type을 8(요청)으로 ICMP 요청 프로토콜을 작성하고, IPv4 프로토콜 작성한다.

(2) 이더넷 프로토콜의 목적지 MAC 주소는 "cc:cc:cc:cc:cc:cc" 으로 작성한다. 최종 목적지는 B지만 MAC주소는 가까운 주소이기 때문에 목적지 MAC 주소는 "cc:cc:cc:cc:cc:cc" 으로 작성한다. 또한, A의 라우팅 테이블을 확인해보면, B의 네트워크 대역인 192.168.20.0/24에서 가리키는 주소인 192.168.10.1로 보내야하고 그 곳의 MAC주소가 "cc:cc:cc:cc:cc:cc"이다. 스위치에서는 2계층 주소인 이더넷 주소만 확인하기 때문에 C로 보낸다.

(3) 공유기는 데이터를 받아서 이더넷 프로토콜을 확인하고 IPv4 프로토콜을 확인하는데 목적지가 본인이 아닌걸 확인했다. 그렇기 때문에 공유기의 라우팅 테이플을 확인한다. 보내는 주소를 확인하고 그에 맞는 주소로 보낼 준비를 한다. 대역은 이렇게 확인 후 보내기 위해서 목적지 MAC주소와 출발지 MAC주소를 자기 옆에서 통신할 수 있는 주소로 작성해서 이더넷 프로토콜을 다시 만든다.

(4) 라우터가 데이터를 받으면 목적지 MAC 주소를 확인하고 라우터의 라우팅 테이블을 확인하고 전송할 주소를 확인한다. 그리고 보내는 곳으로 맞춰서 다시 이더넷 프로토콜을 작성해주고 전송한다.

(5) 공유기가 데이터를 받으면 목적지 MAC 주소를 확인하고 공유기의 라우팅 테이블을 확인하고 전송할 주소를 확인한다. 그리고 보내는 곳으로 맞춰서 다시 이더넷 프로토콜을 작성해주고 전송한다.

(6) ICMP 요청을 받은 B는 ICMP로 통신을 확인하기 위해서 Type을 0(응답)으로 ICMP 요청 프로토콜을 작성하고, IPv4 프로토콜 작성한다. 그 다음 이 과정을 역순으로 다시 A로 보내준다.

IPv4 조각화

조각화란?

큰 IP 패킷들이 적은 MTU(Maximum Transmission Unit)를 갖는 링크를 통하여 전송되려면 여러 개의 작은 패킷으로 쪼개어(조각화)되어 전송돼야 한다. 데이터가 1,500byte보다 크면 조각화가 이루어져서 데이터가 전송된다.

즉, 목적지까지 패킷을 전달하는 과정에 통과하는 각 라우터마다 전송에 적합한 프레임으로 변환이 필요하다. 일단 조각화되면, 최종 목적지에 도달할 때까지 재조립되지 않는 것이 일반적이다.

IPv4에서는 발신지 뿐만 아니라 중간 라우터에서도 IP 조각화가 가능하다. IPv6에서는 IP 단편화가 발신지에서만 가능하다. 재조립은 항상 최종 수신지에서만 가능하다.