16/34 Flow control Các chương

Nếu bên gửi nhanh hơn bên nhận thì sao?

TCP làm sao không làm tràn bộ nhớ của máy nhận?

TCP đã có thể gửi lại dữ liệu bị mất. Nhưng ngay cả khi mạng không làm mất gói nào, vẫn còn một vấn đề.

Máy chủ có thể gửi dữ liệu rất nhanh, trong khi ứng dụng ở máy nhận lại đọc rất chậm.

Ví dụ:

TCP nhận:       100 MB/s
Ứng dụng đọc:   20 MB/s

80 MB còn lại mỗi giây phải nằm đâu đó.

Dữ liệu phải chờ trong bộ đệm

Khi dữ liệu TCP tới máy nhận, ứng dụng không nhất thiết đọc ngay.

Hệ điều hành giữ phần chưa được ứng dụng đọc trong bộ đệm nhận (receive buffer):

Mạng
  ↓
TCP receive buffer
  ↓
Ứng dụng

Nhưng bộ đệm này có giới hạn.

Nếu dữ liệu tới nhanh hơn tốc độ ứng dụng lấy ra, nó sẽ đầy dần:

[■][ ][ ][ ][ ]
[■][■][ ][ ][ ]
[■][■][■][ ][ ]
[■][■][■][■][ ]
[■][■][■][■][■]

Đến lúc đó, bên gửi cần biết rằng máy nhận không còn chỗ cho thêm dữ liệu.

Máy nhận báo còn bao nhiêu chỗ

Trong TCP, bên nhận quảng bá một cửa sổ nhận (receive window, rwnd).

Con số này cho bên gửi biết hiện tại nó còn được phép có thêm bao nhiêu dữ liệu chưa được xác nhận theo cửa sổ nhận.

Khi ứng dụng đọc chậm và bộ đệm đầy lên, rwnd nhỏ dần:

rwnd = 64 KB
rwnd = 32 KB
rwnd = 8 KB
rwnd = 0

Bên gửi phải giới hạn lượng dữ liệu đang gửi theo cửa sổ đó.

Nếu:

rwnd = 0

bên gửi không thể tiếp tục đẩy dữ liệu mới như trước.

Nó phải chờ.

Ứng dụng đọc bớt, bên gửi lại tiếp tục

Giả sử ứng dụng cuối cùng xử lý được một phần dữ liệu:

[■][■][■][■][■]

        ↓ ứng dụng đọc

[ ][ ][■][■][■]

Bộ đệm lại có chỗ trống.

Máy nhận có thể quảng bá một rwnd lớn hơn, và bên gửi tiếp tục truyền dữ liệu.

Toàn bộ vòng lặp trông như thế này:

bên gửi gửi dữ liệu
        ↓
receive buffer đầy dần
        ↓
rwnd nhỏ lại
        ↓
bên gửi gửi ít lại hoặc dừng
        ↓
ứng dụng đọc dữ liệu
        ↓
receive buffer có thêm chỗ
        ↓
rwnd tăng
        ↓
bên gửi tiếp tục

Thử làm ứng dụng đọc chậm và xem cửa sổ thay đổi:

Bộ đệm nhận và cửa sổ nhận

Bên gửi

gửi tiếp

Bộ đệm nhận

rwnd: 2

Ứng dụng

đọc chậm

Đó là kiểm soát luồng (flow control).

Nó ngăn một bên gửi nhanh làm bên nhận phải chứa nhiều dữ liệu hơn khả năng hiện tại của mình.

Nhưng máy nhận không phải chỗ duy nhất có thể quá tải

Flow control trả lời câu hỏi:

Máy nhận còn theo kịp không?

Nhưng giữa hai máy còn có switch, router và nhiều đường truyền khác.

Sender → Router → Router → Router → Receiver

Receive buffer có thể vẫn còn rất nhiều chỗ, nên:

rwnd = 64 KB

Nhưng một router ở giữa có thể đang nhận dữ liệu nhanh hơn khả năng chuyển tiếp của nó.

rwnd không cho bên gửi biết chuyện đó.

Nếu chính mạng ở giữa đang quá tải, TCP biết bằng cách nào?

Nguồn bài viết (1)

  1. RFC 9293 — Transmission Control Protocol (TCP) · IETF