OSI 모형은 네트워크 프로토콜 디자인과 통신을 계층별로 나누어 설명한 것입니다. 개발자는 보통 L1, L2는 가볍게 넘기고 L3(네트워크 계층)부터 집중해 공부합니다. L1, L2는 전자전기학과 친구들이 ‘알아서’해주는 영역으로 치부하죠.
네트워크는 파동입니다. 구리선, 광 케이블, Wi-Fi 모두 전자기 신호로 통신 데이터가 오갑니다. 이 아날로그 신호가 내 컴퓨터에 들어오는 것부터 모든 통신이 시작합니다.
LAN선으로 들어오는 신호는 의미 있는 데이터일 수도 있고 의미 없는 노이즈일 수도 있습니다. 아무튼 아날로그 파동을 내 컴퓨터로 보내 0과 1로 만드는 것까지가 L1의 역할입니다.
아날로그 신호 수신 (CAT-5, RJ45, Magnetics)
대부분의 현대 이더넷 네트워크는 UTP(Unshielded Twisted Pair) 케이블, 즉 비차폐 연선 케이블을 사용하여 데이터를 전송합니다. 이 케이블은 여러 개의 절연된 구리선 쌍이 꼬여 있는 형태입니다. 꼬여 있는 이유는 외부의 전자기 간섭(EMI)을 줄여 신호 품질을 향상시킬 수 있기 때문입니다. UTP 케이블을 통해 데이터가 아날로그 형태의 전기적 신호로 전달됩니다.
UTP 케이블은 성능과 용도에 따라 여러 카테고리(CAT)로 구분됩니다. 100BASE-TX은 최대 100Mbps를 지원하는 CAT.5 케이블을 주로 사용합니다. CAT.5 케이블은 양쪽 끝에 RJ45 커넥터를 연결해 네트워크 장치와 물리적으로 연결합니다. 수신 측 네트워크 장치의 PHY 칩은 RJ45 커넥터를 통해 UTP 케이블로부터 아날로그 전기 신호를 받아드립니다.
PHY 칩이란 네트워크 장치에서 물리 계층을 담당하는 반도체 소자입니다.
RJ45 안에는 전기적으로 절연하고 신호 품질을 개선하고 노이즈를 억제하기 위한 변압기와 자기소자 부품이 탑재되어 있습니다. 이것을 Magnetics라 총칭합니다.
A/D Converter
아날로그-디지털 변환(ADC)이라고도 하며 아날로그 신호를 디지털 신호로 변환하는 과정입니다.
샘플링(Sampling): 아날로그 신호의 진폭을 일정한 시간 간격(샘플링 주파수) 으로 측정하여 이산값의 시퀀스를 얻습니다. 원래 신호를 정확히 담기 위해 최고 주파수의 두 배를 샘플링 주파수로 사용합니다 (나이퀴스트-섀넌 샘플링 정리). 100BASE-TX의 최대 대역폭은 31.25MHz이기 때문에 샘플링 주파수는 최소 62.5MHz를 사용해야 합니다. 실제로는 125 MHz를 사용합니다.1
양자화(Quantization): 샘플링으로 얻은 진폭 값을 미리 정한 양자화 레벨로 근사합니다. 예를 들어 양자화 레벨이 64단계(6비트)라면 -1V ~ +1V 입력을 64단계(-32~+31)으로 나누고 진폭을 반올림합니다.2
인코딩(Encoding): 양자화로 얻은 양자화 레벨을 2의 보수를 취해 이진 코드로 표현합니다. 예를 들어 6비트에서 -5 구간이라면 111011
이 되고, +6이라면 000110
이 됩니다.
DSP
DSP(Digital Signal Processor)는 디지털 신호의 왜곡을 보정하는 소자입니다.
이퀄라이저(Equalization): 물리 채널(CAT.5 케이블, RJ45, Magnetics)에서 발생하는 위상/진폭 왜곡 및 고주파 손실(ISI)을 복원하는 회로입니다. 신호의 특성에 따라 역보상 필터를 적용합니다.
BLW 보정(Baseline Wander Correction): 베이스라인이란 신호의 기준 전압, 즉 0V를 주로 의미합니다. 신호(파동)는 0V를 기준으로 위아래로 움직이죠. 베이스라인이 틀어지는 현상을 BLW라 합니다. DSP는 BLW 신호를 보정하는 회로를 갖고 있습니다.
클록/데이터 복구(Clock and Data Recovery, CDR): 전송측과 수신측의 클록은 다를 수 있습니다. 이 말은 즉, 전송측의 주파수와 수신측의 주파수가 다르다는 뜻입니다. CDR은 온전한 데이터를 추출하기 위해 전송측 신호를 수신측의 주파수에 동기화하는 회로입니다. 100BASE-TX는 100M PLL 소자에서 여러 위상의 125MHz 클록을 만듭니다. 이는 수신 측 주파수의 기준으로 사용합니다.
보정 후 DSP는 아래 기준에 따라 ADC 6비트 신호를 MLT-3 레벨(-1, 0, +1)로 변환합니다. 다만 어떻게 변환하길래 6-bit가 MLT-3이 되었는지는 잘 모르겠습니다.
MLT-3 Converter
MLT-3는 이진 코드를 3개의 전압 레벨(-V, 0, +V)로 압축하는 인코딩 방식입니다.
인코딩 방식 (이진 코드 → MLT-3)
1 비트
: 전압 레벨을 다음으로 이동 (-V → 0 → +V → 0 반복)0 비트
: 현 레벨 유지
Data를 MLT-3으로 변환하는 아래 그림을 봅시다. Data가 1일 때는 MLT-3의 레벨이 변하고 Data가 0일 때는 현재 레벨을 유지합니다. 참고로 클록이 0→1로 올라갈 때 모든 변화가 일어납니다
1111 Data를 전송하기 위해서는 클록 4주기가 필요합니다. 반면 MLT-3은 1주기로 이를 표현할 수 있습니다. (-V → 0 → +V → 0) 다시 말해, 신호의 최대 주파수를 클럭보다 ¼로 줄일 수 있습니다. 따라서 100BASE-TX는 125MHz 클럭의 ¼인 31.5MHz 만으로 데이터를 송수신할 수 있습니다.
(Source, https://en.wikipedia.org/wiki/MLT-3_encoding)
MLT-3은 Data에 연속된 0이 많으면 신호 변화가 사라집니다. 이러면 수신측 입장에서는 0이 연속되서 신호 변화가 없는지, 아니면 클록이 어긋나서 신호를 놓친 건지 알기 어렵습니다. 이 문제를 해결하기 위해 후술할 4B/5B RLL을 사용합니다.
디코딩 방식 (MLT-3 → 이진 코드)
디코딩도 마찬가지로 생각하면 됩니다. MLT-3 신호의 레벨(위상) 변화가 있으면 1, 없으면 0이 됩니다. DSP에서 넘어온 MLT-3를 디지털 신호로 바꾸어 다음으로 전달합니다.
NRZI Converter
non-return-to-zero(NRZ) 란 라인 코드 방식 중 하나로 데이터(0과 1)를 서로 다른 전압 레벨로 표현하지만 베이스라인(0V)로는 가지 않는 것이 특징입니다. 즉 전압을 +V와 -V만 갖는 방식입니다
인코딩 방식 (데이터 이진 코드 → NRZI 이진 코드)
- NRZ-L: 0과 1에 다른 전압을 할당(ex.
0 = +V
,1 = -V
) - NRZ-I or NRZI: 1이면 신호를 반전(
-V → +V
or+V → -V
)하고 0이면 상태 유지
아래는 이진 데이터를 NRZI로 인코딩한 그림입니다. 참고로 10BASE-T 표준은 NRZI 대신 Manchester 라인 코드를 사용합니다.
(Source)
디코딩 방식 (NRZI 이진 코드 → 데이터 이진 코드)
MLT-3 Converter의 산출물인 디지털 신호를 클럭 주파수에 맞추어 해석합니다. 100BASE-TX는 125MHz에 맞춰 NRZI 디지털 신호를 분할해 데이터 이진 코드로 변환합니다. 따라서 산출물은 125 Mbps 시리얼 데이터입니다.
Descrumbler and SIPO
인코딩(=Scrambler)
0이나 1이 길게 이어지는 것을 방지하고, 0과 1이 고르게 분산되록 하기 위해 기존 데이터 스트림과 난수 스트림을 XOR 합니다. 이렇게 0과 1일 고르게 분산되면 전자파 간섭(EMI)이 줄어들고 클록 복원이 쉬워집니다.
난수 스트림은 PRBS(Pseudo-random Bit Sequence)라 부르며, LFSR 회로가 생성합니다.
디코딩(=Descrumbler)
수신할 때는 동일한 PRBS를 생성해 다시 XOR하면 원래 데이터를 복원할 수 있습니다.
4B/5B 코드표를 보면 11111
이 IDLE로, 아무런 데이터도 전송되지 않는 것을 의미합니다. IDLE 신호가 연속적으로 감지해 스크램블러 시퀀스의 위치(키)를 맞춥니다. 동기화가 완료되면 키를 잠그고 수신 데이터와 키를 XOR해 원래 데이터를 복원합니다.
IEEE 802.3에서 허용하는 최대 패킷 크기인 1514 bytes 동안 IDLE 신호가 없으면 수신 작업을 중단하고 동기화 프로세스를 다시 시작합니다.
4000바이트(40μs) 동안 IDLE 심볼이 감지되지 않으면 동기화가 끊긴 것으로 간주하고, 재동기화를 시작합니다.
SIPO
125Mbps NRZI 데이터 스트림을 25MHz 5비트 병렬 데이터로 변환합니다.
4B/5B
인코딩 방식 (4비트 → 5비트)
4비트 데이터 그룹을 5비트 코드로 변환하는 블록 코딩3 방식입니다. NRZI나 MLT-3 방식에서 0이나 1이 길게 연속될 경우, 신호 전이(transition)가 없어 수신 측이 클럭을 동기화하기 어려워집니다.
이를 해결하기 위한 4비트를 5비트 코드로 매핑하는 임의의 테이블을 사용합니다. 5비트 코드로 매핑할 때는 반드시 연속된 0이 3개를 넘지 않아야하며 한 번 이상 전이가 있어야 합니다.
아래는 위 조건을 만족하는 LAN83C185 소자의 4B/5B 코드 테이블의 일부입니다.
디코딩 방식 (5비트 → 4비트)
마찬가지로 위 그림의 표를 바탕으로 5비트를 4비트로 매핑하면 됩니다. 이 경우 125Mbps 데이터 스트림을 5비트씩 끊어서 해석합니다.
MII
Media Independent Interface는 물리 계층과 2계층(MAC 계층)을 연결하는 병렬 인터페이스입니다. IEEE 802.3u에 정의되었습니다.
MAC
OSI 2계층은 아래 두 하위 계층으로 구분됩니다.
계층 이름 | 주요 역할 |
---|---|
LLC (Logical Link Control) | 상위 계층(네트워크 계층)과의 인터페이스, 다중화, 흐름제어, 에러 알림 등 |
MAC (Media Access Control) | 물리 매체에 대한 접근 제어, 프레임의 송수신, 물리주소(MAC 주소) 관리, 충돌 제어 등 |
물리 계층으로 들어온 데이터는 MII를 통해 MAC 계층에 전달됩니다. 4비트씩 들어오는 데이터는 MAC 계층의 내부 수신 버퍼(RX FIFO 등)에 저장합니다. MAC은 프레임의 끝(FCS)을 감지하면 프레임이 완전히 수신되었다 판단하고 하드웨어 인터럽트(RX Interrupt)를 발생시켜 커널에게 알립니다.
인터럽트를 받은 커널의 네트워크 드라이버는 RX FIFO에서 패킷을 읽어 메인 메모리(소켓 버퍼 등)로 복사합니다. 드라이버가 “패킷을 모두 읽었다”고 NIC에게 알리면, NIC는 해당 공간을 비웁니다.
Footnotes
-
블록 코딩이란? m개의 비트열을 n개의 비트열로 변환하는 방식 ↩