본문 바로가기
CS/Network

[Network] 성공과 실패를 결정하는 1% 네트워크 원리(2) - IP와 이더넷

by sebinChu 2024. 9. 1.

개요


성공과 실패를 결정하는 1% 네트워크의 원리 챕터 2를 정리한 포스팅이다.

이 포스팅에서는 IP와 이더넷을 중심으로 정리한다.

 

 

4. 서버에서 연결을 끊어 소켓을 말소한다.


 

 

  • 서로 FIN, ACK를 주고 받는다. (데이터 전송이 끝난 측에서 먼저 FIN 전송)
  • 소켓이 말소되면 모든 정보가 없어진다. → 이때 애플리케이션이 다른 소켓을 작성하면 말소된 포트 번호를 사용할 수 있기 때문에 마지막 FIN에 대한 ACK는 어느정도 시간을 두고 말소한다.

 

5. IP 패킷 송수신 동작


큰흐름

TCP 담당 부분에서 패킷을 바이너리로 전달받은 IP는 IP헤더, MAC 헤더 만들어서 이더넷에 보내고, 이더넷은 이 IP 패킷(디지털 데이터)를 전기 신호/빛으로 변환해서 케이블로 데이터를 흘려보낸다. 모든 소켓관련 내용은 위에서 다 해주기 때문에 이더넷은 모든 기기에 공통적으로 행동한다.

 

5-1) 앞에서 프로토콜스택.. TCP로부터 의뢰받은 IP는 어떻게 동작할까?

송신처에서 소켓을 가장 가까운 중계처(라우터 등)로 전송하면, 소켓 헤더에 저장된 정보 + 중계처의 표(수신처/가까운 또다른 중계처의 방향에 대한 정보)를 통해 데이터를 전송한다.

  • 허브: 이더넷의 규칙에 따라 패킷 운반
  • 라우터: IP의 규칙에 따라 패킷 운반

■ 실제로 송신처 컴퓨터부터 중간 중계장치들(라우터, 허브 등)을 거치는 과정

  1. 송신처에서 패킷이 가려는 서버의 IP 주소를 IP 헤더의 수신처에 기록한다.
  2. 패킷의 목적지가 분명해지므로, IP는 이 수신처가 어느 방향에 있는지 + 라우터를 조사한다.
  3. 이어서 다음 방향의 라우터 조사한다.
  4. 다음 방향의 라우터로 패킷을 보내도록 이더넷에 의뢰한다.
  5. 다음 라우터에 할당된 이더넷의 주소(MAC 주소)를 이더넷이 알려주고, 이를 MAC 헤더에 기록한다.
  6. 이더넷 추천 경로에 따라 허브에 도착한다.
  7. 허브에서는 수신처 정보와 표를 결합해서 목적지를 판단 및 중계한다.
  8. 패킷은 다음 라우터에 도착한다.
  9. 라우터에는 IP용 표가 있으므로, 이것과 IP 헤더의 수신처를 결합해서 다음 중계지(라우터)를 결정한다.
  10. 해당 라우터의 MAC 주소를 헤더에 붙여서 송신한다.

 

 

5-2) 패킷 송수신 동작의 개요

패킷 송수신은 TCP 담당부분이 IP 담당 부분에 패킷을 의뢰하는 것부터 시작된다.

  • TCP 담당 부분은 [TCP 헤더 + 데이터 조각]을 IP 부분에 건네준다.

TCP 담당으로부터 송신 의뢰를 받은 IP 담당 부분은 추가적인 헤더를 붙여, 네트워크용 HW에 건네준다.

  • IP 헤더: IP 프로토콜에 규정된 규칙에 따라 패킷을 목적지에 보낼 때 사용하는 제어 정보
  • MAC 헤더: 이더넷 등의 LAN을 사용하여 가장 가까운 라우터까지 패킷을 운반할 때 사용하는 제어 정보

