Dựa vào nền tảng là mô hình Tng đã phân tích ở phần trước, chúng ta chia MPTCP thành 2 tầng con kết nối với nhau thông qua một giao diện xác định.Kiến trúc của MPTCP thiết kế theo mô hình phân chia Tng như Hình 2.6.
Semantic Flow+Endpoint Network Semantic Flow+Endpoint Network Network Network end-to-end End Host Firewall or NAT Perfomance Enhancing Proxy End Host Flow+End point Application Application Flow+ Endpoint end-to-end
28
Hình 2.6. Mối quan hệ giữa Tng(bên trái) và MPTCP(bên phải)
Tầng con MPTCP:
Có vai trò như lớp Semantic hướng ứng dụng (app oriented), cung cấp khả năng tương thích ứng dụng.
Thành phần luồng con TCP:
Cung cấp khả năng tương thích mạng có vai trò như một luồng TCP thông thường trong mạng, cũng như tầng Flow+Endpoint là thành phần hướng mạng.
Là phần mở rộng giao thức của TCP, MPTCP xác định một giao thức hoạt động ở hai quy mô: các thành phần MPTCP điều hành end-to-end, trong khi nó cho phép thành phần TCP điều hành segment-by-segment. Từ những phân tích ở trên, giao thức vận chuyển đa đường phải có chức năng quản lý Flow/Endpoint đối với mỗi đường dẫn ở kết nối “đầu cuối – đầu cuối”(end-to-end), trong khi vẫn phải có giao diện trong suốt đối với tầng ứng dụng. Giữ nguyên kiến trúc này, MPTCP phân chia tầng vận chuyển thành các phần: phần MPTCP, đáp ứng các chức năng “semantic function” truyền dữ liệu thứ tự và tin cậy, và phần “legacy TCP”(subflow), bao gồm các chức năng Flow/Endpoint.
MPTCP sử dụng các phiên của TCP thông thường, hay còn gọi là các "subflow", để cung cấp cách thức giao vận cơ sở trên mỗi đường dẫn, và như vậy những điều này giữ lại khả năng tương thích trên mạng. Thông tin MPTCP cụ thể được truyền trong một cách thức tương thích với TCP, mặc dù cơ chế này là tách biệt với các thông tin thực tế được chuyển giao để có thể phát triển trong các phiên bản trong tương lai. Ở phần này ta đưa ra một kiến trúc tổng quan cho TCP đa đường. Kiến trúc này cho phép giao thức trực tiếp thực hiện được các mục tiêu đã nêu ra ở trên. MPTCP hoạt động ở tầng vận chuyển, và sự tồn tại của nó mục đích là trong suốt với cả những lớp cao và thấp hơn. Nó được mở rộng từ giao thức TCP chuẩn, và như vậy MPTCP được thiết kế để có thể sử dụng được các ứng dụng kế thừa từ TCP mà không cần thay đổi các ứng dụng này.
29
Những ứng dụng có khả năng sử dụng truyền tải đa đường có thể sử dụng thêm nhiều socket API. Hình 2.7 minh họa kiến trúc phân lớp của TCP thông thường và MPTCP.
Hình 2.7. So sánh mô hình TCP và mô hình của MPTCP
Nằm bên dưới tầng ứng dụng, mở rộng MPTCP lần lượt quản lý các TCP subflows (luồng con) dưới nó. Để làm điều này, nó phải thực hiện các chức năng sau:
a. Quản lý đường dẫn (Path Management):
Đây là chức năng phát hiện và sử dụng nhiều đường dẫn giữa hai host. MPTCP sử dụng sự hiện diện của nhiều địa chỉ IP ở một hoặc cả hai host như là một điều để phát hiện khả năng sử dụng nhiều đường dẫn. Do đầu cuối không thể phân biệt các đường dẫn khác nhau, nên dễ dàng xảy ra trường hợp các đường dẫn này có thể đi qua cùng một liên kết thắt cổ chai. Tính năng quản lý đường dẫn của giao thức MPTCP là các cơ chế để báo hiệu những địa chỉ khác nhau cho các host biết, và cơ chế để thiết lập các subflows mới gia nhập vào một kết nối MPTCP đang tồn tại.
b. Lập lịch cho các phân đoạn (Scheduler):
Chức năng này chia dòng bytes nhận được từ tầng ứng dụng thành các phân đoạn (segments) để truyền đi trên một trong những subflows sẵn có. Thiết kế MPTCP sử dụng một ánh xạ đánh thứ tự dữ liệu (data sequence mapping), liên kết các phân đoạn được gửi trên các subflow khác nhau bằng một chuỗi số ở mức kết nối, do đó cho phép các phân đoạn gửi trên các subflow khác nhau được sắp xếp lại đúng thứ tự ở bên nhận. Lập lịch gói tin là phụ thuộc vào thông tin về sự sẵn có của các đường dẫn từ thành phần quản lý đường dẫn, và sau đó nó sử dụng các subflow để truyền các phân đoạn đã xếp thành hàng đợi. Chức năng này cũng chịu trách nhiệm cho việc sắp xếp lại các phân đoạn ở cấp kết nối khi nhận được gói tin từ các luồng con TCP, theo bản đồ chuỗi dữ liệu.
c. Giao diện Subflow (TCP đơn đường):
Thành phần subflow có các phân đoạn từ các thành phần lập lịch gói tin và truyền
Application TCP Application IP MPTCP Subflow (TCP) Subflow (TCP) IP
30
chúng trên một đường dẫn xác định. Chú ý rằng phần lập lịch gói tin không được gắn đủ thông tin trong gói tin để cho phép thực hiện điều này: các phân đoạn với cùng một Sequence Number cấp kết nối có thể được truyền đi trên nhiều đường dẫn, ví dụ, khi truyền lại hay điều chỉnh tăng khả năng dư thừa (redundancy). MPTCP sử dụng TCP bên dưới (Subflow) cho khả năng tương thích mạng; TCP đảm bảo gửi tin cậy, theo thứ tự. TCP đánh số thứ tự riêng vào các phân đoạn, sử dụng cho việc phát hiện cũng như truyền lại các gói bị mất ở lớp Subflow. Bên nhận, Subflow chuyển tập hợp các phân đoạn cho thành phần lập lịch gói tin ở mức kết nối MPTCP; Ánh xạ tuần tự dữ liệu của thành phần lập lịch gói tin bên gửi cho phép sắp xếp toàn bộ dòng byte theo đúng như thứ tự bên gửi.
d. Kiểm soát tắc nghẽn [6]:
Chức năng này phối hợp kiểm soát tắc nghẽn trên mỗi subflow(TCP thông thường). Thuật toán điều khiển tắc nghẽn phải đảm bảo rằng một kết nối MPTCP không được chiếm nhiều băng thông một cách không công bằng hơn một luồng con TCP chiếm tại một nút cổ chai chia sẻ.Các chức năng này hoạt động phù hợp và liên quan chặt chẽ với nhau. Thể hiện như sau:
Quản lý tuyến sau khi phát hiện (hoặc khởi tạo) nhiều tuyến giữa hai host. Packet Scheduler sau đó nhận được một dòng dữ liệu từ các ứng dụng dành cho mạng, và thực hiện các hoạt động cần thiết trên dữ liệu nhận được này (ví dụ phân mảnh dữ liệu thành các phân mảnh ở cấp kết nối(MPTCP) và đánh số thứ tự cấp kết nối ) rồi gửi nó xuống lớp subflow. Subflow sau đó thêm số thứ tự riêng(cấp luồng con), khung báo nhận ACKs, và chuyển chúng vào mạng. Lớp subflow bên nhận sắp xếp lại dữ liệu(nếu cần thiết) và chuyển dữ liệu sau khi xử lý lên cho thành phần lập lịch gói tin, thành phần này sẽ sắp xếp dữ liệu lại một lần nữa nhưng ở cấp kết nối(MPTCP) và gửi dòng dữ liệu lên tầng ứng dụng xử lý. Cuối cùng thành phần kiểm soát tắc nghẽn tồn tại như một phần của thành phần lập lịch gói tin(tính toán, lập lịch các phân mảnh nên gửi với tốc độ nào, ở subflow nào...).
2.4. Hoạt động của MPTCP
Trong phần này sẽ trình bày và mô tả về các cơ chế hoạt động của MPTCP, như được miêu tả trong RFC 6824. Các hoạt động chính của giao thức MPTCP cho phép tạo, duy trì và kết thúc các kết nối có bao gồm các luồng con [7, 8].
31
2.4.1. Định dạng phân đoạn MPTCP
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ả