Quick Overview Of TCP

Như đã đề cập ở bài trước, TCP là 1 trong 2 giao thức nằm ở tầng vận chuyển và được sử dụng để truyền dữ liệu từ 1 host sang host khác. Vậy điều gì khiến cho TCP trở thành 1 cách thức phổ biến trong việc gửi và nhận dữ liệu như thế? Không giống UDP, TCP sẽ kiểm tra lỗi trong mỗi packet (gói tin) mà nó nhận được để tránh việc bị hỏng dữ liệu.
Một vài giao thức sử dụng TCP như là: FTP, Telnet, HTTP, HTTPS, DNS, SMTP và POP3. Bây giờ chúng ta sẽ có cái nhìn sâu hơn về những đặc điểm chính của giao thức tuyệt vời này.

Các đặc điểm chính
Sau đây là những đặc điểm chính của TCP mà chúng ta sẽ đi vào phân tích:
- Vận chuyển đáng tin cậy (Reliable Transport).
- Hướng kết nối (Connection-Oriented).
- Điều khiển luồng (Flow Control).
- Windowing.
- Acknowledgments.
- Nhiều chi phí hơn.

Vận chuyển đáng tin cậy
Nó là giao thức vận chuyển đáng tin cậy bởi vì chính các kỹ thuật khác nhau mà nó sử dụng để đảm bảo rằng dữ liệu nhận được không bị lỗi. TCP là 1 giao thức mạnh được dùng để truyền dữ liệu nhưng trong giao thức này thì lỗi dữ liệu (data error) không phải là 1 option (tùy chọn). Khi bạn quyết định tải về 1 file khoảng chừng 50 Mb từ 1 website, bạn sẽ không muốn sau khi hoàn tất việc tải về mà tập tin đó bị lỗi. Mặc dù trong thực tế thì điều này vẫn xảy ra.
Hình ảnh này cho thấy TCP Header ở trong khung Ethernet II:


Còn sơ đồ dưới đây sẽ zoom vào chi tiết của TCP Header, hiển thị các trường có trong giao thức:


Sơ đồ được chia nhỏ ra thành các trường với độ dài của mỗi trường được tính bằng bit (nên nhớ rằng 8 bits tương đương với 1 byte).
Trường phổ biến nhất trong TCP Header là Source Port, Destination Port và Code bits. Code bits còn được biết đến là các cờ (Flag).
Các trường còn lại giúp đảm bảo các TCP Segment đi được đến đích và ghép lại đúng thứ tự, và cũng cung cấp 1 cơ chế khắc phục lỗi nếu có 1 vài đoạn bị mất hay không đi đến đích được.

Hướng kết nối
Điều này có nghĩa là 1 kết nối phải được thiết lập giữa 2 máy tính trước khi bắt đầu truyền dữ liệu. Khi thuật ngữ "kết nối đã được thiết lập" được sử dụng, điều này có nghĩa là cả 2 máy đều đã biết nhau và đã thỏa thuận trao đổi dữ liệu. Điều này cũng có nghĩa là việc bắt tay 3 bước sẽ xảy ra. Bạn sẽ tìm thấy các bit SYN và ACK ở trong trường Code bits được sử dụng để thực hiện việc bắt tay 3 bước. Nhờ có bắt tay 3 bước, TCP trở thành giao thức hướng kết nối.
Mô hình sau sẽ minh họa quá trình bắt tay 3 bước:


Bước 1: Host A gửi gói tin khởi đầu tới Host B. Gói tin này có cờ SYN được bật. Host B nhận gói tin và thấy rằng cờ SYN có giá trị là 1 bởi vậy nó biết rằng Host A đang cố gắng thiết lập 1 kết nối tới nó.
Bước 2: Giả sử Host B có đủ tài nguyên, nó sẽ gửi trả lại Host A 1 gói tin với cờ SYN và ACK được bật. Cờ SYN mà Host B gửi ở bước này có nghĩa là "tôi muốn đồng bộ với bạn" (hay còn có thể hiểu là tôi cũng muốn thiết lập kết nối với bạn) và cờ ACK cho biết "tôi đã nhận được cờ SYN trước mà bạn gửi cho tôi".
Bước 3: Sau đó, Host A gửi 1 gói tin khác tới Host B với cờ ACK được bật, hay nó muốn nói là "Tôi đã nhận được yêu cầu từ bạn".
Một khi việc bắt tay 3 bước hoàn thành, kết nối được thiết lập và việc truyền dữ liệu bắt đầu.

