Thursday, February 4, 2010

TCP Flag Options



Ở hình bên, ta xem thông tin các cờ được sử dụng trong quá trình bắt tay giữa bên gửi và bên nhận, cờ SYN có giá trị là 1, có nghĩa là cờ này đang được bật, chúng ta có thể thay đổi giá trị này thành “on”. Giá trị này cho biết đây là phiên đầu tiên của một kết nối TCP.

Mỗi một cờ có giá trị là 1 bit, có 6 cờ được thiết lập, ở bản bên, Flags có chiều dài là 6 bits.
Có 3 loại cờ phổ biến được sử dụng, là SYN, ACK, và FIN. Dùng để thiết lập kết nối, chấp nhận kết nối và kết thúc quá trình gởi nhận. Các giá trị còn lại ta sẽ đi sâu vào trong phần tiếp theo vì chúng được sử dụng chỉ trong những trường hợp đặc biệt, chứ không thường xuyên.
Chúng ta bắt đầu tìm hiểu về 6 loại cờ trên, từ giá trị thứ 1.
1.Urgent pointer:
Cờ urgent pointer được sử dụng để xác định mức độ khẩn cấp của phiên kết nối. Một khi cờ này được bật (giá trị là 'on' hoặc '1'), dữ liệu trong phiên này sẽ được ưu tiên gởi trước mà không cần đợi cho đến khi các phiên trước đó hoàn thành xong.

Trong quá trình gởi nhận dữ liệu từ nơi lưu trữ đến một máy tính từ xa, do lượng dữ liệu là lớn, nên một khi có vấn đề xảy ra trong quá trình này, dữ liệu gởi đi sẽ không còn đảm bảo tính nguyên vẹn, không xác định được. Nếu dữ liệu tiếp tục được gởi và nhận sẽ làm cho thời gian thực hiện công việc tăng lên mà không mang lại kết quả, cờ Urgent pointer trong trường hợp này được bật, lệnh chấm dứt kết nối được gởi đi mà không cần phải chờ cho đến khi tất cả dữ liệu được gởi trước đó đến được bên nhận.

2. ACK (Acknowledgement)
Cờ ACK dùng để ghi nhận sự thành công của một phiên kết nối.
Nếu ta dùng một chương trình sniffer trong quá trình gởi nhận dữ liệu bằng giao thức TCP, trong hầu hết các trường hợp,các gói tin bạn gửi đi hoặc nhân được, cờ ACK luôn mang giá trị là 1, nghĩa là cờ ACK được bật. Vì trong trường hợp bạn nhận được gói tin trả lời từ một máy chủ lưu trữ, công việc còn lại của bạn là gửi các gói tin trả lời với cờ ACK được bật để xác định rằng kết nối đã được thiết lập.
Trong một số trường hợp , máy chủ yêu cầu bạn tuần tự gởi một gói tin với cờ ACK được bật cho mỗi lần nhận được 3 gói tin (nhận 3 gởi 1), quá trình này được gọi là Windowing. Hiện nay phương thức này được sử dụng rộng rãi.
3.PUSH:
Giống như Urgent Pointer, cớ PUSH được bật nhằm xác định độ ưu tiên của một dữ liệu nào đó. Cờ này được sử dụng chủ yếu ở đầu và cuối của một phiên truyền nhận dữ liệu, ảnh hưởng tới việc xử lí dữ liệu ở đầu gửi và nhận sau khi kết thúc.
Khi phát triển các ứng dụng mới dựa trên mô hình OSI và phương thức TCP, các nhà phát triển phải đảm bảo đáp ứng đủ các yêu cầu được ấn định ở RFC để ứng dụng của mình hoạt động đúng cách. Cờ PUSH đảm bảo các phân đoạn dữ liệu được xử lí một cách chính xác, và thích hợp cho các mức ưu tiên tại cả hai nơi nhận và gửi của một phiên kết nối ảo.
Khi một máy chủ gởi các dữ liệu của nó, dữ liệu này không được gởi ngay mà được xếp trong hàng đợi TCP buffer trước khi nó được chấp nhận và gởi đến bên nhận. Thiết kế này đảm bảo dữ liệu việc chuyển giao đạt được hiệu quả cao nhất có thể, mà không phải lãng phí thời gian và bandwidth bằng cách tạo ra nhiều phiên kết nối , mà kết hợp dữ liệu thành một hoặc nhiều phiên kết nối lớn hơn gởi đi cùng một lúc.

