BFD (Bidirectional Forwarding Detection)

Hi all! Hôm nay chúng ta sẽ cùng thảo luận về BFD, một chức năng hữu hiệu hỗ trợ các giao thức khác như OSPF, VRRP, LDP…

BFD là một giao thức giúp nhanh chóng phát hiện lỗi trên link (cỡ micro-second). Những giao thức phổ biến như OSPF, EIGRP, BGP… đều có phương thức phát hiện link lỗi với cơ chế trao đổi bản tin và timer riêng. Tuy nhiên, thời gian phát hiện lỗi của chúng khá thấp (cỡ second), vì vậy khi có sự cố, thời gian hội tụ lâu hơn. Nếu sử dụng BFD làm giao thức phát hiện link lỗi, thời gian phát hiện sẽ được rút ngắn, nhờ đó giảm thời gian hội tụ, giảm mức độ ảnh hưởng tới dịch vụ.

BFD chạy độc lập với các giao thức khác. Dữ liệu mà BFD trao đổi được đóng trên lớp Network, vì vậy dữ liệu của BFD được coi là data-plane và không làm ảnh hưởng đến hoạt động của các giao thức dùng chung. Cũng nhờ đó, BFD giúp phát hiện link lỗi ở mức data-plane, đảm bảo phản ánh đúng nhu cầu người sử dụng.

1. Chế độ hoạt động của BFD

BFD có 2 chế độ hoạt động, Asynchronous mode, Demand mode và Echo mode.

Asynchronous mode

Trong chế độ này, hệ thống sẽ định kỳ gửi bản tin BFD Control đến thiết bị đầu xa (tạm gọi là hàng xóm BFD). Hàng xóm BFD sẽ có trách nhiệm lắng nghe các bản tin BFD Control này, nếu sau một khoảng thời gian Detection Timer mà nó không nhận được bất kỳ bản tin nào, nó sẽ coi BFD session này đã chết và thực hiện các hành động do người quản trị định nghĩa.

Demand mode

Khác với Asynch mode, Demand mode không gửi định kỳ bản tin BFD Control đến hàng xóm để kiểm tra trạng thái đường truyền. Thay vào đó, nó sử dụng phương pháp thăm dò, mỗi khi cần kiểm tra, nó sẽ gửi ra một bản tin yêu cầu đầu xa phản hồi. Nếu sau 1 thời gian không nhận được phản hồi, router sẽ coi BFD session này đã chết. Thiết bị của Cisco (và một số vendor khác) hiện không hỗ trợ demand mode, vì vậy trong khuôn khổ bài viết này sẽ không nhắc đến chế độ này.

Cả AsynchDemand mode đều hỗ trợ chức năng Echo mode. Khi thiết lập chức năng này, thiết bị sẽ gửi ra gói tin BFD Echo. Đầu bên kia khi nhận được gói tin BFD Echo sẽ gửi tra về mà không xử lý thông tin gì. Nếu bên gửi đã gửi gói Echo đi, mà sau đó không nhận được gói Echo trả về, nó sẽ coi BFD session này đã chết.

2. Hoạt động của BFD

bfd_state_machine.PNG

Sơ đồ luân chuyển trạng thái trong BFD

Một router chạy BFD có 3 trạng thái, trong đó có 2 trạng thái sử dụng để thiết lập session (Init và Up) và trạng thái còn lại để ngắt session (Down). Cả thiết lập và ngắt session đều sử dụng phương pháp 3-way hand-sharke. Ngoài ra ta còn có thể định nghĩa thêm trạng thái Admin down để mô tả cho việc BFD session bị ngắt do người quản trị cấu hình.

Các router BFD trao đổi thông tin trạng thái với nhau thông qua trường state (sta) trong bản tin BFD Control.

Down state

Trạng thái ban đầu của một router khi bật BFD là Down. Ở trạng thái này, router sẽ hiểu BFD session đang Down. Ở trạng thái này, router sẽ gửi bản tin BFD Control với nội dung sta = Down đến out-interface được cấu hình BFD.

