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 chúng ta duyệt web, gửi email hoặc chơi trò chơi 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 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à bắt tay ba chiều.

Bài viết này sẽ thảo luận chi tiết về nguyên tắc, quy trình và tầm quan trọng của bắt tay ba chiều. Từng bước, chúng tôi sẽ giải thích lý do tại sao bắt tay ba chiều là cần thiết, cách nó đảm bảo tính ổn định và độ tin cậy của kết nối, và 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 chiều, 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 bắt tay ba chiều.

 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ột máy khách khởi tạo kết nối, nó sẽ tạo ra một số thứ tự ban đầu ngẫu nhiên (client_isn) và đặt nó 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à một 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 tin này không chứa dữ liệu lớp ứng dụng (tức là dữ liệu đã gửi). Tại thời điểm 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 SYN từ máy khách, nó sẽ khởi tạo ngẫu nhiên 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ả bit SYN và ACK thành 1. Cuối cùng, máy chủ gửi gói đến máy khách, không chứa dữ liệu lớp ứng dụng (và không có dữ liệu để máy chủ gửi). Vào thời điểm này, máy chủ ở 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ẽ vào trạng thái ESTABLISHED.

Khi máy chủ nhận được gói tin 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à câu hỏi thường được hỏi trong các cuộc phỏng vấn. Khi bắt tay ba chiều hoàn tất, cả hai bên đều vào 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 đó 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 lần, mà là bốn lần?
Câu trả lời phổ biến là "Bởi 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ề mặt, không đưa ra lý do chính. Sau đây, tôi sẽ phân tích lý do 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 bắt tay ba chiều là để tránh nhầm lẫn do khởi tạo kết nối trùng lặp cũ. 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 thời gian đã chỉ đị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 chiều để 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 trong 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 những 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 tin SYN cũ đến máy chủ trước các gói tin SYN mới nhất.
2- Máy chủ sẽ trả lời gói tin SYN + ACK cho máy khách sau khi nhận được gói tin SYN cũ.
3- Khi máy khách nhận được gói tin 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ó, sau đó gửi gói tin 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 xem 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 xem 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 bên của giao thức TCP phải duy trì một số thứ tự, đây là yếu tố chính để đảm bảo truyền tải đáng 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:

Người nhận 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à đợi máy khách trả lời, một lần và mãi mãi, để đảm bảo rằng các số thứ tự ban đầu được đồng bộ hóa đáng tin cậy.

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

Mặc dù bắt tay bốn chiều 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 chiều. Tuy nhiên, hai lần bắt tay chỉ có thể đảm bảo rằng số thứ tự ban đầu của một bên được bên kia nhận thành công, nhưng không có đảm bảo rằng số thứ tự ban đầu của cả hai bên có thể được xác nhận. Do đó, bắt tay ba chiều là lựa chọn tốt nhất để đảm bảo tính ổn định và độ tin cậy của các kết nối TCP.

Lý do 3: Tránh lãng phí tài nguyên
Nếu chỉ có "two-handshake", 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 đó SYN sẽ được gửi lại. Tuy nhiên, vì không có bắt tay thứ ba, máy chủ không thể xác định 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 những điều sau:

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 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 để thiết lập kết nối hay không. Do đó, nếu tin nhắn bị kẹt trong mạng, máy khách sẽ tiếp tục gửi yêu cầu SYN liên tục, khiến máy chủ liên tục thiết lập kết nối mới. Điều này sẽ làm tăng tình trạng tắc nghẽn và độ trễ của mạng và ảnh hưởng tiêu cực đến hiệu suất chung của mạng.

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 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ạngThiết lập kết nối TCP được thực hiện bằng bắt tay ba chiều. Trong quá trình bắt tay ba chiều, 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 rằng 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 đến máy khách, cho biết rằng yêu cầu kết nối được chấp nhận và 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 rằng kết nối đã được thiết lập thành công. Do đó, 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