Những bí ẩn chính của Mạng Mạng Môi giới TCP Kết nối: Demystified sự cần thiết phải bắt tay ba

Thiết lập kết nối TCP
Khi chúng tôi duyệt web, gửi email hoặc chơi một trò chơi trực tuyến, chúng tôi thường không nghĩ về kết nối mạng phức tạp đằng sau nó. Tuy nhiên, đây là những bước dường như nhỏ này đảm bảo giao tiếp ổn định giữa chúng tôi 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 điều này là bắt tay ba chiều.

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

Quy trình bắt tay ba chiều của TCP và chuyển đổi trạng thái
TCP là một giao thức vận chuyển định 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 một cái bắt tay ba chiều.

 TCP bắt tay ba chiều

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

Ban đầu, cả máy khách và máy chủ đều được đóng. Đầu tiên, máy chủ tích cực lắng nghe trên một cổng và ở trạng thái nghe, điều đó có 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 đồng bộ

Khi một máy khách bắt đầu 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 đi là một gói SYN. Máy khách chỉ ra rằng họ 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 lớp ứng dụng (nghĩa là dữ liệu đã gửi). Tại thời điểm này, trạng thái của khách hàng được đánh dấu là syn-sent.

Syn+ACK Packet

Khi một máy chủ nhận được một gói SYN từ máy khách, nó sẽ khởi tạo ngẫu nhiên số sê -ri của chính 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 trong trường "Số xác nhận" và đặt cả bit SYN và ACK thành 1. Cuối cùng, máy chủ sẽ gửi gói cho máy khách, không chứa dữ liệu lớp ứng dụng (và không có dữ liệu cho máy chủ gửi). Tại thời điểm này, máy chủ đang ở trạng thái SYN-RCVD.

Gói ACK

Khi máy khách nhận được gói từ máy chủ, nó cần thực hiện các tối ưu hóa sau để trả lời gói 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 trả lời thành 1; Thứ hai, máy khách nhập giá trị server_isn + 1 trong trường "Xác nhận số trả lời"; Cuối cùng, máy khách gửi gói đến máy chủ. Gói này có thể mang dữ liệu từ máy khách đến máy chủ. Sau khi hoàn thành các hoạt động này, khách hàng sẽ vào trạng thái đã thiết lập.

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ừ quá trình trên, khi thực hiện bắt tay ba chiều, cái bắt tay thứ ba được phép mang dữ liệu, nhưng hai cái 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ẽ vào trạng thái đã thiết lập, cho thấy 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 ba cái bắt tay? Không phải hai lần, bốn lần?
Câu trả lời chung 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 là chính xác, nhưng nó chỉ là lý do bề mặt, không đưa ra lý do chính. Sau đây, tôi sẽ phân tích các lý do cho việc bắt tay ba 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 được việc khởi tạo các kết nối lặp đi lặp lại trong lịch sử (lý do chính)
Việc bắt tay ba chiều đảm bảo rằng cả hai bên đã nhận được số thứ tự ban đầu đáng tin cậy.
Việc bắt tay ba chiều tránh lãng phí tài nguyên.

Lý do 1: Tránh các kết hợp trùng lặp lịch sử
Tóm lại, lý do chính cho việc bắt tay ba chiều là để tránh sự nhầm lẫn do khởi tạo kết nối trùng lặp cũ. Trong một 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 được chỉ định và các gói dữ liệu cũ có thể đến máy chủ đích trước vì 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 lịch sử

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

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 chính nó, sau đó gửi gói RST đến máy chủ để hủy kết nối.

Với kết nối hai tay, 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 khách hàng xác định xem kết nối hiện tại có phải là kết nối lịch sử dựa trên bối cảnh khi nó sẵn sàng gửi gói thứ ba hay không:

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

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

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

Máy 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.

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

● Số trình tự có thể xác định gói dữ liệu đã được bên kia nhận được, 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 với gói ACK cho biết việc tiếp nhận thành công gói SYN của máy khách. Sau đó, máy chủ gửi gói SYN với số thứ tự ban đầu cho máy khách và chờ máy khách trả lời, một lần và mãi mãi, để đảm bảo rằng các số chuỗi ban đầu được đồng bộ hóa đáng tin cậy.

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

Mặc dù một cái bắt tay bốn chiều cũng có thể đồng bộ hóa một cách đáng tin cậy các số trình tự ban đầu của cả hai bên, các bước thứ hai và thứ ba có thể được kết hợp thành một bước duy nhất, dẫn đến một cái bắt tay ba chiều. Tuy nhiên, hai cái bắt tay chỉ có thể đảm bảo rằng số trình tự ban đầu của một bên được bên kia nhận được thành công, nhưng không có gì đảm bảo rằng số trình 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ó "hai tay", khi yêu cầu SYN máy khách bị chặn trong mạng, máy khách không thể nhận được gói ACK được gửi bởi máy chủ, do đó, Syn sẽ phẫn nộ. Tuy nhiên, vì không có bắt tay thứ ba, máy chủ không thể xác định xem 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 đó, máy chủ chỉ có thể chủ động thiết lập một kết nối sau khi nhận được từng yêu cầu SYN. Điều này dẫn đến những điều sau đây:

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 nhiều gói SYN lặp đi lặp lại, 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 một sự lãng phí không cần thiết của tài nguyên máy chủ.

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

Bản tóm tắt
CácNhà môi giới gói mạngCơ sở kết nối TCP được thực hiện với một cái bắt tay ba chiều. Trong thời gian bắt tay ba chiều, trước tiên, máy khách gửi một gói với cờ SYN đến máy chủ, cho biết rằng họ 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 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 và gửi số thứ tự ban đầu của riêng mình. Cuối cùng, máy khách trả lời bằng cờ ACK đến máy chủ để chỉ ra rằng kết nối đã được thiết lập thành công. Do đó, hai bên ở trạng thái đã được thiết lập và có thể bắt đầu gửi dữ liệu cho nhau.

Nói chung, quy trình bắt tay ba chiều cho cơ sở kết nối TCP được thiết kế để đảm bảo độ ổ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 đối với 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: Tháng 1-08-2025