Mục đích của TIME WAIT trong kết nối TCP là gì?


12

Tôi thấy rằng lý do hoạt động gần hơn vào TIME WAIT là để đảm bảo rằng ACK cuối cùng không bị mất. Nhưng làm thế nào để biết nếu ACK cuối cùng bị mất? Người thụ động sẽ gửi lại FIN gần hơn và sau đó người chủ động gần hơn sẽ biết ACK bị mất? Dưới đây là hình ảnh của TCP FSM.

TCP FSM



1
Bài đăng trên blog này có một câu trả lời tuyệt vời: vincent.bernat.im/en/blog/ Kẻ
Tinh tinh thích chiến tranh

Câu trả lời:


5

Người thụ động sẽ gửi lại FIN gần hơn và sau đó người chủ động gần hơn sẽ biết ACK bị mất?

Đúng. Trích dẫn từ TCP / IP Illustrated Tập 1 , trong phần Quản lý kết nối TCP:

  1. Để hoàn thành việc đóng, phân đoạn cuối cùng chứa ACK cho FIN cuối cùng. Lưu ý rằng nếu FIN bị mất, nó sẽ được truyền lại cho đến khi nhận được ACK cho nó.

Có thời gian chờ. Khi ở trong LAST_ACK, thụ động gần hơn sẽ gửi lại FINkhi có thời gian chờ, giả sử rằng nó đã bị mất. Nếu nó thực sự bị mất, thì hoạt động gần hơn cuối cùng sẽ nhận được truyền lại FINvà nhập TIME_WAIT. Nếu FINkhông bị mất nhưng trận chung kết ACKbị mất, thì hoạt động gần hơn sẽ diễn ra TIME_WAITvà nhận FINlại. Khi điều này xảy ra - nhận một FINtrong TIME_WAIT- các ACKđược truyền lại.

Các giá trị thời gian chờ TIME_WAITKHÔNG sử dụng cho mục đích truyền lại. Khi có thời gian chờ TIME_WAIT, người ta cho rằng trận chung kết ACKđã được gửi thành công vì việc thụ động gần hơn không truyền lại các FINgói. Vì vậy, thời gian chờ TIME_WAITchỉ là một khoảng thời gian mà sau đó chúng ta có thể giả định một cách an toàn rằng nếu đầu kia không gửi bất cứ thứ gì, thì đó là vì anh ta đã nhận được trận chung kết ACKvà đóng kết nối.


1

Nhưng làm thế nào để biết nếu ACK cuối cùng bị mất?

Bởi vì nó đã không nhận được nó trong khoảng thời gian chờ. Tôi biết đó là câu trả lời "duh", nhưng đó chính xác là lý do tại sao các trạng thái và thời gian chờ này tồn tại.

Thụ động sẽ gần hơn gửi lại FIN

Không. Trừ khi các gói tiếp theo đến luồng đó và điều đó sẽ dẫn đến "RST" (đặt lại) được gửi.

Toàn bộ quá trình là máy trạng thái phức tạp để thực hiện tắt máy có trật tự mặc dù có khả năng xảy ra lỗi mạng. Mạng bị đứt, liên kết gặp lỗi, liên kết trở nên bão hòa và phải bỏ gói, thiết bị không hoạt động, v.v. Như một bài tập, hãy chạy cây trạng thái để kết nối hoạt động khi một trong các điểm cuối biến mất (ví dụ như mất điện.)

TL; DR Cây trạng thái đó được thiết kế để xử lý mọi chế độ thất bại có thể.


Cảm ơn, nhưng tôi vẫn bối rối về phần đầu tiên. Ý tôi là làm thế nào để người chủ động biết gần hơn ACK không bị thụ động tiếp cận gần hơn? Khi thụ động gần hơn nhận được ACK, nó sẽ phá vỡ kết nối của nó và nếu nó không nhận được ACK, nó sẽ ở lại LAST ACK, vậy làm thế nào để chủ động biết gần hơn nếu ACK được nhận?
czhao

bởi vì có bộ tính giờ gắn liền với mọi tiểu bang.
Ricky Beam

Xin lỗi tôi không hiểu. Làm thế nào để những bộ tính giờ này nói với người chủ động gần hơn mà người thụ động gần hơn không nhận được ACK cuối cùng? tức là làm thế nào để người chủ động biết gần hơn nếu phải gửi lại ACK cuối cùng?
czhao

0

Mục đích của TIME_WAIT là cho phép mạng phân biệt các gói đến như thuộc về kết nối 'cũ, hiện có' với một kết nối mới. Đề xuất là đặt bộ hẹn giờ TIME_WAIT thành hai lần Thời gian phân đoạn tối đa (MSL), trên hệ thống của tôi, MSL là 1 phút, do đó, các kết nối sẽ ở trạng thái TIME_WAIT trong 2 phút.

Sau khoảng thời gian này, mọi gói tin đến không còn được liên kết với kết nối cũ.

TIME_WAIT không được chờ đợi để gửi các gói ACK; được điều khiển bởi các trạng thái CLOSE_WAIT và FIN_WAIT. Khi bạn đến trạng thái TIME_WAIT, ổ cắm đã bị đóng.

Tài liệu tham khảo: http://www.tcpipguide.com/free/t_TCPConnectionTermination-3.htm https://en.wikipedia.org/wiki/Maximum_seribution_lifetime http: //www.logn normal.com/blog/2012/09/27/ linux-tcpip-chỉnh /

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.