🔐 Ba Bắt Tay & Bốn Gói Tin – Hiểu Đúng Cách TCP Thiết Lập và Kết Thúc Kết Nối
Khi làm việc với TCP/IP, một trong những quy trình quan trọng nhất mà mọi kỹ sư mạng và bảo mật cần hiểu rõ là cách TCP thiết lập và kết thúc kết nối. Dù đã quá quen thuộc trong lý thuyết, nhưng không ít người nhầm lẫn giữa các bước, đặc biệt là quá trình kết thúc kết nối (termination). Bài viết này sẽ giúp bạn hiểu rõ và nhớ kỹ bằng cách giải thích từng gói tin trong ngữ cảnh thực tế.
📥 Thiết lập kết nối TCP – 3-Way Handshake
TCP là một giao thức hướng kết nối (connection-oriented), điều đó có nghĩa là trước khi có thể gửi dữ liệu thật, hai thiết bị cần phải thiết lập một phiên giao tiếp tin cậy. Quá trình này gọi là Three-Way Handshake (bắt tay ba bước), sử dụng ba gói tin để đồng bộ hóa số thứ tự (sequence number) giữa client và server. Các bước:
📤 Kết thúc kết nối TCP – 4 bước FIN/ACK
Khi một trong hai phía (thường là client) muốn kết thúc phiên làm việc TCP, quá trình kết thúc diễn ra qua một chuỗi 4 gói tin (nên đôi khi được gọi là Four-way Termination). Các bước:
🎓 Ví dụ thực tế từ gói tin Wireshark:
🔐 Tổng kết cho anh em SOC và Network Engineer:
Bạn đã từng debug một kết nối bị treo ở FIN_WAIT_2 chưa? Hãy chia sẻ trong bình luận kinh nghiệm thực chiến của bạn với TCP handshake nhé! 👇
Khi làm việc với TCP/IP, một trong những quy trình quan trọng nhất mà mọi kỹ sư mạng và bảo mật cần hiểu rõ là cách TCP thiết lập và kết thúc kết nối. Dù đã quá quen thuộc trong lý thuyết, nhưng không ít người nhầm lẫn giữa các bước, đặc biệt là quá trình kết thúc kết nối (termination). Bài viết này sẽ giúp bạn hiểu rõ và nhớ kỹ bằng cách giải thích từng gói tin trong ngữ cảnh thực tế.
📥 Thiết lập kết nối TCP – 3-Way Handshake
TCP là một giao thức hướng kết nối (connection-oriented), điều đó có nghĩa là trước khi có thể gửi dữ liệu thật, hai thiết bị cần phải thiết lập một phiên giao tiếp tin cậy. Quá trình này gọi là Three-Way Handshake (bắt tay ba bước), sử dụng ba gói tin để đồng bộ hóa số thứ tự (sequence number) giữa client và server. Các bước:
- Gói SYN (Client → Server)
- Client khởi động kết nối bằng cách gửi một TCP segment với cờ SYN = 1.
- Kèm theo đó là Sequence Number = X, là một số ngẫu nhiên do client tạo ra.
→ Mục tiêu: "Tôi muốn bắt đầu kết nối, đây là số thứ tự khởi đầu của tôi."
- Gói SYN-ACK (Server → Client)
- Server phản hồi bằng một gói SYN-ACK:
- SYN = 1 để đồng bộ hóa số thứ tự phía server (Sequence Number = Y).
- ACK = X + 1 để xác nhận đã nhận gói SYN từ client.
→ Mục tiêu: "Tôi đồng ý kết nối, đây là số thứ tự của tôi, và tôi đã nhận của bạn."
- Server phản hồi bằng một gói SYN-ACK:
- Gói ACK (Client → Server)
- Client phản hồi với gói ACK có ACK = Y + 1, xác nhận đã nhận SYN của server.
→ Mục tiêu: "Xác nhận cuối cùng, sẵn sàng truyền dữ liệu."
- Client phản hồi với gói ACK có ACK = Y + 1, xác nhận đã nhận SYN của server.
🔄 Kết quả: Hai bên đồng bộ số thứ tự, thiết lập phiên TCP thành công. Giao tiếp bắt đầu.
📤 Kết thúc kết nối TCP – 4 bước FIN/ACK
Khi một trong hai phía (thường là client) muốn kết thúc phiên làm việc TCP, quá trình kết thúc diễn ra qua một chuỗi 4 gói tin (nên đôi khi được gọi là Four-way Termination). Các bước:
- Gói FIN (Client → Server)
- Client gửi gói tin với FIN = 1, thông báo không còn dữ liệu để gửi.
→ TCP ở client vào trạng thái FIN_WAIT_1.
- Client gửi gói tin với FIN = 1, thông báo không còn dữ liệu để gửi.
- Gói ACK (Server → Client)
- Server gửi ACK xác nhận gói FIN.
→ Client vào FIN_WAIT_2, chờ server đóng.
- Server gửi ACK xác nhận gói FIN.
- Gói FIN (Server → Client)
- Khi server cũng sẵn sàng kết thúc, nó gửi gói FIN = 1.
→ Server vào LAST_ACK.
- Khi server cũng sẵn sàng kết thúc, nó gửi gói FIN = 1.
- Gói ACK (Client → Server)
- Client phản hồi ACK cuối cùng, xác nhận đã nhận FIN từ server.
→ Client vào TIME_WAIT, đợi 2 lần thời gian TTL để đảm bảo không có gói tin trễ.
- Client phản hồi ACK cuối cùng, xác nhận đã nhận FIN từ server.
✅ Sau bước này, kết nối TCP được đóng hoàn toàn cả hai phía.
🎓 Ví dụ thực tế từ gói tin Wireshark:
- SYN: Seq=1000
- SYN-ACK: Seq=3000 Ack=1001
- ACK: Seq=1001 Ack=3001
- Truyền dữ liệu…
- FIN: Seq=5001
- ACK: Ack=5002
- FIN: Seq=8001
- ACK: Ack=8002
🔐 Tổng kết cho anh em SOC và Network Engineer:
- Nếu không nắm rõ handshake, bạn dễ bỏ sót các sự kiện quan trọng trong log phân tích gói tin.
- 3 gói thiết lập – 4 gói kết thúc, giúp bạn định vị kết nối TCP trong firewall, SIEM hoặc phân tích sự cố.
- Trong các tấn công như TCP SYN Flood, attacker gửi SYN nhưng không hoàn thành bắt tay – gây tiêu tốn tài nguyên server.
- Trong forensic, gói FIN và thời điểm TIME_WAIT rất hữu ích để biết ai kết thúc kết nối, và khi nào.
Bạn đã từng debug một kết nối bị treo ở FIN_WAIT_2 chưa? Hãy chia sẻ trong bình luận kinh nghiệm thực chiến của bạn với TCP handshake nhé! 👇