Những bí ẩn chính của kết nối TCP của nhà môi giới gói mạng: Làm sáng tỏ sự cần thiết của bắt tay ba lần

Thiết lập kết nối TCP
Khi 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 tưởng chừng như nhỏ này lại đảm bảo khả năng liên lạc ổ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 bước.

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 cái bắt tay ba bên. Từng bước, chúng tôi sẽ giải thích lý do cần có bắt tay ba chiều, cách thức đảm bảo độ ổn định và độ tin cậy của kết nối cũng như 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 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 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ủ tích cực lắng nghe trên một cổng và ở trạng thái LISTEN, 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 SYN

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 để cho biết gói gửi đi là gói SYN. Máy khách cho biết 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 lớp ứng dụng (nghĩa là dữ liệu được 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 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 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 đến máy khách, gói này 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). Lúc 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 để phản hồ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, khách hàng 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, client gửi gói tin đến server. 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, máy khách sẽ chuyển sang trạng thái THÀNH 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 THÀNH 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, lần bắt tay thứ ba được phép mang dữ liệu, nhưng hai lần 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. Sau khi quá trình bắt tay ba chiều hoàn tất, cả hai bên sẽ chuyển sang trạng thái THÀNH LẬP, cho biết rằng kết nối đã được thiết lập thành công, lúc 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 phải bắt tay ba lần? Không phải hai lần, bốn lần?
Câu trả lời phổ biến là: “Vì cái 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 đưa ra lý do chính. Sau đây, tôi sẽ phân tích lý do dẫn đến cái bắt tay ba lần từ ba khía cạnh để chúng ta 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 lại trong lịch sử một cách hiệu quả (lý do chính)
Quá trình bắt tay ba bước đả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 tránh lãng phí tài nguyên.

Lý do 1: Tránh tham gia trùng lặp lịch sử
Tóm lại, lý do chính của việc 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ũ 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 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 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ột máy khách gửi liên tiếp nhiều gói thiết lập kết nối SYN, 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 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 bắt tay hai lần, 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ử hay không dựa trên bối cảnh khi nó sẵn sàng gửi gói 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 được gửi bởi lần bắt tay thứ ba là gói 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 được gửi lần thứ ba là gói ACK và hai bên giao tiếp đã thiết lập kết nối thành công.

Vì vậy, lý do chính mà TCP sử dụng bắt tay ba bước 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ộ số thứ tự ban đầu của cả hai bên
Cả hai phía của giao thức TCP phải duy trì số thứ tự, đây là yếu tố then chốt để đảm bảo việc 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 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 gói ACK cho biết việc 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 đến 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 một cách đáng tin cậy.

Đồng bộ dãy số 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 một cách đá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, dẫn đến bắt tay ba chiều. Tuy nhiên, hai cái 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 chứ không có gì đảm bảo rằng số thứ tự ban đầu của cả hai bên có thể được xác nhận. Vì vậy, 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 các 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 người", 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, do không có lần bắt tay thứ ba nên máy chủ không thể xác định 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 đó, máy chủ chỉ có thể chủ động thiết lập 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 lặp lại nhiều gói SYN, máy chủ sẽ thiết lập nhiều kết nối dự phòng không hợp lệ sau khi nhận được yêu cầu. Điều này dẫn đến sự lãng phí tài nguyên máy chủ một cách không cần thiết.

Lưu giữ tin nhắn: Do thiếu 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 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ẽ tiếp tục gửi đi gửi lại các yêu cầu SYN, 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ẽ làm tăng tắc nghẽn và độ trễ mạng và ả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

Vì vậy, để đả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 sự cố này.

Bản tóm tắt
cácNhà môi giới gói mạngViệc thiết lập kết nối TCP được thực hiện bằng cách bắt tay ba bước. Trong quá trình bắt tay ba chiều, trước tiên máy khách sẽ gửi một gói 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ủ sẽ trả lời một gói có cờ SYN và ACK cho 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 chính nó. Cuối cùng, máy khách trả lời bằng cờ ACK cho 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 đang ở trạng thái THÀNH 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 để thiết lập 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: Jan-08-2025