Giới thiệu
Như chúng ta đã thấy ở những bài trước, 1 TCP Segment mang theo dữ liệu trong khi những cái khác chỉ đơn giản là báo nhận cho dữ liệu nhận được trước đó. Quá trình bắt tay 3 bước sử dụng SYN và ACK có sẵn trong TCP giúp hoàn thiện kết nối trước khi dữ liệu được truyền.
Mỗi TCP Segment đều có mục đích và điều này được xác định với sự trợ giúp của TCP Flag Options, cho phép bên gửi hoặc bên nhận chỉ ra cờ nên được sử dụng để các Segment xử lý 1 cách chính xác ở phía bên kia. Chúng ta hãy nhìn vào hình sau và cùng phân tích:
Bạn có thể thấy 2 cờ được sử dụng trong bắt tay 3 bước và truyền dữ liệu là SYN và ACK.
Với tất cả các cờ, giá trị bằng '1' được hiểu là cờ đấy đang được bật. Ví dụ trong hình chỉ có cờ SYN được bật, và chúng ta dựa vào đó đoán được đây là Segment đầu tiên của 1 kết nối TCP mới.
Mỗi cờ có độ dài 1 bit và có 6 cờ tất cả nên tổng cộng TCP Flags có độ dài 6 bits.
Bạn có lẽ cũng đồng ý với tôi rằng 3 cờ phổ biến nhất hay ít nhất mà chúng ta có nghe nói tới là cờ SYN, cờ ACK và cờ FIN lần lượt dùng để thiết lập kết nối, báo nhận thành công và kết thúc kết nối. Các cờ còn lại ít được biết đến nhưng nó có vai trò rất quan trọng. Chúng ta sẽ đi tìm hiểu tất cả 6 cờ này ngay bây giờ.
Cờ đầu tiên - Urgent Pointer
Cờ đầu tiên mà chúng ta tìm hiểu là Urgent Pointer. Cờ này để xác định dữ liệu đến là "khẩn cấp" tức là nâng độ ưu tiên của Segment. Những Segment có cờ Urgent Pointer được bật không phải chờ đợi cho đến khi các Segment trước đó được xử lý mà được gửi trực tiếp và xử lý ngay lập tức.
Urgent Pointer có thể được sử dụng trong luồng dữ liệu mà 1 máy gửi dữ liệu đến 1 ứng dụng được chạy ở 1 máy tính từ xa. Nếu có vấn đề xảy ra, máy tính cần phải hủy bỏ việc truyền dữ liệu và ngăn chặn việc xử lý dữ liệu ở đầu bên kia. Trong trường hợp bình thường, các Segment sẽ được gửi và xếp vào hàng đợi cho đến khi tất cả các dữ liệu trước được xử lý. Tuy nhiên, trong trường hợp cờ Urgent Pointer được bật thì sẽ được xử lý ngay lập tức mà không phải chờ.
Bằng cách đặt giá trị cờ Urgent Pointer là '1', máy tính sẽ không chờ đợi cho đến khi tất cả các dữ liệu được xếp vào hàng đợi rồi mới thực thi mà nó sẽ ngừng tất cả việc xử lý các dữ liệu khác và xử lý ngay lập tức các Segment ưu tiên.
Để dễ hiểu chúng ta xét 1 ví dụ thực tế:
Tại các bưu điện lớn, có hàng trăm xe tải chở thư từ và bưu phẩm từ khắp nơi đến và chờ đợi để được dỡ xuống. Kết quả là phải đợi rất lâu để có thể dỡ hết thư từ trong các xe đấy. Tuy nhiên có 1 chiếc xe tải có cờ màu đỏ mới đến. Các nhân viên an ninh hiểu rằng chiếc xe tải có cờ màu đỏ đang mang theo những lá thư rất quan trọng và cần đến đích một cách nhanh nhất. Vì thế, các nhân viên an ninh sẽ ưu tiên việc dỡ thư có trong chiếc xe tải này trước rồi mới tiến hành bốc dỡ ở các xe tải khác sau.
Trong ví dụ, những chiếc xe tải đại diện cho các Segment đang đi đến, và xe tải có cờ màu đỏ đại diện cho Segment có cờ Urgent Pointer được bật.
Cờ thứ hai - ACKnowledgement
Cờ ACK được sử dụng để xác nhận việc nhận thành công các gói tin. Nếu bạn đang chạy 1 chương trình sniffer trong khi truyền dữ liệu sử dụng TCP, bạn sẽ nhận thấy rằng trong hầu hết các trường hợp, mỗi gói tin bạn gửi hoặc nhận sẽ có 1 cờ ACK đi sau nó. Vì vậy nếu bạn nhận được 1 gói dữ liệu thì máy bạn sẽ gửi lại 1 gói tin có ACK = 1 để báo nhận cho gói dữ liệu vừa nhận được.
Không nhất thiết cứ 1 Segment nhận được thì sẽ phải gửi 1 ACK thông báo cho đầu bên kia. Trong các kỹ thuật điều khiển luồng hiện nay ví dụ như cửa sổ trượt, máy gửi sẽ gửi 1 lúc nhiều gói tin. Nếu máy nhận nhận được hết tất cả các gói tin trong lượt gửi ấy, máy nhận chỉ cần gửi ACK báo nhận cho gói tin cuối cùng. Bên gửi sẽ hiểu rằng bên nhận đã nhận được đúng tất cả các gói tin trong lượt gửi đó. Người ta gọi đó là báo nhận ACK tích lũy.
Cờ thứ 3 - PUSH
Cờ PUSH giống như cờ Urgent Pointer, tồn tại để đảm bảo rằng các dữ liệu được ưu tiên và được xử lý tại nơi gửi hoặc nơi nhận. Cờ này cụ thể được sử dụng khá thường xuyên ở đầu và cuối của việc truyền dữ liệu, ảnh hưởng đến cách dữ liệu được xử lý ở cả 2 đầu. Khi phát triển các ứng dụng mới, chúng ta phải chắc chắn rằng chúng thực hiện theo hướng dẫn cụ thể được đưa ra bởi RFC để đảm bảo các ứng dụng đấy có thể làm việc đúng cách và quản lý luồng dữ liệu trong và ngoài tầng ứng dụng trong mô hình OSI một cách hoàn hảo. Khi sử dụng, cờ PUSH làm cho các Segment chắc chắn được xử lý 1 cách chính xác và ưu tiên thích hợp ở cả 2 đầu của kết nối.
Khi 1 máy muốn gửi dữ liệu của nó, nó tạm thời được cất trong bộ đệm TCP, 1 khu vực đặc biệt trong bộ nhớ, cho đến khi Segment đã đạt đến 1 kích thước nhất định và sau đó được gửi đến bên nhận. Thiết kế này đảm bảo rằng việc chuyển giao dữ liệu là hiệu quả nhất có thể mà không phải đợi thời gian và băng thông bằng cách tạo ra nhiều Segment, nhưng kết hợp chúng vào 1 hoặc nhiều cái lớn hơn.
Khi Segment cuối cùng được nhận, nó được đặt trong bộ đệm TCP đến trước khi nó được thông qua vào tầng ứng dụng. Dữ liệu xếp trong hàng đợi bộ đệm sẽ vẫn ở đó cho đến khi các Segment khác đến. Và một khi hoàn tất, các dữ liệu được chuyển đến tầng ứng dụng. Trong khi thủ tục này hoạt động tốt ở hầu hết các trường hợp thì có rất nhiều trường hợp sự chậm trễ trong việc xếp hàng ở hàng đợi có thể gây ra nhiều vấn đề cho các ứng dụng đang chờ đợi.
Một vấn đề cuối cùng đề cập đến là cờ PUSH thường được thiết lập vào đoạn cuối của 1 tập tin để ngăn chặn việc tắc nghẽn bộ đệm. Nó cũng thường được nhìn thấy khi sử dụng để gửi HTTP hoặc các dạng yêu cầu khác thông qua 1 proxy - đảm bảo yêu cầu được xử lý 1 cách thích hợp và có hiệu quả.
Cờ thứ 4 - Reset (RST)
Cờ RST là cờ được sử dụng khi 1 Segment đến mà không được dự định dùng trong kết nối hiện thời. Nói cách khác, nếu bạn gửi 1 gói tin đến 1 máy chủ để thiết lập kết nối và không có dịch vụ nào chờ đợi để trả lời yêu cầu, máy chủ sẽ tự động gửi 1 gói tin trả lời với cờ RST được bật. Điều này chỉ ra rằng máy chủ đã thiết lập lại kết nối.
Điều này có thể được chứng minh rất đơn giản và hợp lý, sự thật là trong hầu hết các trường hợp tính năng này được sử dụng bởi hầu hết các tin tặc để quét cổng trên máy chủ xem nó có được mở hay không?
Các phương pháp sử dụng để phát hiện các cổng này rất đơn giản: khi cố gắng quét 1 máy chủ, 1 Segment hợp lệ được xây dựng với cờ SYN được bật và được gửi đến máy mục tiêu. Nếu không có dịch vụ lắng nghe ở cổng đấy thì máy mục tiêu sẽ gửi trả lời bằng 1 Segment có cờ ACK và RST được thiết lập. Nếu có dịch vụ lắng nghe trên cổng đấy thì máy mục tiêu sẽ gửi trả về 1 Segment có cờ ACK được thiết lập. Dĩ nhiên, đây là 1 phần của quá trình bắt tay 3 bước.
Nếu máy quét phát hiện ra 1 cổng được mở, nó sẽ hoàn tất quá trình bắt tay 3 bước sau đó chấm dứt bằng cách sử dụng cờ FIN và đánh dấu cổng đấy được mở.
Cờ thứ 5 - SYNchronisation
Cờ thứ 5 trong TCP Flag Options có lẽ thường được sử dụng nhất trong truyền thông sử dụng TCP. Như chúng ta đã biết, cờ SYN được sử dụng để khởi tạo quá trình bắt tay 3 bước trong TCP.
Trong hình trên, Host A cần phải tải dữ liệu từ Host B sử dụng giao thức TCP. Quá trình bắt tay 3 bước được thực hiện trước khi việc truyền dữ liệu xảy ra. Trong quá trình bắt tay 3 bước, chúng ta thấy có tổng cộng 2 cờ SYN được truyền. Khi trao đổi dữ liệu và kết nối mới đã được tạo ra, chúng ta sẽ thấy nhiều cờ SYN được gửi và nhận.
Cờ thứ 6 - FIN
Cờ cuối cùng mà chúng ta nói đến ở đây là cờ FIN, viết tắt của từ FINished. Cờ này luôn xuất hiện khi các gói dữ liệu cuối cùng được trao đổi giữa 1 kết nối.
Một chú ý quan trọng là khi 1 máy gửi 1 cờ FIN để đóng kết nối, nó vẫn có thể tiếp tục nhận dữ liệu cho tới khi máy bên kia cũng thực sự đóng kết nối, mặc dù điều này chỉ xảy ra trong 1 số hoàn cảnh nhất định.
Thủ tục ngắt kết nối được thực hiện như sau:
Hình trên thể hiện quá trình ngắt kết nối giữa máy A và máy B. Một khi việc truyền dữ liệu hoàn tất, máy A gửi 1 gói tin với cờ FIN và ACK được thiết lập. Tại thời điểm này, ứng dụng của máy A sẽ không nhận bất kỳ 1 dữ liệu nào nữa và sẽ đóng kết nối từ bên máy A.
Khi máy B nhận được yêu cầu đóng kết nối, máy B gửi 1 báo nhận ACK cho máy A để thông báo đã nhận được yêu cầu và thông báo cho ứng dụng ở máy B là ứng dụng bên máy A yêu cầu đóng kết nối. Khi 2 công việc này hoàn thành, máy B gửi 1 gói tin có cờ FIN và ACK được bật để đóng kết nối bên phía mình.
Hãy nhớ rằng TCP hoạt động song công (full duplex) nghĩa là lưu lượng hoạt động ở cả 2 hướng. Trong ví dụ, lưu lượng từ máy A đến máy B và ngược lại. Ngoài ra nó còn yêu cầu cả 2 bên đóng kết nối từ phía mình, do đó cả 2 bên đều gửi cờ FIN để báo rằng kết nối được đóng ở phía nó.
Bước cuối cùng, bước 4, máy A chấp nhận yêu cầu máy B gửi ở bước 3 và gửi báo nhận cho máy B, thủ tục đóng kết nối hoàn tất.
Lược dịch từ bài gốc: Click Here
Bài tiếp theo: TCP Window Size, Checksum & Urgent Pointer
Không có nhận xét nào:
Đăng nhận xét