Cấu trúc gói tin tcp

      28

Trong bài học này chúng ta sẽ xem xét chi tiết hơn về giao thức Tcp để có thể hiểu rõ về cách thức lập trình với Tcp socket, bao gồm cấu trúc gói tin, thiết lập & hủy liên kết, cách truyền dữ liệu.

Bạn đang xem: Cấu trúc gói tin tcp

Ở phần thực hành chúng ta đã thực hiện một chương trình client/server cơ bản sử dụng Tcp socket. Do Tcp là một giao thức rất phức tạp, trước khi đi vào phân tích chi tiết kỹ thuật lập trình Tcp socket, chúng ta sẽ xem xét các vấn đề chính của giao thức Tcp.


Đóng gói dữ liệu

Tương tự như Udp, Tcp cũng chỉ vận chuyển các chuỗi byte (mà ứng dụng tạo ra) mà không quan tâm tới ý nghĩa của chúng.

Dữ liệu của ứng dụng sau khi chuyển qua socket tới tầng giao vận sẽ được giao thức TCP tách thành từng phần. Đối với mỗi phần dữ liệu này, TCP sẽ bổ sung thêm các thông tin điều khiển vào trước phần dữ liệu để tạo thành một đơn vị dữ liệu của tầng giao vận, gọi là TCP segment.

Phần thông tin điều khiển mà TCP thêm vào trước khối dữ liệu ứng dụng gọi là TCP header. Phần dữ liệu ứng dụng lưu trong TCP segment được gọi là payload. TCP segment sau đó sẽ tiếp tục được chuyển xuống tầng mạng và tiến hành đóng với với giao thức IP để tạo thành một đơn vị dữ liệu của tầng mạng, gọi là IP datagram (hoặc IP package).

Tại tầng liên kết IP package lại được đóng gói một lần nữa thành Ethernet frame trước khi đưa lên đường truyền vật lý.

Tcp header

Cấu trúc của TCP header được trình bày trong sơ đồ dưới đây:

*
*
Truyền dữ liệu qua liên kết Tcp: song công, segment, các buffer

TCP có thể coi như một hệ thống con của hệ điều hành chịu trách nhiệm nhận dữ liệu từ ứng dụng cục bộ cũng như nhận dữ liệu từ máy ở xa.

Tcp buffer

TCP không lập tức đóng gói dữ liệu và chuyển lên mạng. Thay vào đó, Tcp chuyển dữ liệu tới một bộ nhớ đệm (buffer) được hình thành trong quá trình bắt tay ba bước. Theo thời gian, TCP sẽ lấy dữ liệu (dữ liệu của ứng dụng) từ bộ nhớ đệm, đóng gói thành segment, và chuyển lên đường truyền.

Trong khoảng thời gian chờ ở bộ nhớ đệm, ứng dụng có thể gửi thêm dữ liệu và dữ liệu này sẽ tiếp tục được bổ sung vào bộ nhớ đệm. Tương tự, TCP trên máy đích cũng sử dụng một bộ nhớ đệm cục bộ của riêng mình để lưu dữ liệu nhận được cho đến khi nó nhận được đầy đủ tất cả các gói tin theo đúng thứ tự. Sau đó, dữ liệu này mới được chuyển lên cho ứng dụng.

Tcp segment

Đơn vị dữ liệu của Tcp được gọi là segment. Kích thước tối đa của segment (maximum segment size, MSS) được thiết lập tự động bằng cách xác định kích thước tối đa của frame dữ liệu của tầng liên kết. Việc thiết lập MSS như vậy đảm bảo cho TCP segment có thể nằm vừa khít trong một frame với kích thước đủ lớn để có hiệu suất gửi dữ liệu cao nhất.

Xem thêm: Gmail Và Email Có Phải Là Gmail Không, Địa Chỉ Email, Gmail Là Gì

Khi TCP gửi đi dữ liệu kích thước lớn (ví dụ, một file ảnh lớn trong một trang web), dữ liệu này sẽ được cắt thành từng phần có kích thước bằng MSS (trừ mảnh cuối cùng có thể có kích thước nhỏ hơn).

Ngược lại, các ứng dụng tương tác thường dùng các khối dữ liệu có kích thước nhỏ hơn MSS. Ví dụ, chương trình Telnet thường gửi đi dữ liệu có kích thước đúng 1 byte, do đó kích thước TCP segment dùng với Telnet thường chỉ có 21 byte.

Acknowledgement

Mỗi khi Tcp trên máynguồn gửi đi một segment, nó sẽ chờ nhận được một gói tin phản hồi (ACK) từ máyđối tác thông báo về tình trạng của segment vừa nhận. Chỉ khi có ACK xác nhận đạtyêu cầu, Tcp trên máy nguồn mới tiếp tục gửi đi segment tiếp theo.

Do những đặc điểm trên, khi tiến trình gửi dữ liệu đi (dưới dạng các thông điệp thuộc tầng ứng dụng), TCP đảm bảo việc chuyển được toàn bộ dữ liệu tới máy đích theo đúng thứ tự, không mất mát và không lỗi.

Nhìn từ khía cạnh ứng dụng, liên kết và truyền dữ liệu qua Tcp giống như một luồng byte liên tục “chảy” từ buffer của máy nguồn tới buffer của máy đích. Khi tới buffer của máy đích, dữ liệu sẽ chờ được lấy vào chương trình và xử lý. Vì là một dòng byte liên tục, TCP không đảm bảo duy trì “ranh giới” giữa các thông điệp. Việc phân tách nội dung thông điệp tầng ứng dụng thuộc trách nhiệm của chương trình ứng dụng.

Đóng liên kết

Cả hai tiến trình tham gia vào liên kết TCP đều có thể yêu cầu đóng liên kết.

Khi một trong hai tiến trình muốn kết thúc một liên kết, nó sẽ gửi đi một segment không chứa dữ liệu, trong đó bit FIN = 1.

Khi tiến trình còn lại nhận được segment này, nó sẽ gửi lại một ACK segment. Tiếp theo tiến trình này sẽ gửi tiếp một segment, trong đó bit FIN = 1.

Cuối cùng, tiến trình muốn kết thúc liên kết sẽ gửi một ACK segment. Ngay sau đó, bộ nhớ đệm và các biến trạng thái liên quan tời liên kết sẽ được giải phóng và liên kết được ngắt.