← Về danh sách
Mạng
#TCP#3wayHandshake#4wayHandshake#연결관리#TIME_WAIT#133회
Cập nhật lần cuối · 2026-07-07

TCP 3-way Handshake và 4-way Handshake

1. Tổng quan

A. Định nghĩa

TCP là giao thức truyền tải hướng kết nối, tin cậy, sử dụng handshake 3-way để thiết lập kết nối và 4-way để giải phóng kết nối, qua đó quản lý tin cậy việc liên lạc hai chiều.

Lý do căn bản TCP có handshake là vì phải tạo ra luồng hai chiều tin cậy trên nền mạng không tin cậy — nơi IP không bảo đảm thứ tự và việc đến nơi. Trước khi gửi dữ liệu, hai bên phải xác nhận với nhau "tôi đã sẵn sàng, và sẽ đếm bắt đầu từ số nào", thì sau đó mới có thể ráp lại thứ tự, loại bỏ trùng lặp và truyền lại. Tức là handshake không phải lời chào của liên lạc mà là hợp đồng ban đầu của độ tin cậy.

B. Mục đích

Quá trình thiết lập kết nối có hai mục tiêu. Thứ nhất, xác nhận trạng thái sẵn sàng gửi/nhận của từng chiều. Không chỉ chiều client→server mà cả chiều server→client cũng phải được mở, nên cần SYN của cả hai bên. Thứ hai, trao đổi và đồng bộ số thứ tự ban đầu (ISN) của mỗi chiều. Số thứ tự là chuẩn cho thứ tự và việc truyền lại của mọi byte sau đó, và bắt đầu bằng giá trị không thể đoán trước để ngăn gói tin của kết nối cũ bị lẫn vào hoặc bị giả mạo.

2. Thiết lập kết nối — 3-way Handshake

sequenceDiagram
  participant C as Client
  participant S as Server
  C->>S: SYN (seq=x)
  S->>C: SYN+ACK (seq=y, ack=x+1)
  C->>S: ACK (ack=y+1)

Điểm cốt lõi là vì sao thiết lập cần chính xác 3 bước. Để mở mỗi chiều cần "SYN (báo số bắt đầu của tôi)" và "ACK (xác nhận)" tương ứng, nên lẽ ra cần 4 thông điệp. Nhưng server có thể gộp ACK xác nhận SYN của client và SYN của chính mình vào một gói (SYN+ACK), nên giảm còn 3 bước. ① Client báo số thứ tự ban đầu x của mình bằng SYN, ② server xác nhận x (ack=x+1) đồng thời gửi kèm số thứ tự y của mình, ③ client xác nhận y (ack=y+1) thì số thứ tự của cả hai chiều đều được thống nhất và kết nối được thiết lập (ESTABLISHED). 2 bước thì thiếu vì không có xác nhận chiều server, còn 4 bước thì không cần thiết.

Bước Nội dung Trạng thái
1. SYN Client yêu cầu kết nối (số thứ tự ban đầu x) SYN_SENT
2. SYN+ACK Server chấp nhận + số thứ tự của mình (y), xác nhận x SYN_RECEIVED
3. ACK Client xác nhận y → kết nối được thiết lập ESTABLISHED

3. Giải phóng kết nối — 4-way Handshake

sequenceDiagram
  participant C as Client
  participant S as Server
  C->>S: FIN
  S->>C: ACK
  S->>C: FIN
  C->>S: ACK (TIME_WAIT)

Lý do giải phóng là 4-way, nhiều hơn thiết lập một bước, là vì kết nối TCP là hai luồng độc lập theo từng chiều. Dù một bên nói "tôi đã gửi xong (FIN)", bên kia có thể vẫn còn dữ liệu cần gửi. Vì vậy bên kia trước hết chỉ xác nhận (ACK) FIN, gửi nốt dữ liệu còn lại của mình, rồi khi xong mới gửi riêng FIN của mình (trạng thái này gọi là CLOSE_WAIT/half-close — đóng một nửa). Xác nhận và tín hiệu kết thúc từng được gộp thành SYN+ACK khi thiết lập, thì khi giải phóng lại bị tách thành ACK và FIN do độ lệch thời gian "gửi dữ liệu còn lại", nên số bước tăng thêm một. Bên chủ động kết thúc sau khi gửi ACK cuối cùng không đóng ngay mà chờ một lúc ở trạng thái TIME_WAIT.

Bước Nội dung
1. FIN Bên chủ động kết thúc yêu cầu kết thúc
2. ACK Bên nhận xác nhận (vẫn có thể gửi dữ liệu còn lại, half-close)
3. FIN Bên nhận cũng yêu cầu kết thúc sau khi gửi xong
4. ACK Bên chủ động kết thúc xác nhận → TIME_WAIT → kết thúc

4. Khái niệm liên quan và bảo mật

Handshake tiện lợi bao nhiêu thì cũng tạo ra lỗ hổng bấy nhiêu. TIME_WAIT sau khi kết thúc trông như lãng phí, nhưng nó nhằm ngăn các gói tin cũ bị trễ trên mạng lẫn nhầm vào kết nối mới mở cùng cổng, và để nhận việc truyền lại của đối phương khi ACK cuối cùng bị mất; thông thường được duy trì trong 2MSL. SYN Flooding là DoS trong đó kẻ tấn công gửi hàng loạt SYN mà không gửi ACK cuối cùng, làm cạn kiệt hàng đợi kết nối nửa mở (backlog) của server. SYN cookie để đối phó là kỹ thuật trong đó server không lưu trạng thái kết nối vào hàng đợi mà mã hóa nó bằng mật mã học vào trong số thứ tự, rồi khi ACK thật đến thì khôi phục trạng thái từ giá trị đó.

Khái niệm Giải thích
TIME_WAIT Ngăn gói tin trễ lẫn vào, dự phòng truyền lại ACK cuối (2MSL)
SYN Flooding DoS làm cạn backlog bằng kết nối chưa hoàn tất
SYN cookie Mã hóa trạng thái vào số thứ tự để phòng thủ không cần hàng đợi
Số thứ tự (ISN) Chuẩn bảo đảm thứ tự, truyền lại; không đoán trước được để chống giả mạo

5. Các điểm cần cân nhắc và hàm ý

  • Cái giá của độ tin cậy là độ trễ: 3-way tiêu tốn tối thiểu 1 RTT trước khi truyền dữ liệu. Trên web có nhiều yêu cầu ngắn, chi phí ban đầu này quyết định hiệu năng cảm nhận.
  • Tiến hóa sang QUIC: QUIC — nền tảng của HTTP/3 — gộp kết nối truyền tải và đàm phán TLS trên UDP, hỗ trợ 0-RTT, giảm đáng kể độ trễ handshake. Đây là xu hướng kế thừa khái niệm độ tin cậy của TCP nhưng cải thiện chi phí thiết lập.
  • Góc độ vận hành: Trên máy chủ quy mô lớn, socket TIME_WAIT có thể chiếm giữ cổng dẫn đến cạn kiệt, nên phải quản lý bằng tái sử dụng kết nối (keep-alive) và tinh chỉnh tham số kernel.

Tóm tắt một câu: TCP là giao thức tin cậy đồng bộ số thứ tự và thiết lập kết nối bằng 3-way SYN→SYN+ACK→ACK, và do half-close theo từng chiều nên giải phóng bằng 4-way FIN→ACK→FIN→ACK; nó bổ sung tính ổn định và bảo mật bằng TIME_WAIT và SYN cookie, còn QUIC cải thiện độ trễ của nó.