네트워크 HW, 이더넷 등에서는 0과 1로 구성된 디지털 데이터를 받아서 전기 신호 상태로 바꾸어 케이블에 송출한다.

  • 신호는 허브나 라우터 등의 중계 장치에 도착하고, 이 장치가 상대가 있는 곳까지 패킷을 전달한다.
📌 IP 패킷 송수신 동작은 패킷의 역할에 관계없이 모두 같다. IP 담당 부분은 TCP 담당으로부터 받은 데이터를 그냥 하나의 바이너리 데이터로 간주하고 내용물에 대해서는 전혀 관심이 없다. 당연히 TCP의 동작 단계도 신경쓰지 않는다. 어떤 형식이든 의뢰받은 내용물을 패킷의 모습으로 만들어 상대에게 송신 및 전달하기만 할 뿐이다.

 

5-3) IP 헤더

  • 가장 중요한 것은 수신처(목적지) IP 주소(애플리케이션에서 통지된 통신 상대의 IP 주소)다. IP는 애플리케이션이 지정한 것이 잘못되었어도 그대로 송신한다. 애플리케이션 측 책임으로 간주하기 때문이다
  • 송신처 IP 주소는 사실 컴퓨터에 할당되는 것이 아니라 LAN 어댑터에 할당되므로, 복수의 LAN 어댑터가 있을 경우 한 대의 컴퓨터에 할당된 IP가 여러 개다.
    • 따라서 어느 IP 주소를 송신처 주소로 설정할 지 판단해야 한다. → 이 판단은 패킷을 건네주는 상대의 라우터를 결정하는 것과 같다.
    • 상대 라우터가 결정되면 LAN 어댑터에서 패킷을 송신해야 하는지 결정되고, LAN이 결정되면 IP 주소가 결정되기 때문이다.

패킷을 건네주는 상대의 라우터를 판단하는 방법?

  • 라우터가 IP용 표를 사용하여 다음 라우터를 결정하는 것과 같다.
  • route print 명령어
    • interface: 네트워크용 인터페이스
    • Gateway: 다음 라우터의 IP 주소
    • 넷마스크: 기본 gateway
    • 프로토콜 번호: 어디에서 의뢰받은 것인지 설정(TCP: 06, UDP: 17)

 

5-4) 이더넷용 MAC 헤더 - IP 헤더 만들고, MAC 헤더 만들어 붙이기

IP 헤더를 통해 목적지 주소를 알 수 있지만, 이더넷에는 TCP/IP 개념이 통용되지 않는다. 따라서 이더넷 패킷을 운반하기 위해서 수신처를 판단할 때 MAC 헤더를 사용한다.

 

 

  • 송신처 MAC 주소: 하나의 48비트, LAN 어댑터의 MAC 주소 설정
    • MAC 주소는 LAN을 제조할 때 그 안의 ROM에 기록한다.
  • 수신처 MAC 주소: 패킷을 건네주는 상대의 MAC 주소
    • 패킷을 건네줄 상대의 주소는 경로표 ‘Gateway’에 기록되어 있다.
  • 이더 타입: 패킷의 내용물이 무엇인지 나타냄
    • 이더타입까지가 MAC 헤더이고, 그 뒤에 이어지는 것은 패킷의 내용물
    • 이더넷의 내용물은 IP, ARP같은 프로토콜의 소켓이며, 각각에 대응하는 값이 규칙적으로 정해져 있으므로 여기에 값을 기록한다.

 

5-5) ARP로 라우터의 MAC 주소 조사한다.

상대가 자신과 같은 네트워크에 존재하면 단순히 브로드캐스트“OO라는 IP 주소 있는 분?” 이렇게 찾을 수 있다. 그럼 "저요~"하는 상대방의 MAC 주소를 MAC 헤더에 설정하면 끝이다. 

 

 ARP 캐시

  • 패킷을 보낼 때마다 "있으신 분 - 저요" 동작을 반복하면 ARP 패킷이 불어나기 때문에 ARP 캐시라는 메모리 영역에 보존하여 재사용한다.
  • ARP 캐시를 먼저 확인하고, 없는 경우에만 브로드캐스트한다.
  • 캐시에 저장된 내용은 일정 시간이 지나면 삭제된다. (오류 방지를 위해)

 이러한 MAC 주소/헤더를 붙이는 것까지 IP 담당 부분의 역할이다.

  • LAN 어댑터에 건네주기 전에 IP 담당 부분에서 패킷을 완성하면 LAN은 전송만 하면 되기 때문에 IP 쪽이 담당한다!

 

 