Khi đến bên nhận, dữ liệu được lưu ở TCP incoming buffer chờ phân loại và sắp xếp trước khi đến được tầng application. Dữ liệu được lưu ở đây cho đến khi quá trình gởi nhận hoàn tất, chúng được sắp xếp một lần nữa trước khi chuyển giao cho ứng dụng thích hợp xử lí.
Trong khi phương thức này hoạt động tốt trong hầu hết các trường hợp, thì đôi lúc việc chờ phân loại và sắp xếp này làm cho dữ liệu đến bên nhận không xác định được do sự trễ của dữ liệu đối với chương trình tiếp nhận. Vấn đề này hơi khó hiểu một chút, một ví dụ là việc tiếp nhận và xử lí dữ liệu của Real Player, chương trình này yêu cầu dữ liệu phải được gửi và xử lí ngay lập tức mà không bị phân khúc hoặc gián đoạn.
Điềm cuối cùng cần nhắc đến là cờ PUSH thường được đặt trên phân đoạn cuối của việc gửi nhận một tập tin để ngăn ngữa buffer Deadlocks (http://searchoracle.techtarget.com/expert/KnowledgebaseAnswer/0,289625,sid41_gci1203664,00.html ). Nó cũng được sử dụng rộng rãi trong giao thức http hoặc việc gửi nhận thông tin qua proxy server, đảm bảo các yêu cầu được xử lí phù hợp và có hiệu quả.

4.RST(Reset)
Cờ reset được sử dụng trong trường hợp một phiên kết nối được tạo ra không thuộc về các kết nối đã được thiết lập và đang được xử lí. Một ví dụ cụ thể, nếu bạn gửi một yêu cầu kết nối đến cổng 80 (http) của một máy chủ nào đó, trong khi vì một lí do nào đó, webserver không hoạt động, máy chủ sẽ không chấp nhận yêu cầu này, và gửi cho bạn một gói tin trả lời với cờ RST được bật, điều đó có nghiã là server reset kết nối của bạn.
Bạn hãy liên tưởng đến các công cụ dùng để quét cổng, nmap chẳng hạn, công cụ này sẽ lần lượt gởi các yêu cầu đến các welknown-port, dựa vào các gói tin gửi về sẽ xác định được dịch vụ nào đang chạy, và đang lắng nghe và chờ kết nối ở cổng nào.
Các phương pháp quét cổng được hiểu một cách đơn giản, khi cố găng để quét một máy chủ từ xa, chương trình này tạo một loạt các gói tin tới các cổng cụ thể với cờ SYN được bật, và gởi đến máy chủ mục tiêu, nếu trên một cổng nào đó không có dịch vụ mở cổng lắng nghe, máy chủ sẽ trả lời bằng một gói tin với cờ ACK và RST được bật, cờ ACK báo cho ta biết máy chủ đã nhận được yêu cầu, cờ RST báo cho ta biết không có dịch vụ nào thích hợp với yêu cầu đó. Ngược lại, nếu có một dịch vụ lắng nghe trên cổng, thì máy chủ sẽ xây dựng một phiên đoạn với cờ SYN, ACK được bật.
Ví dụ trên miêu tả một phần tiêu chuẩn của quá trình bắt tay 3 bước <3ways>
Sau khi chương trình quét cổng nhận được trả lời như trên, chương trình sẽ hoàn thành quá trình bắt tay này, và kết thúc bằng cờ FIN (finish) , sẽ nói đến trong phần sau.
5.SYN (SYNchronisation)
Cờ SYN có lẽ là cờ được sử dụng rộng rãi và phổ biến nhất trong truyền thông TCP.


Hình trên diễn tả quá trình bắt tay 3 bước trong một phiên giao dịch giữa host A và host B. Quá trình này diễn ra với 2 lần cờ syn được chuyển giao, lần thứ nhất Host A gởi yêu cầu cho Host B với cờ SYN được bật báo cho HOST B biết A muốn tạo kết nối và tải dữ liệu từ B, tiếp theo B kiểm tra yêu cầu của A, nếu hợp lệ, B trả lời A bằng một gói tin với cờ SYN và ACK được bật chấp nhận yêu cầu của A, tiếp theo A lại gửi cho B một gói tin nữa để báo cho B biết chuẩn bị thiết lập kết nối, khi B nhân được gói tin này thì quá trình kết nối được thiết lập (established)
6. FIN (FINish)
Cuối cùng là cờ FIN, biểu tượng cho việc hoàn thành kết nối. Cờ này dùng để xác nhận kết nối được thiết lập bằng cờ SYN trước đó. Vì vậy, cờ FIN luôn luôn xuất hiện sau khi việc gởi nhận gói tin được hoàn thành.
Lưu ý rằng cờ FIN dùng để đánh dấu kết thúc một kết nối, nhưng không có nghĩa là kết nối hoàn toàn được triệt tiêu. Ta xem hình bên dưới, quá trình chấm dứt một kết nối giữa nơi gửi (Host B) và nơi nhận (Host A) diễn ra như sau


Đầu tiên là việc gởi nhận dữ liệu hoàn tất giữa A và B, sau đó Host A gửi cho Host B một gói tin với cờ FIN và ACK được bật báo cho B biết A đã nhận xong dữ liệu, Application giữ vai trò nhận dữ liệu ở A sẽ không tiếp nhận bất kì dữ liệu nào ở B nữa, B trả lời A bằng một gói tin với cờ ACK được bật báo cho A biết B chấp nhận yêu cầu, tiếp theo B xác nhận việc chấm dứt bằng gói tin với cờ FIN, và ACK được bật, cuối cùng A xác nhận bằng việc gởi đến cho B gói tin với cờ ACK, kết nối sau đó mới được triệt tiêu hoàn toàn.
Đọc đến đây có lẽ ai cũng thắc mắc vì sao lại có nhưng bước phức tạp như vậy, trong khi hoàn toàn có thể đóng ngay kết nối khi gửi và nhận xong DATA. TCP là một giao thức Full Duplex, có nghĩa là trong khi B gửi dữ liệu cho A thì đồng thời A cũng gửi dữ liệu cho B, ít nhất để B biết rằng A còn duy trì kết nối đến B để nhận dữ liệu. Việc chấm dứt kết nối phải đồng thời diễn ra từ 2 phía, bên gửi và bên nhận,

Kết: Bài viết này tôi thu thập được từ các bài viết tiếng Anh trên mạng, cố gắng diễn tả cụ thể nhất theo cách hiểu của riêng bản thân mình. Hi vọng bạn sẽ có một cái nhìn tổng quan hơn về TCP và hiểu phần nào đó về quá trình bắt tay 3 bước trong cách truyền nhận một gói tin dùng TCP.


**Mr.Bi
Anh mách cho một kế thế này. Khi em muốn nắm về tcp/ip, em nên nghiên cứu một bức đồ hoạ về ip header, tcp header, udp header.... và xem kỹ các fields và chức năng của chúng. Xong được cái này là em đã nắm ít nhất 50% về giao thức này rồi. Nếu không nắm được những chi tiết và giá trị bên trong một header thì đọc mãi đống chữ trong sách cũng chẳng thu nhập được bao nhiêu đâu em

1 comment:

  1. Bài viết rất hay anh à! em rất thích bài này.

    ReplyDelete