Thursday, June 24, 2010

TCP:Sequence & Acknowledgement Numbers

Như ta đã biết thì TCP là 1 giao thức hướng kết nối. 2 thông số Sequence and Acknowledgment number là 2 trong số những chi tiết nói lên sự hướng kết nối của TCP. Khi sử dụng TCP để truyền dữ liệu thì nó sẽ giúp cho dữ liệu đc liền mạch, ko bị mất mát dữ liệu trong quá trình truyền tin.
TCP sử dụng 1 số cơ chế như timout, retransmission, sequence để bảo đảm ko có lỗi trong quá trình truyền.Khi hết 1 khoảng thời gian quy định mà vẫn chưa nhận đc ACK thì dữ liệu sẽ đc truyền lại với ACK là ACK ngay sau ACK cuối cùng đc truyền.
Mỗi hệ điều hành có 1 cách để tính toán sequence number khác nhau. Mỗi hệ điều hành có thuật toán riêng để tạo ra các số đó, số này sẽ đc dùng để đảm bảo việc truyền dữ liệu.
Cả Acknowledgment and sequence number đều sử dụng 32bit cho nên sẽ có 2^32~4,3 tỉ trường hợp có thể có của các số này.
-Initial sequence number(ISN)
Khi 2 host muốn có 1 kết nối, điều đó cũng đồng nghĩa với việc sẽ phải tạo ra 1 số ban đầu để có thể bắt đầu một phiên kết nối, số này gọi là Initial sequence number(ISN)
ISN là giá trị của sequence number đc khởi tạo khi bắt đầu 1 phiên kết nối. Đây là 1 mối nguy cơ của việc session hijacking.
Ý tưởng của việc này đó là:
Hacker là kẻ "đứng giữa" 2 máy đang kết nối với nhau, 2 host này muốn kết nối thì trước tiên sẽ phải tao ra ISN để có thể đạt được 1 kết nối thành công giữa 2 host này. Việc của hacker là đứng ở giữa, sniff các gói tin, đoán đc thuật toán tạo ra ISN, sau đó tấn công chiếm đoạt phiên kết nối!
Giả sử ta có 2 host là hostA-client, hostB-server chuẩn bị khởi tạo kết nối với nhau.Ở đây host muốn khởi tạo kết nối là hostA.
Khi muốn tạo 1 kết nối với hostB, hostA sẽ dùng 1 thuật toán của riêng OS nó đang sử dụng để tạo ra sequence number, gói tin TCP này sẽ bật cờ SYN lên, với sequence number đã đc tạo ra, nó sẽ gửi đến hostB.
Lúc này hacker là kẻ đứng ở giữa, nó sẽ cố gắng sniff gói tin, sao cho có thể đoán đc thuật toán của việc khởi tạo này.Một khi đã thấy đc thuật toán thì việc đoán đc gói tin tiếp theo với sequence number nào la ko khó.
Khi đã có đc thuật toán và đoán đc sequence number tiếp theo thì nó sẽ tiến hành hijack phiên kết nối. THời gian đóng vai trò khá quan trọng, cho nên nó sẽ cùng lúc tiến hành việc gửi các gói tin trông có vẻ đúng tới hostB, đồng thời cũng sẽ gửi các thông tin rác đến hostA, làm hostA ko thể có khả năng tiếp tục phiên kết nối với hostB. Như vậy hacker đã thành công trong việc chiếm đoạt phiên kết nối!
-Ví dụ về ACK number and SYN number
Bây giờ ta sẽ xem xét về tính kết nối tin cậy của TCP

Xét ví dụ 2 host truyền tải thông tin sử dụng TCP với nhau
hostA--------------------------------------hostB
step1: ------------------------------------>
step2: <-----------------------------------
step3: ------------------------------------>
step4: ------------------------------------>
đây là quá trình bắt tay 3 bước giữa 2 hostA và hostB.
Ta sẽ xem xét theo từng bước
Step1:
HostA muốn khởi tạo 1 phiên kết nối, nó sẽ gửi 1 gói tin với cờ SYN đc bật lên và 1 số sequence number(A) đc tạo ra. Lúc này ACK =0
Ta có thể hiểu ngắn gọn rằng hostA nói:'Tôi có thể có 1 phiên kết nối với anh ko?Sequence number của tôi là A'
Step2:
Khi hostB nhận đc yêu cầu từ hostA, nó sẽ xem xét khả năng của nó có thể đáp ứng đc yêu cầu của hostA hay ko!?Nếu đc nó sẽ gửi trả lại 1 gói tin hồi đáp với Sequence number là B và ACK là A+1.Gói tin này sẽ có cờ SYN và ACK đc bật lên. Điều đó cũng nói rằng, hostB đã xác nhận là gói tin này nó gửi là để hồi đáp lại gói tin với sequence number mà hostA mới gửi cho nó!
Khi này thì hostB đã giống như:'Tôi đã nhận đc gói tin yêu cầu của anh, tôi có thể kết nối với anh. Sequence number tiếp theo so với sequence number của anh mới gửi cho tôi là A+1, và ACK của tôi là B'
Khi này rõ ràng hostA sẽ nhận ra đây là gói tin dành cho yêu cầu mới gửi thông qua sequence number mà hostB gửi trả lại cho nó!
Step3:
Khi hostA đã nhận đc gói tin mà hostB vừa gửi thì cũng là lúc nó sẽ tạo ra 1 gói tin để kết thúc việc xin xỏ kết nối này. HostA sẽ tạo ra gói tin với cờ ACK đc bật lên, sequence number lúc này sẽ là A+1 và ACK là 1 số C nào đó.
Khi mà hostB nhận đc gói tin này rồi, nó cũng sẽ hiểu rằng 2 bên đã thoả thuận xong, và sẽ bắt đầu kết nối với nhau. Đến đây quá trình bắt tay 3 bước đã hoàn thành. 2 bên có thể truyền gửi dữ liệu với nhau.
Step4:
Đây là giai đoạn truyền dữ liệu. HostA khi đã đc sự cho phép từ hostB thì sẽ gửi lại gói tin với SYN, ACK như ở Step3, những gói tin này sẽ chứa data để gửi sang hostB

No comments:

Post a Comment