6. 이더넷 패킷 송수신 동작


5-6) 이더넷의 기본

 

 

 

 

 

  • MAC 헤더의 수신처 MAC 주소를 가진 상대에게 패킷을 전달한다.
  • 송신처 MAC 주소로 송신처를 나타낸다.
  • 이더 타입으로 패킷의 내용물을 나타낸다.
  • ‘이더넷’이라는 하나의 사양에 기초하여 동작하기 때문에 클라이언트, 라우터 등 상관없이 모든 기기에 공통적으로 적용된다.

 

 

 

 

 

 

 

 

5-7) IP로부터 받은 패킷(디지털 데이터)을 전기/빛의 신호로 변환하여 송신한다.

IP 패킷으로 받은 디지털 데이터를 전기 신호로 변환하는 것은 LAN 어댑터다.

  • 하지만 LAN 어댑터는 단독으로 일할 수 없고, 이를 제어하는 LAN 드라이버 소프트웨어가 필요하다. (모든 HW의 공통.. 이를 제어하는 SW가 필요함)
  • 전원 공급 → OS 시동 → 드라이버가 어댑터 초기화(MAC 주소 설정) → OK

 IP한테 패킷을 받으면 LAN 어댑터의 버퍼 메모리에 복사 후, 패킷을 송신하도록 MAC 회로에 명령을 보낸다.

 

 

5-8) 패킷에 3개의 제어용 데이터를 추가한다.

  1. 프리앰블(preeamble): 송신하는 패킷을 읽을 타이밍을 잡기 위한 것.  101110… 이라는 비트 패턴을 신호로 바꾸면 파형이 일정한 모습을 갖는다. 수신측은 신호를 수신할 때 이 파형에서 타이밍을 잡는다.
  2. 스타트 프레임 딜리미터: 패킷의 시작을 나타내는 표시
  3. FCS(Frame Check Sequence): 운반하는 도중 파형이 흐트러져 데이터가 변한 경우, 이를 검출하기 위해서 사용한다. 계산의 바탕이 된 데이터 값이 1비트라도 변화하면 달라진 값을 취하도록 고안이 되어 있다. 패킷을 운반하는 도중 잡음 등의 영향으로 데이터가 변하면, 수신측에서 계산한 FCS가 송신측과 달라진다. 이 차이를 통해 전달 과정에서 문제가 발생했음을 파악한다.

 

5-9) 허브를 향해 패킷을 송신한다.

위 세 가지를 부가하면, 케이블에 송출하는 패킷이 완성된다. 드디어 신호를 송신할 수 있는 상태가 된다!

 

[반이중 모드] 이더넷 구조를 따라 패킷이 변환되어 케이블까지 흘러가는 과정

  • 케이블에 다른 기기가 송신한 신호가 흐르고 있는지 조사하고, 끝날 때까지 기다린다. (신호 충돌 방지)
  • MAC 회로가 프리앰블의 맨 앞부터 1비트씩 차례로 전기 신호로 변환한다.
    • 이때 디지털 데이터를 신호로 변환하는 속도가 전송 속도다. →만약 1초 동안 10MB 디지털 데이터를 신호로 변환하여 보낸다면 전송률은 10MiB/초
  • 이후 변환된 전기 신호를 PHY(MAU) 신호 부분에 보낸다. 이 전기 신호를 다시 케이브렝 송출하는 형식으로 변환하여 송신한다. 즉, PHY는 MAC 회로가 송신한 전기 신호의 형식을 케이블 형시긍로 변환하기 위한 변환회로다!
    • PHY는 송신 동작만 하는 것이 아니라 수신 신호선에서 신호가 흘러들어오는지 감시한다.