Đồng thời, khi ở trạng thái Down, router cũng sẽ lắng nghe bản tin BFD Control từ hàng xóm.

  • Nếu nhận được 1 bản tin BFD Control từ hàng xóm cũng với sta = Down thì nó sẽ nhảy lên trạng thái Init để chuẩn bị thiết lập các tham số về BFD (Timer, Discriminator…).
  • Nếu bản tin BFD Control có sta = Init, router sẽ nhảy thẳng lên trạng thái Up.

Init state

Ở trạng thái này, router sẽ hiểu là nó đang tạo kết nối BFD đến con router ở xa. Router sẽ gửi bản tin BFD Control với sta = Init đến out-interface được cấu hình BFD, đồng thời lắng nghe bản tin BFD Control từ xa gửi tới:

  • Nếu gói tin gửi tới có sta = Init hoặc Up, BFD sẽ nhảy lên trạng thái Up.
  • Nếu gói tin gửi tới có sta = Down, điều đó có nghĩa router đầu xa chưa sẵn sàng kết nối. Vì vậy BFD sẽ vẫn giữ nguyên trạng thái Init chờ con đầu xa sẵn sàng.
  • Nếu hết thời gian Detection time mà router không nhận được thông tin gì, nó sẽ hiểu kết nối đến con đầu xa đã bị chết. Vì vậy BFD sẽ bị nhảy lại trạng thái down.

Up state

Up state được hiểu là phiên BFD đã được thiết lập đầy đủ, kết nối giữa 2 thiết bị đang làm việc tốt. Ở trạng thái này, router sẽ lắng nghe trạng thái của hàng xóm thông qua bản tin BFD Control:

  • Nếu nhận được bản tin Up hoặc Init, nó sẽ giữ nguyên trạng thái Up này.
  • Nếu nhận được bản tin với sta = Down, router sẽ nhảy về trạng thái down và nó hiểu link này bị chết.
  • Nếu nhận được bản tin với sta = Admin down, router sẽ nhảy về trạng thái down và nó hiểu BFD được tắt trên thiết bị đầu xa do người quản trị cấu hình.
  • Nếu không nhận được bản tin nào sau thời gian Detection time, nó sẽ hiểu là link này đã chết và chuyển BFD về trạng thái down.

Để thực hiện khởi tạo phiên BFD, router tham gia vào BFD sẽ đóng 1 trong 2 vai trò: Active role hoặc Passive role. Chỉ các Active role mới được phép gửi bản tin BFD Control trước. Các router Passive role sẽ không được gửi bản tin BFD Control cho đến khi nó nhận được một bản tin BFD Control từ thằng Active => Passive router sẽ học được discriminator từ thằng Active router. Trong các cặp BFD, ít nhất 1 thiết bị sẽ đóng vai trò là Active. Tuy nhiên, tùy từng ứng dụng khi sử dụng với giao thức khác (OSPF, VRRP…), có thể cả 2 router đóng vai trò là Active (cái này sẽ giới thiệu khi mô tả BFD cho các dịch vụ khác nhau).

3. Discriminator

Nếu trên cùng một link có chứa nhiều phiên BFD cùng hoạt động, cần có một giải pháp để phân biệt các session khác nhau => Chúng ta sử dụng một giá trị có tên discriminator để giải quyết vấn đề này.

Discriminator được biểu diễn bởi trường disciminator trong bản tin BFD Control. Theo đó:

  • My discriminator: Là giá trị do router gửi bản tin sinh ra.
  • Your discriminator: Là giá trị đại diện cho phiên BFD bên phía đầu nhận. Nếu đây là bản tin đầu tiên được gửi, router chưa biết discriminator bằng bao nhiêu => Trường này có giá trị bằng 0.

Dựa vào cặp My discriminator và Your discriminator, router sẽ định nghĩa được BFD session, từ đó có thể trao đổi thông tin, cập nhật trạng thái cho chính xác phiên BFD.

Ok, cơ bản đến đây là đã khá clear về BFD. Mọi người nếu muốn tìm hiểu thêm có thể đọc trong chuẩn RFC5880. Thanks for reading!

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s