II-I IP와 이더넷의 패킷 송수신 동작
1% 네트워크 원리 을 읽고 정리한 문서입니다 ;)
IP와 이더넷의 패킷 송수신 동작
패킷의 기본
패킷은 헤더와 데이터의 두 부분으로 구성된다.
헤더가 붙은 이상, 상위 계층에서 받은, 그 뒤에 붙은 데이터는 그저 바이너리 데이터로 보기 때문에, 이 것이 어떠한 프로토콜이든, 오류가 있던 전혀 상관하지 않고, 그저 이 데이터의 타입만 헤더로 적어놓게 된다.
패킷의 헤더를 조사하면 패킷의 목적지를 판단할 수 있고, 이 주소는 라우팅 테이블과 조합되면 어느 케이블로 가야 하는지를 알 수 있기에, 다음 중계 장치로 도착할 수 있는 것이다.
이렇게 요청을 보내면 거의 같은 경로로 회답 패킷이 오가는 것이 일반적이므로, 송수신 측을 구분하기보다는 둘 다 엔드 노드로 보는 것이 일반적이다.
허브는 이더넷의 규칙에 따라 패킷(프레임)을 운반하고, 라우터는 IP의 규칙에 따라 패킷을 운반한다.
이를 다시 말하자면, TCP/IP의 패킷에는 MAC 헤더 (이더넷용 헤더) 와 IP 헤더 가 붙어 있다.
먼저, 송신처에서 패킷의 목적지가 되는 액세스 대상 서버의 IP 주소를 IP 헤더의 수신처에 기록한다.
이 목적지 IP가 어느 방향에 있는지를 조사하고, 그 방향에 있는 다음 라우터를 조사한다. 이후, 이 패킷을 이더넷 계층 (데이터링크 계층) 에 의뢰하게 되는데, 이 때 그 라우터의 MAC 주소를 조사하여 이를 MAC 헤더에 기록하여 전달한다.
이렇게 해서 패킷을 전달하면, 만일 허브 장비인 경우 패킷의 MAC 목적지를 해석하여 올바른 목적지로 중계하게 되고, 만일 라우터인 경우에는 IP헤더의 목적지를 조사하여 이를 라우팅 테이블과 비교함으로서 다음 라우터를 정하고, 그 MAC 주소를 MAC 헤더에 기록하여 패킷을 전송한다.
IP의 의뢰를 받아 패킷을 전송할 수 있는 프로토콜이라면 모두 호환이 되게끔, IP와 이더넷 계층이 분리된 것이다.
패킷 송수신의 개요
패킷 송수신의 출발점은 TCP 담당 부분이 데이터에 조각에 TCP 헤더를 부가한 것을 IP 담당 부분에 전달하는 것으로 시작된다. 이와 동시에 통신할 상대방의 IP 주소를 알려준다.
IP 헤더는 IP 목적지까지 패킷을 전달하는 데 사용하는 제어 정보가 기록된다.
MAC 헤더는 이더넷 등의 LAN 을 사용하여 가장 가까운 라우터까지 패킷을 운반하는 제어 정보가 기록된다.
최종적으로 LAN 어댑터에 건네줄 때의 패킷의 모습은 0이나 1의 비트가 이어진 디지털 데이터이다.
수신처 IP 주소를 기록한 IP 헤더를 만든다
IP 헤더에서 가장 중요한 부분은 수신처 IP 주소이다. 이는 결국 본래 어플리케이션 계층으로부터 통지되어 내려와진 통신 상대의 IP 주소이다.
또한, 송신처 IP 주소또한 설정되어야 하는데, 이는 라우팅 테이블을 기준으로 송신될때 쓰일 LAN 카드에 할당된 IP주소가 된다.
이후 프로토콜 번호도 명시하여, 이 뒤에 붙은 데이터가 어떤 형식의 데이터인지를 표시하여, 추후 수신될 때 어떤 식으로 해석해야 하는지를 명시해준다.
이더넷용 MAC 헤더를 만든다
IP 헤더를 만들었다면, 그 앞에 MAC 헤더를 만든다. 이는 이더넷의 수신처 판단 구조로 사용하는 것이다.
이더 타입 이라는 항목에 뒤에 붙은 데이터가 어떠한 내용물인지 타입을 명시하며, 이는 IP 프로토콜인지, ARP 프로토콜인지, IPv6인지 등이 될 수 있다.
송신처 MAC 주소란에는 LAN 어댑터의 ROM에 기록된 MAC 주소가, 최초 초기화 시 MAC 회로에 설정되는데, 이것이 기록된다.
수신처 MAC 주소란에는 이 패킷을 전달받을 다음 기기의 MAC 주소가 들어가야 하는데, 이는 라우팅 테이블을 기반으로 어떤 기기에 전달되어야 할지를 안 다음, 그 IP 주소로부터 MAC 주소를 얻어오는 동작을 수행하는데, 이는 ARP 프로토콜 을 이용하여 브로드캐스팅함으로서 얻어낼 수 있다.
MAC 헤더를 만들고 관리하는 것은 IP 계층의 담당 범위 밖이라고 볼 수 있지만, LAN 어댑터가 하는 일을 줄이고 IP 이외의 패킷 또한 하나의 LAN 어댑터로 대응시킬 수 있기 때문에 이 계층에서 수행된다.
- 이는 L3에서 L2 의 헤더를 만들어준다는 느낌보다는, L2에 전달해 주는 것들을 그대로 L2에서 헤더로 쓰는 느낌으로 보는 것이 많다. 직접 그 데이터 앞에 헤더를 붙여 데이터를 쏘는 것은 L2 이기 때문.
이더넷의 기본
이더넷에서는 다수의 컴퓨터가 여러 상대와 자유롭게 적은 비용으로 통신하기 위한 기술이며, 네트워크 전체에 신호가 흐르기 때문에 수신처 주소를 기반으로 해당하는 기기는 패킷을 수신하고, 다른 기기는 패킷을 폐기한다. 이 때 폐기하지 않고 모두 수신하는 동작을 promiscuous (무차별 모드) 라고 한다.
하지만, 이더넷이 원형 구조에서 리피터 허브 (더미 허브), 스위치 허브로 변화함에 따라, MAC 주소에 알맞는 기기로만 패킷이 전달되게끔 이더넷 구조가 바뀌어왔다.
이렇게 변화가 있더라도, 수신처 MAC 기기에게 패킷을 전달하고, 송신처 MAC 주소로 송신처를 나타낸 후 이더 타입으로 내용물 타입을 알리는 대전제가 있다면 이더넷이다.
IP 패킷을 전기나 빛의 신호로 변환하여 송신한다.
디지털 데이터를 전기나 빛의 신호로 변환하여 네트워크 케이블에 송출하는 것은 LAN 어댑터가 담당한다.
LAN 어댑터는 전원이 들어오면 ROM 에 저장된 MAC 주소를 MAC 회로에 설정하는 작업을 진행한다.
이후 IP 담당 부분에서 패킷을 받으면, 이를 어댑터 내부의 버퍼 메모리에 복사하고, 패킷을 송신하도록 MAC 회로에 명령을 보낸다.
MAC 회로는 이 패킷을 메모리에서 추출해와서 프리앰블과 스타트 프레임 딜리미터, 그리고 트레일러로서 프레임 체크 시퀀스 (FCS) 를 추가한다.
프리앰블은 0101…이 56번 존재하는 비트열이고, 이는 수신측이 신호를 수신할 때 이 파형에서 클록 타이밍을 잡을 수 있게 해주기 위함이다.
스타트 프레임 딜리미터는 프리앰블을 읽다가 실제 패킷 데이터가 시작함을 알려주는, 특별한 8비트짜리 비트열이다.
디지털 데이터를 그저 전기 신호로 나타낸다면, 0이나 1이 이어질 때 신호의 변화가 없어지기에, 이를 주기적으로 0과 1을 반복하는 클록과 합성시켜서 데이터를 보내게 된다.
끝 부분에 추가한 FCS 는 보낸 데이터에 특별한 계산식을 통해 얻어낸 32비트짜리 값이며, 만일 수신측이 계산해낸 FCS 값과 다르다면, 이는 송수신 과정에 문제가 생긴 것이므로 해당 패킷을 폐기한다.
허브를 향해 패킷을 송신한다
케이블에 데이터를 송신할 때는 리피터 허브 (더미 허브) 가 사용하는 반이중 통신과, 스위치 허브가 사용하는 전이중 통신을 통해 데이터를 전송한다.
LAN 어댑터에서 MAC 회로가 디지털 데이터를 1비트씩 차례로 전기 신호로 변환하여 PHY 또는 MAU 라는 송수신 신호 부분에 보낸다. 이 때 디지털 데이터를 전기 신호로 변환하는 속도가 해당 랜 어댑터의 전송 속도가 되는 것이다.
반이중 통신에서는 한 케이블이 한 시점에 송신이나 수신만 할 수 있는데, 만일 송신을 하려 했을 때 수신중이었다면 수신이 완료될 때까지 대기한 후 다시 시도하게 된다.
이후 송신 동작을 하다가 만일 수신 상태가 된다면, 서로의 신호가 뒤섞여서 분간할 수 없는 상태가 되므로, 이 때는 충돌했다고 보고 충돌이 일어났다는 재밍 신호를 발송하고 송신 동작을 다시 시도한다. 각 기기들은 MAC 주소를 바탕으로 계산된 난수를 바탕으로 서로 다른 시간동안 대기하게 된다.
돌아온 패킷을 받는다
케이블을 통해 받는 신호의 맨 앞에는 프리앰블이 있을 것이고, 이로부터 타이밍을 계산해나갈 수 있다. 이후 스타트 프레임 딜리미터가 나오면, 그 다음 비트부터 디지털 데이터로 변환한다. 이를 LAN 어댑터에서 버퍼에 저장시키고, FCS 값 검증을 거친 뒤, MAC 헤더의 MAC 주소가 자신이 맞는지를 확인한다.
이후 랜 어댑터는 패킷을 받은 사실을 OS 에 통지하게 되는데, 이는 인터럽트를 이용하게 된다. 확장 버스 슬롯에 있는 인터럽트용 신호선에 신호를 보냄으로서, CPU 가 이 패킷 처리에 대한 작업을 곧바로 진행할 수 있도록 만들어 준다.
CPU가 랜 드라이버를 동작시킴으로서, MAC 헤더에 있는 타입에 따라 프로토콜을 판별하고, 이 프로토콜에 맞는 OS의 프로토콜 스택에 패킷을 건네준다.
서버의 응답 패킷을 IP에서 TCP로 넘기다
위 과정을 거치면, TCP/IP 프로토콜 스택은 패킷을 받아 IP헤더 부분부터 조사를 시작한다.
우선 수신처 IP 주소가 자신의 IP가 맞는지를 검사하고, 만일 이상이 있다면 ICMP라는 메시지를 사용하여 통신 상대에게 이상이 있었음을 통지한다.
IP 프로토콜에서는 여러 라우팅 기기 등을 통해서 전달이 될 때, 기기의 제약에 맞추기 위해서 패킷을 분할하는 경우가 존재하기 때문에, 플래그 항목을 참조하여 패킷이 분할된 상태인지를 확인한다.
만일 분할된 패킷이라면, 같은 ID 정보를 가진 패킷들을, 프래그먼트 오프셋에 따라 버퍼에서 대기시키고 재조립시키는 리어셈블링 과정을 거치고, TCP 담당 부분에 전달하게 된다.
정리
- TCP/IP의 패킷에는 IP 주소 체계의 IP 헤더와, MAC 주소 체계의 이더넷 MAC 헤더가 붙어있다.
- 목적지 IP로 향하려면 어느 방향으로 가야 할지는 라우팅 테이블을 참조하여 알아내고, 여기에 ARP 프로토콜을 사용하여 다음 기기의 MAC 주소 또한 알아낸다.
- LAN 어댑터는 패킷에 프리앰플, 스타트 프레임 딜리미터, 프레임 체크 시퀀스를 추가하고, 실제 신호 전송은 클럭을 합성하여 보낸다.
- IP 계층에서는 데이터를 여러 개로 나누어서 보낼 수도 있는데, 이는 IP 헤더의 플래그와 ID 정보, 프래그먼트 오프셋을 기반으로 리어셈블링 작업을 추가로 요구하게 된다.
'공부한 이야기 > 네트워크' 카테고리의 다른 글
1% 네트워크 V : 서버측의 LAN에는 무엇이 있는가 (0) | 2023.04.29 |
---|---|
1% 네트워크 III : 케이블의 앞은 LAN 기기였다 (0) | 2023.04.29 |
1% 네트워크 II : TCP/IP의 데이터를 전기 신호로 만들어 보낸다 (0) | 2023.04.29 |
1% 네트워크 I : 웹 브라우저가 메시지를 만든다 (0) | 2023.04.29 |
모두의 네트워크 IX : 무선 랜 이해하기 (0) | 2023.04.29 |