TCP dùng 4-way handshake (FIN/ACK/FIN/ACK) để đóng kết nối; sau đó initiator vào TIME_WAIT (2×MSL ≈ 60s) để đảm bảo ACK cuối được nhận.
TCP close connection cần 4 bước vì mỗi direction đóng độc lập:
- Client gửi FIN — muốn đóng kết nối
- Server gửi ACK — xác nhận, nhưng server vẫn có thể tiếp tục gửi data (half-close)
- Server gửi FIN — server cũng muốn đóng
- Client gửi ACK — xác nhận
TIME_WAIT state: sau khi client gửi ACK cuối, client vào TIME_WAIT trong 2*MSL (Maximum Segment Lifetime, thường 60 giây) trước khi port được tái sử dụng. Mục đích:
- đảm bảo server nhận được ACK cuối (nếu ACK mất, server retransmit FIN, client trong TIME_WAIT có thể trả ACK lại)
- đảm bảo packets cũ từ connection trước không được nhầm cho connection mới
Vấn đề thực tế: server với nhiều short-lived connections (HTTP/1.1) có thể bị exhausted ephemeral ports do quá nhiều TIME_WAIT sockets. Giải pháp: tcp_tw_reuse=1 (Linux, reuse TIME_WAIT sockets cho outgoing connections), HTTP/2 multiplexing, keep-alive connections.