Các kích thước cửa sổ TCP nói chung là không phụ thuộc vào kích thước phân khúc lớn nhất mà phụ thuộc vào các đơn vị truyền tải tối đa do đó phụ thuộc vào kích thước khung hình tối đa .
Hãy bắt đầu thấp.
Các kích thước khung hình tối đa là khung lớn nhất mạng (segment) có thể vận chuyển. Đối với Ethernet, đây là 1518 byte theo định nghĩa.
Khung đóng gói một gói IP, vì vậy gói lớn nhất - đơn vị truyền tối đa MTU - là kích thước khung tối đa trừ đi chi phí khung. Đối với Ethernet, đó là 1518 - 18 = 1500 byte.
Gói IP đóng gói một phân đoạn TCP, do đó, kích thước phân đoạn tối đa MSS là MTU trừ đi chi phí IP trừ chi phí TCP (MSS không bao gồm tiêu đề TCP). Đối với Ethernet và TCP qua IPv4 mà không có tùy chọn, đây là 1500 - 20 (tổng phí IPv4) - 20 (chi phí TCP)) = 1460 byte.
Bây giờ, TCP là một giao thức truyền tải tự thể hiện như một ổ cắm luồng cho ứng dụng. Điều đó có nghĩa là một ứng dụng chỉ có thể truyền bất kỳ lượng dữ liệu có kích thước tùy ý qua ổ cắm đó. Do đó, TCP chia luồng dữ liệu thành các phân đoạn đã nói (0 đến MSS byte dài {1}), truyền từng phân đoạn qua IP và đặt chúng trở lại cùng nhau tại đích.
Các phân đoạn TCP được xác nhận bởi đích đến để đảm bảo phân phối. Hãy tưởng tượng nút nguồn sẽ chỉ gửi một phân đoạn duy nhất, chờ xác nhận và sau đó gửi phân đoạn tiếp theo. Bất kể băng thông thực tế, thông lượng của kết nối TCP này sẽ bị giới hạn bởi thời gian khứ hồi (RTT, thời gian cần thiết để một gói đi từ nguồn tới đích và quay lại).
Vì vậy, nếu bạn có kết nối 1 Gbit / s giữa hai nút có RTT là 10 ms, bạn có thể gửi 1460 byte mỗi 10 ms hoặc 146 kB / s một cách hiệu quả. Điều đó không thỏa mãn lắm.
Do đó, TCP sử dụng cửa sổ gửi - nhiều phân đoạn có thể "đang bay" cùng một lúc, được gửi đi và chờ xác nhận. Nó cũng được gọi là cửa sổ trượt khi nó tiến lên mỗi khi phân đoạn ở đầu cửa sổ được xác nhận, kích hoạt việc gửi phân đoạn tiếp theo mà cửa sổ tiến tới. Bằng cách này, kích thước phân khúc không thành vấn đề. Với một cửa sổ truyền thống 64 KiB, chúng ta có thể có số tiền đó trong chuyến bay và theo đó, vận chuyển 64 KiB trong mỗi 10 ms = 6,5 MB / s. Tốt hơn, nhưng vẫn không thực sự thỏa mãn cho kết nối gigabit.
TCP hiện đại sử dụng tùy chọn tỷ lệ cửa sổ có thể tăng cửa sổ gửi theo cấp số nhân lên tới 2 GiB, cung cấp cho một số tăng trưởng trong tương lai.
Nhưng tại sao không phải tất cả dữ liệu chỉ được gửi cùng một lúc và tại sao chúng ta cần cửa sổ gửi này? Nếu bạn gửi mọi thứ nhanh như bạn - cục bộ - có thể và có (rất có thể) một liên kết chậm hơn ở đâu đó trên đường đến đích, một lượng dữ liệu đáng kể sẽ cần phải được xếp hàng. Không có bộ chuyển mạch hoặc bộ định tuyến nào có thể đệm nhiều hơn một vài MB (nếu có), do đó, lưu lượng vượt quá sẽ cần phải được loại bỏ. Không thừa nhận, nó sẽ cần phải bực bội, vượt quá một lần nữa. Điều này sẽ rất kém hiệu quả và nó sẽ làm tắc nghẽn mạng nghiêm trọng. TCP xử lý vấn đề này bằng điều khiển tắc nghẽn, điều chỉnh kích thước cửa sổ theo băng thông hiệu quả và thời gian khứ hồi hiện tại trong một thuật toán phức tạp.
{1} phân đoạn rỗng có thể được sử dụng để ngăn chặn timeouts kết nối bằng cách sử dụng keepalive tùy chọn. Thx Ded repeatator