Những bí ẩn chính của kết nối TCP Network Packet Broker: Làm sáng tỏ nhu cầu về Triple Handshake

Thiết lập kết nối TCP
Khi duyệt web, gửi email hoặc chơi game trực tuyến, chúng ta thường không nghĩ đến kết nối mạng phức tạp đằng sau nó. Tuy nhiên, chính những bước tưởng chừng nhỏ này lại đảm bảo giao tiếp ổn định giữa chúng ta và máy chủ. Một trong những bước quan trọng nhất là thiết lập kết nối TCP, và cốt lõi của bước này là cơ chế bắt tay ba bước.

Bài viết này sẽ thảo luận chi tiết về nguyên lý, quy trình và tầm quan trọng của bắt tay ba bước. Chúng tôi sẽ từng bước giải thích lý do tại sao cần bắt tay ba bước, cách nó đảm bảo tính ổn định và độ tin cậy của kết nối, cũng như tầm quan trọng của nó đối với việc truyền dữ liệu. Với sự hiểu biết sâu sắc hơn về bắt tay ba bước, chúng ta sẽ hiểu rõ hơn về các cơ chế cơ bản của giao tiếp mạng và có cái nhìn rõ ràng hơn về độ tin cậy của các kết nối TCP.

Quá trình bắt tay ba chiều TCP và chuyển đổi trạng thái
TCP là giao thức truyền tải hướng kết nối, yêu cầu thiết lập kết nối trước khi truyền dữ liệu. Quá trình thiết lập kết nối này được thực hiện bằng cơ chế bắt tay ba bước.

 Bắt tay ba chiều TCP

Chúng ta hãy xem xét kỹ hơn các gói tin TCP được gửi trong mỗi kết nối.

Ban đầu, cả máy khách và máy chủ đều ĐÓNG. Đầu tiên, máy chủ chủ động lắng nghe trên một cổng và ở trạng thái LISTEN, nghĩa là máy chủ phải được khởi động. Tiếp theo, máy khách đã sẵn sàng để bắt đầu truy cập trang web. Nó cần thiết lập kết nối với máy chủ. Định dạng của gói kết nối đầu tiên như sau:

 Gói SYN

Khi máy khách khởi tạo kết nối, nó sẽ tạo một số thứ tự ban đầu ngẫu nhiên (client_isn) và đặt số này vào trường "Số thứ tự" của tiêu đề TCP. Đồng thời, máy khách đặt vị trí cờ SYN thành 1 để chỉ ra rằng gói tin gửi đi là gói SYN. ​​Máy khách chỉ ra rằng nó muốn thiết lập kết nối với máy chủ bằng cách gửi gói SYN đầu tiên đến máy chủ. Gói này không chứa dữ liệu tầng ứng dụng (tức là dữ liệu đã gửi). Lúc này, trạng thái của máy khách được đánh dấu là SYN-SENT.

Gói SYN+ACK

Khi máy chủ nhận được gói tin SYN từ máy khách, nó sẽ ngẫu nhiên khởi tạo số sê-ri của riêng nó (server_isn) và sau đó đặt số đó vào trường "Số sê-ri" của tiêu đề TCP. Tiếp theo, máy chủ nhập client_isn + 1 vào trường "Số xác nhận" và đặt cả hai bit SYN và ACK thành 1. Cuối cùng, máy chủ gửi gói tin đến máy khách, trong đó không chứa dữ liệu tầng ứng dụng (và cũng không có dữ liệu để máy chủ gửi). Lúc này, máy chủ đang ở trạng thái SYN-RCVD.

Gói ACK

Sau khi máy khách nhận được gói tin từ máy chủ, nó cần thực hiện các tối ưu hóa sau để phản hồi gói tin trả lời cuối cùng: Đầu tiên, máy khách đặt bit ACK của tiêu đề TCP của gói tin trả lời thành 1; Thứ hai, máy khách nhập giá trị server_isn + 1 vào trường "Xác nhận số câu trả lời"; Cuối cùng, máy khách gửi gói tin đến máy chủ. Gói tin này có thể mang dữ liệu từ máy khách đến máy chủ. Sau khi hoàn tất các thao tác này, máy khách sẽ chuyển sang trạng thái ESTABLISHED.

Khi máy chủ nhận được gói trả lời từ máy khách, nó cũng chuyển sang trạng thái ĐÃ THIẾT LẬP.

