Thứ Bảy, 6 tháng 10, 2012

Hi, Đang ngâm cứu về DDOS thấy cái này hay nên muốn chía sẻ.
Hình ảnh phía trên là sơ đồ trạng thái kết nối TCP, mình nhấn mạnh nó rất quan trọng, đặc biệt với dân mạng chúng ta khi nghiên cứu về TCP/IP.

Mình xin đi thẳng.
I. Quá trình bắt tay 3 bước (three-way handshake )
Ta chú ý vào 2 vòng tròn có sô 1 nằm trong (mình tạm gọi là (1)): Ban đầu bên client (màu xanh) server (màu cam).

Mình giả sử thằng client (active open) muốn kết nối với server (passive open)

Client muốn kết nối đến server nó phải trải qua quá trình bắt tay ba bước:
Bắt tay thứ nhất: (1) client tự nhân cờ SYN từ chính nó và chuyển qua trạng thái SYN_SENT, cùng lúc này thằng server cũng nhận SYN từ client và chuyển trạng thái nó thành SYN_RCVD.
Bắt tay thứ hai: (2) client nhận SYN và ACK từ server và chuyển thành ESTABLISHED
Bắt tay thứ ba: (3) Server nhận ACK từ client và chuyển thành ESTABLISH

client Server
1. CLOSED LISTEN
2. SYN-SENT --> <SEQ=100><CTL=SYN> --> SYN-RECEIVED
3. ESTABLISHED <-- <SEQ=300><ACK=101><CTL=SYN,ACK> <-- SYN-RECEIVED
4. ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK> --> ESTABLISHED
5. ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK><DATA> --> ESTABLISHED Basic 3-Way Handshake for Connection Synchronization

Mình giải thích một chút về sờ đồ trên
kí hiêu --> chỉ sự chuyển dời TCP segment từ client đến server, <-- là TCP segment từ Server đên client.

Trạng thái của TCP sẽ đổi sau khi TCP segment dời đi.
SEQ : số sequence
CTL: cờ điều khiển (control flags)
ACK : trường ACK

Dòng 1 :
Ban đầu thăng client ở trang thái CLOSED : nghĩa là client chưa có kết nối nào
Trạng thái ban đầu của server là LISTEN : server đang đợi một kết nối từ client.

Các dòng 2,3,4 đều giống như quá trình mình phân tích ở trên.
Riêng dòng 5 client gửi ACK và kèm theo dữ liệu, chú ý răng SEQ, ACK hoàn toàn giống ở bước 4.

Bước 5 khá thú vị! Bởi nó như một "mũi tên trúng hai đích" vậy, vừa gửi ACK để hoàn thành bắt tay, vừa " đi ké" được dữ liệu. Đi ké nhưng vẫn đúng luật giao thông :D bởi vì TCP stacks ngày nay cho phép gửi dữ liệu trong ACK PACKET. Thực ra ta có thể gửi từ bước 4.
Những dữ liệu ké có thể kể đến như gói HTTP request.

Các ví dụ trên thiết lập kết nối đối với một bên CLOSED một bên LISTEN . Nếu cả client lấn Server đều CLOSED

Hãy thử phân tích sơ đồ sau
client server
1. CLOSED CLOSED
2. SYN-SENT --> <SEQ=100><CTL=SYN> ...
3. SYN-RECEIVED <-- <SEQ=300><CTL=SYN> <-- SYN-SENT
4. ... <SEQ=100><CTL=SYN> --> SYN-RECEIVED
5. SYN-RECEIVED --> <SEQ=100><ACK=301><CTL=SYN,ACK> ...
6. ESTABLISHED <-- <SEQ=300><ACK=101><CTL=SYN,ACK> <-- SYN-RECEIVED
7. ... <SEQ=101><ACK=301><CTL=ACK> --> ESTABLISHED

kí hiệu .... đó chính là độ delay (TCP segment ta gửi vẫn còn nằm trên mạng chưa được nhận)
Dòng 1 : cho ta biết trạng thái TCP client và server đều là CLOSED
Dòng 2: client gửi SYN do Server đang ở CLOSED (vì nó cũng muốn gửi SYN)nên nó tạm thời không nhận TCP segment từ client.
Dòng 3: Server gửi SYN, do client đang ở SYN-SENT nhận SYN từ server sẽ chuyển thánh SYN-RECIEVED
Dòng 4: client tiếp tục công việc dang dở ở bước 2, nó lại gửi cái SYN i chang, server nhận SYN nên chuyển thành SYN-RECEIVED
Dòng 5: Do client gửi SYN-SENT trước nó được quyền đáp trả SYN,ACK trước, nhưng server (cũng muốn đáp trả SYN,ACK) không nhận vì nếu nhận nó sẽ rơi vào ESTABLISHED và không thể gửi SYN,ACK được
Dòng 6: Do Client đã gửi SYN,ACK(dù chưa được nhận) nên "cờ" lại về tay server nó thực hiện gửi SYN,ACK, client nhận được SYN,ACK chuyển thành ESTABLISHED
Dòng 7: giờ thì server không còn "nhu cầu " gì nữa, nó nhận ACK từ client để chuyển thành ESTABLISHED.

Quá trình trên thực hiện sole nhau giữa client và server, thằng nào gửi SYN-SENT trước sẽ kết thúc trước, gửi sau kết thúc sau

Phần sau mình nói về các trạng thái khác như TIME_WAIT, CLOSE_WAIT...

Không có nhận xét nào:

Đăng nhận xét