Giao vận: TCP Internals Deep Dive
Quảng cáo • Advertisement
📢 Sponsor Ad
Google AdSense
lesson.content.title
lesson.content.subtitle
🎯 Mục tiêu bài học
Hiểu TCP State Machine và các thuật toán chống tắc nghẽn (Congestion Control) giúp Internet không bị sập.
1. TCP State Machine (Cỗ máy trạng thái)
⚠️ Tại sao cần TIME_WAIT?
Sau khi đóng kết nối, Client vẫn giữ trạng thái TIME_WAIT khoảng 30s-2phút. Để đảm bảo nếu gói ACK cuối cùng bị lạc, Server gửi lại FIN thì Client vẫn còn đó để hứng. Nếu không có TIME_WAIT, gói tin cũ lang thang trên mạng có thể chui vào kết nối mới gây lỗi dữ liệu.
2. Flow Control vs Congestion Control
| Flow Control (Kiểm soát luồng) | Congestion Control (Kiểm soát tắc nghẽn) | |
|---|---|---|
| Mục tiêu | Bảo vệ Người Nhận (Receiver) không bị ngập. | Bảo vệ Mạng lưới (Network) không bị tắc. |
| Cơ chế | Sliding Window (Windows Size trong Header). | Congestion Window (cwnd - Biến nội bộ của Sender). |
| Hoạt động | Receiver báo: "Tao còn 10KB chỗ trống". | Sender tự cảm nhận: "Mạng lag rồi, giảm tốc độ thôi". |
3. Các thuật toán TCP Congestion
a. Slow Start (Khởi động chậm)
Mới vào, cwnd = 1 MSS (Maximum Segment Size). Gửi 1 gói.
Nhận ACK OK -> Tăng gấp đôi: 2, 4, 8, 16... (Tăng theo hàm mũ). Tăng đến khi gặp ngưỡng ssthresh (Slow Start Threshold).
b. Congestion Avoidance (Tránh tắc nghẽn)
Khi vượt ngưỡng ssthresh, tăng tuyến tính (Mỗi RTT tăng 1 MSS). Tăng từ từ để thăm dò.
c. Fast Retransmit (Truyền lại nhanh)
Nếu Sender nhận được 3 Duplicate ACKs (Báo hiệu: "Gói X chưa tới, nhưng gói X+1, X+2 tới rồi"). Sender hiểu là gói X bị mất, nó gửi lại ngay lập tức mà không chờ Timeout.
4. Nagle's Algorithm (Gộp gói tin)
Vấn đề: Ứng dụng Telnet/SSH mỗi lần gõ 1 ký tự (1 byte). TCP Header (20 byte) + IP Header (20 byte) = 40 byte overhead cho 1 byte dữ liệu. Rất phí.
Giải pháp: Gom nhiều byte nhỏ lại thành 1 gói to rồi mới gửi.
Lưu ý: Game Online (Real-time) thường phải TẮT Nagle (TCP_NODELAY) để giảm độ trễ (Latency).
📝 Lab 11: Netcat Chat & TCP Tuning
Dùng nc (Netcat) để giả lập Server/Client.
# Terminal 1 (Server): Lắng nghe port 9999
nc -l -p 9999
# Terminal 2 (Client): Kết nối
nc 127.0.0.1 9999
Gõ phím bên này, bên kia hiện ra. Dùng Wireshark bắt gói tin Loopback để xem cờ PSH (Push) và ACK nhảy liên tục.
🔥 Interview Q&A
Q: Sự khác biệt giữa Window Size và MSS (Maximum Segment Size)?
A: MSS là kích thước dữ liệu lớn nhất trong 1 gói tin (thường là 1460 byte để vừa khít Ethernet 1500 byte). Window Size là tổng lượng dữ liệu có thể gửi đi mà chưa cần nhận ACK (tính bằng nhiều MSS cộng lại). Window Size quyết định Throughput.
Quảng cáo • Advertisement
📢 Ad Space
Google AdSense