Lúng túng với việc sắp xếp lại gói

Aug 15 2020

Tôi đang đọc một cuốn sách giáo khoa nói về giao thức TCP "Lặp lại có chọn lọc":

Chúng tôi đã giả định rằng các gói không thể được sắp xếp lại trong kênh giữa người gửi và người nhận. Đây thường là một giả định hợp lý khi người gửi và người nhận được kết nối bằng một dây vật lý duy nhất. Tuy nhiên, khi “kênh” kết nối cả hai là một mạng, việc sắp xếp lại gói có thể xảy ra. Cách tiếp cận được thực hiện trong thực tế là đảm bảo rằng một số thứ tự không được sử dụng lại cho đến khi người gửi “chắc chắn” rằng bất kỳ gói nào đã gửi trước đó có số thứ tự x không còn trong mạng. Điều này được thực hiện bằng cách giả định rằng một gói tin không thể “sống” trong mạng lâu hơn một khoảng thời gian tối đa cố định.

Tôi đang bối rối và dưới đây là hai câu hỏi của tôi.

Q1-Điều gì làm "kênh có thể được coi là bộ đệm các gói tin về cơ bản và phát ra các gói tin này một cách tự nhiên vào bất kỳ thời điểm nào trong tương lai." nghĩa là? Tại sao chúng ta cần đệm một gói tin cũ? Không phải tốt hơn là người nhận cứ bỏ qua nó?

Q2-Giả sử kích thước cửa sổ là 2 và số thứ tự có sẵn là 0,1,2,3. Đầu tiên người gửi gửi gói 0, gói 1, trong khi gói 0 bị tấn công bằng cách nào đó và mất nhiều thời gian để đến nơi, do đó thời gian chờ xảy ra, người gửi phải gửi lại gói 0, nhưng lần này gói 0 (mới) đến đúng giờ. Sau đó người gửi gửi gói 2, gói 3, tất cả đều do người nhận. Và sau đó người gửi chuẩn bị gửi gói 0 (mới) và gói 1 (mới), nhưng gói 0 cũ đến tay người nhận ngay bây giờ, do đó, nhận không thể biết rằng gói này là gói cũ hay gói mới. Vì vậy, làm thế nào "giả sử rằng một gói không thể" sống "trong mạng lâu hơn một số thời gian tối đa cố định" có thể khắc phục sự cố này? Nó có nghĩa là tiêu đề gói tin chứa thời gian mà nó được gửi đi?

Trả lời

2 Zac67 Aug 16 2020 at 07:31

Điều gì khiến "kênh có thể được coi là bộ đệm các gói tin về cơ bản và tự phát ra các gói tin này vào bất kỳ thời điểm nào trong tương lai." nghĩa là? tại sao chúng ta cần đệm một gói tin cũ? không tốt hơn là người nhận chỉ cần bỏ qua nó?

Đó là bản chất của xếp hàng và đệm là một phần thiết yếu của chuyển mạch gói - các gói đã nhận được xếp hàng / đệm khi xâm nhập và bị xóa khỏi hàng đợi khi chúng đã được chuyển tiếp. Việc đệm là cần thiết vì nếu không thì liên kết đầu ra sẽ luôn cần phải trống bất cứ khi nào nhận được gói tin - điều này không thể xảy ra đối với mạng chuyển mạch gói, chỉ đối với mạng chuyển mạch kênh.

Giả sử kích thước cửa sổ là 2 và số thứ tự có sẵn là 0,1,2,3.

Cửa sổ không đếm các gói / gói dữ liệu mà là các byte . Ngoài ra, số thứ tự chỉ lặp lại khi trường 32 bit của nó bị tràn - điều đó chỉ xảy ra sau 4 GiB dữ liệu. Tuy nhiên, giới hạn đó có nghĩa là không thể có nhiều hơn 4 Gib dữ liệu "đang bay" để tránh sự mơ hồ. Vì cửa sổ lớn nhất có thể là (gần bằng) 1 GiB, đó không phải là vấn đề.

Lưu ý rằng với ACK tích lũy, đơn giản, người nhận không thể chọn lọc ACK phân đoạn sau khi phân đoạn trước vẫn bị thiếu. ACK có nghĩa là tất cả dữ liệu trước đó đã được nhận.

Ví dụ: với kích thước phân đoạn là 1.000 và kích thước cửa sổ là 10.000, người gửi sẽ gửi biểu đồ dữ liệu D00-D09 (chuỗi 0-9,999). D00 và D02-D09 được nhận, nhưng D01 bị mất. Người nhận vẫn là 1.000 ACK (chuỗi dữ liệu dự kiến ​​tiếp theo) kích hoạt người gửi di chuyển D0 ra khỏi cửa sổ, nâng nó lên 1.000-10.999 và gửi D10.

Trong khi đó, người nhận đã quyết định rằng có vấn đề, vì vậy nó ACK lại 1.000 để báo hiệu điều đó. Người gửi nhận ACK kép và gửi lại D01 (chế độ miễn cưỡng) hoặc tất cả dữ liệu bắt đầu từ D01 (chế độ tích cực). Người nhận đã có D10 (10.000-10.999), do đó, nó là 11.000 ACK, lần lượt chuyển cửa sổ của người gửi thành 11.000-20.999 (và hủy truyền lại vẫn còn tồn đọng, đối với chế độ tích cực).

(Tôi đã phần nào đơn giản hóa quy trình, trên thực tế có nhiều chồng chéo song song hơn và tất nhiên là có sự chậm trễ giữa gửi và nhận.)

CHỈNH SỬA: Như Jeff đã chỉ ra một cách chính xác (thx!), Hỗ trợ cho các xác nhận có chọn lọc (SACK) gần như được cung cấp ngày nay. Sử dụng tùy chọn đó, người nhận cũng có thể SACK 2.000-9.999 (từ D02-D09) ngay lập tức, vì vậy người gửi sẽ không bắt đầu truyền lại chúng. Nó cũng có thể bắt đầu truyền 11.000-20.999 sớm hơn.