Hình 2. 8. Định dạng gói MPTCP
Trong MPTCP, một số khái niệm ở TCP thông thường đã thay đổi, sau đây là những thay đổi:
Số thự tự (Sequence Number): Trường “Sequence Number” trong phần mào đầu của gói tin TCP là để đánh số thự tự trong các luồng con. Để cho phép bên nhận có thể sắp xếp lại đúng thứ tự dữ liệu cho việc chuyển lên tầng ứng dụng, giao thức MPTCP sử dụng thêm một phần gọi là không gian thứ tự cấp dữ liệu. Trong trường này, bản tin khởi tạo SYN và bản tin kết thức DATA FIN chiếm 1 octet (8 bit) của không gian thứ tự. Do có hai không gian số thứ tự nên cần một ánh xạ chính xác giữa không gian chuỗi dữ liệu và không gian chuỗi luồng con (chính là Data Sequence Mapping), ánh xạ này được báo hiệu thông qua trường “TCP option” trong các gói tin TCP.
ACK:Trường ACK trong phần mào đầu TCP chỉ báo nhận ở mức subflow thông qua số thứ tự cấp luồng con, không báo nhận ở không gian thứ tự mức dữ liệu(mức kết nối MPTCP). Không nên cố gắng liên hệ việc báo nhận ở mức dữ liệu từ các khung báo nhận ACK mức luồng con thay vì dùng riêng một khung báo nhận tách biệt ở mức kết nối.
Duplicate ACK: Khung ACK dành cho MPTCP này phải được tách biệt độc lập với báo hiệu tắc nghẽn. Để loại bỏ trường hợp những đối tượng non-MPTCP không nhận biết được duplicate ACKS, MPTCP không nên gửi nhiều hơn hai duplicate ACKS chứa báo hiệu MPTCP trong một hàng.
32
là ở cấp luồng con, cửa sổ này dùng để điều chỉnh tốc độ gửi phù hợp với tốc độ xử lý của bên nhận. Trong MPTCP, mỗi luồng con phải báo cáo cùng một cửa sổ nhận toàn phần, được xác định trên mỗi kết nối ở bộ đệm bên nhận. Cửa sổ nhận ở phần mào đầu TCP cho cho biết không gian đệm còn trống cho kết nối mức dữ liệu (trái ngược với mức luồng con) ở bên nhận. Điều này cũng giống ở TCP thông thường, nhưng để duy trì điều này cửa sổ nhận phải được thể hiện ở bên gửi liên hệ với số thứ tự ở khung báo nhận DATA_ACK. Với cách này, vai trò kiểm soát luồng được bảo toàn. Chú ý rằng một số middleboxes có thể làm thay đổi cửa sổ nhận và vì thế một đầu cuối phải sử dụng giá trị cực đại trên mỗi luồng con cho cửa sổ nhận ở mức kết nối cũng như cần phải duy trì một cửa sổ mức luồng con cho việc xử lý mức luồng con
FIN(FINISH): Cờ đánh dấu kết thúc FIN trong mào đầu TCP sử dụng cho mỗi luồng con, không sử dụng ở mức kết nối. Để báo hiệu kết thúc ở mức kết nối, ta sử dụng option DATA_FIN.
RST(RESET): Cũng như cờ FIN, cờ RST cũng chỉ sử dụng ở mức luồng con. Không có RST ở mức kết nối, vì không thể phân biệt RST của hai kết nối. Ví dụ: nếu một máy không có trạng thái về một luồng con, nó sẽ không thể biết luồng con đó thuộc về kết nối nào trong số những kết nối nó đang thực hiện . Để reset một kết nối, ta reset đồng thời tất cả luồng con của kết nối đó.
Danh sách địa chỉ(Address List): Việc quản lý danh sách địa chỉ được thực hiện trên mỗi kết nối(trái ngược với trên mỗi luồng con, trên mỗi đầu cuối, hay trên mỗi host...). Điều này cho phép ứng dụng chính sách cục bộ trên mỗi kết nối. Thêm một địa chỉ vào một kết nối không liên quan đến các kết nối khác của cặp đầu cuối đó.
5 – tuple: bao gồm protocol, local address, local port, remote address, remote port được áp dụng cho tầng ứng dụng đối với ứng dụng không có khả năng nhận diện Multipath trên luồng con đầu tiên, ngay cả khi luồng con đó vừa bị đóng hay xóa khỏi kết nối. Đây là vấn đề liên quan đến Multipath API.
2.4.2. Các tùy chọn MPTCP
Để báo hiệu giữa các máy đầu cuối, MPTCP sử dụng trường tùy chọn TCP. Loại tùy chọn TCP dành riêng cho MPTCP là 30 và được chỉ định bởi Internet Assigned Numbers Authority (IANA). Việc sử dụng các kiểu phụ tùy chọn này là cần thiết để hỗ trợ chức năng đa đường cụ thể và chúng bao gồm một kiểu số duy nhất cho MPTCP, với “sub-types” 4 bit cho mỗi bản tin MPTCP.
33
Giá trị Bản tin Mô tả
0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 MP_CAPABLE MP_JOIN DATA_SEQUENCE_SI GNAL ADD_ADDR REMOVE_ADDR MP_PRIO MP_FAIL MP_FASTCLOSE Multipath Capable Join Connection
Data ACK and Data Sequence Mapping Add Address Remove Address Change SubflowPriority Fallback Fast Close 0x8-0xe 0xf Unassigned
Reserved for private use
Bảng 2.1. Các loại tùy chọn kiểu phụ (subtype) của MPTCP
2.4.3. Thiết lập kết nối
Phần sau đây sẽ mô tả cách một kết nối MPTCP được khởi tạo và chúng ta cũng sẽ xem cách các luồng con mới được thiết lập và thêm vào kết nối hiện có.
Để khởi tạo kết nối MPTCP, máy chủ hỗ trợ MPTCP sẽ mở kết nối TCP thông thường bằng cách gửi gói ACK với tùy chọn MP_CAPABLE. Trong trường hợp máy chủ khác cũng hỗ trợ MPTCP, phản hồi SYN/ACK cũng sẽ chứa tùy chọn MP_CAPABLE. Bắt tay ba bước sau đó được hoàn thành bởi gói ACK cuối cùng cũng chứa tùy chọn MP_CAPABLE.Bây giờ, cả hai máy đều biết rằng máy kia có khả năng thực hiện truyền đa đường và kết quả là có ý định kết nối như vậy trong. Trong trường hợp phản hồi SYN/ACK không chứa tùy chọn MP_CAPABLE, giả sử rằng trình mở thụ động không hỗ trợ MPTCP thì kết nối sẽ tiếp tục như một kết nối TCP đơn đường thông thường.
Trong quá trình bắt tay ba bước, hai máy cũng sẽ trao đổi khóa và đồng ý về một thuật toán mật mã được sử dụng cho kết nối. Hiện tại, thuật toán mật mã duy nhất được RFC 6824 chỉ định là thuật toán HMAC-SHA1. Máy khởi tạo sử dụng tùy chọn MP_CAPABLE trong gói SYN để gửi khóa 64 bit được tạo riêng cho kết nối MPTCP này.Phương thức tạo cho khóa này là cách triển khai cụ thể, nhưng khóa phải khó đoán và nó phải là duy nhất cho máy chủ gửi tại bất kỳ thời điểm nào. Khóa ngẫu nhiên và duy nhất này sau đó được băm bằng hàm băm một chiều. Kết quả HMAC-value (Hash-based Message Authentication Code) là mã thông báo 32-bit cho kết nối này và tất cả các luồng con trong tương lai sẽ sử dụng mã thông báo này để xác định kết nối. Như chúng ta sẽ
34
thấy, cơ chế bắt tay luồng con này đảm bảo rằng mọi luồng con đều được thêm vào đúng kết nối - điều này rất cần thiết trong trường hợp máy chủ xử lý hàng nghìn kết nối.
Hình 2. 9. Kết nối MPTCP và thiết lập luồng con
Sau khi kết nối MPTCP đã được thiết lập giữa hai máy, các luồng con mới có thể được thêm vào kết nối. Tùy chọn MP_CAPABLE chỉ được sử dụng trong quá trình khởi tạo kết nối MPTCP và mỗi máy được cấp một mã thông báo để các luồng con khác có thể xác định kết nối. Cả hai máy đều có thể bắt đầu thiết lập các luồng con mới vào bất kỳ lúc nào trong quá trình kết nối và chúng có thể được tạo bằng cách sử dụng tùy chọn MP_JOIN.
2.4.4. Bắt đầu một luồng con mới
Tất nhiên, chúng ta có thể giả định rằng một máy lưu trữ nhiều địa chỉ của chính nó. Mặc dù cả hai máy đều được phép khởi tạo quá trình bắt đầu một luồng con mới, điều hợp lý và bình thường nhất là máy chủ đã khởi tạo kết nối ban đầu chịu trách nhiệm này. Việc tạo luồng con mới được bắt đầu dưới dạng bắt tay ba bước TCP, với trao đổi TCP SYN/ACK thông thường. Gói SYN đầu tiên được gửi tự nhiên từ giao diện bổ sung với địa chỉ mới. Không giống như khi bắt đầu kết nối, bây giờ tùy chọn MP_JOIN TCP được sử dụng và mã thông báo cho kết nối được gửi cùng với nó để xác định kết nối nào sẽ được tham gia bởi luồng con mới này. Gói MP_JOIN SYN đầu tiên không chỉ gửi mã thông báo mà chúng biết nguồn gốc từ khóa của máy chủ khác và là mã tĩnh cho mỗi kết
35
nối, nó còn gửi một số ngẫu nhiên và ID địa chỉ. Số ngẫu nhiên, được gọi là nonce, là một biện pháp phòng ngừa bảo mật, ngăn chặn các cuộc tấn công phát lại vào phương pháp xác thực. Như đã đề cập, một thuật toán mật mã đã được trao đổi trong quá trình thiết lập kết nối ban đầu - HMAC-SHA1 là thuật toán duy nhất hiện nay. Khi sử dụng mật mã này, các máy chủ sẽ trao đổi các nonce, kết hợp chúng với các khóa từ thiết lập kết nối, tạo ra một hàm băm SHA1 từ kết quả và cuối cùng trao đổi các giá trị băm. Phương pháp này sẽ ngăn kẻ tấn công tạo một luồng con mới đến một máy chủ có khả năng kết nối đa đường, trừ khi kẻ tấn công tìm ra khóa gốc từ quá trình bắt tay trong quá trình thiết lập kết nối.
ID địa chỉ có thể được mô tả như một định danh của địa chỉ nguồn mà từ đó luồng con được bắt đầu. Như chúng ta đã biết, thiết bị trung gian có thể thay đổi hoặc xóa địa chỉ nguồn trong tiêu đề IP của gói, nhưng việc sử dụng ID địa chỉ trong tùy chọn MP_JOIN đảm bảo rằng người nhận biết địa chỉ của giao diện nơi bắt nguồn luồng con.Khi ACK cuối cùng được gửi, luồng con được tạo và sẵn sàng để truyền dữ liệu. Toàn bộ quá trình trao đổi được thể hiện trong hình 2.6.
Thuật ngữ quản lý đường dẫn đề cập đến việc trao đổi thông tin liên quan đến các đường dẫn khác nhau giữa các máy chủ. Về cơ bản, điều này được thực hiện bằng cách trao đổi thông tin về các địa chỉ bổ sung.Một máy chủ có thể thông báo cho máy chủ kia về địa chỉ bổ sung bằng cách sử dụng tùy chọn ADD_ADDR trên luồng con hiện có, có chứa địa chỉ mới.Máy chủ khác sau đó có thể quyết định bắt đầu tạo luồng con mới đến địa chỉ nhận được. Điều này có thể hữu ích nếu một máy nhiều địa chỉ nằm ởphía sau NAT, điều này có thể ngăn máy chủ tạo các luồng con mới với những máy khác.
Nếu một hoặc nhiều giao diện của một máy chủ bắt đầu gặp sự cố, thì cũng có tùy chọn REMOVE_ADDR, có thể được sử dụng để thông báo cho máy chủ khác rằng địa chỉ không thể truy cập được nữa và cần được xóa đi.
2.4.5. Trao đổi dữ liệu
Như chúng ta đã biết, MPTCP lấy một luồng dữ liệu đầu vào từ một ứng dụng và phân chia dữ liệu trên một hoặc nhiều luồng con. Để đảm bảo truyền tải và đảm bọ độ tin cậy, dữ liệu được truyền qua nhiều luồng con cần có đủ thông tin kiểm soát để được tập hợp lại thành công ở người nhận. Do đó, MPTCP sử dụng số thứ tự dữ liệu 64-bit (DSN) để đánh số tất cả dữ liệu được gửi qua các luồng con hoạt động khác nhau và mỗi luồng con có không gian số thứ tự 32-bit riêng, giống như TCP thông thường.
36
Tất cả các gói dữ liệu được truyền chứa tùy chọn TCP DATA_SEQUENCE_SIGNAL (DSS), mang theo ánh xạ trình tự dữ liệu. Ánh xạ trình tự dữ liệu bao gồm số thứ tự dữ liệu và số thứ tự luồng con để cho ánh xạ này hợp lệ. Ánh xạ này ghép không gian chuỗi con với không gian chuỗi dữ liệu và đảm bảo rằng dữ liệu từ các luồng con khác nhau được tập hợp lại một cách chính xác và phân phối theo đúng thứ tự. Trong trường hợp không thành công, ánh xạ cũng đảm bảo rằng dữ liệu có thể được truyền lại trên một luồng con khác (được ánh xạ tới cùng một DSN).Tuy nhiên, RFC 6824 không chỉ định cách dữ liệu nên được lập lịch giữa các luồng con khác nhau ở phía gửi, khía cạnh này được xác định cụ thể khi triển khai [4].
Tùy chọn DATA_SEQUENCE_SIGNAL cũng mang trường Data ACK, một xác nhận mức kết nối cho số thứ tự dữ liệu đã nhận. Điều này là cần thiết để đảm bảo rằng MPTCP cung cấp khả năng phục hồi đầu cuối đầy đủ và hoạt động như một ACK tích lũy cho toàn bộ kết nối. TCP đảm bảo rằng các phân đoạn dữ liệu được gửi qua các luồng con được xác nhận như bình thường, nhưng cũng cho MPTCP xác nhận luồng dữ liệu được tập hợp lại.Các luồng con khác nhau có thể có RTT khác nhau và điều này có thể dẫn đến lỗ hổng trong số thứ tự cấp dữ liệu và cuối cùng sẽ dẫn đến sự cố chặn đầu dòng (head-of-line). Việc xác nhận này là cần thiết để phía gửi biết tại thời điểm nào nó có thể giải phóng dữ liệu khỏi bộ đệm. Trường Data ACK chỉ định số thứ tự dữ liệu tiếp theo mà nó cần nhận được trên một luồng con khác đang hoạt động.
Vấn đề chặn head-of-line: Các luồng con của MultiPath TCP đương nhiên sẽ đi qua các đường dẫn với các đặc tính mạng khác nhau. Khi các gói được ghép qua các đường dẫn có sẵn, sự khác biệt về độ trễ của đường dẫn có thể gây ra phân phối không đúng thứ tự ở phía nhận. Vì MPTCP đảm bảo phân phối theo thứ tự, các gói đi qua đường dẫn RTT thấp sẽ phải "đợi" các gói đến từ đường dẫn có RTT cao. Hiện tượng này được gọi là vấn đề chặn đầu dòng.
2.4.6. Ưu tiên các luồng con
Cách kết nối MPTCP chọn để lập lịch lưu lượng qua các luồng con là cách triển khai cụ thể và ứng dụng không thể điều khiển. Các chính sách nội bộ quyết định cách phân chia lưu lượng trên các tuyến có sẵn, nhưng trong hầu hết các trường hợp, mục tiêu là tối đa hóa thông lượng và cân bằng tắc nghẽn.
Bất kể cơ chế lập lịch như thế nào, nó có thể hữu ích cho các ứng dụng hoặc người dùng cuối khi có một số loại điều khiển về việc sử dụng luồng con. Một tình huống có
37
thể xảy ra có thể là tình huống trong đó luồng con chính là luồng con duy nhất được sử dụng cho lưu lượng truy cập thông thường, nhưng luồng con thứ cấp đã sẵn sàng để sử dụng trong trường hợp luồng con chính bị lỗi. Ví dụ, giải pháp này có thể thuận lợi trong các trường hợp luồng con thứ cấp có chi phí cao hoặc độ trễ thay đổi, thông lượng không ổn định.
Do đó, MPTCP đã triển khai tùy chọn MP_PRIO. Tùy chọn này hỗ trợ hai cấp độ ưu tiên luồng con: ưu tiên bình thường và ưu tiên dự phòng. Nếu tùy chọn MP_PRIO được gửi với cờ B (cờ dự phòng) được đặt thành 1, nó chỉ ra rằng đường dẫn không được sử dụng cho lưu lượng dữ liệu trừ khi không có luồng con nào khác trong kết nối mà B = 0.Nói cách khác, luồng con có thể được sử dụng trong trường hợp mọi luồng con khác có mức độ ưu tiên bình thường lỗi. Ngay cả khi luồng con ở chế độ ưu tiên sao lưu, vẫn có thể nhận dữ liệu từ luồng con. Nguyên tắc được minh họa trong hình 2.7. Cờ B với cài đặt ưu tiên cũng có thể được thông báo trong quá trình tạo luồng con mới, trong tùy chọn MP_JOIN.
Lưu ý rằng tùy chọn MP_PRIO với cài đặt ưu tiên là một yêu cầu từ phía nhận dữ liệu đến phía gửi dữ liệu, nhưng phía gửi phải tuân thủ yêu cầu.Mặc dù, có thể phía gửi dữ liệu có các chính sách cục bộ ghi đè lên nhứng thực tế là luồng con được định cấu hình để ưu tiên sao lưu.Trong trường hợp bạn muốn thay đổi mức độ ưu tiên của một luống con tạm thời không khả dụng do sự cố liên kết không mong muốn, bạn có thể gửi tùy chọn MP_PRIO trên một luồng con khác và chỉ định địa chỉ của giao diện mong muốn bằng cách đặt trường ID Địa chỉ.
38
2.4.7. Đóng kết nối
Trong kết nối TCP thông thường, FIN thông báo cho phía nhận rằng phía gửi