Các Neighbor trong các mạng Point to Point, Point to Multipoint, và liên kết ảo luôn thiết lập Adjacency với nhau trừ phi các tham số trong các gói Hello của chúng không phù hợp.
Trong các mạng quảng bá và NBMA, DR và BDR sẽ thiết lập Adjacency với tất cả các Neighbor còn các DRother sẽ không thiết lập Adjacency với các DRother khác.
Quá trình xây dựng Adjacency sử dụng ba loại gói OSPF sau:
1. Gói mô tả cơ sở dữ liệu DD (loại 2).
2. Gói yêu cầu trạng thái liên kết (loại 3).
3. Gói cập nhật trạng thái liên kết (loại 4).
Gói DD đặc biệt quan trọng trong quá trình xây dựng Adjacency. Các gói DD sẽ chứa Header của các LSA trong cơ sở dữ liệu trạng thái liên kết của Router gốc. Router nhận sẽ nhận các gói DD và kiểm tra các Header này để quyết định xem liệu nó đã có bản copy mới nhất của LSA trong cơ sở dữ liệu của nó. Ngoài ra gói DD còn chứa ba cờ được sử dụng để quản lí quá trình xây dựng Adjacency. Ba cờ đó là:
1. Bit I (Initial bit): I = 1 chỉ ra rằng gói DD đầu tiên gửi.
2. Bit M (More bit): M = 1 chỉ ra rằng đây không phải gói DD cuối cùng được gửi.
3. Bit MS (Master/Slave bit): MS = 1 chỉ ra rằng gói DD được gửi từ Router là Master.
Khi cuộc đàm phán Master/Slave bắt đầu ở trạng thái Exstart, cả hai Neighbor sẽ cùng yêu cầu trở thành Master bằng cách gửi một gói DD rỗng với bit MS = 1. Neighbor có Router ID thấp hơn sẽ là Slave và truyền trở lại gói DD có MS = 0 và số trình tự DD được lập theo số trình tự của Master. Gói DD này sẽ là gói DD đầu tiên chứa các bản tóm tắt LSA. Khi cuộc đàm phán Master/Slave hoàn thành, trạng thái Neighbor sẽ chuyển sang Exchange.
Đồ án tốt nghiệp Chương 3. Giao thức OSPF Ở trạng thái Exchange, các Neighbor sẽ tiến hành đồng bộ cơ sở dữ liệu của chúng. Danh sách tóm tắt cơ sở dữ liệu được ghi cùng với các Header của tất cả các LSA trong cơ sở dữ liệu của Router. Các gói DD chứa danh sách các Header của các LSA được gửi tới Neighbor.
Nếu một Router thấy rằng Neighbor của nó có một LSA không có trong cơ sở dữ liệu của nó, hoặc rằng Neighbor có bản copy của một LSA (đã biết) mới hơn, nó đặt LSA này vào danh sách yêu cầu trạng thái liên kết. Sau đó nó gửi gói yêu cầu trạng thái liên kết để yêu cầu bản copy của LSA này. Các gói cập nhật trạng thái liên kết vận chuyển các LSA được yêu cầu. Khi nhận được các LSA yêu cầu, Router sẽ xoá Header của các LSA nhận được khỏi danh sách yêu cầu trạng thái liên kết.
Tất cả các LSA gửi đi trong gói cập nhật trạng thái liên kết phải được xác nhận. Do vậy, các LSA đã được truyền được ghi vào danh sách truyền lại trạng thái liên kết. Khi một LSA được xác nhận, nó sẽ được xoá khỏi danh sách này. LSA có thể được xác nhận theo hai cách:
• Xỏc nhận rừ ràng: Khi nhận được gúi xỏc nhận trạng thỏi liờn kết chứa LSA Header.
• Xác nhận ngầm: Khi nhận được gói cập nhật trạng thái liên kết chứa phiên bản LSA giống với phiên bản đã gửi. (Cả hai LSA đều mới hơn các LSA khác).
Master điều khiển quá trình đồng bộ và đảm bảo chỉ có gói DD được truyền đi vào thời điểm đó. Khi Slave nhận một gói DD từ Master, Slave xác nhận việc này bằng cách gửi một gói DD có cùng số trình tự tới Master. Nếu Master không nhận được xác nhận của gói này trong khoảng thời gian RxmtInterval, nó sẽ gửi tiếp bản copy của gói đó đến Slave.
Slave gửi các gói DD chỉ để đáp lại các gói DD mà nó nhận từ Master. Nếu gói DD nhận được có số trình tự mới, Slave gửi gói DD có cùng số trình tự với gói này. Nếu số trình tự của gói nhận được giống với gói xác nhận trước đó, gói xác nhận được truyền lại.
Khi quá trình đồng bộ hoàn tất, một trong hai sự chuyển đổi trạng thái sau sẽ xảy ra:
• Nếu vẫn còn các mục trong danh sách yêu cầu trạng thái liên kết, Router sẽ chuyển trạng thái của Neighbor sang trạng thái Loading.
• Nếu danh sách yêu cầu trạng thái là rỗng, Router sẽ chuyển trạng thái của Neighbor sang trạng thái Full.
Master biết rằng quá trình đồng bộ đã hoàn tất khi nó gửi tất cả các gói DD cần thiết để diễn tả đầy đủ cơ sở dữ liệu trạng thái liên kết của nó tới Slave và nhận được gói DD với bit M = 0. Slave biết rằng quá trình đồng bộ đã hoàn tất khi nó nhận được gói DD có bit M = 0 và gửi một gói DD xác nhận có bit M = 0. Hình dưới đây chỉ ra ví dụ về một quá trình đồng bộ cơ sở dữ liệu cùng với sự chuyển đổi trạng thái Neighbor.
RT1 RT2
Hello (DR = 0.0.0.0, Neighbors Seen = 0) Hello (DR = RT2, Neighbors Seen = RT1)
DD (Seq = x, I = 1, M = 0, MS = 1)
DD (Seq = y + n, I = 0, M = 0, MS = 0) DD (Seq = y + n, I = 0, M = 0, MS = 1) DD (Seq = y + 1, I = 0, M = 1, MS = 0) DD (Seq = y + 1, I = 0, M = 1, MS = 1)
DD (Seq = y, I = 0, M = 1, MS = 0) DD (Seq = y, I = 1, M = 1, MS = 1)
LS Request
LS Request LS Update
LS Update
Down Down
Init Exstart
Exstart Exchange
Exchange
Loading
Full
Full
Hình 3.6 Ví dụ một quá trình đồng bộ cơ sở dữ liệu
Đồ án tốt nghiệp Chương 3. Giao thức OSPF
Quá trình đồng bộ cơ sở dữ liệu ở hình trên gồm các bước sau:
1. RT1 được kích hoạt trong mạng đa truy nhập và gửi một gói Hello. Do nó chưa biết được về một Neighbor nào, nên trường Neighbor của gói là rỗng, trường DR và BDR được lập bằng 0.0.0.0.
2. RT2 nhận được gói Hello từ RT1, nó tạo một cấu trúc dữ liệu Neighbor cho RT1 và chuyển trạng thái của RT1 thành Init. RT2 gửi một gói Hello chứa Router ID của RT1 trong trường Neighbor và địa chỉ giao diện của nó trong trường DR.
3. Khi nhận được gói Hello từ RT2, RT1 sẽ biết được Router ID của mình. RT1 tạo một cấu trúc dữ liệu Neighbor cho RT2 và chuyển trạng thái của RT2 sang trạng thái Exstart để chuẩn bị cho việc đàm phán Master/Slave. Sau đó nó tạo một gói DD rỗng (không chứa các Header của các LSA) có số trình tự là x, bit I = 1 (chỉ ra rằng đây là gói DD đầu tiên của RT1), bit M = 1 ( chỉ ra rằng đây không phải là gói DD cuối cùng), bit MS = 1 (chỉ ra rằng RT1 muốn là Master).
4. RT2 chuyển trạng thái của RT1 sang trạng thái Exstart trong lúc nhận gói DD. Sau đó nó gửi một gói DD phản hồi có số trình tự là y. RT2 có Router ID cao hơn RT1 nên nó đặt bit MS = 1. Do gói DD này dùng cho quá trình đàm phán Master/Slave nên nó cũng rỗng như gói đầu tiên.
5. RT1 chấp nhận RT2 là Master và chuyển trạng thái của RT2 sang Exchange. RT1 tạo một gói DD có số trình tự bằng y, bit MS = 0 (chỉ ra rằng nó là Slave). Gói này sẽ chứa các LSA Header từ danh sách tóm tắt trạng thái liên kết của RT1.
6. RT2 chuyển trạng thái của RT1 sang trạng thái Exchange trong khi nhận gói DD của RT1. Nó gửi một gói DD chứa các LSA Header từ danh sách tóm tắt trạng thái liên kết của nó và tăng số trình tự DD lên y + 1 .
7. RT1 gửi một gói xác nhận với số trình tự là y + 1 tới RT2. Quá trình cứ tiếp tục như vậy. Khi RT2 gửi gói DD với các LSA Header cuối cùng trong danh sách tóm tắt trạng thái liên kết của nó, nó đặt bit M = 0.
8. RT1nhận được gói cuối cùng này và biết rằng quá trình Exchange đã hoàn tất. Khi này nó đã có các khoản mục cần thiết trong danh sách yêu cầu trạng thái liên kết của nó. Nó chuyển RT2 sang trạng thái Loading và gửi gói xác nhận chứa các LSA Header cuối cùng của nó.
9. Khi nhận được gói DD cuối cùng này của RT1, RT2 chuyển trạng thái của RT1 sang Full vì nó không còn khoản mục nào trong danh sách yêu cầu trạng thái liên
10. RT1 gửi các gói yêu cầu trạng thái liên kết và RT2 gửi các gói cập nhật trạng thái liên kết có chứa các LSA yêu cầu cho đến khi danh sách yêu cầu trạng thái liên kết của RT1 rỗng. Sau đó RT1 sẽ chuyển trạng thái của RT2 sang Full.