Pages

Monday, May 24, 2010

Bắt tay 3 bước(three way - handshake)



Ở lớp Transport có 2 giao thức quan trọng là UDP và TCP.

- TCP là giao thức thuộc dạng connection-oriented (hướng kết nối). Có nghĩa là nó thiết lập kênh kết nối trước khi truyển data đi.

- UDP là giao thức thuộc dạng connectionless (nghĩa là không hướng kết nối). Nó không cần thiết lập kênh truyền trước khi truyền dữ liệu đi.

TCP thiết lập kết nối bằng 3 bước bắt tay (3-way handshake)

sender ___________ receiver

SYN seq=X ----------> SYN received (step 1)

SYN received <--------send ACK X+1 and SYN Y (step 2)

Send ACK Y+1 --------> (step 3)


Tìm hiểu:

Có lẽ kiến thức về TCP/IP là những gì bạn cần phải tìm hiểu đầu tiên trên con đường trở thành Network Administrator hay Security Advisor. Kiến thức liên quan đến bộ giao thức này có rất nhiều, bạn nên dành thời gian để tìm hiểu thật kỹ về nó. Trong bài này chúng ta sẽ đề cập đến vấn đề 3 bước bắt tay tạo kết nối trong TCP.
Một gói dữ liệu TCP chứa các bit cờ (flag bits) để mô tả nội dung và mục đích của gói dữ liệu.
Ví dụ:

* Gói dữ liệu với cờ SYN (synchronization) dùng để bắt đầu một connection.
* ACK (acknowledgement).
* FIN (finish) dùng để ngắt một connection.
* ...

Bây giờ chúng ta sẽ tìm hiểu kỹ hơn một phiên (session) làm việc được bắt đầu như thế nào:



1. SYN: các chương trình máy con (ví dụ yêu cầu từ browser, ftp client) bắt đầu connection với máy chủ bằng cách gửi một packet với cờ "SYN" đến máy chủ.
SYN packet này thường được gửi từ các cổng cao (1024 - 65535) của máy con đến những cổng trong vùng thấp (1 - 1023) của máy chủ. Chương trình trên máy con sẽ hỏi hệ điều hành cung cấp cho một cổng để mở connection với máy chủ. Những cổng trong vùng này được gọi là "cổng máy con" (client port range). Tương tự như vậy, máy chủ sẽ hỏi HĐH để nhận được quyền chờ tín hiệu trong máy chủ, vùng cổng 1 - 1023. Vùng cổng này được gọi là "vùng cổng dịch vụ" (service port).
Ví dụ (mặc định):

- Web Server sẽ luôn chờ tín hiệu ở cổng 80 và Web browser sẽ connect vào cổng 80 của máy chủ.
- FTP Server sẽ lắng ở port 21.

Ngoài ra trong gói dữ liệu còn có thêm địa chỉ IP của cả máy con và máy chủ.

2. SYN/ACK: khi yêu cầu mở connection được máy chủ nhận được tại cổng đang mở, server sẽ gửi lại packet chấp nhận với 2 bit cờ là SYN và ACK.
SYN/ACK packet được gửi ngược lại bằng cách đổi hai IP của server và client, client IP sẽ thành IP đích và server IP sẽ thành IP bắt đầu. Tương tự như vậy, cổng cũng sẽ thay đổi, server nhận được packet ở cổng nào thì cũng sẽ dùng cổng đó để gửi lại packet vào cổng mà client đã gửi.
Server gửi lại packet này để thông báo là server đã nhận được tín hiệu và chấp nhận connection, trong trường hợp server không chấp nhận connection, thay vì SYN/ACK bits được bật, server sẽ bật bit RST/ACK (Reset Acknowledgement) và gởi ngược lại RST/ACK packet.
Server bắt buộc phải gửi thông báo lại bởi vì TCP là chuẩn tin cậy nên nếu client không nhận được thông báo thì sẽ nghĩ rằng packet đã bị lạc và gửi lại thông báo mới.

3. ACK: khi client nhận được SYN/ACK packet thì sẽ trả lời bằng ACK packet. Packet này được gởi với mục đích duy báo cho máy chủ biết rằng client đã nhận được SYN/ACK packet và lúc này connection đã được thiết lập và dữ liệu sẽ bắt đầu lưu thông tự do.
Đây là tiến trình bắt buộc phải thực hiện khi client muốn trao đổi dữ liệu với server thông qua giao thức TCP. Một số thủ thuật dựa vào đặc điểm này của TCP để tấn công máy chủ (ví dụ DOS).

thêm cái video:


http://www.youtube.com/watch?v=FdwNzb1CQPg&NR=1



4 nhận xét:

nc said...

có thêm phần ngắt kết nối tcp nữa thì hay :)

Nguyễn Văn Thương said...

Khi một bên nào đó muốn ngắt kết nối (bên chủ động) thì nó sẽ gửi đi một cờ FIN (Finish) và "bên còn lại" nhận được sẽ trả lời lại bằng 1 cờ ACK đồng ý ngắt kết nối. Sau đó "bên chủ động" nhận được thì lập tức sẽ gửi lại một cờ ACK tiếp theo cho "bên còn lại". Cuối cùng "bên còn lại" sẽ gửi thêm 1 cờ ACK nữa và ngắt kết nối. :D

ruancinan said...

Thương Lee nhầm rồi! Quá trình kết thúc là 2 quá trình kết thúc 1 chiều độc lập nhau. Khi một bên muốn kết thúc nó sẽ gửi 1 cờ FIN và bên còn lại sẽ gửi lại tin báo nhận bằng cờ ACK. Khi đó kết nối tồn tại dạng "nửa mở" một bên đã kết thúc việc gửi dữ liệu nên chỉ nhận trong khi bên khi bên kia vẫn tiếp tục gửi. Để kết nối đóng hoàn toàn, bên còn lại cũng phải làm tương tự tức là gửi 1 cờ FIN cho bên kia và chờ nhân 1 cờ ACK

Anonymous said...

Bạn ơi, cái cơ chế kết thúc này mình đọc vẫn chưa hiểu lắm, mọi người viết lên thành sơ đồ được không

Mình loạn hết cả rồi

Post a Comment