Như bạn có thể thấy từ quy trình trên, khi thực hiện bắt tay ba chiều, bắt tay thứ ba được phép mang dữ liệu, nhưng hai bắt tay đầu tiên thì không. Đây là một câu hỏi thường được hỏi trong các cuộc phỏng vấn. Sau khi bắt tay ba chiều hoàn tất, cả hai bên sẽ chuyển sang trạng thái ESTABLISHED, cho biết kết nối đã được thiết lập thành công, tại thời điểm này, máy khách và máy chủ có thể bắt đầu gửi dữ liệu cho nhau.

Tại sao lại là ba cái bắt tay? Không phải hai mà là bốn cái?
Câu trả lời phổ biến là: "Vì bắt tay ba chiều đảm bảo khả năng nhận và gửi." Câu trả lời này đúng, nhưng chỉ là lý do bề nổi, không nêu ra được lý do chính. Sau đây, tôi sẽ phân tích lý do của bắt tay ba chiều từ ba khía cạnh để hiểu sâu hơn về vấn đề này.

Bắt tay ba chiều có thể tránh hiệu quả việc khởi tạo các kết nối được lặp lại trong lịch sử (lý do chính)
Bắt tay ba chiều đảm bảo rằng cả hai bên đều nhận được số thứ tự ban đầu đáng tin cậy.
Bắt tay ba chiều giúp tránh lãng phí tài nguyên.

Lý do 1: Tránh các liên kết trùng lặp lịch sử
Tóm lại, lý do chính cho việc bắt tay ba bước là để tránh nhầm lẫn do việc khởi tạo kết nối trùng lặp cũ gây ra. Trong môi trường mạng phức tạp, việc truyền các gói dữ liệu không phải lúc nào cũng được gửi đến máy chủ đích theo đúng thời gian quy định, và các gói dữ liệu cũ có thể đến máy chủ đích trước do tắc nghẽn mạng và các lý do khác. Để tránh điều này, TCP sử dụng bắt tay ba bước để thiết lập kết nối.

bắt tay ba chiều tránh các kết nối trùng lặp lịch sử

Khi máy khách gửi nhiều gói tin thiết lập kết nối SYN liên tiếp, trong các tình huống như tắc nghẽn mạng, những điều sau đây có thể xảy ra:

1- Các gói SYN cũ đến máy chủ trước các gói SYN mới nhất.
2- Máy chủ sẽ trả lời gói SYN + ACK cho máy khách sau khi nhận được gói SYN cũ.
3- Khi máy khách nhận được gói SYN + ACK, nó xác định rằng kết nối là kết nối lịch sử (số thứ tự đã hết hạn hoặc hết thời gian chờ) theo ngữ cảnh của riêng nó và sau đó gửi gói RST đến máy chủ để hủy kết nối.

Với kết nối bắt tay hai chiều, không có cách nào để xác định liệu kết nối hiện tại có phải là kết nối lịch sử hay không. Bắt tay ba chiều cho phép máy khách xác định liệu kết nối hiện tại có phải là kết nối lịch sử hay không dựa trên ngữ cảnh khi máy khách sẵn sàng gửi gói tin thứ ba:

1- Nếu là kết nối lịch sử (số thứ tự đã hết hạn hoặc hết thời gian chờ), gói tin được gửi bởi lần bắt tay thứ ba là gói tin RST để hủy kết nối lịch sử.
2- Nếu không phải là kết nối lịch sử, gói tin được gửi lần thứ ba là gói tin ACK và hai bên giao tiếp thiết lập kết nối thành công.

Do đó, lý do chính mà TCP sử dụng bắt tay ba chiều là để khởi tạo kết nối nhằm ngăn chặn các kết nối lịch sử.

Lý do 2: Để đồng bộ hóa số thứ tự ban đầu của cả hai bên
Cả hai phía của giao thức TCP đều phải duy trì một số thứ tự, đây là yếu tố then chốt để đảm bảo truyền tải tin cậy. Số thứ tự đóng vai trò quan trọng trong các kết nối TCP. Chúng thực hiện các chức năng sau:

Bộ thu có thể loại bỏ dữ liệu trùng lặp và đảm bảo tính chính xác của dữ liệu.

Người nhận có thể nhận các gói tin theo thứ tự số thứ tự để đảm bảo tính toàn vẹn của dữ liệu.

● Số thứ tự có thể xác định gói dữ liệu đã được bên kia nhận, cho phép truyền dữ liệu đáng tin cậy.

