Là giao thức truyền tin cậy nên điều khiển tắc nghẽn là một trong những chức năng quan trọng của SCTP. Giống nhƣ TCP, SCTP cũng sử dụng cơ chế slow start và
Congestion avoidance để kiểm soát quá trình vận chuyển thông tin trên mạng. SCTP sử dụng 3 tham số sau để kiểm soát và điều phối các quá trình trên:
- 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
Bắt đầu chậm (slow start): Thuật toán slow-start và tránh tắc nghẽn là bắt buộc đối với
một thiết bị đầu cuối để kiểm soát lƣợng dữ liệu đƣợc truyền vào mạng. Giống nhƣ trong TCP, một thiết bị đầu cuối SCTP cũng sử dụng ba biến kiểm soát sau để cân đối tốc truyền tin của nó[1]:
- Rwnd: đƣợc bên nhận đặt dựa trên số khoảng trống trong bộ đệm dùng để nhận gói tin của nó.
- Cwnd: cửa sổ tắc nghẽn đƣợc bên gửi điều chỉnh dựa trên hiện trạng của mạng.
- Ssthresh: Ngƣỡng cửa sổ tắc nghẽn dùng để phân biệt việc sử dụng slow-start hay tránh tắc nghẽn.
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.
- 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.
Tránh tắc nghẽn (Congestion Avoidance)
Để 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
- 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.
Kiểm soát tắc nghẽn: Trong quá trình truyền dữ liệu , khi phát hiện ra các gói tin bị mất
trên đƣờng tryền (không có SACK biên nhận) thực thể SCTP sẽ điều chỉnh cwnd giảm đi một nửa, chờ đợi gói tin biên nhận. Khi thời gian biên nhận kết thúc (thông qua đồng hồ kiềm soát quá trình phát t3-rtx) các tham số sẽ đƣợc thiết lập lại.
Ssthresh = max(cwnd/2, 2*MTU)
Cwnd=1*MTU
Lúc này thực thể phát SCTP sẽ bắt đầu quá trình ―bắt đầu chậm‖ và không gửi quá 1 gói tin cho đến khi nhận đƣợc biên nhận.
2.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.
Nếu thực thể SCTP là đa điểm (multi-homing) thì mỗi điểm sẽ lƣu giữ các bộ đếm lỗi cho mỗi địa chỉ thực thể nhận khác nhau và khi các bộ đếm lỗi này vƣợt quá giới hạn cho phép thì nó sẽ chỉ báo lỗi địa chỉ thực thể mà điểm đó đang kết nối đến. Khi đƣờn truyền của một điểm bị lỗi, thực thể SCTP sẽ tự động chuyể sang đƣờng 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.
Các thực thể SCTP sẽ kiểm soát đƣờng truyền bằng cách định kì gửi đi các bản tin HEARTBEAT tới các thực thể nhận và sau khi nhận đƣợc bản tin HEARTBEAT thì thực thể nhận sẽ gửi lại chunk HEARTBEAT ACK để biên nhận. Bên gửi nhận đƣợc chunk này sẽ thiết lập lại bộ đếm lỗi.