네트워크 인터페이스 선택 원리와 기준
📌 전체 흐름: 목적지 IP로 패킷을 보낼 때 라우팅 테이블 참조
🔢 1. 라우팅 테이블에서 목적지 IP와 매칭
목적지 IP를 기준으로, 가장 적합한 라우팅 경로를 찾기 위해 다음 수행:
모든 라우팅 테이블 항목에 대해:
목적지 IP와 각 항목의 서브넷 마스크를 AND 연산해서 네트워크 주소 계산
해당 네트워크 주소와 라우팅 항목의 대상 네트워크와 비교
그중 **가장 긴 서브넷 마스크(LPM: Longest Prefix Match)**를 우선
동일한 길이의 경로가 여러 개 있다면 → **Metric(비용)**이 가장 낮은 경로 선택
해당 경로의 **인터페이스(예: eth0, wlan0 등)**와 게이트웨이 주소를 선택
🔢 2. 출력 인터페이스 결정 → ARP로 MAC 알아냄
인터페이스가 정해지면:
목적지 IP가 같은 서브넷이면 직접 전송
아니면 게이트웨이의 IP를 목적지로 보고 ARP 요청하여 MAC 주소 알아냄
🔢 3. 애플리케이션이 소켓 열 때 바인딩
애플리케이션은 OS의 소켓 API를 사용해 "소켓"을 생성
bind()
호출 시, 일반적으로 다음을 지정할 수 있음:출발지 IP 주소 (→ 라우팅 결과와 무관할 수도 있음)
포트 번호
보통
bind()
를 생략하면 커널이 자동으로 라우팅 결과에 따라 적절한 인터페이스의 IP를 사용
🔢 4. 전송: TCP 세그멘테이션 및 IP 패킷화
애플리케이션이 데이터를 보내면:
TCP는 데이터를 세그먼트 단위로 나누고, 각 세그먼트에 TCP 헤더 추가
그다음 IP 헤더 추가 → IP 패킷 생성
IP 패킷은 결정된 인터페이스를 통해 MAC 주소 붙여 이더넷 프레임으로 전송
✅ 전체 요약: 네가 쓴 문장을 구조적으로 정리하면
1
"IP주소를 라우팅 테이블의 모든 서브넷 마스크와 AND연산"
✅ 정확
2
"그 값을 모든 네트워크 대상과 비교"
✅ 정확 (서브넷과 비교)
3
"일치하는 네트워크 대상 중 매트릭 비교 후 인터페이스 선택"
✅ 정확 (단, LPM 우선 → 그 후 Metric 고려)
4
"소켓에 인터페이스에 대한 TCP/IP 바인딩하고 세그멘테이션"
⚠️ 조금 보완 필요 → 소켓은 일반적으로 포트/IP 바인딩, 인터페이스는 OS가 라우팅에 따라 자동 선택 → 세그멘테이션은 TCP/IP 스택에서 처리됨
🔍 보충 설명: bind()
는 인터페이스와 직접 연결 안 됨
bind()
는 인터페이스와 직접 연결 안 됨bind(socket, IP:port)
에서 IP를 지정하면 OS는 그 IP에 연결된 인터페이스를 찾아 사용인터페이스를 직접 바인딩하려면 소켓 옵션
SO_BINDTODEVICE
를 사용해야 함 (리눅스에서만)
✅ 최종 정리 흐름 (단계별 요약)
목적지 IP를 라우팅 테이블의 각 엔트리와 서브넷 마스크 AND 연산
일치하는 엔트리 중 가장 긴 서브넷 길이 → 그중 Metric 낮은 인터페이스 선택
인터페이스 결정 후 ARP로 MAC 주소 획득
소켓이 열리면 OS가 라우팅 결과에 따라 자동으로 해당 인터페이스의 IP를 사용해 전송
데이터는 TCP 세그멘트화 → IP 패킷화 → MAC 프레임 → 네트워크 전송
✅ 목적지 IP로 패킷을 보낼 때 전체 흐름 + 계층
📦 전체 흐름 요약
[애플리케이션 데이터]
→ TCP 세그멘테이션
→ IP 패킷화
→ 라우팅 결정
→ MAC 주소 결정(ARP)
→ 프레임화 후 전송
🔢 단계별 정리 + OSI 계층
① 애플리케이션이 소켓 열기
socket()
, bind()
호출
7계층 (응용) + 일부 OS에서 5~6계층 대응
HTTP, FTP, SSH 등
② 포트 바인딩
bind(IP:port)
4계층 (전송)
TCP/UDP 포트
③ 라우팅 테이블 조회 및 인터페이스 선택
IP → 라우팅 테이블 검색 AND 연산 + LPM + Metric
3계층 (네트워크)
IP 주소, 서브넷 마스크, 게이트웨이
④ ARP 요청 (필요시)
목적지 or 게이트웨이 MAC 주소 탐색
2계층 (데이터 링크) + ARP는 L2.5(비공식)로도 불림
MAC 주소, 브로드캐스트
⑤ TCP 세그멘테이션
데이터를 TCP 세그먼트로 분할 + 헤더 추가
4계층 (전송)
TCP 헤더, 시퀀스 번호
⑥ IP 패킷화
TCP 세그먼트에 IP 헤더 추가
3계층 (네트워크)
IP 헤더, TTL, 프로토콜 번호
⑦ MAC 프레임화
IP 패킷에 MAC 헤더 + 트레일러 추가
2계층 (데이터 링크)
출발지/목적지 MAC 주소, CRC
⑧ 신호 전송
전기/광/무선으로 전송
1계층 (물리)
비트 스트림, 전송 매체
🎯 시각적으로 정리
[응용 계층] 사용자 앱 / 소켓 API 호출
↓
[전송 계층] 포트 바인딩, TCP 세그먼트 생성
↓
[네트워크 계층] 라우팅 테이블 탐색 → 목적지 IP 결정 → IP 패킷 생성
↓
[데이터 링크 계층] ARP 요청 → 목적지 MAC 주소 획득 → 이더넷 프레임 생성
↓
[물리 계층] 전기 신호/무선 등으로 실제 전송
💡 추가 팁
라우팅 테이블 판단 (AND 연산, LPM) → 순수 3계층 (IP 레벨)
ARP는 "IP → MAC" 변환이라 2계층과 3계층의 사이 역할 → 흔히 L2.5라고도 불려요
소켓
bind()
나connect()
는 전송 계층 관여지만, OS가 자동으로 IP 결정하는 데는 3계층 라우팅이 내부적으로 작동합니다
✅ 요약 표
소켓 API
7계층
socket()
, bind()
포트 처리
4계층
TCP/UDP
라우팅 결정
3계층
IP 주소, 라우팅 테이블
ARP 처리
2계층 (L2.5)
MAC 주소 결정
세그멘트 생성
4계층
TCP 헤더, 시퀀스 번호
IP 패킷 생성
3계층
IP 헤더, TTL
프레임 생성
2계층
MAC 헤더, CRC
신호 전송
1계층
전기/광 신호
Last updated