Điều khiển luồng
Điều khiển luồng được sử dụng để điều khiển luồng dữ liệu trong kết nối. Nếu vì một lý do nào đó mà 1 trong 2 máy không thể theo kịp việc truyền dữ liệu thì nó có khả năng gửi những tín hiệu đặc biệt tới máy kia, yêu cầu máy kia hoặc là ngừng hoặc là chậm lại để nó có thể theo kịp.
Ví dụ, nếu Host B là 1 Web Server mà người ta có thể tải về các trò chơi, vì thế dĩ nhiên Host A không phải là máy duy nhất sẽ tải trò chơi về từ Web Server đó, bởi vậy Host B phải điều chỉnh luồng dữ liệu tới các máy tính tải trò chơi từ nó. Điều đó có nghĩa là nó có thể nói với Host A rằng chờ một chút đến khi sẵn có nhiều tài nguyên hơn bởi vì hiện tại đang có 20 người dùng đang cố gắng tải trò chơi đó về trong cùng lúc.
Mô hình dưới đây minh họa 1 phiên điều khiển luồng đơn giản giữa 2 Host. Tại thời điểm này, chúng ta chỉ cần hiểu khái niệm về điều khiển luồng:


Nhìn chung, khi 1 máy nhận 1 lượng dữ liệu mà nó không đủ khả năng để xử lý ngay lập tức được, thì nó sẽ cất dữ liệu đó trong 1 phần của bộ nhớ được gọi là buffer (vùng đệm). Hành động buffering này giải quyết được vấn đề chỉ khi việc bùng nổ dữ liệu là nhỏ và không kéo dài.
Tuy nhiên, nếu việc bùng nổ dữ liệu vẫn tiếp tục diễn ra nó sẽ làm cạn kiệt bộ nhớ ở phía máy nhận và kết quả là dữ liệu đến sẽ bị vứt bỏ. Bởi vậy trong tình huống này, máy nhận sẽ phát ra tín hiệu "Not Ready" hoặc "Stop" tới máy gửi, hoặc nguồn của lượng dữ liệu này. Sau khi máy nhận đã xử lý xong dữ liệu mà nó có trong bộ nhớ, nó sẽ phát ra tín hiệu "Ready" hoặc là "Go" và khi máy gửi nhận được tín hiệu này, nó sẽ bắt đầu truyền lại.

Windowing
Thông lượng, hay hiệu quả của việc truyền dữ liệu sẽ thấp nếu máy gửi phải chờ 1 thông báo đã nhận được sau khi gửi 1 gói tin của dữ liệu. Vì có thời gian sẵn sàng sau khi máy gửi truyền đoạn dữ liệu và trước khi nó kết thúc tiến trình báo nhận từ máy nhận, máy gửi sẽ tận dụng thời gian rảnh đó để truyền thêm dữ liệu. Nếu chúng ta muốn định nghĩa ngắn gọn về Windowing, chúng ta có thể nói rằng đó là số data segment (đoạn dữ liệu) mà máy truyền dữ liệu được phép gửi mà không cần nhận các thông báo đã nhận được từ máy kia.
Windowing kiểm soát bao nhiêu thông tin được truyền qua lại với nhau. Trong khi một số giao thức lượng hóa thông tin bằng cách quan sát số gói tin, thì TCP/IP đo thông tin bằng cách đếm số bytes.


