Độ tin cậy của TCP Vận chuyển
Chúng ta đều quen thuộc với giao thức TCP như một giao thức vận chuyển đáng tin cậy, nhưng làm thế nào nó đảm bảo độ tin cậy của việc vận chuyển?
Để đạt được truyền tải đáng tin cậy, cần phải xem xét nhiều yếu tố, chẳng hạn như dữ liệu bị hỏng, mất mát, trùng lặp và phân đoạn không theo thứ tự. Nếu không thể giải quyết những vấn đề này, không thể đạt được truyền tải đáng tin cậy.
Do đó, TCP sử dụng các cơ chế như số thứ tự, phản hồi xác nhận, kiểm soát gửi lại, quản lý kết nối và kiểm soát cửa sổ để đạt được khả năng truyền tải đáng tin cậy.
Trong bài báo này, chúng tôi sẽ tập trung vào cửa sổ trượt, kiểm soát luồng và kiểm soát tắc nghẽn của TCP. Cơ chế truyền lại được đề cập riêng trong phần tiếp theo.
Kiểm soát lưu lượng mạng
Network Flow Control hay còn gọi là Network Traffic Control thực chất là biểu hiện của mối quan hệ tinh tế giữa nhà sản xuất và người tiêu dùng. Bạn có thể đã gặp trường hợp này rất nhiều lần trong công việc hoặc trong các cuộc phỏng vấn. Nếu khả năng sản xuất của nhà sản xuất vượt xa khả năng tiêu thụ của người tiêu dùng, điều này sẽ khiến hàng đợi tăng lên vô hạn. Trong trường hợp nghiêm trọng hơn, bạn có thể biết rằng khi các tin nhắn RabbitMQ tích tụ quá nhiều, nó có thể khiến hiệu suất của toàn bộ máy chủ MQ bị suy giảm. Điều tương tự cũng đúng với TCP; nếu không được kiểm tra, quá nhiều tin nhắn sẽ được đưa vào mạng và người tiêu dùng sẽ vượt quá khả năng của họ, trong khi nhà sản xuất sẽ tiếp tục gửi các tin nhắn trùng lặp, điều này sẽ ảnh hưởng lớn đến hiệu suất của mạng.
Để giải quyết hiện tượng này, TCP cung cấp một cơ chế cho người gửi để kiểm soát lượng dữ liệu được gửi dựa trên khả năng tiếp nhận thực tế của người nhận, được gọi là kiểm soát luồng. Người nhận duy trì một cửa sổ nhận, trong khi người gửi duy trì một cửa sổ gửi. Cần lưu ý rằng các cửa sổ này chỉ dành cho một kết nối TCP duy nhất và không phải tất cả các kết nối đều chia sẻ một cửa sổ.
TCP cung cấp khả năng kiểm soát luồng bằng cách sử dụng một biến cho cửa sổ nhận. Cửa sổ nhận cung cấp cho người gửi chỉ báo về dung lượng bộ nhớ đệm còn trống. Người gửi kiểm soát lượng dữ liệu được gửi theo khả năng chấp nhận thực tế của người nhận.
Máy chủ nhận thông báo cho người gửi về kích thước dữ liệu mà nó có thể nhận được và người gửi gửi đến giới hạn này. Giới hạn này là kích thước cửa sổ, bạn còn nhớ tiêu đề TCP không? Có một trường cửa sổ nhận, được sử dụng để chỉ ra số byte mà người nhận có thể hoặc muốn nhận.
Máy chủ gửi sẽ định kỳ gửi một gói thăm dò cửa sổ, được sử dụng để phát hiện xem máy chủ nhận có vẫn có thể chấp nhận dữ liệu hay không. Khi bộ đệm của máy thu có nguy cơ tràn, kích thước cửa sổ được đặt thành giá trị nhỏ hơn để hướng dẫn máy gửi kiểm soát lượng dữ liệu được gửi.
Dưới đây là sơ đồ Kiểm soát luồng mạng:
Kiểm soát tắc nghẽn mạng
Trước khi giới thiệu về kiểm soát tắc nghẽn, chúng ta cần hiểu rằng ngoài cửa sổ nhận và cửa sổ gửi, còn có một cửa sổ tắc nghẽn, chủ yếu được sử dụng để giải quyết vấn đề về tốc độ mà người gửi bắt đầu gửi dữ liệu đến cửa sổ nhận. Do đó, cửa sổ tắc nghẽn cũng được duy trì bởi người gửi TCP. Chúng ta cần một thuật toán để quyết định lượng dữ liệu phù hợp để gửi, vì gửi quá ít hoặc quá nhiều dữ liệu đều không lý tưởng, do đó có khái niệm về cửa sổ tắc nghẽn.
Trong kiểm soát luồng mạng trước đây, điều chúng ta tránh được là người gửi điền dữ liệu vào bộ nhớ đệm của người nhận, nhưng chúng ta không biết điều gì đang xảy ra trong mạng. Thông thường, mạng máy tính nằm trong một môi trường chia sẻ. Do đó, có thể xảy ra tình trạng tắc nghẽn mạng do giao tiếp giữa các máy chủ khác.
Khi mạng bị tắc nghẽn, nếu một số lượng lớn các gói tin tiếp tục được gửi đi, nó có thể gây ra các vấn đề như độ trễ và mất gói tin. Tại thời điểm này, TCP sẽ truyền lại dữ liệu, nhưng việc truyền lại sẽ làm tăng gánh nặng cho mạng, dẫn đến độ trễ lớn hơn và mất nhiều gói tin hơn. Điều này có thể đi vào một vòng luẩn quẩn và ngày càng lớn hơn.
Do đó, TCP không thể bỏ qua những gì đang xảy ra trên mạng. Khi mạng bị tắc nghẽn, TCP sẽ tự hy sinh bằng cách giảm lượng dữ liệu mà nó gửi đi.
Do đó, kiểm soát tắc nghẽn được đề xuất, nhằm mục đích tránh lấp đầy toàn bộ mạng bằng dữ liệu từ người gửi. Để điều chỉnh lượng dữ liệu mà người gửi phải gửi, TCP định nghĩa một khái niệm gọi là cửa sổ tắc nghẽn. Thuật toán kiểm soát tắc nghẽn sẽ điều chỉnh kích thước của cửa sổ tắc nghẽn theo mức độ tắc nghẽn của mạng, để kiểm soát lượng dữ liệu mà người gửi gửi.
Cửa sổ tắc nghẽn là gì? Điều này có liên quan gì đến cửa sổ gửi?
Cửa sổ tắc nghẽn là biến trạng thái được duy trì bởi người gửi để xác định lượng dữ liệu mà người gửi có thể gửi. Cửa sổ tắc nghẽn thay đổi động theo mức độ tắc nghẽn của mạng.
Cửa sổ gửi là kích thước cửa sổ được thỏa thuận giữa người gửi và người nhận, cho biết lượng dữ liệu mà người nhận có thể nhận được. Cửa sổ tắc nghẽn và cửa sổ gửi có liên quan với nhau; cửa sổ gửi thường bằng giá trị tối thiểu của Cửa sổ tắc nghẽn và Cửa sổ nhận, tức là swnd = min(cwnd, rwnd).
Cửa sổ tắc nghẽn cwnd thay đổi như sau:
Nếu không có tình trạng tắc nghẽn trong mạng, tức là không xảy ra thời gian chờ truyền lại, thì cửa sổ tắc nghẽn sẽ tăng lên.
Nếu có tình trạng tắc nghẽn trong mạng, cửa sổ tắc nghẽn sẽ giảm xuống.
Người gửi xác định xem mạng có bị tắc nghẽn hay không bằng cách quan sát xem gói tin xác nhận ACK có được nhận trong thời gian quy định hay không. Nếu người gửi không nhận được gói tin xác nhận ACK trong thời gian quy định, thì mạng được coi là bị tắc nghẽn.
Ngoài cửa sổ tắc nghẽn, đã đến lúc thảo luận về thuật toán kiểm soát tắc nghẽn TCP. Thuật toán kiểm soát tắc nghẽn TCP bao gồm ba phần chính:
Khởi đầu chậm:Ban đầu, cửa sổ tắc nghẽn cwnd tương đối nhỏ và người gửi tăng cửa sổ tắc nghẽn theo cấp số nhân để nhanh chóng thích ứng với dung lượng của mạng.
Tránh tắc nghẽn:Sau khi cửa sổ tắc nghẽn vượt quá ngưỡng nhất định, bên gửi sẽ tăng cửa sổ tắc nghẽn theo cách tuyến tính để làm chậm tốc độ tăng của cửa sổ tắc nghẽn và tránh làm quá tải mạng.
Phục hồi nhanh:Nếu xảy ra tình trạng tắc nghẽn, bên gửi sẽ giảm một nửa cửa sổ tắc nghẽn và chuyển sang trạng thái phục hồi nhanh để xác định vị trí phục hồi mạng thông qua các xác nhận trùng lặp đã nhận, sau đó tiếp tục tăng cửa sổ tắc nghẽn.
Bắt đầu chậm
Khi kết nối TCP được thiết lập, cửa sổ tắc nghẽn cwnd ban đầu được đặt thành giá trị MSS (kích thước phân đoạn tối đa) tối thiểu. Theo cách này, tốc độ gửi ban đầu là khoảng MSS/RTT byte/giây. Băng thông khả dụng thực tế thường lớn hơn nhiều so với MSS/RTT, vì vậy TCP muốn tìm tốc độ gửi tối ưu, có thể đạt được bằng cách khởi động chậm.
Trong quá trình khởi động chậm, giá trị của cửa sổ tắc nghẽn cwnd sẽ được khởi tạo thành 1 MSS và mỗi lần phân đoạn gói tin được truyền đi được xác nhận, giá trị của cwnd sẽ tăng thêm một MSS, tức là giá trị của cwnd sẽ trở thành 2 MSS. Sau đó, giá trị của cwnd sẽ tăng gấp đôi cho mỗi lần truyền thành công một phân đoạn gói tin, v.v. Quá trình tăng trưởng cụ thể được thể hiện trong hình sau.
Tuy nhiên, tốc độ gửi không phải lúc nào cũng tăng; sự tăng trưởng phải kết thúc vào một lúc nào đó. Vậy, khi nào thì tốc độ gửi tăng kết thúc? Khởi động chậm thường kết thúc sự gia tăng tốc độ gửi theo một trong nhiều cách sau:
Cách thứ nhất là trường hợp mất gói tin trong quá trình gửi khởi động chậm. Khi xảy ra mất gói tin, TCP đặt cửa sổ tắc nghẽn cwnd của người gửi thành 1 và khởi động lại quá trình khởi động chậm. Tại thời điểm này, một khái niệm về ngưỡng khởi động chậm ssthresh được giới thiệu, có giá trị ban đầu bằng một nửa giá trị của cwnd tạo ra mất gói tin. Nghĩa là, khi phát hiện tắc nghẽn, giá trị của ssthresh bằng một nửa giá trị cửa sổ.
Cách thứ hai là tương quan trực tiếp với giá trị ngưỡng khởi động chậm ssthresh. Vì giá trị của ssthresh bằng một nửa giá trị cửa sổ khi phát hiện tắc nghẽn, mất gói có thể xảy ra với mỗi lần nhân đôi khi cwnd lớn hơn ssthresh. Do đó, tốt nhất là đặt cwnd thành ssthresh, điều này sẽ khiến TCP chuyển sang chế độ kiểm soát tắc nghẽn và kết thúc khởi động chậm.
Cách cuối cùng để kết thúc khởi động chậm là nếu phát hiện ba ACK dự phòng, TCP sẽ thực hiện truyền lại nhanh và vào trạng thái phục hồi. (Nếu không rõ tại sao lại có ba gói ACK, điều này sẽ được giải thích riêng trong cơ chế truyền lại.)
Tránh tắc nghẽn
Khi TCP vào trạng thái kiểm soát tắc nghẽn, cwnd được đặt thành một nửa ngưỡng tắc nghẽn ssthresh. Điều này có nghĩa là giá trị của cwnd không thể tăng gấp đôi mỗi khi nhận được một phân đoạn gói tin. Thay vào đó, một cách tiếp cận tương đối bảo thủ được áp dụng trong đó giá trị của cwnd chỉ tăng thêm một MSS (độ dài phân đoạn gói tin tối đa) sau mỗi lần truyền hoàn tất. Ví dụ, ngay cả khi 10 phân đoạn gói tin được xác nhận, giá trị của cwnd sẽ chỉ tăng thêm một MSS. Đây là mô hình tăng trưởng tuyến tính và nó cũng có giới hạn trên về tăng trưởng. Khi xảy ra mất gói tin, giá trị của cwnd được thay đổi thành MSS và giá trị của ssthresh được đặt thành một nửa của cwnd. Hoặc nó cũng sẽ dừng sự tăng trưởng của MSS khi nhận được 3 phản hồi ACK dự phòng. Nếu vẫn nhận được ba ACK dự phòng sau khi giảm một nửa giá trị của cwnd, giá trị của ssthresh được ghi lại là một nửa giá trị của cwnd và trạng thái phục hồi nhanh được nhập.
Phục hồi nhanh chóng
Trong trạng thái Phục hồi nhanh, giá trị của cửa sổ tắc nghẽn cwnd được tăng thêm một MSS cho mỗi ACK dự phòng nhận được, tức là ACK không đến theo trình tự. Điều này nhằm tận dụng các phân đoạn gói đã được truyền thành công trong mạng để cải thiện hiệu quả truyền tải càng nhiều càng tốt.
Khi ACK của phân đoạn gói tin bị mất đến, TCP giảm giá trị của cwnd và sau đó chuyển sang trạng thái tránh tắc nghẽn. Điều này nhằm kiểm soát kích thước của cửa sổ tắc nghẽn và tránh làm tăng thêm tình trạng tắc nghẽn mạng.
Nếu thời gian chờ xảy ra sau trạng thái kiểm soát tắc nghẽn, tình trạng mạng trở nên nghiêm trọng hơn và TCP di chuyển từ trạng thái tránh tắc nghẽn sang trạng thái khởi động chậm. Trong trường hợp này, giá trị của cửa sổ tắc nghẽn cwnd được đặt thành 1 MSS, độ dài phân đoạn gói tin tối đa và giá trị của ngưỡng khởi động chậm ssthresh được đặt thành một nửa cwnd. Mục đích của việc này là tăng dần kích thước của cửa sổ tắc nghẽn sau khi mạng phục hồi để cân bằng tốc độ truyền và mức độ tắc nghẽn của mạng.
Bản tóm tắt
Là một giao thức vận chuyển đáng tin cậy, TCP thực hiện vận chuyển đáng tin cậy bằng số thứ tự, xác nhận, kiểm soát truyền lại, quản lý kết nối và kiểm soát cửa sổ. Trong số đó, cơ chế kiểm soát luồng kiểm soát lượng dữ liệu được gửi bởi người gửi theo khả năng tiếp nhận thực tế của người nhận, tránh được các vấn đề về tắc nghẽn mạng và suy giảm hiệu suất. Cơ chế kiểm soát tắc nghẽn tránh xảy ra tắc nghẽn mạng bằng cách điều chỉnh lượng dữ liệu được gửi bởi người gửi. Các khái niệm về cửa sổ tắc nghẽn và cửa sổ gửi có liên quan với nhau và lượng dữ liệu tại người gửi được kiểm soát bằng cách điều chỉnh động kích thước của cửa sổ tắc nghẽn. Bắt đầu chậm, tránh tắc nghẽn và phục hồi nhanh là ba phần chính của thuật toán kiểm soát tắc nghẽn TCP, điều chỉnh kích thước của cửa sổ tắc nghẽn thông qua các chiến lược khác nhau để thích ứng với khả năng và mức độ tắc nghẽn của mạng.
Trong phần tiếp theo, chúng ta sẽ xem xét chi tiết cơ chế truyền lại của TCP. Cơ chế truyền lại là một phần quan trọng của TCP để đạt được khả năng truyền dữ liệu đáng tin cậy. Nó đảm bảo truyền dữ liệu đáng tin cậy bằng cách truyền lại dữ liệu bị mất, bị hỏng hoặc bị trì hoãn. Nguyên tắc triển khai và chiến lược của cơ chế truyền lại sẽ được giới thiệu và phân tích chi tiết trong phần tiếp theo. Hãy theo dõi!
Thời gian đăng: 24-02-2025