配線架與結構化布線(patch panel / structured cabling)¶
dc-30b 算了電纜走哪條槽,這張補上電纜兩端接到什麼:配線架是一塊「被動、沒有 IP、卻決定整條連線長什麼樣」的面板。它把一條連線切成「固定的長線(permanent link)」加「可換的跳線(patch cord)」,使資料中心的網路變更變成在配線架上拔插跳線,而不是重拉線。對資料模型來說,它是 NetBox FrontPort / RearPort 的原型,也是「連線」不等於「一條線」的第一個實例。
六格¶
拓撲位置¶
伺服器 NIC →(跳線)→ 機櫃內/列尾配線架 →(水平固定線,走 dc-30b 的線槽)→ 區域或水平配線區的配線架 →(跳線)→ 交換器。TIA-942 的空間命名:MDA(主配線區,放 main cross-connect)、HDA(水平配線區,放 horizontal cross-connect)、ZDA(區域配線區,放 zone outlet 或 consolidation point)、EDA(設備配線區,放機櫃)。
容量單位¶
埠數(口/U)與長度預算(m)。長度是主要約束:固定線 ≤ 90 m、含跳線的 channel ≤ 100 m(銅纜通用上限;Cat 8 只有 30 m,見下)。機櫃空間以 U 計,由 dc-29 的 Rack 管。
冗餘表達¶
沒有 N+1,冗餘靠拓撲:TIA-942 支援星形拓撲加選配的區間冗餘。2N 的兩路若走同一個配線架/同一條線槽,路由並不獨立——這是 dc-30b 的 route_independence 往上延伸一層(配線架本身也要算進路由)。
遙測介面¶
配線架本身沒有遙測。連線是否存在只能靠兩端設備的 link 狀態(SNMP/LLDP,→ dc-43)與人工盤點對帳。標示標準 TIA-606-A 被 TIA-942 建議遵循(來源只說「建議遵循」,內容未取得)。
故障域¶
一個配線架掛掉(實際是被人誤拔、被誤標)→ 該面板所有埠。更常見的是標示錯誤造成的人為故障:跳線插錯口,拓撲圖還以為是對的。
維護特性¶
變更頻繁(每次上架/下架/換交換器)。每次變更是一次沒有工單就會悄悄發生的資料漂移:資料庫說 A 口接 X,現場是 B 口。維護的重點是對帳,不是保養。
關鍵數字與計算¶
(1) permanent link、channel 與跳線降額¶
- 標準情境(多源一致):固定線 90 m + 兩端跳線合計 10 m = channel 100 m。
- 降額(來源:Fluke,轉述 TIA-568.2-D):28 AWG 細跳線導體電阻大、衰減高,固定線上限要打折:
代入:
| 跳線合計 | 計算 | perm_max | channel 總長 |
|---|---|---|---|
| 6 m | 102 − 11.70 = 90.30 → 封頂 90 | 90 | 96 |
| 10 m | 102 − 19.50 | 82.5 | 92.5 |
| 15 m | 102 − 29.25 | 72.75 | 87.75 |
注意 Fluke 文章把 15 m 那列寫成「73 m」。72.75 四捨五入成 73 就超標了:固定線必須往下取整(floor),不能四捨五入。這是資料模型裡一個真實的「舍入方向」約束。
(2) Category 8 的 30 m¶
來源:Telegärtner。Cat 8 channel 上限 30 m = 24 m 水平線 + 兩端各最多 3 m 跳線,且最多 2 個連接點(2-connector channel)。比 Cat 6A 的 100 m 小得多,所以 25/40GBASE-T 只適合機櫃列內、交換器到伺服器的短距離。實例:24 + 3 + 3 = 30 剛好 OK;水平 25 m 就 31 > 30,違規;多插一個配線架(3 個連接點)也違規。
(3) ZDA 與直連¶
- ZDA 內不得有 cross-connect、一條水平線路徑上最多一個 ZDA、ZDA 最多 144 個連接(來源:IEEE 802.3 簡報轉述 TIA-942 原版;942-C 是否沿用未驗證)。
- 直接連(DAC 等)只適用於同一機櫃或相鄰機櫃(來源:cablinginstall 轉述 TIA-942-C 指引),其餘要走結構化布線。
(4) 空間估算(假設數字,非標準值)¶
24 台伺服器 × 每台 2 個銅纜口 = 48 口。設 24 口/U(假設),需 2U 配線架。cablinginstall 提到「十個地板下配線箱可省出 40U=一整個機櫃」,意思是配線架的 U 數是真實的機櫃空間成本,要回寫 dc-29 的 Rack。942-C 另要求放交換器的區域機櫃寬至少 800 mm(舊版 600 mm 對高密度跳線不實用)→ RackType.width_mm 要能約束。
來源分歧與疑點¶
- 「100 m」不是通用常數:Wikipedia 說 90 m + 合計 10 m 跳線;IEEE 簡報說 channel 含設備跳線 100 m;Fluke 說有降額公式,channel 可以是 92.5 或 87.75。三者在標準情境不衝突,但跳線不是標準情境時結論不同。
- cross-connect / interconnect 的定義:IEEE 簡報的摘要把 interconnect 描述成「配線區內連接主動設備的點」,與業界常見用法(interconnect=設備直接接到配線架、不經第二組跳線)不同;因為是 AI 摘要轉述,暫不採用,兩者差在 channel 內的連接點數,要看 TIA-568 原文。
- 連接點怎麼算(設備端插孔算不算)本卡來源都沒說,Cat 8 的「2 個連接」依 Telegärtner 的字面。
- Fluke 的 28 AWG 跳線「<15 m」 與它自己的 15 m 範例互相矛盾;練習用 ≤ 15。
- TIA-568、TIA-942-C、ISO/IEC 11801 原文皆未取得;ISO 系統另有 Cat 8.1/8.2(Class I/II),8.2 的連接器與 RJ45 不相容。先問 facility 採哪一套標準(TIA/ISO/EN 50173),不要把任一套的數字當通用。
常見誤解¶
以為 100 m 就是「一條網路線的最大長度」,但實際上 90 m 是固定線、100 m 是含跳線的 channel,而且跳線換成 28 AWG 或拉長就要降額,Cat 8 更只有 30 m——資料庫只存「Cable.length」會讓三種情況混成同一個數字。
以為配線架是被動的,不需要建模,反正兩端設備都有記錄,但實際上它是路徑的中繼點——前埠到後埠的對應是資料(NetBox 的 rear_port_position),一個 12 芯 MPO 後埠可以對應 12 個 LC 前埠;兩端面板若位置對應不一樣(反轉),A 面板的 LC3 會出現在 B 面板的 LC10。不建模就追不到「這條連線另一頭到底在哪」。
以為機櫃之間直接拉條跳線或 DAC 最省事,但實際上直連只限同機櫃或相鄰機櫃,跨列要走結構化布線;否則每次搬機櫃都要重拉一條不在任何圖上的「野線」,而且它也不在 dc-30b 的線槽填充計算裡。
對資料模型的意涵¶
- Panel 是 Device,有
RearPort(positions)與FrontPort(rear_port, rear_port_position)(NetBox 官方模型)。約束:rear_port_position∈ [1, positions],且(rear_port, position)對每個 front port 唯一。MPO 卡匣是 positions = 12 的後埠。 - Channel 是推導物件,不是欄位:沿
Cable→ 後埠 → 位置 → 前埠 →Cable走完整條路徑,累加「固定線長、跳線長、跳線 AWG、連接點數」。Cable要補kind(patch/horizontal/trunk)、awg(跳線導體規格)、category;規格不明則UNDETERMINED,不補預設值。 - 規則表帶來源:
ChannelRule(standard, category, max_total_m, max_perm_m, max_connections, derate_formula),每個數字用 dc-30 的Sourced包起來,24 AWG 跳線 > 10 m 這種來源沒說的情況回UNDETERMINED,不回OK。舍入規則寫進程式(floor)。 - 對 dc-29/dc-30b 的回寫:配線架佔
Rack的 U(1U 24 口是假設值,存在PanelType.ports_per_u);RackType.width_mm ≥ 800對「放交換器的機櫃」是約束;水平Cable.route的路徑長度加兩端餘量必須 ≤perm_max——線槽的實體長度終於跟長度預算接上。 - 告警規則:
CHANNEL_TOO_LONG、CONNECTOR_COUNT_EXCEEDED、DIRECT_ATTACH_NOT_ADJACENT、ZDA_OVER_144、PATCH_MISMATCH(現場 link 與資料庫對不上,靠 LLDP 比對)。
該問 facility 的問題¶
- 本站布線依哪一套標準(TIA-568/942、ISO/IEC 11801、EN 50173)?跳線是 24 AWG 還是 28 AWG?
- 配線架放在機櫃頂(TOR)、列尾(EOR)還是有獨立的 HDA/ZDA?ZDA 一個服務幾個機櫃?
- 標示是否遵循 TIA-606 之類的規則,誰負責對帳,多久一次?
動手練習(30–40 分鐘)¶
新建 channel.py,接 dc-30b 的 pathway.py(Check 沿用,這裡為獨立執行放精簡版;水平線長度預算就是 Cable.route 的實體長度)。先寫長度預算,再寫前後埠追蹤,最後用 trace 找出反轉面板的對端。
import math
from dataclasses import dataclass
from enum import Enum
class Check(Enum): # 與 dc-30b 同一個
OK="ok"; VIOLATED="violated"; NOT_APPLICABLE="not_applicable"
INVALID="invalid"; UNDETERMINED="undetermined"
def derated_perm_max(cord_m: float, awg: int) -> float | None: ... # 28: 102−1.95L 封頂 90,floor 到 0.01;24: ≤10 m → 90;其餘 None
def check_channel(perm_m, cord_m, awg) -> Check: ... # 28 AWG 跳線 >15 m → VIOLATED;None → UNDETERMINED
def check_cat8(perm_m, cord_m, connections) -> Check: ... # 總長 ≤30 且連接點 ≤2
def check_zda(connections, zdas_in_run, has_cross_connect) -> Check: ... # ≤144、≤1 ZDA、無 cross-connect
def check_direct_attach(row_a, idx_a, row_b, idx_b) -> Check: ... # 同列且相鄰
@dataclass
class Panel:
name: str
rear: dict # 後埠名 -> positions
front: dict # 前埠名 -> (後埠名, position)
def validate(self) -> Check: ... # 越界或 (rear,pos) 重複 → INVALID
def front_at(self, rear, pos) -> str | None: ...
def trace(start_panel, start_front, trunks, panels): ... # trunks: [((panel,rear),(panel,rear),length_m)]
# 回 (終點面板, 終點前埠, 固定線長) 或 None
驗收表(已用參考實作跑過)¶
| # | 輸入 | 期望輸出 |
|---|---|---|
| 1 | check_channel(90,10,24) |
OK |
| 2 | check_channel(90,6,28);derated_perm_max(6,28) |
OK;90.0(90.3 封頂) |
| 3 | check_channel(90,10,28);derated_perm_max(10,28) |
VIOLATED;82.5 |
| 4 | check_channel(82.5,10,28) |
OK |
| 5 | check_channel(73,15,28) / (72.75,15,28) |
VIOLATED(Fluke 的 73 超標)/ OK |
| 6 | check_channel(60,12,24) |
UNDETERMINED(來源沒說) |
| 7 | check_channel(70,16,28) |
VIOLATED(跳線 >15) |
| 8 | check_cat8(24,6,2) / (24,6,3) / (25,6,2) |
OK / VIOLATED / VIOLATED |
| 9 | check_zda(144,1,False) / (145,1,False) / (100,2,False) / (100,1,True) |
OK / VIOLATED / VIOLATED / VIOLATED |
| 10 | check_direct_attach("A",3,"A",4) / ("A",3,"A",5) / ("A",3,"B",3) |
OK / VIOLATED / VIOLATED |
| 11 | A:LC1..12 → MPO1 位置 1..12;B:LC(13−i) → MPO1 位置 i;重複對應;越界對應 |
OK、OK、INVALID、INVALID |
| 12 | A–B 與 A–C 兩條 80 m 幹線;trace("A","LC3",…) 走 B/走 C/無幹線;trace("B","LC10",…) |
("B","LC10",80.0)/("C","LC3",80.0)/None;("A","LC3",80.0) |
第 5 列同一個 73 m,四捨五入看是 OK、floor 看是違規;第 12 列同一條幹線,終點是 LC10 還是 LC3 取決於面板的對應表——沒有把對應存成資料就沒有答案。
加分題:(a) 把 dc-30b 的 Cable.route 接進來:perm_m = sum(pathway.length_m) + 兩端餘量,超過 derated_perm_max 時吐 CHANNEL_TOO_LONG;(b) 讓 Panel 帶 ports_per_u,呼叫 dc-29 的 Rack.mount,並在機櫃寬 < 800 mm 且機櫃裝了交換器時吐 RACK_TOO_NARROW。
自我檢核¶
Q1. 跳線是 28 AWG、兩端合計 12 m,固定線最長多少?
答案
102 − 1.95 × 12 = 102 − 23.4 = 78.6 m(低於 90 的封頂)。channel 總長 90.6 m。若要在 12 m 跳線下用到 90 m 固定線,就得改用 24 AWG——但 24 AWG 超過 10 m 時本卡來源沒給數字,應回 UNDETERMINED 去查原文,而不是照 90 m 放行。
Q2. 為什麼 A 面板的 LC3 追到 B 面板是 LC10?資料庫要存什麼才能追得到?
答案
因為 B 面板的前埠到後埠位置的對應是反轉的(LC(13−i) → 位置 i),位置 3 的前埠是 LC10。要存的是每個面板的 FrontPort.rear_port 與 rear_port_position,並驗證 (rear_port, position) 唯一且在 [1, positions] 內;追蹤時依「後埠+位置」換面板的前埠,不是依「名稱相同」。
Q3. 這張卡會讓你的資料模型長出什麼欄位?
答案
(1) Cable.kind / awg / category,Panel 的 RearPort.positions 與 FrontPort.rear_port_position(唯一約束);(2) ChannelRule(standard, category, max_total_m, max_perm_m, max_connections, derate_formula),數字用 Sourced,來源沒說回 UNDETERMINED,降額後固定線往下取整;(3) PanelType.ports_per_u 與 RackType.width_mm ≥ 800 的約束;(4) CHANNEL_TOO_LONG、CONNECTOR_COUNT_EXCEEDED、DIRECT_ATTACH_NOT_ADJACENT、ZDA_OVER_144、PATCH_MISMATCH 五種告警。