Chúng ta sẽ giải thích sơ đồ trên:
Host B đang gửi dữ liệu cho Host A, với Window size = 1. Điều này có nghĩa là Host B mong đợi gói ACK cho mỗi đoạn dữ liệu mà nó gửi cho Host A. Một khi đoạn dữ liệu đầu tiên được gửi, Host A nhận nó và gửi 1 gói ACK2 tới Host B. Bạn có thể thắc mắc rằng tại sao là ACK2 mà không phải là ACK?
ACK2 được dịch ra bởi Host B là: "Tôi đã nhận được gói tin của bạn vừa gửi cho tôi và tôi sẵn sàng nhận đoạn dữ liệu thứ 2". Bởi vậy Host B chuẩn bị sẵn sàng đoạn dữ liệu thứ 2 và gửi nó cho Host A, và mong chờ gói ACK3 trả lời từ Host A để nó có thể gửi đoạn dữ liệu thứ 3 cho A, như hình trên cho thấy, Host B đã nhận được gói ACK3.
Tuy nhiên nếu nó nhận ACK2 một lần nữa, điều này nghĩa là có vấn đề gì đấy với việc truyền trước đây và Host B sẽ gửi lại đoạn dữ liệu bị mất. Bây giờ chúng ta sẽ thử với Window size khác để dễ hiểu hơn, ta thử chọn 3!


Trong ví dụ trên, chúng ta có Window size = 3, nghĩa là Host B có thể gửi 3 đoạn dữ liệu tới Host A trước khi mong chờ ACK trả lại. Host B gửi 3 đoạn dữ liệu đầu tiên (Send 1, Send 2, Send 3), Host A nhận 3 đoạn dữ liệu trong tình trạng tốt và gửi ACK4 cho Host B. Điều này có nghĩa là Host A đã nhận được 3 đoạn dữ liệu mà Host B đã gửi và chờ các đoạn dữ liệu kế tiếp mà trong trường hợp này là 4,5 và 6.

Acknowledgments
Việc truyền dữ liệu đáng tin cậy đảm bảo tính toàn vẹn của dòng dữ liệu gửi từ 1 máy đến 1 máy qua 1 liên kết dữ liệu đầy đủ chức năng. Điều này đảm bảo dữ liệu không bị trùng lặp hay bị mất mát. Phương pháp đạt được điều này được biết đến là Positive Acknowledgment with Retransmission. Kỹ thuật này đòi hỏi máy nhận liên lạc với máy gửi bằng cách gửi trả lại 1 thông điệp báo nhận cho máy gửi khi nó nhận được dữ liệu. Máy gửi ghi lại từng đoạn dữ liệu mà nó đã gửi và chờ thông báo nhận này trước khi gửi đoạn dữ liệu kế tiếp. Khi nó gửi 1 đoạn dữ liệu, máy gửi bắt đầu 1 bộ đếm thời gian và truyền lại nếu thời gian hết hạn trước khi ghi nhận thông điệp trở về từ máy nhận.


Hình trên minh họa Acknowledgment làm việc như thế nào? Ta có thể thấy được Window size bằng 3. Đầu tiên, Host B gửi 3 đoạn dữ liệu tới Host A và Host A sẽ gửi trả lại ACK4 để thông báo rằng đã nhận được 3 đoạn dữ liệu trên và mong chờ 3 đoạn dữ liệu kế tiếp là 4,5,6. Tiếp theo, Host B sẽ gửi tiếp 3 đoạn dữ liệu 4,5,6 nhưng đoạn dữ liệu thứ 5 bị mất mát đâu đó trên đường truyền và Host A sẽ không thể nhận được đoạn dữ liệu đó. Sau 1 lúc chờ đợi, Host A biết được đoạn dữ liệu thứ 5 đã bị mất và gửi ACK5 tới Host B để nói với Host A truyền lại đoạn dữ liệu thứ 5.
Tại thời điểm này, Host B gửi đoạn dữ liệu thứ 5 và chờ Host A gửi ACK. Host A nhận đoạn dữ liệu thứ 5 và gửi trả lại ACK7. Bước tiếp theo Host B sẽ gửi 3 đoạn dữ liệu tiếp theo là 7,8,9.

Thêm nhiều chi phí
Như bạn đã thấy, có 1 cơ chế rõ ràng nhờ có TCP mà dữ liệu truyền đi không bị lỗi. Mọi tính năng mà giao thức hỗ trợ đều phải trả giá, và ở đây là chi phí liên kết với TCP.
Khi chúng ta nói về chi phí, chúng ta nói tới các trường khác nhau chứa đựng trong TCP Header và việc kiểm tra lỗi để đảm bảo không phần nào của dữ liệu bị hỏng.

Lược dịch từ bài gốc: Click Here

Bài tiếp theo: The TCP Header/Segment







Không có nhận xét nào:

Đăng nhận xét