IP in Linux

John·2025년 6월 14일

system programming

목록 보기
6/11

IP layer에 대해 들어가기 전에, 큰 그림을 먼저 설멍하자면, 네트워킹 스택은 다음과 같이 이루어져 있었다.

그림에서 볼 수 있듯이 IP(Internet Protocol) layer은 L3에 해당한다.
이 페이지에서는 IP의 기능과 routine을 설명할 것이다.

Function of IP

  • IP는 호스트(ex. 컴퓨터 스마트폰)을 구분하는 IP 주소로 구별 가능하다.
    IP를 이용한 전송 시, source IP와 destination IP 정보가 담겨있다.
    -> Routing 기능(목적지로 길 찾기) 수행 가능.

  • IP는 MTU(Maximum Transmission Unit)를 고려해 fragment/reassemble 을 수행한다.

* reliable한 기능은 없다. (Best Effort, but not reliable)

Routing

IP 주소는 호스트의 논리적 주소(logical address)이다.
*physical address 의 예시 : MAC

destination IP주소를 가지고, 내가 다음 hop을 어떻게 가져갈 지 결정하는 것이 routing이다.
routing에는 두가지 시나리오가 있을 수 있다.

  1. dst IP주소가 local(동일한 subnet)에 있는 경우.
    next hop이 바로 destination 위치로 이동

  2. dst IP주소가 local에 없는(subnet 바깥에 있는) 경우.
    라우터(게이트웨이)로 이동.

--> IP layer에서 어떻게 이동할 지 결정한다.

IP layer은 또한 다음 연산을 위해 L2의 정보를 알아낸다. 즉 IP layer에서 physical address도 얻음.
얻는 방법? ARP 요청을 보냄 -> next hop의 physical address 를 얻음 -> L2에게 전달

TCP header가 있는 것 처럼, IP도 또한 IP header존재.
struct iphdr (include/linux/ip.h에 정의되어 있음)

Routing When Sending

L4으로부터 패킷이 도착한 이후,

  1. Loopback 일 경우 (내 자신에게 전달.127.0.0.1 주소를 가짐. e.g. IPC)
    ip_local_deliver() 함수 호출 -> RX routine 수행.

  2. 아닐 경우, 다음 hop의 IP address 얻음

Routing When Receiving

L2로부터 패킷이 도착한 이후,

  1. 내 것이 맞는 경우(dst IP == 내 주소), 수신

  2. 내 것이 아닌 경우(dst IP != 내 주소), Broadcast를 통해 forwarding. (toward single host -> unicast, toward multiple hosts -> multicast)

Structures for Routing

  1. dst IP ~ next hop을 위한 구조
    Forwarding Information Base Table(FIB) (struct fib_tables)
    = Routing table
    다음 hop의 IP주소가 저장되어있는 테이블.
    routing protocol이 채우거나 수정(e.g. BGP, IS-IS protocol)

  2. IP ~ physical address를 위한 구조
    Neighbor Table(struct neigh_table)
    next hop의 physical address를 저장하기 위해.
    ARP에 쓰임

FIB

user가 connect() syscall을 날리면,
커널에서는 ip_route_connect() 함수가 호출된다. 해당 함수가 호출되면, routing table(FIB)를 참고해 next hop에 대한 정보를 얻는다.

FIB은 많은 정보를 가지고 있지만, 핵심적인 것만 살펴보자면, prefix, gateway(router), interface 가 있다.

* prefix에서 / 는 mask 이고, 몇비트까지 확인해야하는지에 대한 정보이다. fib_lookup()을 통해 확인 (ex /24 - 앞에서 24비트 , 즉 3번째 자리까지 일치하면 해당한다는 뜻)

* gateway에서 주소가 있으면, 다른 서브넷이라는 뜻이다.

Neighbor Table

라우팅 이후, physical address를 찾기 위해 사용되는 table.
만약 neighbor table에 MAC주소 없으면, ARP 를 날려 정보를 얻는다. 또는 임의로 넣어놓을 수 있음.
한번 저장하고 나서, 일정 시간 이후에 자동으로 해당 데이터 삭제.

FYI) 가상머신-컨테이너 간 통신 때, 오류가 나는 이유는 주로 두 테이블 문제일 수 있으니, 확인하거나 임의 수정 필요.

profile
¡Salid y Disfrutad!

0개의 댓글