null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
⌂
임베디드 개발자를 위한 네트워크 기초 — IP 주소부터 PHY 레지스터까지
Structure
ip-addressing
•
공인 IP, 사설 IP, 그리고 NAT가 존재하는 이유
•
고정 IP vs 유동 IP — DHCP의 동작 원리
•
네트워크 클래스 — IP 주소를 나누는 논리
•
서브넷 마스크와 게이트웨이 — 네트워크를 쪼개는 방법
•
CIDR 표기법 — /24가 의미하는 것
•
DNS — 이름을 IP로, IP를 이름으로
mac-transmission
•
MAC 주소와 OUI — 하드웨어 식별의 기초
•
유니캐스트, 멀티캐스트, 브로드캐스트 — 전송 방식의 선택
•
멀티캐스트 MAC 주소 — IP에서 MAC으로의 변환 원리
•
VLAN — 하나의 스위치에서 여러 네트워크 분리하기
port-and-layer
•
포트(Port) — 하나의 IP에서 수천 개의 통신 채널을 분리하는 법
•
PDU — 프레임, 패킷, 세그먼트의 차이
•
OSI 7계층 vs TCP/IP 모델 — 두 모델이 공존하는 이유
physical-layer
•
NIC와 PHY — 임베디드 이더넷 하드웨어 구조
•
MDC/MDIO — PHY 레지스터를 제어하는 2-Wire 인터페이스
•
NLP, FLP, Auto-negotiation — PHY가 링크를 협상하는 방법
•
Extended Register — Clause 22의 32개 제한을 넘는 법
•
"Docker 기초 — 컨테이너의 모든 것"
•
Store-and-Forward vs Cut-through
wireshark-debug
•
Wireshark에서 IP Checksum이 0인 이유
•
"Docker Compose — 멀티 컨테이너 오케스트레이션"
•
FCS/CRC와 Wireshark의 4바이트 미스터리
•
"TypeScript 기초 — JavaScript에 타입을 더하다"
•
임베디드 이더넷 디버깅 — Wireshark 실전 사용법
Flow Structure
MDC/MDIO — PHY 레지스터를 제어하는 2-Wire 인터페이스
16 / 24
Extended Register — Clause 22의 32개 제한을 넘는 법
☆ Star
↗ Full
NLP, FLP, Auto-negotiation — PHY가 링크를 협상하는 방법
#network
#phy
#autoneg
#nlp
#flp
@devpc
|
2026-05-04 01:59:40
|
GET /api/v1/flows/23/nodes/416?fv=2&nv=1
Context:
Flow v2
→
Node v1
0
Views
1
Calls
# NLP, FLP, Auto-negotiation — PHY가 링크를 협상하는 방법 ## Auto-negotiation이란 이더넷 케이블 양쪽 끝에 서로 다른 속도/Duplex 를 지원하는 장치가 연결됐을 때, 자동으로 최적의 통신 조건을 협상하는 기능이다. ``` PHY A: 10/100/1000 Mbps Full-duplex 지원 PHY B: 10/100 Mbps Half/Full-duplex 지원 ↓ Auto-negotiation 결과: 100 Mbps Full-duplex (최대 공통 조건) ``` 협상 실패 시 link가 올라오지 않거나, 의도하지 않은 Half-duplex로 동작해 성능 저하가 발생한다. --- ## NLP (Normal Link Pulse) 10BASE-T에서 사용하는 링크 유지 신호다. - **주기**: 16ms - **펄스 폭**: 100ns - **용도**: 링크가 살아있음을 알리는 heartbeat 수신 후 150ms 내에 다음 펄스나 프레임이 없으면 링크 에러로 판단한다. 4번 연속 수신하거나 프레임을 수신하면 복구된다. --- ## FLP (Fast Link Pulse) 100BASE-TX 이상에서 NLP를 확장한 신호다. 단순한 heartbeat 역할 외에 **자신의 능력(capability)을 상대에게 광고**한다. ``` FLP 구조: 33개의 NLP로 구성 ├── 17개 Clock Pulse (동기화) └── 16개 Data Pulse (Auto-negotiation 정보 포함) 주기: 16 ± 8 ms ``` 16개의 Data Pulse가 담는 정보(Advertisement 레지스터): | 비트 | 의미 | |------|------| | [4:0] | 기술 필드 (0x01 = IEEE 802.3) | | [8:5] | 속도/Duplex 지원 목록 | | [9] | Pause 기능 | | [10] | Asymmetric Pause | | [13] | 원격 결함 감지 | | [15] | Next Page 지원 | --- ## Auto-negotiation 흐름 ``` PHY A → FLP(자신의 capability) → PHY B PHY B → FLP(자신의 capability) → PHY A ↓ 양쪽 capability의 교집합 계산 (우선순위: 1000 FD > 100 FD > 100 HD > 10 FD > 10 HD) ↓ Parallel Detection 또는 협상 결과로 링크 설정 ``` --- ## 코드에서 Auto-negotiation 설정 ```c // PHY BCR(Basic Control Register)에서 Auto-negotiation 설정 #define BCR_REG 0x00 #define BCR_RESET (1 << 15) #define BCR_AUTONEG_EN (1 << 12) #define BCR_AUTONEG_RS (1 << 9) // Restart Auto-negotiation // Auto-negotiation 활성화 + 재시작 phy_write(phy_addr, BCR_REG, BCR_AUTONEG_EN | BCR_AUTONEG_RS); // 협상 완료 확인 (BSR bit 5) #define BSR_REG 0x01 #define BSR_AUTONEG_DONE (1 << 5) #define BSR_LINK_STATUS (1 << 2) while (!(phy_read(phy_addr, BSR_REG) & BSR_AUTONEG_DONE)); // 협상 결과 확인 (PHY별 Extended Register에서) // Aurix TC3xx 예: PHYSTS 레지스터 uint16_t physts = phy_read(phy_addr, 0x10); uint8_t speed = (physts >> 1) & 0x3; // 0=10M, 1=100M, 2=1000M uint8_t duplex = (physts >> 0) & 0x1; // 0=Half, 1=Full ``` --- ## Auto-negotiation 비활성화 — 언제? 자동차 이더넷(100BASE-T1, 1000BASE-T1)은 **Auto-negotiation을 지원하지 않는다.** 단선 설계로 단순화됐기 때문이다. 속도와 마스터/슬레이브 역할을 **고정 설정**으로 지정해야 한다. ```c // 100BASE-T1: Master 모드, 100Mbps 강제 설정 (PHY 전용 레지스터) phy_write(phy_addr, EXTENDED_CTRL_REG, MASTER_MODE | SPEED_100M); ``` --- ## 정리 Auto-negotiation이 실패하는 주요 원인은 세 가지다. 1. **FLP를 수신하지 못함** — 케이블 불량, 핀 연결 오류 2. **공통 capability 없음** — 양쪽 지원 목록이 겹치지 않음 3. **협상 타임아웃** — PHY 초기화 후 충분한 대기 시간 미확보 링크가 올라오지 않을 때 MDC/MDIO로 PHY 상태 레지스터를 읽으면 어느 단계에서 멈춰있는지 파악할 수 있다.
MDC/MDIO — PHY 레지스터를 제어하는 2-Wire 인터페이스
Extended Register — Clause 22의 32개 제한을 넘는 법
// COMMENTS
Newest First
ON THIS PAGE
No content selected.