Giao thức TCP hoạt động trên mô hình client-server, nơi một thiết bị gửi yêu cầu đến một thiết bị khác, được gọi là máy chủ (server). Giao thức TCP là giao thức đáng tin cậy, điều này có nghĩa là nó đảm bảo việc truyền dữ liệu giữa các thiết bị một cách tin cậy và hiệu quả.
Trong TCP, số ACK (acknowledgment number) và số SEQ (sequence number) được sử dụng để đồng bộ hóa việc truyền dữ liệu giữa hai thiết bị. Cụ thể:
- Số SEQ (sequence number): đại diện cho số thứ tự của gói tin dữ liệu được gửi từ thiết bị gửi. Nó được sử dụng để đảm bảo rằng các gói tin dữ liệu được gửi trong đúng thứ tự và không bị trùng lặp khi đến thiết bị nhận.
- Số ACK (acknowledgment number): đại diện cho số thứ tự của gói tin dữ liệu đã được nhận đúng và xác nhận (acknowledged) bởi thiết bị nhận. Nó còn được sử dụng để xác định gói tin tiếp theo cần được gửi đi từ thiết bị gửi.
Quy tắc tăng số seq trong giao thức TCP là:
- Số seq của gói tin đầu tiên trong một luồng truyền tải sẽ được khởi tạo bằng một số ngẫu nhiên. Điều này đảm bảo tính ngẫu nhiên và an toàn cho các gói tin.
- Các gói tin sau đó sẽ có số seq tăng dần theo thứ tự của dữ liệu truyền đi. Mỗi gói tin sẽ có độ dài của dữ liệu trong gói, được đo bằng số byte, và số seq của gói tin trước đó. Ví dụ, nếu gói tin 1 có số seq là 1000 và độ dài của dữ liệu là 500 byte, thì gói tin 2 sẽ có số seq là 1500 (tức là 1000 + 500).
- Khi một gói tin được gửi lại do bị mất trong quá trình truyền tải, số seq của gói tin đó vẫn giữ nguyên. Tuy nhiên, giá trị trong trường ACK sẽ thay đổi để đề cập đến gói tin kế tiếp mà thiết bị nhận sẽ nhận được.
- Khi thiết bị gửi không nhận được phản hồi ACK từ thiết bị đích sau khi đã gửi một gói tin, nó sẽ cho rằng gói tin đó đã bị mất trong quá trình truyền tải và gửi lại gói tin đó. Trong trường hợp này, số seq của gói tin được gửi lại sẽ giữ nguyên.
Thiết lập kết nối
TCP (Transmission Control Protocol) có một quá trình bắt tay ba bước (three-way handshake) để thiết lập một kết nối đáng tin cậy và an toàn giữa hai thiết bị trước khi bắt đầu truyền dữ liệu. Quá trình này gồm ba bước cơ bản sau đây:
- Bước 1: Thiết bị A gửi gói tin SYN (Synchronize) đến thiết bị B để khởi tạo kết nối. Gói tin SYN chứa một số thứ tự ngẫu nhiên (initial sequence number) mà thiết bị A sẽ sử dụng để đồng bộ với thiết bị B.
- Bước 2: Thiết bị B nhận được gói tin SYN từ thiết bị A và phản hồi bằng gửi lại gói tin SYN-ACK (Synchronize-Acknowledge) chứa một số seq ngẫu nhiên, cờ SYN và cờ ACK. Cờ ACK chứa giá trị của số seq đã nhận được từ thiết bị gửi tăng lên một đơn vị
- Bước 3: Thiết bị A nhận được gói tin SYN-ACK từ thiết bị B và phản hồi bằng gửi lại gói tin ACK (Acknowledge) đến thiết bị B. Gói tin ACK chứa một số SEQ bằng với số của gói tin SYN-ACK của thiết bị B, và một số SEQ tiếp theo mà thiết bị A sẽ sử dụng cho việc truyền dữ liệu.
Sau khi ba bước trên được thực hiện, hai thiết bị đã thiết lập kết nối và sẵn sàng truyền dữ liệu.
Truyền dữ liệu
- Gửi các gói dữ liệu: Sau khi thiết lập kết nối, người gửi có thể bắt đầu gửi các gói dữ liệu. Mỗi gói được đánh số thứ tự SEQ, được sử dụng để theo dõi thứ tự các gói được gửi.
- Chờ đợi xác nhận: Sau khi gửi mỗi gói, người gửi chờ đợi một gói ACK từ người nhận để xác nhận rằng gói đã được nhận thành công. Số ACK sẽ bằng số SEQ + độ dài của dữ liệu trong gói, được đo bằng số byte. Trong hình này, 37 (ACK) = 1 (SEQ) + 36 (độ dài dữ liệu).
- Sau khi nhận được ACK, người gởi sẽ tiếp tục gởi gói dữ liệu với số SEQ là 37.
Đóng kết nối:
- Khi thiết bị gửi đã gửi hết dữ liệu, nó sẽ gửi một gói tin FIN (Finish) để báo cho thiết bị nhận biết rằng nó đã hoàn thành việc gửi dữ liệu.
- Thiết bị nhận sẽ gửi lại một gói tin ACK để xác nhận rằng nó đã nhận được gói tin FIN.
- Sau đó, thiết bị nhận cũng sẽ gửi một gói tin FIN đến thiết bị gửi để thông báo rằng nó đã hoàn tất việc nhận dữ liệu.
- Thiết bị gửi sẽ trả lời bằng cách gửi một gói tin ACK để xác nhận rằng nó đã nhận được gói tin FIN của thiết bị nhận. Khi cả hai thiết bị đều đã gửi các gói tin FIN và ACK, kết nối TCP giữa chúng sẽ được đóng.
Cơ chế khôi phục mất gói tin
Khi một gói tin bị mất trên đường truyền, TCP sẽ sử dụng một số cơ chế để xác định việc mất gói tin và thực hiện khôi phục lại kết nối. Các bước TCP xác định mất gói thông tin bao gồm:
- Sử dụng cơ chế Retransmission Timeout (RTO): TCP sử dụng RTO để xác định thời gian tối đa để chờ nhận phản hồi từ đầu cuối trước khi coi gói tin đã mất và tiến hành gửi lại gói tin đó. Nếu RTO quá lâu, TCP sẽ đánh giá rằng gói tin đã bị mất và tiến hành gửi lại.
- Sử dụng cơ chế Fast Retransmit: TCP sử dụng cơ chế này để nhanh chóng phát hiện việc mất gói tin bằng cách đợi một khoảng thời gian ngắn sau khi gửi gói tin. Nếu trong thời gian đó, TCP nhận được một gói tin ACK không liên quan đến gói tin đang chờ ACK, nó sẽ đánh giá rằng gói tin đó bị mất và tiến hành gửi lại gói tin đó.
- Sử dụng cơ chế Selective Acknowledgement (SACK): TCP sử dụng SACK để cho phép đầu cuối nhận biết được rằng một số gói tin đã được nhận và chỉ yêu cầu đầu cuối gửi lại các gói tin bị mất.
- Sử dụng cơ chế Congestion Control: TCP sử dụng các thuật toán cơ chế này để giảm băng thông và giảm số lượng gói tin đang được truyền đi khi có quá nhiều gói tin bị mất trong quá trình truyền dữ liệu.
Cơ chế xử lý gói tin sai thứ tự
- TCP sử dụng các trường Sequence Number và Acknowledgment Number trong header để theo dõi và xác định trạng thái của dữ liệu được truyền đi và đến.
- Khi một gói tin đến đích, TCP sẽ kiểm tra trường Sequence Number của gói tin đó với các gói tin trước đó đã nhận được để xác định xem gói tin đó có đúng thứ tự hay không.
- Nếu gói tin đó đến đúng thứ tự, TCP sẽ tiếp tục xử lý nó. Nếu gói tin đó đến sai thứ tự, TCP sẽ lưu trữ gói tin đó vào bộ đệm đến khi tất cả các gói tin trước đó đến đúng thứ tự và được xử lý hoàn tất.
- Khi tất cả các gói tin trước đó đến đúng thứ tự và được xử lý hoàn tất, TCP sẽ tiếp tục xử lý gói tin bị lưu trữ trong bộ đệm.
- Sau khi các gói tin bị lưu trữ trong bộ đệm được xử lý hoàn tất, TCP sẽ gửi ACK (Acknowledgment) cho gói tin cuối cùng đã nhận được để báo hiệu rằng các gói tin trước đó đã được xử lý hoàn tất.
TCP Flow Control là một cơ chế của TCP để điều chỉnh tốc độ truyền dữ liệu giữa thiết bị gửi và thiết bị nhận, giúp đảm bảo rằng thiết bị nhận không bị quá tải và dẫn đến việc mất dữ liệu.
Cơ chế TCP Flow Control hoạt động bằng cách sử dụng cửa sổ trượt (sliding window), cho phép thiết bị nhận thông báo cho thiết bị gửi về khả năng của nó để xử lý dữ liệu được gửi đến. Cửa sổ trượt là một khu vực nhỏ trong bộ đệm của thiết bị nhận, nơi mà nó lưu trữ các gói tin đã nhận được nhưng chưa được xử lý.
Mỗi khi thiết bị nhận một gói tin, nó sẽ gửi một thông báo ACK (acknowledgement) trở lại cho thiết bị gửi, cho biết rằng gói tin đã được nhận. Trong thông báo ACK, nó cũng bao gồm một giá trị cửa sổ (window size), cho biết số lượng gói tin mà nó có thể xử lý tiếp theo.
Ví dụ: giả sử bên gửi muốn gửi 100 gói tin cho bên nhận. Bên nhận chỉ có thể nhận đươc 10 gói tin mỗi lần. Trong trường hợp này, cửa sổ trượt ban đầu sẽ được thiết lập là 10. Sau khi bên nhận tiếp nhận 10 gói tin đầu tiên, nó sẽ gửi một thông điệp ACK trở lại bên gửi, kèm theo giá trị cửa sổ trượt mới là 10. Bên gửi sẽ cập nhật giá trị cửa sổ trượt của nó thành 10 và gửi 10 gói tiếp theo. Quá trình này sẽ tiếp tục cho đến khi tất cả các gói tin được gửi.
Cơ chế flow control giúp đảm bảo rằng dữ liệu được gửi một cách hiệu quả, tránh tình trạng quá tải hoặc mất mát dữ liệu do bên nhận không thể tiêu thụ được nhiều dữ liệu cùng một lúc.