Trong suốt quá trình tồn tại của một kết nối SCTP các điểm cuối sẽ phải chuyển trạng thái theo từng sự kiện khác nhau. Các sự kiện có thể bao gồm: ASSOCIATE, SHUTDOWN, ABORT. Nhận các trạng thái INIT, COOKEI ECHO, ABORT, SHUTDOWN, các chunk điều kiển …
Quá trình thiết lập và truyền tin có thể thông qua lƣợc đồ trạng thái với bên yêu cầu kết nối và bên đáp ứng yêu cầu kết nối nhƣ sau:
--- --- (from any state) / \ / rcv ABORT [ABORT] rcv INIT | | | --- or --- --- | v v delete TCB snd ABORT generate Cookie \ +---+ delete TCB snd INIT ACK ---| CLOSED |
+---+ / \ [ASSOCIATE] / \ --- | | create TCB | | snd INIT | | strt init timer rcv valid | | COOKIE ECHO | v (1) --- | +---+ create TCB | | COOKIE-WAIT| (2) snd COOKIE ACK | +---+ | | | | rcv INIT ACK | | --- | | snd COOKIE ECHO | | stop init timer | | strt cookie timer | v | +---+ | | COOKIE-ECHOED| (3) | +---+ | | | | rcv COOKIE ACK | | --- | | stop cookie timer v v
+---+ | ESTABLISHED |
+---+
2.3.4.1 Quá trình thiết lập kết nối
Quá trình thiết lập kết nối giữa 2 điểm đầu cuối của giao thức SCTP đƣợc mô tả nhƣ hình bên dƣới:
Hình 12:Quá trình thiết lập kết nối
Khi một ứng dụng tại lớp trên của host A có yêu cầu truyền tải dữ liệu nó sẽ gọi lời gọi hàm kết nối ASSOCIATE. Host A sẽ thu thập các dữ liệu cần thiết để tạo Chunk INIT. Bản tin INIT sẽ đƣợc chuyển tới host B (nhờ địa chỉ IP và địa chỉ Port). Đồng hồ đếm thời gian sẽ đƣợc khởi động để đếm thời gian truyền chunk INIT và kết thúc khi nhận đƣợc bản tin đáp ứng chunk INIT ACK. Nếu sau một khoảng 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.
Host 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óa bí mật nhờ một thuật toán mã hóa nhƣ MD5 hoặc SHA-1, đƣa các giá trị này vào COOKIE, cùng với mã xác nhận lập MAC trong chunk INIT để tạo ra chunk INIT-ACK gửi về host A.
Host A nhận đƣợc INIT ACK từ phía host 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 INIT-ACK và gửi tới host 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.
Host 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 host A, chuyển sang trạng thái sẵn sàng nhận và gửi dữ liệu.
Host A sau khi nhận đƣợc COOKIE-ACK từ máy B thì chuyển sang trạng thái kết nối, bắt đầu truyền hoặc nhận dữ liệu.
Giao thức SCTP sử dụng phƣơng pháp bắt tay bốn bƣớc chặt chẽ về thủ tục hơn so với TCP chỉ thiết lập kết nối bằng phƣơng pháp bắt tay ba bƣớc. Lý do sử dụng phƣơng pháp bắt tay 4 bƣớc và vì TCP sau một thời gian sử dụng đã để lộ rõ điểm yếu trong quá trình thiết lập kết nối và bị tấn công trong bƣớc này. Việc sử dụng chunk Cookie Echo là một trong những cải tiến quan trọng của SCTP so với TCP trong việc chống lại các hình thức tấn công D-DOS, cụ thể chúng ta sẽ đi sâu phân tích ở mục 2.3.6.
2.3.4.2 Quá trình ngắt kết nối:
Quá trình ngắt kết nối của 2 điểm đầu cuối đang sử dụng giao thức SCTP có thể bắt đầu bất cứ khi nào theo một trong 2 cách sau:
Cách 1: Không làm mất dữ liệu đang truyền.
Khi nhận đƣợc lời gọi 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 gửi 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 nhận sau khi nhận đƣợc SHUTDOWN-ACK từ bên gửi 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 CLOSE.
Bên gửi nhận đƣợc SHUTDOWN COMPLETE thì loại bỏ các tham số kết nối và chuyển sang trạng thái CLOSE, kết thúc kết nối.
Cách 2: Làm mất mát dữ liệu
Thực thể SCTP đầu cuối yêu cầu đóng kết nối có thể đóng bất cứ khi nào mà không cần quan tâm tới dữ liệu đang truyền và chỉ gửi chunk ABORT tới bên kia.
Bên nhận đƣợc chunk ABORT thì sẽ kết thúc kết nối mà không cần trả lời. Trong trƣờng hợp không nhận đƣợc ABORT bên gửi cũng sẽ kết thúc luôn kết nối sau khi gửi một số lần thông tin mà không nhận đƣợc hồi đáp từ phía bên kia.
Trong cả 2 cách ngắt kết nối trên, cách ngắt kết nối thứ nhất là cách ngắt 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 ngắt kết nối thứ 2 khi bản thân thiết bị đầu cuối của kết nối bị lỗi hoặc kết thúc theo cách thứ nhất nhƣng bị lỗi.
2.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.
Mỗi một gói tin SCTP sẽ có kích thƣớc tối thiểu là 1500 byte vì vậy thực thể SCTP phải có khả năng nhận đƣợc tối thiểu gói tin với kích cỡ nhƣ trên và cửa số ban đầu rwnd cũng phải đƣợc thiết lập tối thiểu là 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 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.
2.3.4.4 Truyền tải dữ liệu đúng tuần tự và không tuần tự
Ngoà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 là 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 toà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 toà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 Điều khiển tắc nghẽn và kiểm soát lỗi 2.3.5.1 Điều khiển tắc nghẽn