Do đó, khi thiết lập kết nối TCP, máy khách sẽ gửi các gói SYN với số thứ tự ban đầu và yêu cầu máy chủ trả lời bằng một gói ACK cho biết đã nhận thành công gói SYN của máy khách. Sau đó, máy chủ sẽ gửi gói SYN với số thứ tự ban đầu cho máy khách và chờ máy khách phản hồi, một lần và mãi mãi, để đảm bảo các số thứ tự ban đầu được đồng bộ hóa một cách đáng tin cậy.

Đồng bộ hóa số sê-ri ban đầu của cả hai bên

Mặc dù bắt tay bốn bước cũng có thể đồng bộ hóa đáng tin cậy số thứ tự ban đầu của cả hai bên, nhưng bước thứ hai và thứ ba có thể được kết hợp thành một bước duy nhất, tạo thành bắt tay ba bước. Tuy nhiên, hai lần bắt tay chỉ có thể đảm bảo số thứ tự ban đầu của một bên được bên kia nhận thành công, chứ không đảm bảo số thứ tự ban đầu của cả hai bên đều được xác nhận. Do đó, bắt tay ba bước là lựa chọn tốt nhất để đảm bảo tính ổn định và độ tin cậy của kết nối TCP.

Lý do 3: Tránh lãng phí tài nguyên
Nếu chỉ có "bắt tay hai lần", khi yêu cầu SYN của máy khách bị chặn trong mạng, máy khách không thể nhận được gói ACK do máy chủ gửi, do đó gói SYN sẽ được gửi lại. Tuy nhiên, vì không có bắt tay ba lần, máy chủ không thể xác định liệu máy khách đã nhận được xác nhận ACK để thiết lập kết nối hay chưa. Do đó, máy chủ chỉ có thể chủ động thiết lập kết nối sau khi nhận được mỗi yêu cầu SYN. ​​Điều này dẫn đến:

Lãng phí tài nguyên: Nếu yêu cầu SYN của máy khách bị chặn, dẫn đến việc truyền đi nhiều gói SYN, máy chủ sẽ thiết lập nhiều kết nối không hợp lệ dự phòng sau khi nhận được yêu cầu. Điều này dẫn đến lãng phí tài nguyên máy chủ không cần thiết.

Lưu giữ tin nhắn: Do thiếu cơ chế bắt tay thứ ba, máy chủ không có cách nào biết liệu máy khách có nhận được xác nhận ACK chính xác để thiết lập kết nối hay không. Kết quả là, nếu tin nhắn bị kẹt trong mạng, máy khách sẽ liên tục gửi yêu cầu SYN, khiến máy chủ phải liên tục thiết lập kết nối mới. Điều này sẽ làm tăng tắc nghẽn và độ trễ mạng, đồng thời ảnh hưởng tiêu cực đến hiệu suất mạng tổng thể.

Tránh lãng phí tài nguyên

Do đó, để đảm bảo tính ổn định và độ tin cậy của kết nối mạng, TCP sử dụng cơ chế bắt tay ba bước để thiết lập kết nối nhằm tránh xảy ra những vấn đề này.

Bản tóm tắt
CácMôi giới gói tin mạngViệc thiết lập kết nối TCP được thực hiện bằng bắt tay ba bước. Trong quá trình bắt tay ba bước, trước tiên máy khách gửi một gói tin có cờ SYN đến máy chủ, cho biết nó muốn thiết lập kết nối. Sau khi nhận được yêu cầu từ máy khách, máy chủ trả lời một gói tin có cờ SYN và ACK cho máy khách, cho biết yêu cầu kết nối đã được chấp nhận, đồng thời gửi số thứ tự ban đầu của riêng nó. Cuối cùng, máy khách trả lời bằng cờ ACK đến máy chủ để cho biết kết nối đã được thiết lập thành công. Như vậy, hai bên đã ở trạng thái ESTABLISHED và có thể bắt đầu gửi dữ liệu cho nhau.

Nhìn chung, quy trình bắt tay ba chiều để thiết lập kết nối TCP được thiết kế để đảm bảo tính ổn định và độ tin cậy của kết nối, tránh nhầm lẫn và lãng phí tài nguyên trên các kết nối lịch sử và đảm bảo rằng cả hai bên đều có thể nhận và gửi dữ liệu.


Thời gian đăng: 08-01-2025