Những bí ẩn quan trọng về kết nối TCP của bộ điều phối gói mạng: Giải mã sự cần thiết của quá trình bắt tay ba bước.

Thiết lập kết nối TCP
Khi chúng ta 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 đó. Tuy nhiên, chính những bước tưởng chừng nhỏ nhặt này lại đảm bảo sự 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 quá trình này là sự 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 quá trình bắt tay ba bước. Từng bước một, chúng ta sẽ giải thích tại sao quá trình bắt tay ba bước lại cần thiết, làm thế nào 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ề quá trình 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 bước TCP và chuyển đổi trạng thái
TCP là một giao thức vận chuyển 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 phương pháp bắt tay ba bước.

 Quá trình bắt tay ba bước TCP

Chúng ta hãy cùng 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 ở trạng thái ĐÓNG. Đầu tiên, máy chủ chủ động lắng nghe trên một cổng và ở trạng thái LẮNG NGHE, điều này có nghĩa là máy chủ cần đượ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ó 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à gói SYN. ​​Máy khách cho biết 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 đượ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 tin 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 tin đến máy khách, gói tin này không chứa dữ liệu lớp ứng dụng (và không có dữ liệu nào để 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 tin 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 "Số xác nhận 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 thành 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 phản hồi từ máy khách, nó cũng chuyển sang trạng thái ESTABLISHED.

Như bạn có thể thấy từ quy trình trên, khi thực hiện bắt tay ba bước, bước bắt tay thứ ba được phép truyền dữ liệu, nhưng hai bước bắt tay đầu tiên thì không. Đây là một câu hỏi thường gặp trong các cuộc phỏng vấn. Sau khi quá trình bắt tay ba bước hoàn tất, cả hai bên đều chuyển sang trạng thái ESTABLISHED, cho thấy kết nối đã được thiết lập thành công, lúc đó 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 bắt tay ba lần? Không phải hai lần, mà là bốn lần?
Câu trả lời thường gặp là, "Vì quá trình bắt tay ba bước đảm bảo khả năng nhận và gửi dữ liệu." Câu trả lời này đúng, nhưng nó chỉ là lý do bề ngoài, không nêu bật được lý do cốt lõi. Sau đây, tôi sẽ phân tích lý do của quá trình bắt tay ba bước từ ba khía cạnh để giúp chúng ta hiểu sâu hơn về vấn đề này.

Quá trình bắt tay ba chiều có thể tránh được việc khởi tạo lại các kết nối đã lặp lại trong quá khứ (lý do chính).
Cơ chế bắt tay ba chiều đảm bảo cả hai bên đều nhận được số thứ tự ban đầu đáng tin cậy.
Thỏa thuận ba bên giúp tránh lãng phí nguồn lực.

Lý do 1: Tránh các phép nối trùng lặp lịch sử
Tóm lại, lý do chính của quá trình bắt tay ba bước là để tránh sự 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 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 quá trình bắt tay ba bước để thiết lập kết nối.

Việc bắt tay ba chiều giúp tránh các kết nối trùng lặp trong quá khứ.

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 tin SYN cũ đến máy chủ trước các gói tin SYN mới nhất.
2- Sau khi nhận được gói tin SYN cũ, máy chủ sẽ trả lời máy khách bằng gói tin SYN + ACK.
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 cũ (số thứ tự đã hết hạn hoặc hết thời gian chờ) dựa trên ngữ cảnh của chính nó, và sau đó gửi gói tin RST đến máy chủ để hủy kết nối.

Với kết nối hai bước bắt tay, 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 cũ hay không. Quá trình bắt tay ba bước 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 cũ hay không dựa trên ngữ cảnh khi nó 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 bước bắt tay thứ ba là gói tin RST để hủy bỏ 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 khiến TCP sử dụng quá trình bắt tay ba bước là để khởi tạo kết nối nhằm ngăn chặn việc thiết lập lại các kết nối cũ.

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ì số thứ tự, đây là yếu tố then chốt để đả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:

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.

Bộ thu có thể nhận các gói dữ liệu 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 mà 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 gửi các gói SYN với số thứ tự ban đầu và yêu cầu máy chủ phản hồi bằng gói ACK để báo hiệu đã 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à chờ máy khách phản hồi, một lần duy nhất, để đả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ộ hóa số sê-ri ban đầu của cả hai bên.

Mặc dù cũng có thể thực hiện bắt tay bốn bước để đồng bộ hóa số thứ tự ban đầu của cả hai bên một cách đáng tin cậy, 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 bước. 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 đảm bảo rằng 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 thứ 3: Tránh lãng phí nguồn lực
Nếu chỉ có "hai bước bắt tay", khi yêu cầu SYN của máy khách bị chặn trên mạng, máy khách không thể nhận được gói ACK do máy chủ gửi, do đó yêu cầu SYN sẽ được gửi lại. Tuy nhiên, vì không có bước bắt tay thứ ba, 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 các vấn đề 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 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ư thừa 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ủ không cần thiết.

Giữ lại thông điệp: Do thiếu bước bắt tay thứ ba, máy chủ không có cách nào biết được 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. Kết quả là, nếu thông điệp 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 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, ảnh hưởng tiêu cực đến hiệu suất tổng thể của mạng.

Tránh lãng phí nguồn lực

Do đó, để đảm bảo tính ổn định và độ tin cậy của kết nối mạng, TCP sử dụng quá trình 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áiBộ 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 quy trình 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 lại một gói tin 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 lại máy chủ bằng cờ ACK để cho biết rằng 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 bước để 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 do các kết nối cũ, đồng thời đảm bảo cả hai bên đều có thể nhận và gửi dữ liệu.


Thời gian đăng bài: 08/01/2025