CHƯƠNG 2. KỸ THUẬT TẤN CÔNG SYN FLOOD
2.3. Quá trình bắt tay 3 bước
Hai ứng dụng dùng TCP phải thiết lập một kết nối TCP trước khi dữ liệu có thể được truyền. Mỗi kết nối sẽ tồn tại giữa một cặp TCP sockets với socket được định nghĩa như là một kết hợp của địa chỉ IP, cổng được dùng, giao thức lớp transport. Quá trình thiết lập kết nối, khởi tạo socket bao gồm giá trị cổng nguồn và cổng đích, chỉ số tuần tự và ACK.
1 Mô tả quá trình bắt tay 3 bước
Bước 1: Yêu cầu liên kết luôn được trạm nguồn khởi tạo tiến trình bằng cách gửi một gói tin TCP với cờ SYN = 1 và chứa giá trị khởi tạo số tuần tự ISN của Client. Giá trị ISN này là một số byte không dấu và được tăng mỗi khi liên kết được yêu cầu (giá trị này quay về 0 khi nó tới giá trị 232). Trong thông điệp SYN này còn chứa số hiệu cổng TCP của phần mềm dịch vụ mà tiến trình trạm muốn liên kết.
Mỗi thực thể liên kết TCP đều có một giá trị ISN mới, số này được tăng theo thời gian. Vì một liên kết TCP có cùng số hiệu cổng và cùng địa chỉ IP được dùng lại nhiều lần, do đó việc thay đổi giá trị ISN ngăn chặn không cho các liên kết dùng lại các dữ liệu đã cũ (State) vẫn còn được truyền từ một liên kết cũ và có cùng một địa chỉ liên kết.
Bước 2: Khi thực thể TCP của phần mềm dịch vụ nhận được thông ddiejp SYN, nó gửi lại gói SYN cùng giá trị ISN của nó và đặt cờ ACK = 1 trong trường hợp sẵn sàng nhận liên kết. Thông điệp này còn chứa giá trị ISN của tiến trình trạm trong trường hợp số tuần tự nhận để báo rằng thực thể dịch vụ đã nhận được giá trị ISN của tiến trình trạm.
Bước 3: Tiến trình trạm trả lời lại gói SYN cảu thực thể dịch vụ bằng một thông báo trả lời ACK. Bằng cách này, các thực thể TCP trao đổi một cách tin cậy các giá trị ISN của nhau và có thể bắt đầu trao đổi dữ liệu. Không có thông điệp nào trong ba bước trên chứa bất kỳ dữ liệu gì, tất cả thông tin trao đổi đều nằm trong phần Header của thông điệp TCP.
Kết thúc liên kết: Khi có nhu cầu kết thúc liên kết TCP, ví dụ A gửi yêu cầu kết thúc liên kết với FIN = 1. Vì vậy liên kết TCP là song công nên mặc dù nhận được yêu cầu kết thúc liên kết của A, thực thể B vẫn có thể tiếp tục truyền cho đến khi B không còn số liệu để gửi và thông báo cho A bằng yêu cầu kết thúc liên kết với FIN = 1. Khi thực thể TCP đã nhận được thông điệp FIN và sau khi
đã gửi thông ddiejp FIN của mình, liên kết TCP thực sự kết thúc. Như vậy cả hai trạm phải đồng ý giải phóng liên kết TCP bằng cách gửi cờ FIN = 1 trước khi chấm dứt liên kết xảy ra, việc này bảo đảm dữ liệu khoongbij thất lạc do đơn phương đột ngột chấm dứt liên lạc.
Truyền và nhận dữ liệu Sau khi liên kết được thiết lập giữa một cặp thực thể TCP, các thực thể truyền dữ liệu. Liên kết TCP dữ liệu có thể được truyền theo hai hướng. Khi nhận một khối dữ liệu cần chuyển đi từ người sử dụng, TCP sẽ lưu trữ tại bộ đệm. Nếu cờ PUST được xác lập thì toàn bộ dừ liệu trong bộ đệm sẽ được gửi đi dưới dạng TCP Segment. Nếu PUST không được xác lập thì dữ liệu trong bộ đệm vẫn chờ gủi đi khi có cơ hội thích hợp.
Bên nhận, dữ liệu sẽ được gửi vào bộ đệm. Nếu dữ liệu trong đệm được đánh dấu bởi cờ PUST thì toàn bộ dữ liệu trong bộ đệm sẽ được gửi lên cho người sử dụng. Ngược lại, dữ liệu vẫn được lưu trong bộ đệm. Nếu dữ liệu khẩn cần phải chuyển gấp thì cờ URGENT được xác lập và đánh dấu dữ liệu bằng bit URG để báo dữ liệu khẩn cần được chuyển gấp.
Để thực hiện quá trình khôi phục lỗi, TCP sẽ gửi các công nhận ACK khi nhận được dữ liệu. Khi dữ liệu gửi đi không được ACK, bên gửi có thể gửi lại dữ liệu. Hình dưới đây mô tả tiến trình một web server gửi ra 1000-bytes trong đó khi segment thứ hai bị mất, dữ liệu sẽ được khôi phục lại.
Hình 2.3.1.1.1. Mô tả quá trình khắc phục lỗi
Ví dụ trên mô tả một tiến trình khôi phục lỗi trong đó bên gửi (máy web) nhận được một ACK trong đó chỉ ra rằng một segment đã bị mất. Lưu ý rằng trường ACK sẽ chỉ ra byte mong đợi kế tiếp- chứ không phải là byte nhận được cuối cùng. Cũng lưu ý rằng trường ACK và trường sequence chỉ ra số bytes, chứ không phải chỉ ra TCP segment. Bên máy gửi sẽ gửi ra một bộ định thời timers, dựa trên giá trị TCP Measured Round Trip Time (MRTT) sao cho nếu một ACK là không nhận được, máy gửi sẽ gửi lại tất cả nhưng dữ liệu không được công nhận mà không chờ cho bên máy nhận gửi một yêu cầu truyền lại.