TCP vận chuyển độ tin cậy
Tất cả 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 để đảm bảo độ tin cậy của giao thông?
Để đạt được truyền tải đáng tin cậy, nhiều yếu tố cần được xem xét, chẳng hạn như tham nhũng dữ liệu, mất mát, sao chép và các mảnh vỡ không theo thứ tự. Nếu những vấn đề này không thể giải quyết được, việc truyền tải đáng tin cậy không thể đạt được.
Do đó, TCP sử dụng các cơ chế như số thứ tự, trả lời xác nhận, kiểm soát lại, quản lý kết nối và kiểm soát cửa sổ để đạt được 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 dòng chảy và kiểm soát tắc nghẽn TCP. Cơ chế truyền lại được bao phủ riêng trong phần tiếp theo.
Kiểm soát luồng mạng
Kiểm soát luồng mạng hoặc được gọi là kiểm soát lưu lượng mạng thực sự là một 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. Có lẽ bạn đã bắt gặp kịch bản này rất nhiều tại nơi làm 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 quá khả năng tiêu thụ của người tiêu dùng, nó sẽ khiến hàng đợi phát triển vô thời hạn. Trong một 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 chồng chất quá nhiều, nó có thể gây ra sự suy giảm hiệu suất của toàn bộ máy chủ MQ. Điều tương tự cũng đúng với TCP; Nếu không được kiểm soát, quá nhiều tin nhắn sẽ được đưa vào mạng và người tiêu dùng sẽ vượt quá năng lực của họ, trong khi các nhà sản xuất sẽ tiếp tục gửi 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 máy thu, được gọi là kiểm soát dòng chảy. Máy thu duy trì cửa sổ nhận, trong khi người gửi duy trì 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 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 điều khiển luồng bằng cách sử dụng một biến cho cửa sổ nhận. Cửa sổ nhận cho người gửi một dấu hiệu cho thấy không gian bộ đệm vẫn còn bao nhiêu. 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 kích thước của 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ổ, hãy nhớ tiêu đề TCP? 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 sẵn sàng nhận.
Máy chủ người gửi sẽ định kỳ gửi gói đầu dò cửa sổ, được sử dụng để phát hiện xem máy chủ nhận có còn có thể chấp nhận dữ liệu hay không. Khi bộ đệm của người nhận 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 người gửi kiểm soát lượng dữ liệu được gửi.
Dưới đây là sơ đồ điều khiển luồng mạng:
Kiểm soát tắc nghẽn mạng
Trước khi giới thiệu 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 đề ở mức nào 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 tôi cần một thuật toán để quyết định số lượng dữ liệu phù hợp để gửi, vì việc gửi quá ít hoặc quá nhiều dữ liệu là không lý tưởng, do đó khái niệm về một cửa sổ tắc nghẽn.
Trong điều khiển luồng mạng trước đó, những gì chúng tôi tránh là người gửi điền vào bộ đệm của người nhận bằng dữ liệu, nhưng chúng tôi không biết những gì đang xảy ra trong mạng. Thông thường, mạng máy tính đang ở trong một môi trường chung. Do đó, có thể có 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 được tiếp tục được gửi, nó có thể gây ra các vấn đề như chậm trễ và mất các gói. 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 trên mạng, dẫn đến sự chậm trễ lớn hơn và tổn thất gói nhiều hơn. Điều này có thể đi vào một vòng luẩn quẩn và tiếp tục 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 tự hy sinh bằng cách giảm lượng dữ liệu mà nó gử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 với dữ liệu từ người gửi. Để điều chỉnh lượng dữ liệu mà người gửi nên gửi, TCP xác định 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 được gửi bởi ngườ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à một 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à một 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; Cửa sổ gửi thường bằng mức tối thiểu của các cửa sổ tắc nghẽn và nhận, nghĩa là SWND = min (CWND, RWND).
Cửa sổ tắc nghẽn CWND thay đổi như sau:
Nếu không có tắc nghẽn trong mạng, tức là không có thời gian chờ truyền lại, cửa sổ tắc nghẽn tăng.
Nếu có tắc nghẽn trong mạng, cửa sổ tắc nghẽn sẽ giảm.
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 liệu gói xác nhận ACK có được nhận trong thời gian chỉ định hay không. Nếu người gửi không nhận được gói xác nhận ACK trong thời gian được chỉ định, thì mạng lưới 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:
Bắt đầu chậm:Ban đầu, cửa sổ tắc nghẽn CWND tương đối nhỏ và người gửi làm tăng cửa sổ tắc nghẽn theo cấp số nhân để nhanh chóng thích ứng với khả năng của mạng.
Tránh tắc nghẽn:Sau khi cửa sổ tắc nghẽn vượt quá một ngưỡng nhất định, người 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 trưởng của cửa sổ tắc nghẽn và tránh quá tải mạng.
Phục hồi nhanh:Nếu xảy ra tắc nghẽn, người gửi nửa cửa sổ tắc nghẽn và nhập 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 ACK trùng lặp nhận được, 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 tối thiểu (kích thước phân đoạn tối đa). Bằng cách này, tỷ lệ gửi ban đầu là khoảng MSS/RTT byte/giây. Băng thông có sẵn 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ỷ lệ gửi tối ưu, có thể đạt được bằng cách bắt đầu chậm.
Trong quy trình bắt đầu 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 truyền được thừa nhận, giá trị của CWND sẽ được tăng thêm một MSS, nghĩa là giá trị của CWND sẽ trở thành 2 MSS. Sau đó, giá trị của CWND được nhân đôi cho mỗi lần truyền thành công một phân đoạn gói, v.v. Quá trình tăng trưởng cụ thể được thể hiện trong hình dưới đây.
Tuy nhiên, tỷ lệ gửi không thể luôn luôn tăng lên; Sự tăng trưởng phải kết thúc đôi khi. Vì vậy, khi nào tỷ lệ gửi tăng kết thúc? Khởi động chậm thường kết thúc sự gia tăng tỷ lệ gửi theo một trong nhiều cách:
Cách đầu tiên là trường hợp mất gói trong quá trình gửi khởi đầu chậm. Khi mất gói, TCP đặt cửa sổ tắc nghẽn của người gửi CWND thành 1 và khởi động lại quy trình khởi động chậm. Tại thời điểm này, một khái niệm về SSthresh ngưỡng khởi động chậm được giới thiệu, có giá trị ban đầu là một nửa giá trị của CWND tạo ra tổn thất gói. Đó là, khi bị tắc nghẽn được phát hiện, giá trị của ssthresh là 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ị của SSthresh ngưỡng bắt đầu chậm. Do giá trị của ssthresh là 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ế độ điều khiển tắc nghẽn và kết thúc chậm bắt đầu.
Cách cuối cùng mà sự khởi đầu chậm có thể kết thúc là nếu ba ACK dự phòng được phát hiện, TCP thực hiện truyền lại nhanh và đi vào trạng thái khôi phục. (Nếu không rõ tại sao có ba gói ACK, nó sẽ được giải thích riêng trong cơ chế truyền lại.)
Tránh tắc nghẽn
Khi TCP đi 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ể được nhân đôi mỗi khi nhận được phân đoạn gói. 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ỉ được tăng thêm một MSS (chiều dài phân đoạn gói tối đa) sau khi mỗi lần truyền được hoàn thành. Ví dụ: ngay cả khi 10 phân đoạn gói được thừa nhận, giá trị của CWND sẽ chỉ tăng thêm một MSS. Đây là một 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 mất gói xảy ra, 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ẽ ngăn chặn sự tăng trưởng của MSS khi nhận được 3 phản hồi ACK dự phòng. Nếu ba ACK dự phòng vẫn được nhận sau khi giảm một nửa giá trị của CWND, giá trị của ssthresh được ghi 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
Ở 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 MSS nhận được ACK dự phòng, nghĩa là ACK không xuất hiện theo trình tự. Điều này là để sử 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 một ACK của phân đoạn gói bị mất đến, TCP sẽ giảm giá trị của CWND và sau đó đi vào trạng thái tránh tắc nghẽn. Điều này là để kiểm soát kích thước của cửa sổ tắc nghẽn và tránh tăng thêm tắc nghẽn mạng.
Nếu thời gian chờ xảy ra sau khi trạng thái kiểm soát tắc nghẽn, điều kiện 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 tối đa và giá trị của SSthresh ngưỡng bắt đầu chậm được đặt thành một nửa của CWND. Mục đích của việc này là để tăng cường lại kích thước của cửa sổ tắc nghẽn sau khi mạng hồi phục để cân bằng tốc độ truyền và mức độ tắc nghẽn 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 theo 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 dòng chảy kiểm soát lượng dữ liệu được gửi bởi người gửi theo khả năng nhận thực tế của người nhận, điều này tránh các vấn đề về tắc nghẽn mạng và suy thoái hiệu suất. Cơ chế kiểm soát tắc nghẽn tránh sự xuất hiện của 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 điều khiển 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 năng lực và mức độ tắc nghẽn của mạng.
Trong phần tiếp theo, chúng tôi sẽ kiểm tra 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 truyền tải đá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 và chiến lược thực hiện 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: Tháng 2-24-2025