Q trình thiết lập kết nối có thể đƣợc mơ tả thơng qua hình ảnh sau: Máy A Máy B
Hình 3.14 Thiết lập kết nối SCTP
Khi một ứng dụng tại tầng trên máy A đòi hỏi truyền tải dữ liệu, nó sẽ gọi lời gọi nguyên thuỷ ASSOCIATE. Máy A sẽ thu thập các dữ liệu cần thiết để tạo chunk INIT. INIT sẽ đƣợc chuyển đến bên B (nhờ địa chỉ IP và địa chỉ cổng). Đồng hồ định thời sẽ đƣợc khởi động để đếm thời gian truyền chunk INIT và kết thúc khi nhận lại lời đáp ứng (chunk INIT ACK). Nếu sau thời gian nhất định không nhận đƣợc lời đáp ứng, hệ thống sẽ thông báo lỗi không thiết lập đƣợc kết nối.
Máy B nhận đƣợc chunk INIT thì sẽ xem xét các dữ liệu trong chunk, thu thập các tham số cần thiết của mình phục vụ thiết lập kết nối, băm các giá trị này và tạo khố bí mật nhờ một thuật tốn nhƣ MD5 hay SHA-1, đƣa các giá trị này vào COOKIE, cùng với mã xác lập MAC trong chunk INIT để tạo ra chunk INIT-ACK gửi về máy A.
Máy A nhận đƣợc INIT ACK từ phía máy B sẽ dừng đồng hồ định thời, tích hợp vào chunk COOKIE-ECHO cùng với COOKIE nhận đƣợc trong chunk INIT-ACK và gửi tới máy B, đồng thời khởi động đồng hồ định thời đếm thời gian cho đến khi nhận đƣợc chunk COOKIE-ACK.
Máy B sau khi nhận đƣợc chunk COOKIE-ECHO chứa các tham số COOKIE, sử dụng MAC để xác nhận lại đúng là COOKIE do nó gửi. Nếu đúng, các tham số trong COOKIE sẽ đƣợc dùng để thiết lập kết nối. Nó sẽ gửi chunk COOKIE-ACK cho máy A, chuyển sang trạng thái sẵn sàng nhận và gửi dữ liệu.
Máy A sau khi nhận đƣợc COOKIE-ACK từ máy B thì chuyển sáng trạng thái kết nối, bắt đầu truyền hay nhận dữ liệu.
Việc thiết lập kết nối thông qua bắt tay bốn bƣớc chặt chẽ về thủ tục hơn so với TCP, là giao thức thiết lập kết nối thông qua bắt tay ba bƣớc. Lý do của việc phải siết chặt quá trình này là TCP sau một thời gian sử dụng đã bị tấn cơng vào chính q trình thiết lập kết nối. Việc sử dụng chunk Cookie Echo là một trong các cải tiến quan trọng của SCTP so với TCP trong việc chống lại các tấn công này. Chi tiết cụ thể sẽ đƣợc phân tích ở phần sau. 3.3.4.2. Kết thúc kết nối.
Cả hai đầu cuối của kết nối đều có thể kết thúc kết nối bất cứ lúc nào trong khi đang kết nối, theo một trong hai cách:
Cách 1: Không làm mất dữ liệu đang chuyển.
Khi nhận đƣợc lời gọi nguyên thuỷ SHUTDOWN từ các ứng dụng tầng trên, bên yêu cầu sẽ dừng việc nhận dữ liệu, gửi chunk SHUTDOWN sau khi đã báo nhận đủ các gói dữ liệu và sau một thời gian nhất định lại gửi lại để đảm bảo SHUTDOWN không bị mất.
Bên đáp ứng sau khi nhận đƣợc báo nhận đủ các gói tin từ bên yêu cầu và SHUTDOWN thì gửi lại SHUTDOWN-ACK cho bên yêu cầu.
Bên yêu cầu nhận đƣợc SHUTDOWN-ACK thì loại bỏ các dữ liệu trong quá trình kết nối, gửi SHUTDOWN COMPLETE và chuyển sang trạng thái CLOSED.
Bên đáp ứng nhận đƣợc SHUTDOWN COMPETE thì loại bỏ các tham số kết nối, chuyển sang trạng thái CLOSED, kết thúc kết nối. Nếu nó khơng nhận đƣợc SHUTDOWN COMPLETE, nó sẽ tiếp tục gửi lại SHUTDOWN ACK theo số lần nhất định trƣớc khi báo lỗi kết nối.
Bên phát Bên thu SHUTDOWN SHUTDOWN-ACK SHUTDOWN-COMPLETE Hình 3.15 Kết thúc kết nối SCTP Cách 2: Làm mất dữ liệu.
Bên yêu cầu kết thúc kết nối có thể kết thúc kết nối mà không quan tâm đến dữ liệu đang chuyển và cần báo nhận bằng cách gửi chunk ABORT tới bên kia. Bên nhận nhận đƣợc ABORT thì kết thúc kết nối và khơng cần trả lời. Nếu ABORT thất lạc và bên gửi kết thúc ln kết nối ngay sau khi gửi thì sau một số lần gửi thông tin mà không nhận đƣợc đáp ứng thì bên kia cũng tự kết thúc kết nối.
Trong hai cách kết thúc kết nối trên, cách kết thúc kết nối thứ nhất là cách kết thúc kết nối chính thức đƣợc sử dụng trong hầu hết các trƣờng hợp. Cách kết thúc kết nối thứ hai chỉ đƣợc sử dụng khi:
Cách kết thúc kết nối thứ nhất bị lỗi (nhƣ mất các chunk điều khiển, lỗi hết giờ...)
Bản thân đầu cuối của kết nối bị lỗi. 3.3.4.3. Truyền dữ liệu
Quá trình truyền dữ liệu sẽ diễn ra khi kết nối đã đƣợc thiết lập và kết thúc khi một trong các bên có yêu cầu kết thúc hay tự động kết thúc mà không cần thông báo trƣớc. Cụ thể, quá trình truyền dữ liệu chỉ xảy ra khi thực thể SCTP truyền ở trong các trạng thái ESTABLISHED, SHUTDOWN- PENDING và SHUTDOWN-RECEICED. Tƣơng tự, quá trình nhận dữ liệu của thực thể SCTP cũng chỉ xẩy ra khi thực thể này ở trong trạng thái ESTABLISHED, SHUTDOWN-PENDING và SHUTDOWN-SENT.
Thực thể SCTP phải có khả năng nhận một gói tin có kích cỡ tối thiểu 1500 byte, vì vậy cửa sổ rwnd ban đầu phải đƣợc thiết lập tối thiểu 1500 byte. Để truyền có hiệu quả, thực thể SCTP có khả năng nhóm nhiều thơng điệp của ngƣời dùng thành một gói tin đồng thời có thể phân mảnh một thơng điệp quá lớn thành một số gói tin để có thể gửi trên đƣờng truyền.
Nhiều chunk DATA và chunk điều khiển có thể hợp thành một gói tin SCTP để truyền, nếu gói tin đó khơng lớn hơn MTU của đƣờng truyền. Bên nhận sẽ tách gói tin thành các chunk ban đầu. Trong một gói tin có cả chunk điều khiển và chunk DATA thì chunk điều khiển sẽ đƣợc đặt trƣớc chunk DATA.
Quá trình truyền (gửi) dữ liệu sẽ tuân theo các luật sau:
- Bên gửi không đƣợc truyền dữ liệu đến bên nhận nếu bộ đệm bên nhận đã đầy (rwnd =0).
- Bên gửi không đƣợc truyền thêm dữ liệu mới đến bộ đệm truyền nếu đã đạt ngƣỡng cwnd.
- Khi có thể gửi dữ liệu, trƣớc khi bắt đầu gửi một gói dữ liệu mới, các gói dữ liệu cũ đƣợc đánh dấu gửi lại phải đƣợc gửi trƣớc.
- Quá trình gửi tiếp tục theo các luật trên.
Quá trình nhận dữ liệu cũng phải tuân thủ các luật sau:
- Thực thể nhận phải báo nhận mỗi khi nhận đƣợc một chunk dữ liệu và không đƣợc tạo ra quá một SACK (chunk báo nhận) cho mỗi một gói tin nhận đƣợc.
- Báo nhận phải đƣợc gửi bởi chunk SACK, trừ yêu cầu đóng kết nối, khi đó báo nhận đƣợc gửi bằng chunk SHUTDOWN.
Quá trình nhận dữ liệu đƣợc thực hiện theo chiến thuật sau:
- Khi khởi tạo một tiến trình truyền/nhận dữ liệu, thực thể nhận phải thơng báo số byte mà nó có thể nhận (là khơng gian bộ đệm đã thiết lập cho tiến trình) thơng qua chunk INIT và INIT ACK, đồng thời thiết lập tham số a_rwnd giá trị này.
- Khi nhận và lƣu tạm thời một chunk DATA trong bộ đệm, thực thể nhận phải giảm giá trị a_rwnd một khoảng đúng bằng kích thƣớc gói tin hiện thời trong bộ đệm, thơng qua đó giảm giá trị rwnd tại thực thể gửi và giảm số lƣợng dữ liệu mà bên gửi có thể gửi.
- Khi gói tin trong bộ đệm đƣợc chuyển lên ứng dụng tầng trên, nó sẽ giải phóng thêm khơng gian bộ đệm, do vậy bên nhận sẽ tăng giá trị a_rwnd và nhƣ vậy sẽ tăng rwnd bên gửi cũng nhƣ số byte mà bên gửi có thể gửi.
- Khi gửi một chunk SACK báo nhận, bên gửi phải đặt tham số a_rwnd
vào trong SACK để báo bên gửi biết.
Thực thể SCTP multi-homed
Thực thể SCTP đƣợc gọi là multi-homed nếu nó có nhiều hơn một địa chỉ thuộc tầng giao vận đƣợc dùng làm địa chỉ nhận dữ liệu. Trong quá trình truyền dữ liệu, thực thể sẽ chọn một trong các địa chỉ này và thiết lập nó là địa chỉ chính thức của thực thể để nhận dữ liệu. Các thực thể khác trao đổi với nó thơng qua địa chỉ này, đồng thời thực thể cũng dùng địa chỉ này để gửi các chunk trả lời (SACK, HEARTBEAT ACK…). Tuy nhiên, khi nhận đƣợc các gói dữ liệu bị trùng lặp, bên nhận sẽ gửi lại chunk báo nhận tới các địa chỉ khác của thực thể multi-homed vì khi nhận đƣợc các gói tin trùng lặp từ một thực thể SCTP multi-homed có nghĩa đƣờng truyền với địa chỉ chính thức có thể đã bị lỗi.
Multi-homed chính là điểm mạnh của giao thức SCTP vì nó giảm thời gian phát hiện và khắc phục sự cố trên đƣờng truyền, tăng tính tin cậy của giao thức.
Truyền tải dữ liệu đúng tuần tự và khơng tuần tự
Ngồi khả năng truyền tải dữ liệu đúng tuần tự, SCTP cho phép truyền tải dữ liệu không đúng tuần tự. Cờ U trong chunk có giá trị 0, các chunk đƣợc truyền tải đúng tuần tự, nghĩa là khi một chunk DATA bị truyền sai, thực thể nhận SCTP buộc phải lƣu giữ các chunk này cho đến khi nhận đủ các chunk khác và đúng tuần tự để gửi lên ứng dụng tầng trên. Khi cờ U có giá trị là 1,
thực thể đầu cuối SCTP sẽ chuyển thẳng chunk DATA này lên ứng dụng tầng trên mà không cần quan tâm đến giá trị tuần tự của chunk. Do vậy SCTP có khả năng truyền tải tồn bộ dữ liệu không tuần tự bằng cách thiết lập giá trị cờ U là 1 trong tồn bộ các chunk. Đây là một trong các tính năng mà SCTP thừa kế từ giao thức UDP mà TCP khơng có. Với tính năng này, SCTP có thể dễ dàng đáp ứng các ứng dụng hiện nay sử dụng giao thức UDP nhƣ truy vấn DNS, các ứng dụng thời gian thực, phát quảng bá (multicast) với yêu cầu độ tin cậy thấp…đồng thời vẫn có khả năng phát dữ liệu với độ tin cậy cao nhƣ TCP.
3.3.5 Kiểm soát lỗi và điều khiển tắc nghẽn 3.3.5.1 Điều khiển tắc nghẽn 3.3.5.1 Điều khiển tắc nghẽn
Điều khiển tắc nghẽn là một trong các chức năng cơ bản của SCTP. SCTP sử dụng chiến lƣợc "bắt đầu chậm" (slow start) và "tránh tắc nghẽn" (Congestion avoidance) để kiểm soát dữ liệu vận truyển trên mạng. SCTP sử dụng 3 tham số để điều chỉnh tỉ lệ gói dữ liệu đƣợc truyền. Ba tham số đó là:
Kích cỡ cửa sổ bên nhận (rwnd - receiver advertised window size) là khơng gian bộ đệm để nhận các gói tin, tính bằng byte.
Cửa sổ điều khiển tắc nghẽn (cwnd- congestion control window) đƣợc điều chỉnh bởi bên gửi dựa trên tình trạng mạng, tính bằng byte.
Ngƣỡng bắt đầu chậm (ssthresh - slow start threshold).
Ngoài ra, SCTP sử dụng thêm tham số partial_bytes_acked để sử dụng trong quá trình tránh tắc nghẽn
a. Bắt đầu chậm
Khi kết nối SCTP đƣợc thiết lập, cửa sổ điều khiển tắc nghẽn cwnd lúc bắt đầu và sau một thời gian truyền tải ổn định đƣợc thiết lập giá trị phải nhỏ hơn hoặc bằng 2*MTU; sau mỗi lần truyền tải bị lỗi (thời gian timeout) thì giá trị này đƣợc thiết lập phải nhỏ hơn hoặc bằng 1*MTU. Ngƣỡng bắt đầu chậm ssthresh ban đầu đƣợc thiết lập bằng giá trị kích cỡ cửa sổ bên nhận rwnd.
Khi cửa sổ phát cwnd còn nhỏ hơn ngƣỡng bắt đầu chậm, cwnd sẽ đƣợc tăng lên với giá trị đƣợc chọn bằng một trong hai giá trị sau (tuỳ thuộc vào giá trị nào nhỏ hơn) là tổng kích cỡ các chunk Data đã đƣợc biên nhận hoặc MTU của đƣờng truyền bên nhận.
Khi cwnd vƣợt qua ngƣỡng ssthresh, nó chuyển sang pha tránh tắc nghẽn.
b. Tránh tắc nghẽn
Để tránh xảy ra tắc nghẽn, cwnd đƣợc tăng lên 1 MTU cho một lần truyền thành công (RTT- round trip time). Điều này đƣợc thực hiện nhƣ sau:
- partial_bytes_acked đƣợc khởi tạo bằng 0
- Mỗi khi nhận đƣợc báo nhận SACK, partial_bytes_acked đƣợc tăng thêm bằng tổng kích cỡ các chunk đã đƣợc biên nhận.
- Khi partial_bytes_acked lớn hơn hoặc bằng cwnd, cwnd đƣợc tăng bằng 1*MTU và partial_bytes_acked đƣợc thiết lập lại giá trị bằng cwnd hoặc partial_bytes_acked.
- Khi toàn bộ dữ liệu đã đƣợc báo nhận, partial_bytes_acked đƣợc thiết lập giá trị bằng 0.
Trong trƣờng hợp thực thể gửi không gửi dữ liệu (trong cả hai giai đoạn bắt đầu chậm và tránh tắc nghẽn) thì cwnd điều chỉnh bằng Max(cwnd/2, 2*MTU) cho một RTO. Điều này điều chỉnh cwnd để phù hợp với đƣờng truyền.
c. Kiểm soát tắc nghẽn
Khi phát hiện ra các gói tin bị mất trên đƣờng truyền (khơng có SACK báo nhận), thực thể gửi sẽ điều trỉnh lại nhƣ sau:
Ssthresh = max(cwnd/2, 2*MTU) Cwnd=ssthresh
Nghĩa là việc mất một gói dữ liệu sẽ làm cwnd giảm đi một nửa, thực thể gửi phải giảm dữ liệu truyền tải, chờ đợi gói tin báo nhận.
Khi thời gian phát lại kết thúc (Thơng qua đồng hồ kiểm sốt q trình phát t3-rtx), các tham số này sẽ đƣợc thiết lập lại:
Ssthresh = max(cwnd/2, 2*MTU) Cwnd=1*MTU
Thực thể gửi lúc này sẽ bắt đầu quá trình “bắt đầu chậm” và khơng gửi quá một gói tin cho đến khi nhận đƣợc báo nhận (SACK hay tái báo nhận TSN).
d. Phát lại nhanh
Khi không xảy ra việc mất dữ liệu, thực thể nhận sẽ thực hiện trì hỗn quá trình biên nhận (để thực hiện cơ chế piggy-backing); tuy nhiên nếu thực thể nhận phát hiện thấy thiếu một số gói dữ liệu trong dãy các gói số liệu nhận đƣợc, nó sẽ phát các biên nhận lặp. Thuật toán phát lại nhanh cho phép thực thể phát thực hiện phát lại ngay không cần chờ đồng hồ “time out”, trong trƣờng hợp nhận đƣợc bốn thông báo SACK báo lỗi thất lạc cùng một gói dữ liệu. Khi đó thực thể gửi sẽ:
- Đánh dấu CHUNK báo thất lạc để phát lại.
- Chỉnh lại tham số ssthresh và cwnd ứng với địa chỉ nhận của chunk DATA bị thất lạc.
- Xác định có bao nhiêu chunk DATA trƣớc chunk bị thất lạc cũng đang chờ phát lại để “gói” trong cùng một gói để gửi lại.
- Khởi động lại đồng hồ “time out” (đồng hồ t3-rtx)
Bên gửi luôn lƣu giữ bộ đếm các SACK báo nhận. Khi bộ đếm này bằng 4 thì quá trình phát lại nhanh đƣợc thực hiện, đồng thời bộ đếm đƣợc đặt về 0.
3.3.5.2 Kiểm soát lỗi
a. Phát hiện lỗi tại điểm cuối.
Mỗi thực thể phát SCTP luôn lƣu giữ một bộ đếm đếm số lần phát lại liên tiếp một gói tin đến một thực thể nhận. Khi số lần này vƣợt một ngƣỡng nhất định mà khơng nhận đƣợc báo nhận thì thực thể phát sẽ báo lỗi lên tầng ứng dụng, huỷ các gói tin trong hàng đợi phát và chuyển sang trạng thái đóng. Mỗi khi nhận đƣơc báo nhận, bộ đếm này sẽ đƣợc thiết lập về trạng thái ban đầu.
b. Phát hiện lỗi đƣờng truyền.
Khi thực thể phát kết nối với thực thể nhận là đa điểm (multi-home), nó sẽ lƣu giữ các bộ đếm lỗi cho mỗi địa chỉ thực thể nhận khác nhau. Khi các bộ đếm lỗi này bị vƣợt quá một giới hạn, nó sẽ báo lỗi địa chỉ thực thể nhận của bộ báo lỗi đó. Nếu nó vẫn có thể gửi thơng tin đến thực thể nhận đó nhƣng qua một địa chỉ khác với đƣờng truyền khác thì đƣờng truyền đó sẽ đƣợc báo lỗi. Khi một đƣờng truyền bị lỗi, thực thể gửi sẽ tự động chuyển sang đƣờng truyền thay thế khác để tiếp tục gửi dữ liệu nếu còn tồn tại một đƣờng truyền khác. Nếu tồn tại nhiều hơn một đƣờng truyền thì chỉ một đƣờng truyền đƣợc sử dụng.
Theo mặc định, thực thể SCTP sẽ kiểm soát đƣờng truyền bằng cách gửi một cách định kỳ chunk HEARTBEAT tới thực thể nhận và thực thể này sẽ gửi chunk HEARTBEAT ACK để báo nhận. Bên gửi nhận đƣợc chunk này sẽ thiết lập lại bộ đếm lỗi.
3.3.6 Vấn đề an toàn dữ liệu
Cũng nhƣ các giao thức vận chuyển dữ liệu khác, SCTP đƣợc thiết kế để vận chuyển tin cậy các dữ liệu nhạy cảm với độ trế của ngƣời sử dụng giữa hai điểm đầu cuối. Vì vây, SCTP cần phải có các khả năng:
- Sẵn sàng cung cấp các dịch vụ vận chuyển dữ liệu tin cậy và kịp thời.
- Đảm báo tính tồn vẹn thông tin của ngƣời sử dụng giữa hai điểm đầu cuối. SCTP có thể đƣợc sử dụng trong nhiều tình huống bị đe doạ khác nhau.