*이더넷은 송신한 신호가 상대에게 완전히 도착했는지 확인하지 않는다. 이더넷은 사양에서 기기와 기기 사이를 연결하는 케이블 길이를 100m 이내로 정한다. 그래서 오류가 좀처럼 발생하지 않는다.

 

 PHY는 송신 동작만 하는 것이 아니라 수신 신호선에서 신호가 흘러들어오는지 감시한다.

  • 이때, 리피터 허브(b)를 사용한 반이중 모드의 경우에는 서로의 신호가 뒤섞여서 분간할 수 없는 상태(충돌)가 된다.
  • 그러면 송신 동작을 중단하고 충돌 사실을 다른 기기에 알리는 재밍 신호를 흘린다. 재밍 신호를 흘리고 잠시 기다렸다가 다시 송신 동작을 시도한다.
  • 스위칭 허브(c)를 사용한 전이중모드는 송수신을 동시에 실행하면서 충돌은 일어나지 않는다.

 

 

5-10) 돌아온 패킷을 받는다.

■ 리피터 허브를 이용한 반이중 동작의 이더넷에서의 동작 과정

  • 1대가 송신한 신호가 리피터 허브에 접속된 케이블 전부에 흘러간다.
  • 프리앰블, 스타트 프레임 딜리미터가 나오면 그 다음 비트부터 디지털 데이터로 변환한다. (그러니까 송신의 거꾸로)
    1. 먼저 PHY회로에서 신호를 공통 형식으로 변환하여 MAC 회로에 보낸다.
    2. MAC 회로에서 신호를 맨앞부터 차례대로 디지털 데이터로 변환하여 버퍼 메모리에 저장한다.
    3. 신호의 마지막에서 FCS 검사 ➡️ 잡음 확인
  • FCS에 문제가 없으면 MAC 헤더의 나의 MAC 주소와 비교하여 자신에게 오는 것인지 판단한다.
  • 자신에게 오는 게 맞으면 인터럽트를 통해 컴퓨터 본체에 통지한다.

인터럽트의 동작 과정

LAN 어댑터가 확장 버스 슬롯 부분에 있는 인터럽트용 신호선에 신호 전송 → 본체는 이 신호를 받고 CPU가 실행하고 있던 작업을 일시적으로 보류 → OS 내부 kernel 모드 실행 → LAN 드라이버 호출 → LAN 드라이버가 LAN 어댑터를 제어하여 송수신 동작 실행

 

 

5-11) 서버의 응답 패킷을 IP에서 TCP로 넘긴다.

■ LAN은 TCP/IP(0800)임을 확인하고 IP 부분으로 올려 보낸다. IP 담당 부분은 헤더 부분부터 조사하여 문제가 없는지 확인한다.

  • 만약 수신처 IP 주소가 잘못 적혀 있다면, ICMP라는 메시지를 사용하여 통신 상대에게 오류를 통지한다. (181p의 다양한 메시지 종류)
  • IP 헤더의 플래그를 확인해서 이 패킷이 만약 분할된 패킷(IP Fragmentation)이라면 IP 담당 부분 내부의 메모리에 일시적으로 보관한다. 그리고 같은 frag를 가진 패킷이 도착하기를 기다리고, 모든 패킷이 도착하면 각각의 패킷마다 붙어있는 offset 순서대로 원래의 모습으로 되돌린다. 이 되돌리는 동작을 리어셈블링이라고 한다.

■ 리어셈블링이 끝난 패킷을 TCP 담당 부분에 전송한다.

  • 송수신처의 ip, port를 통해 해당 소켓을 찾아 적절한 통신을 한다. (소켓에는 통신 진행 상태가 기록되어 있다.)
  • 만약 연결 끊기(FIN같은) 패킷이라면 애플리케이션에게 통지하거나 응답 패킷을 반송한다.