Theo mặc định, khi cả hai tcp_tw_reuse
và tcp_tw_recycle
bị vô hiệu hóa, kernel sẽ đảm bảo rằng các socket ở TIME_WAIT
trạng thái sẽ vẫn ở trạng thái đó đủ lâu - đủ lâu để chắc chắn rằng các gói thuộc các kết nối trong tương lai sẽ không bị nhầm với các gói trễ của kết nối cũ.
Khi bạn bật tcp_tw_reuse
, các socket ở TIME_WAIT
trạng thái có thể được sử dụng trước khi chúng hết hạn và kernel sẽ cố gắng đảm bảo rằng không có xung đột nào liên quan đến số thứ tự TCP. Nếu bạn bật tcp_timestamps
(còn gọi là PAWS, để bảo vệ chống lại các số thứ tự được bọc), nó sẽ đảm bảo rằng những va chạm đó không thể xảy ra. Tuy nhiên, bạn cần kích hoạt dấu thời gian TCP ở cả hai đầu (ít nhất, đó là sự hiểu biết của tôi). Xem định nghĩa của tcp_twsk_unique để biết chi tiết về tin đồn .
Khi bạn kích hoạt tcp_tw_recycle
, kernel trở nên hung hăng hơn nhiều và sẽ đưa ra các giả định về dấu thời gian được sử dụng bởi các máy chủ từ xa. Nó sẽ theo dõi dấu thời gian cuối cùng được sử dụng bởi mỗi máy chủ từ xa có kết nối ở TIME_WAIT
trạng thái) và cho phép sử dụng lại ổ cắm nếu dấu thời gian đã tăng chính xác. Tuy nhiên, nếu dấu thời gian được sử dụng bởi máy chủ thay đổi (tức là cong ngược thời gian), SYN
gói sẽ bị hủy âm thầm và kết nối sẽ không được thiết lập (bạn sẽ thấy lỗi tương tự như "hết thời gian kết nối"). Nếu bạn muốn đi sâu vào mã hạt nhân, định nghĩa của tcp_timewait_state_ process có thể là một điểm khởi đầu tốt.
Bây giờ, dấu thời gian không bao giờ nên quay ngược thời gian; trừ khi:
- máy chủ được khởi động lại (nhưng sau đó, khi nó hoạt động trở lại,
TIME_WAIT
socket có thể đã hết hạn, vì vậy nó sẽ không thành vấn đề);
- địa chỉ IP nhanh chóng được sử dụng lại bởi một thứ khác (các
TIME_WAIT
kết nối sẽ ở lại một chút, nhưng các kết nối khác có thể sẽ bị tấn công TCP RST
và điều đó sẽ giải phóng một số không gian);
- dịch địa chỉ mạng (hoặc tường lửa thông minh) có liên quan ở giữa kết nối.
Trong trường hợp sau, bạn có thể có nhiều máy chủ phía sau cùng một địa chỉ IP và do đó, các chuỗi dấu thời gian khác nhau (hoặc, các dấu thời gian đã nói được ngẫu nhiên hóa ở mỗi kết nối bởi tường lửa). Trong trường hợp đó, một số máy chủ sẽ ngẫu nhiên không thể kết nối, vì chúng được ánh xạ tới một cổng mà TIME_WAIT
nhóm của máy chủ có dấu thời gian mới hơn. Đó là lý do tại sao các tài liệu nói với bạn rằng "Thiết bị NAT hoặc bộ cân bằng tải có thể bắt đầu giảm khung hình do cài đặt".
Một số người khuyên bạn nên rời khỏi tcp_tw_recycle
mình, nhưng cho phép tcp_tw_reuse
và hạ thấptcp_timewait_len
. Tôi đồng tình :-)