Spanning Tree – Người Điều Phối Thầm Lặng
Mỗi gói tin, khi rời khỏi một switch, đều mang theo một hy vọng rất giản dị: đi đúng đường, đến đúng nơi, rồi được phép dừng lại. Phần lớn gói tin có một cuộc đời như vậy – ngắn ngủi, lặng lẽ, chẳng ai để ý. Nhưng có những gói tin kém may mắn hơn. Vì một sợi dây nối nhầm chỗ, vì một đường dự phòng được đấu thêm cho chắc ăn mà chẳng ai kiểm soát, chúng không bao giờ được dừng lại nữa. Chúng cứ đi, gặp lại chính con đường mình vừa đi qua, rồi lại đi tiếp – lần sau nhân đôi, lần sau nữa nhân bốn – cho đến khi cả một hệ thống mạng vốn đang chạy êm ru bỗng nghẹt thở trong tiếng vọng của chính mình.
Chuyện bắt đầu đơn giản thế này. Trong một hệ thống mạng, các switch – thiết bị chuyển mạch – hoạt động chẳng khác gì những trạm bưu điện nhỏ nằm rải khắp khu phố. Khi nhận được một gói tin mà chưa rõ đường đi tiếp theo, cách an toàn nhất mà switch chọn là gửi nó tới tất cả các hướng xung quanh, ai biết đường thì tự chuyển tiếp giúp. Người ta gọi đó là broadcast – phát tán.
Bình thường thì chẳng sao cả. Nhưng vì muốn hệ thống an toàn hơn, đề phòng lỡ một sợi dây bị đứt giữa chừng, người ta thường nối hai switch bằng hai con đường thay vì một. Vấn đề nằm ở chỗ: nếu không có quy tắc nào phân định rõ con đường nào được hoạt động, con đường nào phải nhường, thì gói tin ấy – thay vì tới nơi rồi dừng lại – sẽ chạy vòng vòng mãi giữa hai lối đi, tự nhân bản, tự gửi đi gửi lại đến vô tận. Chỉ trong vài giây, hàng nghìn bản sao "ma" tràn ngập khắp hệ thống, nuốt trọn băng thông, nghẽn cứng toàn mạng. Dân kỹ thuật gọi hiện tượng đó là broadcast storm – cơn bão broadcast. Và chính cơn bão vô hình ấy đã nhấn chìm cả văn phòng sáng hôm nay, chỉ vì một ai đó, có lẽ vô tình, đã cắm thêm một sợi cáp dự phòng mà quên mất hậu quả đi kèm.
Có một điều trớ trêu: sợi dây dự phòng đó được nối thêm là vì muốn tốt cho hệ thống. Không ai ngờ chính sự cẩn thận, nếu thiếu kỷ luật đi kèm, lại trở thành nguyên nhân của sự sụp đổ. Đôi khi cuộc sống cũng vận hành y hệt vậy. Có những mối quan hệ, những kết nối ta cố giữ lại "phòng khi cần đến", nhưng nếu không biết lúc nào nên lên tiếng, lúc nào nên lặng im nhường chỗ, chính sự đa mang ấy lại khiến mọi thứ rối tung lên.
Và đây là lúc thuật toán Spanning Tree bước vào, lặng lẽ như một người điều phối giao thông xuất hiện giữa ngã tư đang kẹt cứng. Việc của nó chỉ có một: giữa mạng lưới chằng chịt những con đường nối các switch với nhau, tìm ra một bộ khung tối giản nhất, sao cho mọi điểm vẫn liên lạc được với mọi điểm, mà không còn dư một vòng lặp nào. Không thừa một sợi dây, không thiếu một kết nối. Trong toán học, người ta gọi bộ khung ấy là một cái cây – tree – một cấu trúc mà giữa hai điểm bất kỳ chỉ tồn tại đúng một con đường duy nhất, không hơn không kém.
Cách Spanning Tree tìm ra cái cây đó cũng thú vị chẳng kém, chẳng khác nào một cuộc bầu cử làng xã thu nhỏ.
Đầu tiên, tất cả các switch trong mạng cùng nhau "bầu" ra một switch làm gốc, gọi là Root Bridge – như dân làng chọn ra một điểm mốc chung, một cái đình làng, để từ đó đo khoảng cách đi lại cho cả xóm. Switch nào mang mã định danh (Bridge ID) nhỏ nhất sẽ thắng cuộc bầu cử này, chẳng cần vận động hành lang, chẳng cần tranh luận, chỉ cần một con số.
Có gốc rồi, mỗi switch còn lại tự hỏi mình một câu: "Đường nào từ tôi tới cái đình làng kia là gần nhất, ít tốn kém nhất?" Con đường ấy trở thành Root Port – cổng chính, chẳng khác gì con đường mà cả xóm vẫn quen đi để ra tới trung tâm xã. Trên mỗi đoạn đường nối hai switch với nhau, cũng sẽ có một cổng được chọn làm đầu mối chính, gọi là Designated Port, để đảm bảo đoạn đường đó chỉ có một cửa vào, một cửa ra, không ai giẫm chân ai.
Còn những con đường dư ra, những sợi dây vô tình tạo thành vòng lặp thì sao? Chúng không hề bị cắt bỏ hay vứt đi đâu cả. Chúng chỉ được đưa vào trạng thái Blocking – lặng im, đứng yên, chờ đợi. Giống hệt con đường vòng của làng, ngày thường chẳng mấy ai đi tới, nhưng nếu con đường chính kia chẳng may sạt lở, nó sẽ lập tức tỉnh giấc, nối lại mạch sống cho cả hệ thống, mà chẳng cần ai phải bắc thêm cầu, nối thêm dây gì nữa.
Để dễ hình dung hơn, thử tưởng tượng một văn phòng nhỏ có 4 switch, gọi tắt là A, B, C, D, nối với nhau thành một vòng tròn khép kín: A–B, B–C, C–D, D–A. Giả sử A có Bridge ID nhỏ nhất, nó trở thành Root Bridge. B và D nối trực tiếp với A, nên cổng hướng về A của cả hai lập tức trở thành Root Port. Riêng C, nằm xa gốc nhất, phải cân nhắc: nên đi qua B hay qua D để tới A với chi phí thấp hơn? Giả sử C chọn đường qua B. Vậy là, xét theo đường tới gốc, đoạn dây C–D trở nên dư thừa. Một trong hai đầu của đoạn dây này – phía có mức ưu tiên thấp hơn khi so về khoảng cách tới gốc – sẽ bị đưa vào Blocking, đầu còn lại vẫn giữ vai trò Designated Port như thường. Vòng tròn khép kín A-B-C-D-A giờ được "cắt" đúng một chỗ, biến thành hình chữ U mở, một cái cây đúng nghĩa, không còn vòng lặp nào cả, nhưng cả 4 switch vẫn trò chuyện được với nhau bình thường. Và nếu mai kia dây B–C chẳng may đứt, cổng đang ngủ yên giữa C và D sẽ tỉnh dậy trong tích tắc, nối lại mạch máu cho toàn hệ thống, êm ru như chưa từng có chuyện gì xảy ra.
Thuật toán này ra đời năm 1985, khi kỹ sư Radia Perlman đang làm việc tại Digital Equipment Corporation. Chuyện kể lại rằng bà giải xong bài toán chỉ trong một ngày thứ Sáu, dành hai ngày đầu tuần kế tiếp để viết tài liệu kỹ thuật mô tả thuật toán, rồi hứng chí làm luôn một bài thơ ngắn về cái cây mạng của mình, đính kèm ngay bên cạnh – một chi tiết hiếm thấy giữa giới kỹ thuật vốn khô khan, chuộng số liệu hơn vần điệu. Bà từng kể vui rằng chính vì giải pháp của mình quá đơn giản, quá gọn gàng, nên không ít đồng nghiệp thời đó còn hoài nghi nó có xứng đáng được xem là một phát minh lớn hay không, trong khi những thiết kế rối rắm, khó hiểu của người khác lại dễ được tung hô là "thiên tài" hơn nhiều. Sự đơn giản, hoá ra, đôi khi lại là thứ khó đạt được nhất.
Ngày ấy, quá trình "tỉnh giấc" của con đường dự phòng có thể mất tới 30-50 giây. Nghe thì ngắn, nhưng với một hệ thống đang gánh hàng trăm giao dịch mỗi giây, 30 giây tê liệt chẳng khác nào cả thế kỷ trôi qua. Về sau, người ta cải tiến thành RSTP – Rapid Spanning Tree Protocol – rút thời gian ấy xuống chỉ còn vài giây ngắn ngủi. Cũng như trong đời sống, phản xạ càng nhanh, tổn thất càng nhẹ.
Nhìn lại, cái hay của Spanning Tree không nằm ở độ phức tạp của nó – thật ra thuật toán này khá gọn gàng, sinh viên năm hai ngành mạng máy tính nào cũng học được. Cái hay nằm ở triết lý phía sau: đôi khi, để một hệ thống, một tập thể, hay một mối quan hệ vận hành trơn tru, không cần tất cả các kết nối phải hoạt động cùng một lúc. Chỉ cần một bộ khung đủ vững, biết rõ ai là gốc, đường nào là chính, và biết âm thầm giữ lại vài lối đi dự phòng, sẵn sàng tỉnh giấc đúng lúc cần đến.
Lần tới, nếu bạn ngồi trong văn phòng, mở trình duyệt lên và mọi thứ chạy êm ru như chưa từng có chuyện gì xảy ra, hãy nhớ rằng đâu đó dưới lớp vỏ dây cáp và ánh đèn LED nhấp nháy kia, có một cái cây vô hình đang âm thầm giữ cho cả khu rừng mạng không rối loạn. Chẳng ai vỗ tay cho nó cả. Nhưng nó vẫn ở đó, mỗi ngày, lặng lẽ làm công việc thầm lặng nhất: giữ cho mọi kết nối luôn có ý nghĩa, và không bao giờ để bất cứ điều gì quay lại cắn đuôi chính mình.