Ứng dụng máy chủ máy khách tcp ip. Ứng dụng máy khách-máy chủ trên ổ cắm luồng TCP. Công dụng chung của các trường

Ứng dụng máy khách-máy chủ trên ổ cắm luồng TCP

Ví dụ sau đây sử dụng TCP để cung cấp các luồng byte hai chiều đáng tin cậy, có trật tự. Hãy xây dựng một ứng dụng hoàn chỉnh bao gồm máy khách và máy chủ. Đầu tiên, chúng tôi trình bày cách xây dựng một máy chủ bằng cách sử dụng các ổ cắm luồng TCP và sau đó là ứng dụng khách để kiểm tra máy chủ của chúng tôi.

Chương trình sau tạo một máy chủ nhận yêu cầu kết nối từ máy khách. Máy chủ được xây dựng đồng bộ nên việc thực thi luồng bị chặn cho đến khi máy chủ đồng ý kết nối với máy khách. Ứng dụng này thể hiện một máy chủ đơn giản phản hồi lại máy khách. Máy khách kết thúc kết nối bằng cách gửi tin nhắn đến máy chủ .

Máy chủ TCP

Việc tạo cấu trúc máy chủ được thể hiện ở sơ đồ chức năng sau:

Đây là mã hoàn chỉnh cho chương trình SocketServer.cs:

// SocketServer.cs sử dụng System; sử dụng System.Text; sử dụng System.Net; sử dụng System.Net.Sockets; không gian tên SocketServer ( class Program ( static void Main(string args) ( // Đặt điểm cuối cục bộ cho socket IPHostEntry ipHost = Dns.GetHostEntry("localhost"); IPAddress ipAddr = ipHost.AddressList; IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000 ); // Tạo một socket Tcp/Ip sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp); // Gán socket cho điểm cuối cục bộ và lắng nghe các socket đến thử ( sListener.Bind(ipEndPoint) ); sListener. Listen(10); // Bắt đầu lắng nghe các kết nối while (true) ( ​​​​Console.WriteLine("Đang chờ kết nối trên cổng (0)", ipEndPoint); // Chương trình tạm dừng, chờ kết nối kết nối đến Trình xử lý ổ cắm = sListener.Accept(); string data = null; // Chúng tôi đợi máy khách cố gắng kết nối với chúng tôi byte bytes = new byte; \n\n"); // Gửi phản hồi tới client\ string reply = "Cảm ơn bạn đã gửi yêu cầu bằng ký tự " + data.Length.ToString() + ""; thông điệp byte = Encoding.UTF8.GetBytes(reply); handler.Send(tin nhắn); if (data.IndexOf(" ") > -1) ( Console.WriteLine("Máy chủ đã chấm dứt kết nối với máy khách."); break; ) handler.Shutdown(SocketShutdown.Both); handler.Close(); ) ) Catch (Ngoại lệ cũ) ( Console.WriteLine (ex.ToString()); ) cuối cùng ( Console.ReadLine(); ) ) ) )

Chúng ta hãy nhìn vào cấu trúc của chương trình này.

Bước đầu tiên là đặt ổ cắm thành điểm cuối cục bộ. Trước khi mở socket để lắng nghe kết nối, bạn cần chuẩn bị địa chỉ endpoint cục bộ cho nó. Địa chỉ dịch vụ TCP/IP duy nhất được xác định bằng sự kết hợp giữa địa chỉ IP của máy chủ với số cổng dịch vụ, tạo ra điểm cuối dịch vụ.

Lớp Dns cung cấp các phương thức trả về thông tin về địa chỉ mạng được thiết bị trên mạng cục bộ hỗ trợ. Nếu một thiết bị LAN có nhiều địa chỉ mạng, lớp Dns sẽ trả về thông tin về tất cả các địa chỉ mạng và ứng dụng phải chọn địa chỉ thích hợp để phục vụ từ mảng.

Hãy tạo IPEndPoint cho máy chủ bằng cách kết hợp địa chỉ IP đầu tiên của máy chủ thu được từ phương thức Dns.Resolve() với số cổng:

IPHostEntry ipHost = Dns.GetHostEntry("localhost"); Địa chỉ IP ipAddr = ipHost.AddressList; IPEndPoint ipEndPoint = IPEndPoint mới(ipAddr, 11000);

Ở đây lớp IPEndPoint đại diện cho localhost trên cổng 11000. Tiếp theo, chúng ta tạo một luồng socket với một phiên bản mới của lớp Socket. Sau khi thiết lập điểm cuối cục bộ để lắng nghe các kết nối, chúng ta có thể tạo một ổ cắm:

Ổ cắm sListener = Ổ cắm mới (ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

Chuyển khoản Địa chỉGia đình chỉ định các sơ đồ địa chỉ mà một thể hiện của lớp Socket có thể sử dụng để phân giải một địa chỉ.

Trong tham số Loại ổ cắmỔ cắm TCP và UDP là khác nhau. Trong đó, bạn có thể xác định, trong số những thứ khác, các giá trị sau:

Dgram

Hỗ trợ datagram. Giá trị Dgram yêu cầu Udp phải được chỉ định cho loại giao thức và InterNetwork trong tham số họ địa chỉ.

thô

Hỗ trợ truy cập vào giao thức vận chuyển cơ bản.

Suối

Hỗ trợ ổ cắm luồng. Giá trị Luồng yêu cầu Tcp phải được chỉ định cho loại giao thức.

Tham số thứ ba và cuối cùng chỉ định loại giao thức cần thiết cho ổ cắm. Trong tham số Loại giao thức Bạn có thể chỉ định các giá trị quan trọng nhất sau đây - Tcp, Udp, Ip, Raw.

Bước tiếp theo là gán ổ cắm bằng phương thức Trói buộc(). Khi một socket được mở bởi hàm tạo, nó không được gán tên, chỉ có một thẻ điều khiển được đặt trước. Phương thức Bind() được gọi để gán tên cho server socket. Để ổ cắm máy khách xác định ổ cắm luồng TCP, chương trình máy chủ phải đặt tên cho ổ cắm của nó:

SListener.Bind(ipEndPoint);

Phương thức Bind() liên kết một socket với một điểm cuối cục bộ. Phương thức Bind() phải được gọi trước khi cố gắng gọi các phương thức Listen() và Accept().

Bây giờ, sau khi đã tạo một socket và liên kết tên với nó, bạn có thể nghe các tin nhắn đến bằng phương thức Nghe(). Ở trạng thái nghe, ổ cắm sẽ lắng nghe các nỗ lực kết nối đến:

SListener.Listen(10);

Tham số xác định tồn đọng, cho biết số lượng kết nối tối đa đang chờ trong hàng đợi. Trong đoạn mã trên, giá trị tham số cho phép tích lũy tối đa mười kết nối trong hàng đợi.

Ở trạng thái nghe, bạn phải sẵn sàng đồng ý kết nối với máy khách mà phương thức này được sử dụng Chấp nhận(). Phương pháp này có được kết nối máy khách và hoàn thành liên kết tên máy khách và máy chủ. Phương thức Accept() chặn luồng của chương trình gọi cho đến khi có kết nối.

Phương thức Accept() xóa yêu cầu kết nối đầu tiên khỏi hàng yêu cầu đang chờ xử lý và tạo một ổ cắm mới để xử lý nó. Mặc dù ổ cắm mới được tạo, ổ cắm ban đầu vẫn tiếp tục lắng nghe và có thể được sử dụng với tính năng đa luồng để chấp nhận nhiều yêu cầu kết nối từ máy khách. Không có ứng dụng máy chủ nào được phép đóng ổ cắm nghe. Nó phải tiếp tục hoạt động cùng với các ổ cắm được tạo bởi phương thức Chấp nhận để xử lý các yêu cầu đến của máy khách.

While (true) ( ​​​Console.WriteLine("Đang chờ kết nối trên cổng (0)", ipEndPoint); // Chương trình tạm dừng trong khi chờ kết nối đến Socket handler = sListener.Accept();

Khi máy khách và máy chủ đã thiết lập kết nối với nhau, tin nhắn có thể được gửi và nhận bằng các phương thức Gửi()Nhận được()ổ cắm lớp.

Phương thức Send() ghi dữ liệu gửi đi vào ổ cắm được kết nối. Phương thức Nhận() đọc dữ liệu đến vào ổ cắm luồng. Khi sử dụng hệ thống dựa trên TCP, kết nối phải được thiết lập giữa các ổ cắm trước khi thực hiện các phương thức Gửi() và Nhận(). Giao thức chính xác giữa hai thực thể giao tiếp phải được xác định trước để ứng dụng máy khách và máy chủ không chặn lẫn nhau do không biết ai sẽ gửi dữ liệu của họ trước.

Khi quá trình trao đổi dữ liệu giữa máy chủ và máy khách hoàn tất, bạn cần đóng kết nối bằng các phương thức Tắt()Đóng():

Handler.Shutdown(SocketShutdown.Both); handler.Close();

SocketShutdown là một enum chứa ba giá trị cần dừng: Cả hai- dừng gửi và nhận dữ liệu bằng ổ cắm, Nhận được- dừng ổ cắm nhận dữ liệu và Gửi- dừng gửi dữ liệu bằng ổ cắm.

Ổ cắm được đóng bằng cách gọi phương thức Close(), phương thức này cũng đặt thuộc tính Connected của ổ cắm thành sai.

máy khách TCP

Các chức năng được sử dụng để tạo ứng dụng khách ít nhiều giống với ứng dụng máy chủ. Giống như máy chủ, các phương pháp tương tự được sử dụng để xác định điểm cuối, khởi tạo ổ cắm, gửi và nhận dữ liệu cũng như đóng ổ cắm.

Du lịch thông qua các giao thức mạng.

TCP và UDP đều là các giao thức lớp vận chuyển. UDP là một giao thức không kết nối với việc phân phối gói không bảo đảm. TCP (Giao thức điều khiển truyền) là giao thức hướng kết nối với việc phân phối gói được đảm bảo. Đầu tiên là một cái bắt tay (Xin chào. | Xin chào. | Hãy trò chuyện? | Đi thôi.), sau đó kết nối được coi là đã thiết lập. Sau đó, các gói được gửi qua lại qua kết nối này (một cuộc trò chuyện đang diễn ra) và việc kiểm tra được thực hiện để xem liệu gói có đến được người nhận hay không. Nếu gói bị mất hoặc được gửi đến nhưng có tổng kiểm tra bị hỏng thì gói đó sẽ được gửi lại ("lặp lại, tôi không nghe thấy"). Do đó, TCP đáng tin cậy hơn, nhưng nó phức tạp hơn từ quan điểm triển khai và do đó, đòi hỏi nhiều chu kỳ xung nhịp / bộ nhớ hơn, điều này không phải là điều kém quan trọng nhất đối với bộ vi điều khiển. Ví dụ về các giao thức ứng dụng sử dụng TCP bao gồm FTP, HTTP, SMTP và nhiều giao thức khác.

TL;DR

HTTP (Giao thức truyền siêu văn bản) là một giao thức ứng dụng mà máy chủ gửi các trang tới trình duyệt của chúng tôi. HTTP hiện được sử dụng rộng rãi trên World Wide Web để lấy thông tin từ các trang web. Hình ảnh hiển thị một đèn trên bộ vi điều khiển có hệ điều hành trên bo mạch, trong đó màu sắc được đặt thông qua trình duyệt.

Giao thức HTTP dựa trên văn bản và khá đơn giản. Trên thực tế, phương thức GET trông giống như sau, được tiện ích netcat gửi đến địa chỉ IPv6 cục bộ của máy chủ có đèn:

~$ nc fe80::200:e2ff:fe58:b66b%mazko 80<

Phương thức HTTP thường là một từ tiếng Anh ngắn được viết bằng chữ in hoa và phân biệt chữ hoa chữ thường. Mỗi máy chủ phải hỗ trợ ít nhất các phương thức GET và HEAD. Ngoài các phương thức GET và HEAD, các phương thức POST, PUT và DELETE thường được sử dụng. Phương thức GET được sử dụng để yêu cầu nội dung của một tài nguyên được chỉ định, trong trường hợp của chúng tôi ở đây là GET /b HTTP/1.0 trong đó đường dẫn /b chịu trách nhiệm về màu (xanh lam). Phản hồi của máy chủ:

HTTP/1.0 200 OK Máy chủ: Contiki/2.4 http://www.sics.se/contiki/ Kết nối: đóng Cache-Control: no-cache, no-store, must-revalidate Pragma: no-cache Hết hạn: 0 Nội dung- loại: văn bản/html Contiki RGB

Màu đỏ TẮT

Màu xanh lá cây TẮT

Màu xanh đang BẬT

Mã trạng thái (chúng tôi có 200) là một phần của dòng đầu tiên trong phản hồi của máy chủ. Đó là một số nguyên có ba chữ số. Chữ số đầu tiên cho biết loại của điều kiện. Mã phản hồi thường được theo sau bởi một cụm từ giải thích bằng tiếng Anh, cách nhau bằng dấu cách, giải thích cho người đó lý do cho phản hồi cụ thể này. Trong trường hợp của chúng tôi, máy chủ hoạt động không có lỗi, mọi thứ đều ổn (OK).

Cả yêu cầu và phản hồi đều chứa các tiêu đề (mỗi dòng là một trường tiêu đề riêng biệt, cặp tên-giá trị được phân tách bằng dấu hai chấm). Các tiêu đề kết thúc bằng một dòng trống, sau đó dữ liệu có thể theo sau.

Trình duyệt của tôi từ chối mở địa chỉ IPv6 cục bộ, do đó, một địa chỉ bổ sung được ghi trong phần sụn của bộ vi điều khiển và tiền tố tương tự cũng cần được gán cho giao diện mạng ảo của trình mô phỏng:

~$ sudo ip addr add abcd::1/64 dev mazko # linux ~$ netsh giao diện ipv6 đặt địa chỉ mazko abcd::1 # windows ~$ Curl http://

TCP tích hợp một cách tự nhiên vào môi trường máy khách/máy chủ (xem Hình 10.1). Ứng dụng máy chủ lỗi(nghe) các yêu cầu kết nối đến. Ví dụ: WWW, dịch vụ truyền tệp hoặc dịch vụ truy cập thiết bị đầu cuối lắng nghe các yêu cầu đến từ khách hàng. Truyền thông trong TCP được khởi tạo bởi các thủ tục thích hợp, khởi tạo một kết nối đến máy chủ (xem Chương 21 về giao diện lập trình socket).

Cơm. 10.1. Máy khách gọi đến máy chủ.

Trong thực tế, máy khách có thể là một máy chủ khác. Ví dụ: máy chủ thư có thể kết nối với máy chủ thư khác để gửi thư email giữa các máy tính.

10.2 Khái niệm TCP

Ứng dụng nên gửi dữ liệu trong TCP dưới dạng nào? TCP truyền dữ liệu tới IP dưới dạng nào? Làm thế nào để các giao thức TCP gửi và nhận xác định kết nối giữa các ứng dụng và các thành phần dữ liệu cần thiết để triển khai nó? Tất cả những câu hỏi này sẽ được trả lời trong các phần sau, mô tả các khái niệm cơ bản về TCP.

10.2.1 Luồng dữ liệu đầu vào và đầu ra

Khái niệm Mô hình kết nối liên quan đến việc ứng dụng chuyển tiếp luồng dữ liệu đến ứng dụng ngang hàng. Đồng thời, nó có khả năng nhận luồng dữ liệu từ đối tác kết nối của mình. TCP cung cấp song công hoàn toàn Chế độ vận hành (song công hoàn toàn) trong đó phục vụ đồng thời hai luồng dữ liệu (xem hình 10.2).


Cơm. 10.2. Các ứng dụng trao đổi luồng dữ liệu.

10.2.2 Phân đoạn

TCP có thể chuyển đổi luồng dữ liệu rời khỏi ứng dụng thành dạng phù hợp để lưu trữ trong datagram. Làm sao?

Ứng dụng gửi dữ liệu tới TCP và giao thức này đặt nó vào bộ đệm đầu ra(gửi bộ đệm). Tiếp theo, TCP cắt các phần dữ liệu từ bộ đệm và gửi chúng, thêm tiêu đề (điều này tạo ra phân đoạn- bộ phận). Trong bộ lễ phục. 10.3 cho thấy dữ liệu từ bộ đệm đầu ra TCP được đóng gói thành các phân đoạn. TCP chuyển phân đoạn này tới IP để phân phối dưới dạng một gói dữ liệu riêng biệt. Việc đóng gói dữ liệu thành các đoạn có độ dài chính xác đảm bảo việc chuyển tiếp hiệu quả, do đó TCP sẽ đợi cho đến khi có đủ lượng dữ liệu thích hợp trong bộ đệm đầu ra trước khi tạo một phân đoạn.


Cơm. 10.3 Tạo phân đoạn TCP

10.2.3 Đẩy

Tuy nhiên, lượng lớn dữ liệu thường không thể áp dụng cho các ứng dụng trong thế giới thực. Ví dụ: khi chương trình máy khách của người dùng cuối bắt đầu phiên tương tác với máy chủ từ xa, khi đó người dùng chỉ nhập lệnh (sau đó nhấn phím Trở lại).

Chương trình máy khách của người dùng cần TCP để biết rằng dữ liệu đang được gửi đến máy chủ từ xa và thực hiện thao tác này ngay lập tức. Trong trường hợp này nó được sử dụng đẩy ra(xô).

Nếu bạn xem xét các hoạt động trong một phiên tương tác, bạn sẽ thấy nhiều phân đoạn có ít dữ liệu và hơn nữa, có thể tìm thấy popping trong hầu hết mọi phân đoạn dữ liệu. Tuy nhiên, không nên sử dụng tính năng đẩy trong quá trình truyền tệp (ngoại trừ phân đoạn cuối cùng) và TCP sẽ có thể đóng gói dữ liệu thành các phân đoạn một cách hiệu quả nhất.

10.2.4 Dữ liệu khẩn cấp

Mô hình chuyển tiếp dữ liệu của ứng dụng bao gồm một luồng byte được sắp xếp di chuyển đến đích. Trở lại ví dụ về phiên tương tác, giả sử người dùng nhấn một phím chú ý(chú ý) hoặc phá vỡ(ngắt). Ứng dụng từ xa phải có khả năng bỏ qua các byte gây nhiễu và phản hồi thao tác nhấn phím nhanh nhất có thể.

Cơ chế dữ liệu khẩn cấp(dữ liệu khẩn cấp) đánh dấu thông tin đặc biệt trong một phân đoạn là cấp bách. Bằng cách này, TCP thông báo cho thiết bị ngang hàng của nó rằng phân đoạn này chứa dữ liệu khẩn cấp và có thể cho biết nó nằm ở đâu. Đối tác phải chuyển tiếp thông tin này đến ứng dụng đích càng sớm càng tốt.

10.2.5 Cổng ứng dụng

Khách hàng phải xác định dịch vụ mà nó muốn truy cập. Điều này được thực hiện thông qua đặc tả địa chỉ IP của dịch vụ máy chủ và số cổng TCP của nó. Giống như UDP, số cổng TCP nằm trong khoảng từ 0 đến 65535. Các cổng trong khoảng từ 0 đến 1023 được gọi là phổ biến và được sử dụng để truy cập các dịch vụ tiêu chuẩn.

Một số ví dụ về các cổng phổ biến và ứng dụng tương ứng của chúng được trình bày trong Bảng 10.1. Dịch vụ Loại bỏ(cổng 9) và tính phí(cổng 19) là phiên bản TCP của dịch vụ mà chúng tôi đã biết qua UDP. Cần phải nhớ rằng lưu lượng đến cổng 9 của giao thức TCP hoàn toàn tách biệt với lưu lượng đến cổng 9 của giao thức UDP.


Bảng 10.1 Các cổng TCP nổi tiếng và các ứng dụng tương ứng của chúng

Hải cảng Ứng dụng Sự miêu tả
9 Loại bỏ Hủy tất cả dữ liệu đến
19 tính phí Trình tạo ký tự. Trao đổi dòng ký tự
20 Dữ liệu FTP Cổng chuyển tiếp dữ liệu FTP
21 FTP Cổng đối thoại FTP
23 TELNET Cổng đăng ký từ xa qua Telnet
25 SMTP Cổng giao thức SMTP
110 POP3 Dịch vụ lấy mẫu thư cho máy tính cá nhân
119 NNTP Truy cập tin tức trực tuyến

Còn các cổng được khách hàng sử dụng thì sao? Trong một số trường hợp hiếm hoi, máy khách không hoạt động thông qua một cổng nổi tiếng. Nhưng trong những tình huống như vậy, muốn mở một kết nối, nó thường yêu cầu hệ điều hành gán cho nó một cổng không được sử dụng và không được đặt trước. Khi kết nối xong, máy khách phải trả lại cổng này, sau đó cổng này có thể được sử dụng lại bởi máy khách khác. Vì có hơn 63.000 cổng TCP trong nhóm số không được đặt trước nên có thể bỏ qua các hạn chế về cổng máy khách.

10.2.6 Địa chỉ ổ cắm

Như chúng ta đã biết, sự kết hợp giữa địa chỉ IP và cổng giao tiếp được gọi là ổ cắm địa chỉ. Kết nối TCP được xác định hoàn toàn bằng địa chỉ ổ cắm ở mỗi đầu của kết nối. Trong bộ lễ phục. Hình 10.4 cho thấy kết nối giữa máy khách có địa chỉ socket (128.36.1.24, port = 3358) và máy chủ có địa chỉ socket (130.42.88.22, port = 21).

Cơm. 10.4.Địa chỉ ổ cắm

Tiêu đề của mỗi datagram chứa địa chỉ IP nguồn và đích. Sau này bạn sẽ thấy số cổng nguồn và đích được chỉ định trong tiêu đề phân đoạn TCP.

Thông thường, một máy chủ có khả năng quản lý nhiều máy khách cùng một lúc. Các địa chỉ ổ cắm máy chủ duy nhất được gán đồng thời cho tất cả các máy khách của nó (xem Hình 10.5).


Cơm. 10,5. Nhiều máy khách được kết nối với địa chỉ ổ cắm máy chủ

Bởi vì một datagram chứa một phân đoạn kết nối TCP được xác định bởi các địa chỉ IP và cổng, nên máy chủ rất dễ dàng theo dõi nhiều kết nối đến máy khách.

10.3 Cơ chế tin cậy TCP

Trong phần này, chúng ta sẽ xem xét cơ chế TCP được sử dụng để phân phối dữ liệu một cách đáng tin cậy trong khi vẫn giữ nguyên thứ tự truyền và tránh mất mát hoặc trùng lặp.

10.3.1 Đánh số và xác nhận

TCP sử dụng đánh số và xác nhận (ACK) để đảm bảo truyền dữ liệu đáng tin cậy. Sơ đồ đánh số TCP hơi khác thường: mọiđược chuyển tiếp qua kết nối bát phânđược coi là có số sê-ri. Tiêu đề phân đoạn TCP chứa số thứ tự octet dữ liệu đầu tiên trong phân đoạn này.

Người nhận được yêu cầu xác nhận rằng dữ liệu đã được nhận. Nếu ACK không đến trong khoảng thời gian chờ, dữ liệu sẽ được truyền lại. Phương pháp này được gọi là xác nhận tích cực với rơle(xác nhận tích cực với việc truyền lại).

Người nhận dữ liệu TCP kiểm tra nghiêm ngặt các số thứ tự đến để xác minh rằng dữ liệu được nhận theo thứ tự và không có phần nào bị thiếu. Vì ACK có thể bị mất hoặc bị trì hoãn một cách ngẫu nhiên nên các phân đoạn trùng lặp có thể đến được người nhận. Số thứ tự cho phép bạn xác định dữ liệu trùng lặp, sau đó sẽ bị loại bỏ.

Trong bộ lễ phục. Hình 10.6 cho thấy một cái nhìn đơn giản về thời gian chờ và truyền lại trong TCP.


Cơm. 10.6. Hết thời gian chờ và truyền lại trong TCP

10.3.2 Các trường cổng, chuỗi và ACK trong tiêu đề TCP

Như thể hiện trong hình. 10.7, một số trường đầu tiên của tiêu đề TCP cung cấp không gian cho các giá trị cổng nguồn và đích, số thứ tự của byte đầu tiên của dữ liệu kèm theo và ACK bằng số thứ tự Kế tiếp byte dự kiến ​​ở đầu bên kia. Nói cách khác, nếu TCP nhận được tất cả byte tối đa 30 từ ngang hàng của nó, trường này sẽ có giá trị 31, cho biết phân đoạn sẽ chuyển tiếp tiếp theo.


Cơm. 10.7. Giá trị ban đầu trong các trường tiêu đề TCP

Một chi tiết nhỏ không thể bỏ qua. Giả sử rằng TCP đã gửi byte từ 1 đến 50 và không còn dữ liệu nào để gửi nữa. Nếu dữ liệu được nhận từ một thiết bị ngang hàng, TCP phải xác nhận việc nhận dữ liệu bằng cách gửi tiêu đề mà không có dữ liệu đính kèm. Đương nhiên, tiêu đề này chứa giá trị ACK. Trong trường chuỗi - giá trị là 51, tức là. số byte tiếp theo, trong đó dự định gửi TCP. Khi TCP gửi dữ liệu tiếp theo, tiêu đề TCP mới cũng sẽ có trường chuỗi là 51.

10.4 Thiết lập kết nối

Làm thế nào để hai ứng dụng kết nối với nhau? Trước khi giao tiếp, mỗi chương trình con gọi một chương trình con để tạo thành một khối bộ nhớ sẽ được sử dụng để lưu trữ các tham số TCP và IP của một kết nối nhất định, ví dụ: địa chỉ ổ cắm, số thứ tự hiện tại, giá trị vòng đời ban đầu, v.v.

Ứng dụng máy chủ chờ đợi một máy khách xuất hiện, người này muốn có quyền truy cập vào máy chủ sẽ đưa ra yêu cầu hợp chất(kết nối), xác định địa chỉ IP và cổng của máy chủ.

Có một tính năng kỹ thuật. Mỗi bên bắt đầu đánh số từng byte không phải bằng một mà bằng số sê-ri ngẫu nhiên(sau này chúng ta sẽ tìm hiểu lý do tại sao điều này được thực hiện). Thông số kỹ thuật ban đầu khuyên rằng số thứ tự ban đầu được tạo dựa trên bộ đếm thời gian bên ngoài 32 bit tăng dần sau mỗi 4 µs.

10.4.1 Kịch bản kết nối

Quy trình kết nối thường được gọi là bắt tay ba chiều vì ba tin nhắn được trao đổi để thiết lập kết nối - SYN, SYN và ACK.

Trong quá trình thiết lập kết nối, các đối tác trao đổi ba thông tin quan trọng:

1. Dung lượng bộ đệm để nhận dữ liệu

2. Lượng dữ liệu tối đa được mang trong một phân đoạn đến

3. Số thứ tự bắt đầu được sử dụng cho dữ liệu gửi đi

Lưu ý rằng mỗi bên sử dụng thao tác 1 và 2 để biểu thị giới hạn mà bên kia sẽ hành động. Máy tính cá nhân có thể có bộ đệm nhận nhỏ, nhưng siêu máy tính có thể có bộ đệm lớn. Cấu trúc bộ nhớ của máy tính cá nhân có thể giới hạn các khối dữ liệu đến ở mức 1 KB, nhưng siêu máy tính sẽ quản lý các phân đoạn lớn hơn.

Khả năng kiểm soát cách bên kia gửi dữ liệu là một tính năng quan trọng giúp TCP/IP có thể mở rộng.

Trong bộ lễ phục. Hình 10.8 hiển thị một kịch bản kết nối mẫu. Các số thứ tự ban đầu rất đơn giản được trình bày để không làm quá tải bản vẽ. Lưu ý rằng trong hình này, máy khách có thể nhận được các phân đoạn lớn hơn máy chủ.


Cơm. 10.8. Thiết lập kết nối

Các hoạt động sau đây được thực hiện:

1. Máy chủ khởi tạo và sẵn sàng kết nối với máy khách (trạng thái này được gọi là mở thụ động).

2. Máy khách yêu cầu TCP mở kết nối đến máy chủ tại địa chỉ IP và cổng được chỉ định (trạng thái này được gọi là active open).

3. Máy khách TCP nhận số thứ tự ban đầu (1000 trong ví dụ này) và gửi phân đoạn đồng bộ(đồng bộ phân đoạn - SYN). Phân đoạn này mang số thứ tự, kích thước của cửa sổ nhận (4K) và kích thước của phân đoạn lớn nhất mà máy khách có thể nhận được (1460 byte).

4. Khi có SYN đến, máy chủ TCP sẽ nhận được của tôi số thứ tự bắt đầu (3000). Nó gửi phân đoạn SYN chứa số thứ tự bắt đầu (3000), ACK 1001 (có nghĩa là byte đầu tiên được máy khách gửi được đánh số là 1001), kích thước cửa sổ nhận (4K) và kích thước của phân đoạn lớn nhất mà máy chủ có thể nhận (1024 byte).

5. Máy khách TCP, sau khi nhận được tin nhắn SYN/ACK từ máy chủ, sẽ gửi lại ACK 3001 (byte dữ liệu đầu tiên được máy chủ gửi phải được đánh số 3001).

6. Máy khách TCP hướng dẫn ứng dụng của nó mở kết nối.

7. TCP máy chủ, sau khi nhận được tin nhắn ACK từ TCP máy khách, sẽ thông báo cho ứng dụng của nó về việc mở kết nối.

Máy khách và máy chủ thông báo các quy tắc của họ đối với dữ liệu nhận được, đồng bộ hóa số thứ tự của chúng và sẵn sàng trao đổi dữ liệu. Đặc tả TCP cũng cho phép một kịch bản khác (không thành công lắm), khi các ứng dụng ngang hàng đồng thời tích cực mở lẫn nhau.

10.4.2 Cài đặt giá trị tham số IP

Yêu cầu ứng dụng thiết lập kết nối cũng có thể chỉ định các tham số cho gói dữ liệu IP sẽ mang dữ liệu kết nối. Nếu giá trị tham số cụ thể không được chỉ định thì giá trị mặc định sẽ được sử dụng.

Ví dụ: một ứng dụng có thể chọn giá trị mong muốn cho mức độ ưu tiên IP hoặc loại dịch vụ. Vì mỗi bên được kết nối đặt mức độ ưu tiên và loại dịch vụ riêng của mình một cách độc lập nên về mặt lý thuyết, các giá trị này có thể khác nhau đối với các hướng luồng dữ liệu khác nhau. Theo quy định, trong thực tế, các giá trị giống nhau được sử dụng cho mỗi hướng trao đổi.

Khi một ứng dụng liên quan đến các tùy chọn bảo mật của chính phủ hoặc quân sự, mỗi điểm cuối của kết nối phải sử dụng cùng cấp độ bảo mật, nếu không kết nối sẽ không được thiết lập.

10.5 Truyền dữ liệu

Quá trình truyền dữ liệu bắt đầu sau khi hoàn thành xác nhận ba bước tạo kết nối (xem Hình 10.9). Tiêu chuẩn TCP cho phép đưa dữ liệu thông thường vào các phân đoạn xác nhận, nhưng nó sẽ không được gửi đến ứng dụng cho đến khi kết nối hoàn tất. Để đơn giản hóa việc đánh số, tin nhắn 1000 byte được sử dụng. Mỗi phân đoạn tiêu đề TCP có trường ACK xác định số thứ tự byte dự kiến ​​sẽ nhận được từ đối tác kết nối.


Cơm. 10.9. Trao đổi dữ liệu đơn giản và luồng ACK

Phân đoạn đầu tiên được máy khách gửi chứa các byte từ 1001 đến 2000. Trường ACK của nó phải chứa giá trị 3001, cho biết số thứ tự byte dự kiến ​​sẽ được nhận từ máy chủ.

Máy chủ phản hồi máy khách bằng một phân đoạn chứa 1000 byte dữ liệu (bắt đầu bằng số 3001). Trường ACK tiêu đề TCP của nó sẽ chỉ ra rằng các byte từ 1001 đến 2000 đã được nhận thành công, do đó, số thứ tự phân đoạn tiếp theo được mong đợi từ máy khách sẽ là 2001.

Sau đó, máy khách sẽ gửi các phân đoạn bắt đầu bằng byte 2001, 3001 và 4001 theo trình tự đã chỉ định. Lưu ý rằng máy khách không đợi ACK sau mỗi phân đoạn được gửi. Dữ liệu được gửi đến thiết bị ngang hàng cho đến khi không gian bộ đệm của nó đầy (bên dưới chúng ta sẽ thấy rằng người nhận có thể chỉ định rất chính xác lượng dữ liệu được gửi cho mình).

Máy chủ tiết kiệm băng thông kết nối bằng cách sử dụng một ACK duy nhất để biểu thị thành công trong việc chuyển tiếp tất cả các phân đoạn.

Trong bộ lễ phục. Hình 10.10 thể hiện việc truyền dữ liệu khi đoạn đầu tiên bị mất. Khi hết thời gian chờ, phân đoạn sẽ được truyền lại. Lưu ý rằng khi nhận được một phân đoạn bị mất, bên nhận sẽ gửi một ACK duy nhất xác nhận việc chuyển tiếp cả hai phân đoạn.


Cơm. 10.10. Mất dữ liệu và truyền lại

10.6 Đóng kết nối

Việc chấm dứt kết nối thông thường được thực hiện bằng cách sử dụng quy trình bắt tay ba lần giống như khi mở kết nối. Mỗi bên có thể bắt đầu đóng kết nối bằng cách sử dụng kịch bản sau:

MỘT:

B:"Khỏe".

TRONG:"Tôi cũng đã hoàn thành công việc."

MỘT:"Khỏe".

Hãy giả sử kịch bản sau (mặc dù nó cực kỳ hiếm khi được sử dụng):

MỘT:"Tôi xong rồi. Không còn dữ liệu nào để gửi nữa."

TRONG:"Được rồi. Tuy nhiên, có một số dữ liệu..."

TRONG:"Tôi cũng đã hoàn thành công việc."

MỘT:"Khỏe".

Trong ví dụ bên dưới, kết nối bị đóng bởi máy chủ, điều này thường xảy ra với các kết nối máy khách/máy chủ. Trong trường hợp này, sau khi người dùng tham gia phiên telnet Lệnh đăng xuất khiến máy chủ bắt đầu yêu cầu đóng kết nối. Trong tình huống thể hiện trong hình. 10.11, các hành động sau được thực hiện:

1. Ứng dụng trên máy chủ yêu cầu TCP đóng kết nối.

2. Máy chủ TCP gửi phân đoạn cuối cùng (Phân đoạn cuối cùng - FIN), thông báo cho máy chủ ngang hàng rằng không còn dữ liệu nào để gửi nữa.

3. TCP của máy khách gửi ACK trong phân đoạn FIN.

4. TCP của máy khách thông báo cho ứng dụng của nó rằng máy chủ muốn đóng kết nối.

5. Ứng dụng khách yêu cầu TCP của nó đóng kết nối.

6. Máy khách TCP gửi tin nhắn FIN.

7. Máy chủ TCP nhận FIN từ máy khách và phản hồi bằng tin nhắn ACK.

8. TCP của máy chủ yêu cầu ứng dụng của nó đóng kết nối.


Cơm. 10.11.Đóng một kết nối

Cả hai bên có thể bắt đầu đóng cửa cùng một lúc. Trong trường hợp này, việc đóng kết nối thông thường được hoàn thành sau khi mỗi thiết bị ngang hàng gửi tin nhắn ACK.

10.6.1 Chấm dứt đột ngột

Mỗi bên có thể yêu cầu chấm dứt đột ngột (đóng đột ngột) kết nối. Điều này có thể chấp nhận được khi một ứng dụng muốn chấm dứt kết nối hoặc khi TCP phát hiện một vấn đề giao tiếp nghiêm trọng mà nó không thể giải quyết bằng các biện pháp riêng của mình. Việc chấm dứt đột ngột được yêu cầu bằng cách gửi một hoặc nhiều tin nhắn đặt lại đến thiết bị ngang hàng, được biểu thị bằng một cờ cụ thể trong tiêu đề TCP.

10.7 Kiểm soát dòng chảy

Bộ thu TCP được tải luồng dữ liệu đến và xác định lượng thông tin có thể chấp nhận. Giới hạn này ảnh hưởng đến người gửi TCP. Giải thích sau đây về cơ chế này chỉ mang tính khái niệm và các nhà phát triển có thể triển khai nó theo nhiều cách khác nhau trong sản phẩm của họ.

Trong quá trình thiết lập kết nối, mỗi thiết bị ngang hàng sẽ phân bổ không gian cho bộ đệm đầu vào của kết nối và thông báo cho bên kia về điều đó. Thông thường, kích thước bộ đệm được biểu thị dưới dạng số nguyên của kích thước phân đoạn tối đa.

Luồng dữ liệu đi vào bộ đệm đầu vào và được lưu trữ ở đó trước khi được chuyển tiếp đến ứng dụng (được xác định bởi cổng TCP). Trong bộ lễ phục. Hình 10.12 cho thấy bộ đệm đầu vào có thể chấp nhận 4 KB.


Cơm. 10.12. Cửa sổ nhận bộ đệm đầu vào

Không gian bộ đệm được lấp đầy khi dữ liệu đến. Khi ứng dụng nhận lấy dữ liệu từ bộ đệm, không gian trống sẽ có sẵn cho dữ liệu mới đến.

10.7.1 Cửa sổ nhận

Cửa sổ nhận(cửa sổ nhận) - bất kỳ khoảng trống nào trong bộ đệm đầu vào chưa bị dữ liệu chiếm dụng. Dữ liệu vẫn còn trong bộ đệm đầu vào cho đến khi nó được ứng dụng đích sử dụng. Tại sao ứng dụng không thu thập dữ liệu ngay lập tức?

Một kịch bản đơn giản sẽ giúp trả lời câu hỏi này. Giả sử rằng một máy khách đã gửi một tệp đến máy chủ FTP chạy trên một máy tính nhiều người dùng rất bận. Chương trình FTP sau đó phải đọc dữ liệu từ bộ đệm và ghi vào đĩa. Khi máy chủ thực hiện các thao tác I/O trên đĩa, chương trình sẽ đợi các thao tác đó hoàn tất. Tại thời điểm này, một chương trình khác có thể bắt đầu (ví dụ: theo lịch trình) và trong khi chương trình FTP bắt đầu lại, dữ liệu tiếp theo sẽ đến bộ đệm.

Cửa sổ nhận kéo dài từ byte được xác nhận cuối cùng đến cuối bộ đệm. Trong bộ lễ phục. 10.12, trước tiên toàn bộ bộ đệm có sẵn và do đó có cửa sổ nhận 4 KB. Khi KB đầu tiên đến, cửa sổ nhận sẽ giảm xuống còn 3 KB (để đơn giản, chúng tôi sẽ giả sử rằng mỗi phân đoạn có kích thước 1 KB, mặc dù trong thực tế giá trị này thay đổi tùy theo nhu cầu của ứng dụng). Sự xuất hiện của hai phân đoạn 1 KB tiếp theo sẽ làm giảm cửa sổ nhận xuống còn 1 KB.

Mỗi ACK được gửi bởi người nhận chứa thông tin về trạng thái hiện tại của cửa sổ nhận, tùy thuộc vào luồng dữ liệu từ nguồn được điều chỉnh.

Trong hầu hết các trường hợp, kích thước của bộ đệm đầu vào được đặt khi kết nối được bắt đầu, mặc dù tiêu chuẩn TCP không chỉ định cách quản lý bộ đệm này. Bộ đệm đầu vào có thể tăng hoặc giảm bằng cách cung cấp phản hồi cho người gửi.

Điều gì xảy ra nếu phân đoạn đến có thể được đặt trong cửa sổ nhận nhưng phân đoạn đó đến không đúng thứ tự? Người ta thường giả định rằng tất cả các triển khai đều lưu trữ dữ liệu đến trong cửa sổ nhận và chỉ gửi xác nhận (ACK) cho toàn bộ khối liền kề gồm nhiều phân đoạn. Đây là cách đúng đắn, vì nếu không, việc loại bỏ dữ liệu không theo thứ tự sẽ làm giảm đáng kể hiệu suất.

10.7.2 Cửa sổ gửi bài

Hệ thống truyền dữ liệu phải theo dõi hai đặc điểm: lượng dữ liệu đã được gửi và xác nhận cũng như kích thước hiện tại của cửa sổ nhận của người nhận. Tích cực gửi không gian(khoảng cách gửi) kéo dài từ octet chưa được xác nhận đầu tiên đến cạnh trái của cửa sổ nhận hiện tại. Phần cửa sổ, đã sử dụng để gửi, cho biết lượng dữ liệu bổ sung có thể được gửi cho đối tác.

Số thứ tự ban đầu và kích thước cửa sổ nhận ban đầu được chỉ định trong quá trình thiết lập kết nối. Cơm. Hình 10.13 minh họa một số tính năng của cơ chế truyền dữ liệu.

1. Người gửi bắt đầu với cửa sổ gửi 4 KB.

2. Người gửi gửi 1 KB. Một bản sao của dữ liệu này được giữ lại cho đến khi nhận được xác nhận (ACK), vì nó có thể cần được truyền lại.

3. Tin nhắn ACK cho KB đầu tiên đến và 2 KB dữ liệu tiếp theo được gửi đi. Kết quả được thể hiện ở phần thứ ba từ trên xuống của Hình. 13/10. Dung lượng lưu trữ 2 KB vẫn tiếp tục.

4. Cuối cùng, một ACK đến cho tất cả dữ liệu được truyền đi (tức là tất cả dữ liệu đó đều được người nhận nhận). ACK khôi phục kích thước cửa sổ gửi thành 4 KB.

Cơm. 13/10. Cửa sổ gửi

Có một số tính năng thú vị cần chỉ ra:

■ Bên gửi không đợi ACK cho mỗi phân đoạn dữ liệu mà nó gửi. Hạn chế duy nhất trong việc chuyển tiếp là kích thước của cửa sổ nhận (ví dụ: người gửi chỉ phải chuyển tiếp các phân đoạn 4K byte đơn).

■ Giả sử người gửi gửi dữ liệu theo nhiều đoạn rất ngắn (ví dụ: 80 byte). Trong trường hợp này, dữ liệu có thể được định dạng lại để truyền hiệu quả hơn (ví dụ: thành một phân đoạn duy nhất).

10.8 tiêu đề TCP

Trong bộ lễ phục. Hình 10.14 hiển thị định dạng phân đoạn (tiêu đề và dữ liệu TCP). Tiêu đề bắt đầu bằng ID cổng nguồn và đích. Tiếp theo trường tiếp theo số seri(số thứ tự) cho biết vị trí trong luồng dữ liệu đi mà phân đoạn này chiếm giữ. Cánh đồng ACK(xác nhận) chứa thông tin về phân đoạn tiếp theo dự kiến ​​sẽ xuất hiện trong luồng dữ liệu đầu vào.


Cơm. 14/10. Phân đoạn TCP

Có sáu lá cờ:

Cánh đồng bù trừ dữ liệu(Data Offset) chứa kích thước của tiêu đề TCP tính bằng từ 32 bit. Tiêu đề TCP phải kết thúc ở ranh giới 32 bit.

10.8.1 Tùy chọn kích thước phân đoạn tối đa

Tham số "kích thước phân khúc tối đa"(maximum Segment size - MSS) dùng để khai báo phần dữ liệu lớn nhất mà hệ thống có thể chấp nhận và xử lý. Tuy nhiên, cái tên này có phần không chính xác. Thông thường trong TCP bộ phậnđược coi là tiêu đề cộng với dữ liệu. Tuy nhiên kích thước phân khúc tối đađịnh nghĩa là:

Kích thước của datagram lớn nhất có thể nhận được là 40

Nói cách khác, MSS phản ánh giá trị lớn nhất khối hàng tại máy thu khi tiêu đề TCP và IP dài 20 byte. Nếu có các tham số bổ sung, chiều dài của chúng sẽ được trừ vào tổng kích thước. Do đó, lượng dữ liệu có thể được gửi trong một phân đoạn được xác định là:

Giá trị đã nêu MSS + 40 – (tổng độ dài tiêu đề TCP và IP)

Các thiết bị ngang hàng thường trao đổi giá trị MSS trong các tin nhắn SYN ban đầu khi mở kết nối. Nếu hệ thống không quảng cáo giá trị kích thước phân đoạn tối đa thì giá trị mặc định là 536 byte sẽ được sử dụng.

Kích thước của phân đoạn tối đa được mã hóa dưới dạng phần dẫn đầu 2 byte, theo sau là giá trị 2 byte, tức là. giá trị lớn nhất sẽ là 2 16 -1 (65.535 byte).

MSS áp đặt một giới hạn nghiêm ngặt đối với dữ liệu được gửi trong TCP: người nhận sẽ không thể xử lý các giá trị lớn. Tuy nhiên, người gửi sử dụng các phân đoạn kích thước nhỏ hơn, vì kích thước MTU dọc theo tuyến đường cũng được xác định cho kết nối.

10.8.2 Sử dụng các trường tiêu đề trong yêu cầu kết nối

Phân đoạn đầu tiên được gửi để mở kết nối có cờ SYN là 1 và cờ ACK là 0. SYN ban đầu là thứ duy nhất một phân đoạn có trường ACK có giá trị 0. Lưu ý rằng các công cụ bảo mật sử dụng tính năng này để xác định các yêu cầu đầu vào cho phiên TCP.

Cánh đồng số seri chứa số thứ tự ban đầu(số thứ tự ban đầu), trường cửa sổ - kích thước ban đầu cửa sổ nhận. Tham số TCP duy nhất hiện được xác định là kích thước phân đoạn tối đa (khi không được chỉ định, mặc định là 536 byte được sử dụng) mà TCP mong muốn nhận được. Giá trị này chiếm 32 bit và thường xuất hiện trong yêu cầu kết nối trong trường tùy chọn(Lựa chọn). Tiêu đề TCP chứa giá trị MSS dài 24 byte.

10.8.3 Sử dụng các trường tiêu đề trong phản hồi yêu cầu kết nối

Trong phản hồi cấp quyền cho yêu cầu kết nối, cả hai cờ (SYN và ACK) đều bằng 1. Hệ thống phản hồi cho biết số thứ tự bắt đầu trong trường thích hợp và kích thước cửa sổ nhận trong trường Cửa sổ. Kích thước phân đoạn tối đa mà người nhận mong muốn sử dụng thường được tìm thấy trong phản hồi cho yêu cầu kết nối (trong tùy chọn). Giá trị này có thể khác với giá trị của bên yêu cầu kết nối, tức là. hai giá trị khác nhau có thể được sử dụng.

Yêu cầu kết nối có thể bị từ chối bằng cách chỉ định cờ đặt lại (RST) có giá trị 1 trong phản hồi.

10.8.4 Chọn số thứ tự bắt đầu

Đặc tả TCP giả định rằng trong quá trình thiết lập kết nối, mỗi bên chọn số thứ tự ban đầu(dựa trên giá trị hiện tại của bộ định thời bên trong 32 bit). Việc này được thực hiện như thế nào?

Hãy tưởng tượng điều gì sẽ xảy ra nếu hệ thống sụp đổ. Giả sử rằng người dùng đã mở kết nối ngay trước khi xảy ra sự cố và gửi một lượng nhỏ dữ liệu. Sau khi khôi phục, hệ thống không còn nhớ bất cứ điều gì đã được thực hiện trước khi xảy ra sự cố, bao gồm cả các kết nối đã bắt đầu và số cổng được chỉ định. Người dùng thiết lập lại kết nối. Số cổng không khớp với nhiệm vụ ban đầu và một số trong số chúng có thể đã được sử dụng bởi các kết nối khác được thiết lập vài giây trước khi xảy ra sự cố.

Do đó, bên kia ở cuối kết nối có thể không biết rằng đối tác của họ đã gặp sự cố và sau đó đã được khôi phục. Tất cả điều này sẽ dẫn đến sự gián đoạn nghiêm trọng, đặc biệt là khi phải mất một thời gian dài để dữ liệu cũ đi qua mạng và trộn lẫn với dữ liệu từ kết nối mới được tạo. Việc chọn bộ hẹn giờ bắt đầu có bản cập nhật (khởi động mới) sẽ loại bỏ những vấn đề như vậy. Dữ liệu cũ sẽ có cách đánh số khác với phạm vi số thứ tự của kết nối mới. Tin tặc, khi giả mạo địa chỉ IP nguồn cho một máy chủ đáng tin cậy, sẽ cố gắng truy cập vào máy tính bằng cách chỉ định số thứ tự ban đầu có thể dự đoán được trong tin nhắn. Hàm băm mật mã dựa trên các khóa nội bộ cung cấp phương pháp tốt nhất để chọn hạt giống an toàn.

10.8.5 Cách sử dụng phổ biến của trường

Khi chuẩn bị tiêu đề TCP để truyền, số thứ tự của octet đầu tiên của dữ liệu được truyền sẽ được chỉ định trong trường số seri(Số thứ tự).

Số octet tiếp theo dự kiến ​​từ đối tác kết nối được nhập vào trường xác nhận(Số xác nhận) khi bit ACK được đặt thành 1. Trường cửa sổ(Cửa sổ) dành cho kích thước cửa sổ nhận hiện tại. Trường này chứa số byte từ số xác nhận có thể nhận được. Lưu ý rằng giá trị này cho phép kiểm soát chính xác luồng dữ liệu. Sử dụng giá trị này, thiết bị ngang hàng sẽ cho biết trạng thái thực tế của cửa sổ nhận trong phiên trao đổi.

Nếu một ứng dụng chỉ định thao tác đẩy trong TCP thì cờ PUSH được đặt thành 1. TCP nhận PHẢI phản hồi cờ này bằng cách nhanh chóng gửi dữ liệu đến ứng dụng ngay khi người gửi muốn chuyển tiếp nó.

Cờ URGENT, khi được đặt thành 1, ngụ ý truyền dữ liệu khẩn cấp và con trỏ tương ứng phải tham chiếu đến octet cuối cùng của dữ liệu khẩn cấp. Cách sử dụng điển hình của dữ liệu khẩn cấp là gửi tín hiệu hủy bỏ hoặc hủy bỏ từ thiết bị đầu cuối.

Dữ liệu khẩn cấp thường được gọi thông tin ngoài băng tần(ngoài băng tần). Tuy nhiên, thuật ngữ này không chính xác. Dữ liệu khẩn cấp được gửi trong luồng TCP thông thường, mặc dù việc triển khai riêng lẻ có thể có các cơ chế đặc biệt để cho ứng dụng biết rằng dữ liệu khẩn cấp đã đến và ứng dụng phải kiểm tra nội dung của dữ liệu khẩn cấp trước khi tất cả các byte thông báo đã đến.

Cờ RESET được đặt thành 1 khi kết nối bị ngắt bất thường. Cờ tương tự được đặt trong phản hồi khi có một phân đoạn không được liên kết với bất kỳ kết nối TCP hiện tại nào.

Cờ FIN được đặt thành 1 cho các thông báo đóng kết nối.


10.8.6 Tổng kiểm tra

Tổng kiểm tra IP chỉ dành cho tiêu đề IP, trong khi tổng kiểm tra TCP được tính cho toàn bộ phân đoạn cũng như tiêu đề giả được tạo từ tiêu đề IP. Trong quá trình tính toán tổng kiểm tra TCP, trường tương ứng có giá trị 0. Trong Hình. Hình 10.15 cho thấy một tiêu đề giả gần giống với tiêu đề được sử dụng trong tổng kiểm tra UDP.


Cơm. 15/10. Trường tiêu đề giả được bao gồm trong tổng kiểm tra TCP

Độ dài TCP được tính bằng cách cộng độ dài của tiêu đề TCP với độ dài của dữ liệu. Tổng kiểm tra TCP là bắt buộc, không giống như UDP. Tổng kiểm tra của phân đoạn đến trước tiên được tính toán bởi người nhận và sau đó được so sánh với nội dung của trường tổng kiểm tra tiêu đề TCP. Nếu các giá trị không khớp, phân đoạn sẽ bị loại bỏ.

10.9 Ví dụ về phân đoạn TCP

Cơm. 10.16, giao thức vận hành máy phân tích đánh hơi từ Network General, là một chuỗi các phân đoạn TCP. Ba phân đoạn đầu tiên thiết lập kết nối giữa máy khách và máy chủ Telnet. Đoạn cuối cùng mang 12 byte dữ liệu.


Cơm. 16/10. Hiển thị tiêu đề TCP bằng bộ phân tích Sniffer

Máy phân tích đánh hơi chuyển đổi hầu hết các giá trị sang dạng thập phân. Tuy nhiên, các giá trị cờ được xuất ra dưới dạng thập lục phân. Cờ có giá trị 12 đại diện cho 010010. Tổng kiểm tra cũng được xuất ở dạng thập lục phân.

10.10 Hỗ trợ phiên

10.10.1 Thăm dò cửa sổ

Người gửi nhanh và người nhận chậm có thể tạo thành cửa sổ nhận có kích thước 0 byte. Kết quả này được gọi là đóng cửa sổ(đóng cửa sổ). Khi có dung lượng trống để cập nhật kích thước cửa sổ nhận, ACK sẽ được sử dụng. Tuy nhiên, nếu tin nhắn đó bị thất lạc, cả hai bên sẽ phải chờ đợi vô thời hạn.

Để tránh tình trạng này, người gửi thiết lập bộ đếm thời gian có thể lưu được(hẹn giờ liên tục) khi đóng cửa sổ tạm thời. Giá trị bộ đếm thời gian là thời gian chờ truyền lại. Sau khi hoàn thành bộ đếm thời gian, một phân đoạn sẽ được gửi đến đối tác cảm biến cửa sổ(thăm dò cửa sổ; một số triển khai cũng bao gồm dữ liệu). Việc thăm dò khiến thiết bị ngang hàng gửi lại ACK báo cáo trạng thái cửa sổ hiện tại.

Nếu cửa sổ vẫn ở kích thước bằng 0, giá trị của bộ đếm thời gian được lưu sẽ tăng gấp đôi. Quá trình này được lặp lại cho đến khi bộ đếm thời gian đạt tối đa 60 giây. TCP sẽ tiếp tục gửi tin nhắn thăm dò cứ sau 60 giây cho đến khi cửa sổ mở ra, người dùng chấm dứt quá trình hoặc ứng dụng hết thời gian chờ.

10.11 Kết thúc phiên

10.11.1 Hết giờ

Đối tác kết nối có thể gặp sự cố hoặc bị gián đoạn hoàn toàn do cổng hoặc liên kết bị lỗi. Để ngăn dữ liệu được truyền lại trong TCP, có một số cơ chế.

Khi TCP đạt đến ngưỡng truyền lại đầu tiên, nó sẽ yêu cầu IP kiểm tra bộ định tuyến bị lỗi và đồng thời thông báo cho ứng dụng rằng có sự cố. TCP tiếp tục chuyển tiếp dữ liệu cho đến khi đạt đến ngưỡng thứ hai trước khi giải phóng kết nối.

Tất nhiên, trước khi điều này xảy ra, một thông báo ICMP có thể đến cho biết rằng vì lý do nào đó không thể truy cập được đích. Trong một số triển khai, ngay cả sau đó, TCP sẽ tiếp tục cố gắng truy cập đích cho đến khi hết khoảng thời gian chờ (tại thời điểm đó sự cố có thể được khắc phục). Tiếp theo, ứng dụng được thông báo rằng điểm đích không thể truy cập được.

Ứng dụng có thể đặt thời gian chờ phân phối dữ liệu của riêng mình và thực hiện các hoạt động của riêng mình khi khoảng thời gian này kết thúc. Thông thường kết nối bị chấm dứt.

10.11.2 Duy trì kết nối

Khi một kết nối không hoàn chỉnh có dữ liệu cần chuyển tiếp trong một thời gian dài, kết nối đó sẽ không hoạt động. Trong thời gian không hoạt động, mạng có thể gặp sự cố hoặc đường truyền vật lý có thể bị gián đoạn. Ngay sau khi mạng hoạt động trở lại, các đối tác sẽ tiếp tục trao đổi dữ liệu mà không làm gián đoạn phiên liên lạc. Chiến lược này tuân thủ các yêu cầu của Bộ Quốc phòng.

Tuy nhiên, bất kỳ kết nối nào - hoạt động hay không hoạt động - đều chiếm rất nhiều bộ nhớ máy tính. Một số quản trị viên cần trả lại tài nguyên không sử dụng cho hệ thống. Do đó, nhiều triển khai TCP có khả năng gửi thông báo về duy trì kết nối(keep-alive), kiểm tra các kết nối không hoạt động. Những tin nhắn như vậy được gửi định kỳ cho đối tác để kiểm tra sự tồn tại của nó trên mạng. Phản hồi phải là tin nhắn ACK. Việc sử dụng các tin nhắn lưu giữ là tùy chọn. Nếu hệ thống có khả năng này, ứng dụng có thể ghi đè lên nó bằng các phương tiện riêng của nó. Khoảng thời gian ước tính mặc định Thời gian chờ bảo trì kết nối là hai giờ!

Chúng ta hãy nhớ rằng một ứng dụng có thể đặt bộ hẹn giờ riêng, theo đó nó sẽ quyết định ở cấp độ riêng của mình xem có chấm dứt kết nối hay không.

10.12 Hiệu suất

TCP hiệu quả như thế nào? Hiệu suất tài nguyên bị ảnh hưởng bởi nhiều yếu tố, trong đó yếu tố chính là bộ nhớ và băng thông (xem Hình 10.17).


Cơm. 17/10. Các yếu tố hiệu suất TCP

Băng thông và độ trễ của mạng vật lý được sử dụng hạn chế đáng kể thông lượng. Chất lượng chuyển tiếp dữ liệu kém dẫn đến một khối lượng lớn các datagram bị loại bỏ, gây ra việc truyền lại và do đó làm giảm hiệu quả băng thông.

Đầu nhận phải cung cấp đủ dung lượng bộ đệm để cho phép người gửi gửi dữ liệu mà không bị gián đoạn. Điều này đặc biệt quan trọng đối với các mạng có độ trễ cao, nơi có khoảng thời gian dài giữa việc gửi dữ liệu và nhận ACK (và khi đàm phán kích thước cửa sổ). Để duy trì luồng dữ liệu ổn định từ nguồn, đầu nhận phải có cửa sổ có kích thước tối thiểu bằng tích của băng thông và độ trễ.

Ví dụ: nếu nguồn có thể gửi dữ liệu với tốc độ 10.000 byte/s và ACK mất 2 giây để trả về thì phía bên kia phải cung cấp cửa sổ nhận có kích thước tối thiểu 20.000 byte, nếu không luồng dữ liệu sẽ không hãy liên tục. Bộ đệm nhận 10.000 byte sẽ giảm thông lượng xuống một nửa.

Một yếu tố quan trọng khác đối với hiệu suất là khả năng của máy chủ trong việc đáp ứng các sự kiện có mức độ ưu tiên cao và thực thi nhanh chóng. chuyển đổi ngữ cảnh, I E. hoàn thành một số thao tác và chuyển sang các thao tác khác. Máy chủ có thể hỗ trợ tương tác nhiều người dùng cục bộ, xử lý nền hàng loạt và hàng tá kết nối liên lạc đồng thời. Chuyển ngữ cảnh cho phép bạn xử lý tất cả các thao tác này trong khi ẩn tải trên hệ thống. Việc triển khai tích hợp TCP/IP với nhân hệ điều hành có thể giảm đáng kể gánh nặng của việc sử dụng chuyển đổi ngữ cảnh.

Cần có tài nguyên CPU máy tính cho các hoạt động xử lý tiêu đề TCP. Nếu bộ xử lý không thể nhanh chóng tính toán tổng kiểm tra, điều này sẽ dẫn đến tốc độ truyền dữ liệu qua mạng giảm.

Ngoài ra, các nhà phát triển nên tìm cách đơn giản hóa cấu hình cài đặt TCP để quản trị viên mạng có thể định cấu hình chúng cho phù hợp với yêu cầu cục bộ của họ. Ví dụ: khả năng điều chỉnh kích thước bộ đệm theo băng thông và độ trễ mạng sẽ cải thiện đáng kể hiệu suất. Thật không may, nhiều triển khai không quan tâm đầy đủ đến vấn đề này và lập trình các tham số truyền thông một cách cứng nhắc.

Giả sử rằng môi trường mạng là hoàn hảo: có đủ tài nguyên và việc chuyển đổi ngữ cảnh được thực hiện nhanh hơn so với việc những chàng cao bồi rút súng lục ổ quay của họ. Sẽ đạt được hiệu suất tuyệt vời?

Không phải lúc nào cũng vậy. Chất lượng phát triển phần mềm TCP cũng có vấn đề. Qua nhiều năm, nhiều vấn đề về hiệu suất đã được chẩn đoán và giải quyết trong nhiều triển khai TCP khác nhau. Có thể coi rằng phần mềm tốt nhất sẽ là phần mềm tuân thủ RFC 1122, phần mềm xác định các yêu cầu đối với lớp giao tiếp của máy chủ Internet.

Quan trọng không kém là ngoại lệ và việc sử dụng các thuật toán Jacobson, Kern và Partridge (những thuật toán thú vị này sẽ được thảo luận dưới đây).

Các nhà phát triển phần mềm có thể đạt được những lợi ích đáng kể bằng cách tạo ra các chương trình loại bỏ việc truyền một lượng nhỏ dữ liệu không cần thiết và có bộ hẹn giờ tích hợp để giải phóng các tài nguyên mạng hiện không được sử dụng.

10.13 Thuật toán cải thiện hiệu suất

Chuyển sang tìm hiểu phần khá phức tạp của TCP, chúng ta sẽ xem xét các cơ chế tăng hiệu suất và giải quyết các vấn đề với thông lượng giảm. Phần này thảo luận về các vấn đề sau:

Bắt đầu chậm(khởi động chậm) ngăn chặn việc sử dụng một phần lớn lưu lượng mạng cho phiên mới, điều này có thể dẫn đến lãng phí.

■ Chữa khỏi hội chứng "cửa sổ không biết gì"(hội chứng cửa sổ ngớ ngẩn) ngăn chặn các ứng dụng được thiết kế kém làm mạng quá tải với tin nhắn.

ACK bị trì hoãn(ACK bị trì hoãn) làm giảm tắc nghẽn bằng cách giảm số lượng tin nhắn xác nhận chuyển tiếp dữ liệu độc lập.

Thời gian chờ truyền lại được tính toán(tính toán thời gian chờ truyền lại) dựa trên việc đàm phán thời gian phiên thực, giảm số lượng truyền lại không cần thiết nhưng không gây ra độ trễ lớn cho việc trao đổi dữ liệu thực sự cần thiết.

■ Ngăn chặn chuyển tiếp TCP khi quá tải trong mạng cho phép bộ định tuyến trở lại chế độ ban đầu và chia sẻ tài nguyên mạng trên tất cả các phiên.

■ Công văn ACK trùng lặp(ACK trùng lặp) khi nhận được một phân đoạn không theo trình tự cho phép các đồng nghiệp truyền lại trước khi hết thời gian chờ.

10.13.1 Khởi động chậm

Nếu bạn bật cùng lúc tất cả các thiết bị điện trong nhà thì mạng điện sẽ bị quá tải. Trong mạng máy tính Bắt đầu chậm ngăn không cho cầu chì chính bị nổ.

Một kết nối mới bắt đầu gửi ngay lập tức một lượng lớn dữ liệu trên một mạng vốn đã bận rộn có thể dẫn đến sự cố. Ý tưởng khởi đầu chậm là để đảm bảo rằng kết nối mới khởi động thành công đồng thời tăng dần tốc độ truyền dữ liệu của nó theo tải mạng thực tế. Người gửi bị giới hạn bởi kích thước của cửa sổ tải chứ không phải bởi cửa sổ nhận lớn hơn.

Cửa sổ tải(cửa sổ tắc nghẽn) bắt đầu với kích thước 1 đoạn. Đối với mỗi phân đoạn có ACK được nhận thành công, kích thước cửa sổ tải sẽ tăng thêm 1 phân đoạn cho đến khi nó vẫn nhỏ hơn cửa sổ nhận. Nếu mạng không bị tắc nghẽn, cửa sổ tải sẽ dần dần đạt đến kích thước của cửa sổ nhận. Trong điều kiện chuyển tiếp bình thường, kích thước của các cửa sổ này sẽ giống nhau.

Lưu ý rằng khởi đầu chậm không có nghĩa là chậm. Sau ACK đầu tiên, kích thước cửa sổ tải là 2 phân đoạn và sau khi nhận được ACK thành công cho hai phân đoạn, kích thước có thể tăng lên 8 phân đoạn. Nói cách khác, kích thước cửa sổ tăng theo cấp số nhân.

Giả sử rằng thay vì nhận được ACK, tình huống hết thời gian chờ xảy ra. Hoạt động của cửa sổ tải trong trường hợp này được thảo luận dưới đây.

10.13.2 Hội chứng cửa sổ không biết gì

Trong lần triển khai TCP/IP đầu tiên, các nhà phát triển đã gặp phải hiện tượng hội chứng "cửa sổ không biết gì"(Hội chứng cửa sổ ngớ ngẩn - SWS), xuất hiện khá thường xuyên. Để hiểu các sự kiện đang diễn ra, hãy xem xét tình huống sau, dẫn đến những hậu quả không mong muốn, nhưng hoàn toàn có thể xảy ra:

1. Ứng dụng gửi gửi dữ liệu nhanh chóng.

2. Ứng dụng nhận đọc 1 byte dữ liệu từ bộ đệm đầu vào (tức là chậm).

3. Bộ đệm đầu vào đầy nhanh chóng sau khi đọc.

4. Ứng dụng nhận đọc 1 byte và TCP gửi ACK nghĩa là “Tôi có dung lượng trống cho 1 byte dữ liệu”.

5. Ứng dụng gửi sẽ gửi gói TCP 1 byte qua mạng.

6. TCP nhận sẽ gửi ACK có nghĩa là "Cảm ơn bạn. Tôi đã nhận được gói và không còn dung lượng trống nữa."

7. Ứng dụng nhận lại đọc 1 byte và gửi ACK và toàn bộ quá trình lặp lại.

Một ứng dụng nhận chậm phải chờ rất lâu để dữ liệu đến và liên tục đẩy thông tin nhận được sang cạnh trái của cửa sổ, thực hiện một thao tác hoàn toàn vô dụng tạo ra thêm lưu lượng truy cập trên mạng.

Tất nhiên, các tình huống thực tế không quá khắc nghiệt. Người gửi nhanh và người nhận chậm sẽ trao đổi các mẩu dữ liệu nhỏ (so với kích thước phân đoạn tối đa) và chuyển qua cửa sổ nhận gần như đầy đủ. Trong bộ lễ phục. Hình 10.18 cho thấy các điều kiện để xuất hiện hội chứng “cửa sổ ngu ngốc”.


Cơm. 18/10. Cửa sổ nhận bộ đệm với không gian trống rất nhỏ

Giải quyết vấn đề này không khó. Ngay khi cửa sổ nhận bị giảm xuống độ dài nhỏ hơn kích thước mục tiêu này, TCP sẽ bắt đầu đánh lừa người gửi. Trong trường hợp này, TCP không nên thông báo cho người gửi thêm vào không gian cửa sổ khi ứng dụng nhận đọc dữ liệu từ bộ đệm theo từng đoạn nhỏ. Thay vào đó, bạn cần giữ bí mật các tài nguyên đã phát hành với người gửi cho đến khi có đủ. Nên sử dụng kích thước phân đoạn đơn, trừ khi toàn bộ bộ đệm đầu vào lưu trữ một phân đoạn duy nhất (trong trường hợp sau, kích thước nửa bộ đệm được sử dụng). Kích thước mục tiêu mà TCP cần báo cáo có thể được biểu thị dưới dạng:

tối thiểu (1/2 bộ đệm đầu vào, Kích thước phân đoạn tối đa)

TCP bắt đầu nói dối khi kích thước cửa sổ trở nên nhỏ hơn kích thước này và sẽ nói sự thật khi kích thước cửa sổ không nhỏ hơn giá trị thu được từ công thức. Lưu ý rằng điều đó không gây hại cho người gửi vì dù sao thì ứng dụng nhận cũng sẽ không thể xử lý nhiều dữ liệu mà nó mong đợi.

Giải pháp đề xuất có thể được xác minh dễ dàng trong trường hợp được thảo luận ở trên với đầu ra ACK cho mỗi byte nhận được. Phương pháp tương tự cũng phù hợp với trường hợp bộ đệm đầu vào có thể lưu trữ một số phân đoạn (như trường hợp thường xảy ra trong thực tế). Người gửi nhanh sẽ lấp đầy bộ đệm đầu vào, nhưng người nhận sẽ chỉ ra rằng nó không còn chỗ trống để chứa thông tin và sẽ không mở tài nguyên này cho đến khi kích thước của nó đạt đến toàn bộ phân đoạn.

10.13.3 Thuật toán Nagle

Người gửi phải, độc lập với người nhận, tránh gửi các đoạn quá ngắn bằng cách tích lũy dữ liệu trước khi gửi. Thuật toán của Nagle thực hiện một ý tưởng rất đơn giản cho phép bạn giảm số lượng gói dữ liệu ngắn được gửi qua mạng.

Thuật toán khuyến nghị trì hoãn việc chuyển tiếp dữ liệu (và đẩy) trong khi chờ ACK từ dữ liệu được truyền trước đó. Dữ liệu tích lũy được gửi sau khi nhận được ACK cho phần thông tin đã gửi trước đó hoặc sau khi nhận được dữ liệu để gửi với số lượng của toàn bộ phân đoạn hoặc sau khi hoàn thành thời gian chờ. Thuật toán này không nên được sử dụng cho các ứng dụng thời gian thực cần gửi dữ liệu nhanh nhất có thể.

10.13.4 ACK bị trì hoãn

Một cơ chế khác để cải thiện hiệu suất là phương pháp trì hoãn ACK. Việc giảm số lượng ACK sẽ làm giảm băng thông có thể được sử dụng để chuyển tiếp lưu lượng truy cập khác. Nếu TCP ngang hàng hơi chậm trễ việc gửi ACK thì:

■ Nhiều phân đoạn có thể được xác nhận bằng một ACK duy nhất.

■ Ứng dụng nhận có thể nhận một lượng dữ liệu nhất định trong khoảng thời gian chờ, tức là. ACK có thể chứa tiêu đề đầu ra và không yêu cầu tạo một thông báo riêng.

Để tránh sự chậm trễ khi gửi một luồng các phân đoạn có độ dài đầy đủ (ví dụ: khi trao đổi tệp), ACK phải được gửi cho ít nhất mọi phân đoạn đầy đủ khác.

Nhiều triển khai sử dụng thời gian chờ 200ms. Nhưng ACK bị trì hoãn không làm giảm tỷ giá hối đoái. Khi một đoạn ngắn đến, vẫn còn đủ dung lượng trống trong bộ đệm đầu vào để nhận dữ liệu mới và người gửi có thể tiếp tục chuyển tiếp (ngoài ra, việc gửi lại thường chậm hơn nhiều). Nếu toàn bộ phân đoạn đến, bạn cần phản hồi nó bằng tin nhắn ACK vào cùng thời điểm.

10.13.5 Hết thời gian truyền lại

Sau khi gửi phân đoạn, TCP đặt bộ hẹn giờ và theo dõi sự xuất hiện của ACK. Nếu không nhận được ACK trong khoảng thời gian chờ, TCP sẽ truyền lại phân đoạn (rơle). Tuy nhiên, khoảng thời gian chờ nên là bao lâu?

Nếu quá ngắn, người gửi sẽ làm tràn ngập mạng bằng cách chuyển tiếp các phân đoạn không cần thiết trùng lặp thông tin đã được gửi. Thời gian chờ quá lớn sẽ ngăn cản việc sửa chữa nhanh chóng các phân đoạn thực sự bị phá hủy trong quá trình chuyển tiếp, điều này sẽ làm giảm thông lượng.

Làm thế nào để chọn khoảng thời gian chờ phù hợp? Giá trị phù hợp với mạng cục bộ tốc độ cao sẽ không phù hợp với kết nối từ xa có nhiều lượt truy cập. Điều này có nghĩa là nguyên tắc “một giá trị cho mọi điều kiện” rõ ràng là không phù hợp. Hơn nữa, ngay cả đối với một kết nối cụ thể hiện có, điều kiện mạng có thể thay đổi và độ trễ có thể tăng hoặc giảm.

Thuật toán Jacobson, Kern và Partridge (được mô tả trong bài viết , Van Jacobson, và Cải thiện ước tính thời gian khứ hồi trong các giao thức vận chuyển đáng tin cậy, Karn và Partridge) cho phép TCP thích ứng với các điều kiện mạng thay đổi. Các thuật toán này được khuyến nghị sử dụng trong các triển khai mới. Chúng ta sẽ xem xét chúng một cách ngắn gọn dưới đây.

Ý thức chung cho rằng cơ sở tốt nhất để ước tính thời gian chờ chính xác cho một kết nối cụ thể là theo dõi thời gian chu kỳ(thời gian khứ hồi) là khoảng thời gian giữa việc gửi dữ liệu và nhận được xác nhận đã nhận.

Lời giải tốt cho các đại lượng sau đây có thể thu được từ các số liệu thống kê cơ bản (xem Hình 10.19) để giúp tính toán thời gian chờ. Tuy nhiên, bạn không nên dựa vào mức trung bình vì hơn một nửa số ước tính sẽ lớn hơn mức trung bình thống kê. Bằng cách xem xét một số giá trị ngoại lệ, chúng tôi có thể có được ước tính tốt hơn có tính đến phân phối chuẩn và giảm thời gian chờ truyền lại quá dài.


Cơm. 19/10. Phân phối thời gian chu kỳ

Không cần phải thực hiện nhiều phép tính để có được ước tính toán học chính thức về độ lệch. Bạn có thể sử dụng ước tính khá sơ bộ dựa trên giá trị tuyệt đối của chênh lệch giữa giá trị cuối cùng và ước tính trung bình:

Độ lệch cuối cùng = | Chu kỳ trước - Trung bình |

Để tính toán giá trị thời gian chờ chính xác, một yếu tố khác cần được tính đến là sự thay đổi thời gian chu kỳ do điều kiện mạng hiện tại. Những gì xảy ra trực tuyến vào phút cuối quan trọng hơn những gì xảy ra một giờ trước.

Giả sử rằng chúng ta đang tính trung bình chu kỳ cho một phiên giao dịch rất dài. Lúc đầu, hãy để mạng được tải nhẹ và chúng tôi đã xác định được 1000 giá trị nhỏ, nhưng sau đó lưu lượng truy cập tăng lên với độ trễ tăng đáng kể.

Ví dụ: nếu 1000 giá trị mang lại mức trung bình thống kê là 170 đơn vị, nhưng sau đó 50 giá trị được đo với mức trung bình là 282, thì mức trung bình hiện tại sẽ là:

170×1000/1050 + 282×50/1050 = 175

Một giá trị hợp lý hơn sẽ là thời gian chu kỳ được làm mịn(Thời gian khứ hồi được làm mịn - SRTT), có tính đến mức độ ưu tiên của các giá trị sau:

SRTT mới = (1 – α)×(SRTT cũ) + α×Giá trị chu kỳ cuối cùng

Giá trị của α nằm trong khoảng từ 0 đến 1. Tăng một dẫn đến ảnh hưởng lớn hơn của thời gian chu kỳ hiện tại đến mức trung bình được làm mịn. Vì máy tính có thể nhanh chóng thực hiện phép chia lũy thừa 2 bằng cách dịch các số nhị phân sang phải, nên α luôn được chọn là (1/2)n (thường là 1/8), vì vậy:

SRTT mới = 7/8×SRTT cũ + 1/8×Thời gian chu kỳ cuối cùng

Bảng 10.2 cho thấy cách công thức SRTT điều chỉnh theo giá trị SRTT hiện tại là 230 đơn vị khi thay đổi điều kiện mạng khiến thời gian chu kỳ tăng dần (giả sử không xảy ra thời gian chờ). Các giá trị ở cột 3 được sử dụng làm giá trị ở cột 1 cho hàng tiếp theo của bảng (tức là giống như SRTT cũ).


Bảng 10.2 Tính toán thời gian chu kỳ được làm mịn

SRTT cũ RTT mới nhất (7/8)×(SRTT cũ) + (1/8)×(RTT)
230.00 294 238.00
238.00 264 241.25
241.25 340 253.59
253.59 246 252.64
252.64 201 246.19
246.19 340 257.92
257.92 272 259.68
259.68 311 266.10
266.10 282 268.09
268.09 246 265.33
265.33 304 270.16
270.16 308 274.89
274.89 230 269.28
269.28 328 276.62
276.62 266 275.29
275.29 257 273.00
273.00 305 277.00

Bây giờ đến câu hỏi chọn giá trị cho thời gian chờ truyền lại. Phân tích các giá trị thời gian chu kỳ cho thấy độ lệch đáng kể của các giá trị này so với giá trị trung bình hiện tại. Việc đặt ra giới hạn cho độ lớn của sai lệch là điều hợp lý. Một giá trị phù hợp cho thời gian chờ truyền lại (trong tiêu chuẩn RFC, giá trị này được gọi là Thời gian chờ truyền lại - RTO) được đưa ra theo công thức sau với ràng buộc độ lệch được làm mịn (SDEV):

T = Hết thời gian truyền lại = SRTT + 2×SDEV

T = SRTT + 4×SDEV

Để tính SDEV, trước tiên hãy xác định giá trị tuyệt đối của độ lệch hiện tại:

DEV = | Thời gian chu kỳ cuối cùng - SRTT cũ |

Công thức làm mịn sau đó được sử dụng để tính đến giá trị sau:

SDEV mới = 3/4×SDEV cũ + 1/4×DEV

Vẫn còn một câu hỏi - cần lấy những giá trị ban đầu nào? Khuyến khích:

Thời gian chờ ban đầu = 3 giây

SRTT ban đầu = 0

SDEV ban đầu = 1,5 s

Van Jacobson đã xác định một thuật toán nhanh để tính toán thời gian chờ truyền lại dữ liệu rất hiệu quả.

10.13.6 Ví dụ thống kê

Thời gian chờ được tính ở trên sẽ thành công như thế nào? Khi giá trị này được triển khai, người ta đã nhận thấy những cải thiện hiệu suất đáng kể. Một ví dụ sẽ là số liệu thống kê của đội netstat, nhận được trên hệ thống con cọp- một máy chủ Internet được truy cập bởi nhiều máy chủ từ khắp nơi trên thế giới.


1510769 gói (314955304 byte) được nhận theo trình tự

Hệ thống con cọpÍt hơn 2,5% phân đoạn dữ liệu TCP được truyền lại. Đối với một triệu rưỡi phân đoạn dữ liệu đến (phần còn lại là các tin nhắn ACK thuần túy), chỉ có 0,6% bị trùng lặp. Cần lưu ý rằng mức độ tổn thất trong dữ liệu đầu vào gần tương ứng với mức độ tổn thất của các phân đoạn đầu ra. Như vậy, lưu lượng truyền lại lãng phí chiếm khoảng 0,6% tổng lưu lượng.

10.13.7 Tính toán sau khi gửi lại

Các công thức được trình bày ở trên sử dụng thời gian chu kỳ làm khoảng thời gian giữa việc gửi một phân đoạn và nhận được xác nhận về việc nhận nó. Tuy nhiên, giả sử rằng không nhận được xác nhận nào trong khoảng thời gian chờ và dữ liệu phải được gửi lại.

Thuật toán Kern giả định rằng thời gian chu kỳ không nên thay đổi trong trường hợp này. Giá trị thời gian chu kỳ được làm mịn hiện tại và độ lệch được làm mịn giữ lại giá trị của chúng cho đến khi nhận được xác nhận để chuyển tiếp một phân đoạn nhất định mà không gửi lại. Từ thời điểm này trở đi, các phép tính được tiếp tục dựa trên các giá trị đã lưu và các phép đo mới.

10.13.8 Hành động sau khi truyền lại

Nhưng điều gì xảy ra trước khi nhận được xác nhận? Sau khi truyền lại, hành vi của TCP thay đổi hoàn toàn, chủ yếu là do mất dữ liệu do tắc nghẽn mạng. Do đó, phản hồi gửi lại dữ liệu sẽ là:

■ Giảm tốc độ truyền lại

■ Chống tắc nghẽn mạng bằng cách giảm lưu lượng tổng thể

10.13.9 Phanh theo hàm mũ

Sau khi truyền lại, khoảng thời gian chờ được tăng gấp đôi. Tuy nhiên, điều gì sẽ xảy ra nếu bộ đếm thời gian lại bị tràn? Dữ liệu sẽ được gửi lại và thời gian truyền lại sẽ tăng gấp đôi. Quá trình này được gọi là phanh theo cấp số nhân(sự lùi lại theo cấp số nhân).

Nếu lỗi mạng tiếp tục xảy ra, khoảng thời gian chờ sẽ tăng gấp đôi cho đến khi đạt đến giá trị tối đa đặt trước (thường là 1 phút). Sau thời gian chờ, chỉ có thể gửi một phân đoạn. Thời gian chờ cũng xảy ra khi vượt quá giá trị đặt trước cho số lần truyền dữ liệu mà không nhận được ACK.

10.13.10 Giảm tắc nghẽn bằng cách giảm dữ liệu được gửi qua mạng

Việc giảm lượng dữ liệu được gửi có phần phức tạp hơn các cơ chế được thảo luận ở trên. Nó bắt đầu hoạt động, giống như khởi đầu chậm đã được đề cập. Tuy nhiên, do giới hạn được đặt ở mức lưu lượng truy cập ban đầu có thể dẫn đến sự cố nên tốc độ trao đổi sẽ thực sự chậm lại do kích thước của cửa sổ tải cho một phân đoạn tăng lên. Bạn cần đặt các giá trị biên để thực sự giảm tốc độ gửi. Đầu tiên, ngưỡng nguy hiểm được tính toán:

Ranh giới - tối thiểu 1/2 (cửa sổ tải hiện tại, cửa sổ nhận của đối tác)

Nếu giá trị kết quả lớn hơn hai phân đoạn, nó được sử dụng làm ranh giới. Nếu không, kích thước đường viền được đặt thành hai phân đoạn. Thuật toán khôi phục hoàn toàn yêu cầu:

■ Đặt kích thước cửa sổ tải thành một đoạn.

■ Với mỗi ACK nhận được, hãy tăng kích thước cửa sổ tải lên một phân đoạn cho đến khi đạt đến giới hạn (giống như cơ chế khởi động chậm).

■ Sau đó, với mỗi ACK nhận được, hãy thêm một giá trị nhỏ hơn vào cửa sổ tải, giá trị này được chọn dựa trên tốc độ tăng trên mỗi phân đoạn trong thời gian chu kỳ (mức tăng được tính bằng MSS/N, trong đó N là kích thước của cửa sổ tải trong các phân đoạn).

Kịch bản lý tưởng có thể cung cấp một cách trình bày đơn giản về cách thức hoạt động của cơ chế phục hồi. Giả sử rằng cửa sổ nhận của đối tác (và cửa sổ tải hiện tại) có kích thước 8 phân đoạn trước khi phát hiện thời gian chờ và ranh giới được xác định là 4 phân đoạn. Nếu ứng dụng nhận ngay lập tức đọc dữ liệu từ bộ đệm, kích thước cửa sổ nhận sẽ vẫn là 8 phân đoạn.

■ 1 phân đoạn được gửi đi (cửa sổ tải = 1 phân đoạn).

■ Đã nhận được ACK - 2 phân đoạn được gửi đi.

■ Đã nhận ACK cho 2 phân đoạn - 4 phân đoạn được gửi (đã đạt đến ranh giới).

■ Đã nhận được ACK cho 4 phân đoạn. 5 phân đoạn được gửi đi.

■ Đã nhận được ACK cho 5 phân đoạn. 6 phân đoạn được gửi đi.

■ Đã nhận được ACK cho 6 phân đoạn. 7 phân đoạn được gửi đi.

■ Đã nhận được ACK cho 7 phân đoạn. 8 phân đoạn được gửi đi (cửa sổ tải lại có kích thước bằng cửa sổ nhận).

Vì quá trình truyền lại hết thời gian chờ yêu cầu xác nhận đã nhận tất cả dữ liệu đã gửi nên quá trình này sẽ tiếp tục cho đến khi cửa sổ tải đạt kích thước của cửa sổ nhận. Các sự kiện diễn ra được thể hiện trong hình. 20.10. Kích thước cửa sổ tăng theo cấp số nhân, tăng gấp đôi trong giai đoạn bắt đầu chậm và tăng tuyến tính khi đạt đến ranh giới.


Cơm. 20.10. Hạn chế tốc độ chuyển tiếp khi tắc nghẽn

13.10.11 ACK trùng lặp

Một số triển khai cung cấp một tính năng tùy chọn được gọi là gửi lại nhanh(truyền lại nhanh) - để tăng tốc độ gửi lại dữ liệu trong một số điều kiện nhất định. Ý tưởng cơ bản của nó liên quan đến việc người nhận gửi các ACK bổ sung để chỉ ra khoảng trống trong dữ liệu nhận được.

Khi nhận được một phân đoạn không đúng thứ tự, bên nhận sẽ gửi lại ACK trỏ đến byte đầu tiên mất dữ liệu (xem Hình 10.21).


Cơm. 21/10. ACK trùng lặp

Người gửi không truyền lại dữ liệu ngay lập tức vì IP thường có thể gửi dữ liệu đến người nhận mà không cần trình tự gửi. Nhưng khi nhận được một số ACK dữ liệu trùng lặp bổ sung (ví dụ: ba), phân đoạn bị thiếu sẽ được gửi mà không cần đợi hết thời gian chờ.

Lưu ý rằng mỗi ACK trùng lặp cho biết đã nhận được một phân đoạn dữ liệu. Một số ACK trùng lặp cho thấy mạng có khả năng cung cấp đủ lượng dữ liệu và do đó không bị tải quá mức. Là một phần của thuật toán tổng thể, việc giảm một chút kích thước của cửa sổ tải được thực hiện khi lưu lượng mạng thực sự tăng lên. Trong trường hợp này, quá trình thay đổi kích thước triệt để khi khôi phục công việc không được áp dụng.

Theo tiêu chuẩn Yêu cầu về máy chủ(yêu cầu về máy chủ) TCP phải thực hiện khởi động chậm tương tự như được mô tả ở trên khi dập tắt nguồn. Tuy nhiên, tin nhắn này không được nhắm mục tiêu hoặc không hiệu quả vì kết nối nhận tin nhắn có thể không tạo ra nhiều lưu lượng truy cập. Đặc điểm kỹ thuật hiện tại Yêu cầu về bộ định tuyến(yêu cầu bộ định tuyến) chỉ ra rằng bộ định tuyến không nên gửi tin nhắn về việc ngăn chặn nguồn.

10/13/13 Thống kê TCP

Cuối cùng, hãy nhìn vào thông điệp thống kê của nhóm mạng,để xem nhiều cơ chế được mô tả ở trên đang hoạt động.

Các phân đoạn được gọi là gói.
879137 gói dữ liệu (226966295 byte)
21815 gói dữ liệu (8100927 byte) được truyền lại
Gửi lại hàng.
132957 gói chỉ có ACK (104216 bị trì hoãn)
Hãy để chúng tôi lưu ý một số lượng lớn

ACK bị trì hoãn.

Thăm dò việc mở cửa sổ

kích thước bằng không.

Đây là các tin nhắn SYN và FIN.
762469 acks (cho 226904227 byte)
Tín hiệu về các gói đến

không theo thứ tự.

1510769 gói (314955304 byte)
9006 gói trùng lặp hoàn toàn (867042 byte)
Kết quả hết thời gian thực

phân phối dữ liệu.

74 gói có một số gói trùng lặp. dữ liệu (12193 byte bị lừa)
Để có hiệu quả cao hơn

một số dữ liệu đã được đóng gói lại để bao gồm các byte bổ sung khi gửi lại.

13452 gói không theo thứ tự (2515087 byte)
530 gói (8551 byte) dữ liệu sau cửa sổ
Có lẽ dữ liệu này đã

được bao gồm trong các thông điệp thăm dò.

402 gói nhận được sau khi đóng
Đây là những lần lặp lại tiếp theo

gửi.

108 bị loại bỏ vì tổng kiểm tra sai
Tổng kiểm tra TCP không hợp lệ.
0 bị loại bỏ vì các trường bù trừ tiêu đề không hợp lệ
7 bị loại bỏ vì gói quá ngắn
14677 kết nối được thiết lập (bao gồm cả chấp nhận)
18929 kết nối đã đóng (bao gồm 643 lần rớt)
4100 kết nối phôi bị mất
572187 phân đoạn được cập nhật rtt (trong số 587397 lần thử)
Nỗ lực thay đổi không thành công

thời gian chu kỳ, vì ACK không đến trước khi hết thời gian chờ,

26 kết nối bị rớt do hết thời gian chờ rexmit
Những lần thử không thành công sau đó

gửi lại, cho biết kết nối bị mất.

Thăm dò thời gian chờ

cửa sổ không.

Hết thời gian xác minh

kết nối bị hỏng.

472 kết nối bị rớt do keepalive

10.14 Tuân thủ yêu cầu của nhà phát triển

Tiêu chuẩn TCP hiện tại yêu cầu việc triển khai phải tuân thủ nghiêm ngặt quy trình khởi động chậm khi khởi tạo kết nối và sử dụng thuật toán Kern và Jacobson để ước tính thời gian chờ gửi lại dữ liệu và kiểm soát tải. Các thử nghiệm đã chỉ ra rằng các cơ chế này dẫn đến cải thiện hiệu suất đáng kể.

Điều gì xảy ra khi bạn cài đặt một hệ thống không tuân thủ nghiêm ngặt các tiêu chuẩn này? Nó sẽ không cung cấp hiệu suất thích hợp cho người dùng của chính nó và sẽ là hàng xóm kém cho các hệ thống khác trên mạng, ngăn cản nó phục hồi sau tình trạng quá tải tạm thời và tạo ra lưu lượng truy cập quá mức khiến các gói dữ liệu bị loại bỏ.

10.15 Rào cản đối với năng suất

TCP đã chứng minh tính linh hoạt của mình bằng cách hoạt động trên các mạng có tốc độ truyền hàng trăm hoặc hàng triệu bit mỗi giây. Giao thức này đã đạt được kết quả tốt trong các mạng cục bộ hiện đại với cấu trúc liên kết Ethernet, Token-Ring và Fiber Distributed Data Interface (FDDI), cũng như cho các liên kết truyền thông tốc độ thấp hoặc kết nối đường dài (tương tự như liên kết vệ tinh).

TCP được thiết kế để đáp ứng các điều kiện khắc nghiệt như tắc nghẽn mạng. Tuy nhiên, phiên bản hiện tại của giao thức có các tính năng hạn chế hiệu suất trong các công nghệ đầy hứa hẹn cung cấp băng thông hàng trăm hoặc hàng nghìn megabyte. Để hiểu các vấn đề liên quan, hãy xem xét một ví dụ đơn giản (mặc dù không thực tế).

Giả sử rằng khi di chuyển một tập tin giữa hai hệ thống, bạn muốn thực hiện một luồng trao đổi liên tục một cách hiệu quả nhất có thể. Hãy giả sử rằng:

■ Kích thước phân đoạn máy thu tối đa là 1 KB.

■ Cửa sổ nhận - 4 KB.

Băng thông cho phép bạn gửi hai phân đoạn trong 1 giây.

■ Ứng dụng nhận sẽ sử dụng dữ liệu khi nó đến.

■ Tin nhắn ACK đến sau 2 giây.

Người gửi có khả năng gửi dữ liệu liên tục. Cuối cùng, khi khối lượng được phân bổ cho cửa sổ đã đầy, một ACK sẽ đến, cho phép gửi một phân đoạn khác:

Sau 2 giây:

NHẬN ACK CỦA PHẦN 1, CÓ THỂ GỬI PHẦN 5.
NHẬN ACK CỦA PHẦN 2, CÓ THỂ GỬI PHẦN 6.
NHẬN ACK CỦA PHẦN 3, CÓ THỂ GỬI PHẦN 7.
NHẬN ACK CỦA PHẦN 4, CÓ THỂ GỬI PHẦN 8.

Sau 2 giây nữa:

NHẬN ACK CỦA PHẦN 5, CÓ THỂ GỬI PHẦN 9.

Nếu cửa sổ nhận chỉ có 2 KB, người gửi sẽ buộc phải đợi một trong hai giây trước khi gửi dữ liệu tiếp theo. Trên thực tế, để lưu giữ luồng dữ liệu liên tục, cửa sổ nhận ít nhất phải có:

Cửa sổ = Băng thông × Thời gian chu kỳ

Mặc dù ví dụ này có phần phóng đại (để cung cấp những con số đơn giản hơn), nhưng một cửa sổ nhỏ có thể gây ra sự cố trên các kết nối vệ tinh có độ trễ cao.

Bây giờ hãy xem điều gì xảy ra với kết nối tốc độ cao. Ví dụ: nếu băng thông và tốc độ chuyển tiếp được đo ở mức 10 triệu bit mỗi giây, nhưng thời gian chu kỳ là 100 ms (1/10 giây), thì đối với luồng liên tục, cửa sổ nhận phải lưu trữ ít nhất 1.000.000 bit, tức là. . 125.000 byte. Nhưng số lớn nhất có thể được ghi vào trường tiêu đề cho cửa sổ nhận TCP là 65.536.

Một vấn đề khác nảy sinh ở tốc độ truyền cao vì số thứ tự sẽ hết rất nhanh. Nếu kết nối có thể truyền dữ liệu với tốc độ 4 GB/s thì số thứ tự phải được cập nhật trong mỗi giây. Sẽ không có cách nào để phân biệt giữa các gói dữ liệu trùng lặp cũ bị trễ hơn một giây khi chúng di chuyển trên Internet từ dữ liệu mới.

Nghiên cứu mới đang được tích cực tiến hành để cải thiện TCP/IP và loại bỏ những trở ngại nêu trên.

10.16 Chức năng TCP

Chương này đề cập đến nhiều chức năng của TCP. Những cái chính được liệt kê dưới đây:

■Liên kết các cổng với các kết nối

■ Khởi tạo kết nối bằng xác nhận ba bước

■ Thực hiện khởi động chậm để tránh tắc nghẽn mạng

■ Phân đoạn dữ liệu trong quá trình chuyển tiếp

■ Đánh số dữ liệu

■ Xử lý các phân đoạn trùng lặp đến

■ Tính toán tổng kiểm tra

■ Kiểm soát luồng dữ liệu qua cửa sổ nhận và cửa sổ gửi

■ Chấm dứt kết nối theo cách đã thiết lập

■ Chấm dứt kết nối

■ Chuyển tiếp dữ liệu khẩn cấp

■ Xác nhận tích cực về việc gửi lại hàng

■ Tính toán thời gian chờ truyền lại

■ Giảm lưu lượng quay lại trong thời gian tắc nghẽn mạng

■ Báo hiệu rằng các phân đoạn đến không đúng thứ tự

■ Cảm nhận việc đóng cửa sổ nhận

10.17 trạng thái TCP

Một kết nối TCP trải qua nhiều giai đoạn: kết nối được thiết lập bằng cách trao đổi tin nhắn, sau đó dữ liệu được gửi và sau đó kết nối được đóng lại bằng cách trao đổi các tin nhắn đặc biệt. Mỗi bước trong thao tác kết nối tương ứng với một tình trạng kết nối này. Phần mềm TCP ở mỗi đầu kết nối liên tục theo dõi trạng thái hiện tại của đầu bên kia của kết nối.

Dưới đây chúng ta sẽ xem xét ngắn gọn quá trình chuyển đổi trạng thái điển hình giữa máy chủ và máy khách nằm ở hai đầu đối diện của kết nối. Chúng tôi không nhằm mục đích cung cấp mô tả đầy đủ về tất cả các trạng thái có thể xảy ra khi gửi dữ liệu. Nó được đưa ra trong RFC 793 và tài liệu Yêu cầu về máy chủ.

Trong quá trình thiết lập kết nối, máy chủ và máy khách sẽ trải qua các chuỗi trạng thái tương tự nhau. Trạng thái máy chủ được hiển thị trong Bảng 10.3 và trạng thái máy khách được hiển thị trong Bảng 10.4.


Bảng 10.3 Trình tự trạng thái máy chủ

Trạng thái máy chủ Sự kiện Sự miêu tả
ĐÓNG CỬA (đóng cửa) Trạng thái giả trước khi bắt đầu thiết lập kết nối.
Mở thụ động bằng ứng dụng máy chủ.
LẮNG NGHE (theo dõi) Máy chủ đang chờ kết nối từ máy khách.
Máy chủ TCP nhận SYN và gửi SYN/ACK. Máy chủ đã nhận được SYN và gửi SYN/ACK. Chuyển sang chờ ACK.
SYN-NHẬN Máy chủ TCP nhận được ACK.
THÀNH LẬP (đã cài đặt) Đã nhận được ACK, kết nối đã mở.

Bảng 10.4 Trình tự trạng thái khách hàng

Nếu các đối tác đồng thời cố gắng thiết lập kết nối với nhau (điều này cực kỳ hiếm), thì mỗi đối tác sẽ chuyển qua các trạng thái ĐÓNG, ĐỒNG HÀNH-GỬI, ĐỒNG BỘ NHẬN và THÀNH LẬP.

Các bên kết thúc của kết nối vẫn ở trạng thái THIẾT LẬP cho đến khi một trong các bên bắt đầu Khép kín kết nối bằng cách gửi phân đoạn FIN. Trong quá trình đóng thông thường, bên khởi xướng việc đóng sẽ trải qua các trạng thái được hiển thị trong Bảng 10.5. Đối tác của cô trải qua các trạng thái được trình bày trong Bảng 10.6.


Bảng 10.5 Trình tự các trạng thái của bên đóng kết nối

Trạng thái bên đóng Sự kiện Sự miêu tả
THÀNH LẬP Một ứng dụng cục bộ yêu cầu đóng kết nối.
TCP gửi FIN/ACK.
CUỐI CÙNG-CHỜ-1 Bên kết thúc chờ phản hồi của đối tác. Hãy để chúng tôi nhắc bạn rằng dữ liệu mới vẫn có thể được gửi đến từ đối tác.
TCP nhận được ACK.
CUỐI CÙNG-CHỜ-2 Bên kết thúc đã nhận được ACK từ ngang hàng, nhưng chưa nhận được FIN. Bên kết thúc đợi FIN khi chấp nhận dữ liệu đến.
TCP nhận được FIN/ACK.
Gửi ACK.
THỜI GIAN CHỜ ĐỢI Kết nối được duy trì ở trạng thái không xác định để cho phép dữ liệu trùng lặp hoặc FIN trùng lặp vẫn tồn tại trên mạng đến hoặc bị loại bỏ. Khoảng thời gian chờ đợi gấp đôi ước tính thời gian tồn tại tối đa của phân đoạn.
ĐÓNG CỬA

Bảng 10.6 Trình tự các trạng thái đối tác khi đóng kết nối

Trạng thái đối tác Sự kiện Sự miêu tả
THÀNH LẬP TCP nhận được FIN/ACK.
ĐÓNG-Đợi FIN đã đến.
TCP gửi ACK.
TCP hy vọng ứng dụng của nó sẽ đóng kết nối. Tại thời điểm này, ứng dụng có thể đang gửi một lượng dữ liệu khá lớn.
Ứng dụng cục bộ bắt đầu đóng kết nối.
TCP gửi FIN/ACK.
ACK CUỐI CÙNG TCP chờ ACK cuối cùng.
TCP nhận được ACK.
ĐÓNG CỬA Tất cả thông tin kết nối đã bị xóa.

10.17.1 Phân tích trạng thái kết nối TCP

Đội netstat -an cho phép bạn kiểm tra trạng thái kết nối hiện tại. Các kết nối ở các trạng thái được hiển thị bên dưới lắng nghe, khởi động, thành lập, đóng cửathời gian chờ đợi.

Lưu ý rằng số cổng kết nối được liệt kê ở cuối mỗi địa chỉ cục bộ và bên ngoài. Bạn có thể thấy rằng có lưu lượng TCP cho cả hàng đợi đầu vào và đầu ra.

Pro Recv-Q Send-Q Địa chỉ cục bộ Địa chỉ nước ngoài (trạng thái)
Tcp 0 0 128.121.50.145.25 128.252.223.5.1526 SYN_RCVD
Tcp 0 0 128.121.50.145.25 148.79.160.65.3368 THÀNH LẬP
TCP 0 0 127.0.0.1.1339 127.0.0.1.111 TIME_WAIT
Tcp 0 438 128.121.50.145.23 130.132.57.246.2219 THÀNH LẬP
Tcp 0 0 128.121.50.145.25 192.5.5.1.4022 TIME_WAIT
Tcp 0 0 128.121.50.145.25 141.218.1.100.3968 TIME_WAIT
Tcp 0 848 128.121.50.145.23 192.67.236.10.1050 THÀNH LẬP
Tcp 0 0 128.121.50.145.1082 128.121.50.141.6000 THÀNH LẬP
Tcp 0 0 128.121.50.145.1022 128.121.50.141.1017 THÀNH LẬP
Tcp 0 0 128.121.50.145.514 128.121.50.141.1020 CLOSE_WAIT
Tcp 0 1152 128.121.50.145.119 192.67.239.23.3572 THÀNH LẬP
Tcp 0 0 128.121.50.145.1070 192.41.171.5.119 TIME_WAIT
Tcp 579 4096 128.121.50.145.119 204.143.19.30.1884 THÀNH LẬP
Tcp 0 0 128.121.50.145.119 192.67.243.13.3704 THÀNH LẬP
Tcp 0 53 128.121.50.145.119 192.67.236.218.2018 FIN_WAIT_1
Tcp 0 0 128.121.50.145.119 192.67.239.14.1545 THÀNH LẬP

10.18 Lưu ý khi thực hiện

Ngay từ đầu, giao thức TCP đã được thiết kế để tương tác với các thiết bị mạng từ các nhà sản xuất khác nhau. Đặc tả TCP không chỉ định chính xác cách thức hoạt động của các cấu trúc triển khai nội bộ. Những câu hỏi này được dành cho các nhà phát triển, những người được giao nhiệm vụ tìm ra các cơ chế tốt nhất cho từng triển khai cụ thể.

Ngay cả RFC 1122 (tài liệu Yêu cầu về máy chủ - yêu cầu đối với máy chủ) để lại đủ tự do cho các biến thể. Mỗi chức năng được triển khai đều được đánh dấu bằng một mức độ tương thích nhất định:

■ CÓ THỂ (Được phép)

■ KHÔNG PHẢI

Thật không may, đôi khi có những sản phẩm không thực hiện được yêu cầu PHẢI. Kết quả là, người dùng gặp phải sự bất tiện khi hiệu suất bị giảm.

Một số phương pháp thực hiện tốt không được đề cập trong các tiêu chuẩn. Ví dụ: bảo mật có thể được cải thiện bằng cách hạn chế sử dụng các cổng nổi tiếng đối với các quy trình đặc quyền trên hệ thống, nếu hệ điều hành cục bộ hỗ trợ phương pháp này. Để cải thiện hiệu suất, việc triển khai nên sao chép và di chuyển dữ liệu đã gửi hoặc đã truy xuất càng ít càng tốt.

Giao diện lập trình ứng dụng tiêu chuẩn không xác định(cũng như chính sách bảo mật), để có không gian trống để thử nghiệm các bộ công cụ phần mềm khác nhau. Tuy nhiên, điều này có thể dẫn đến việc sử dụng các giao diện lập trình khác nhau trên mỗi nền tảng và sẽ không cho phép di chuyển phần mềm ứng dụng giữa các nền tảng.

Trên thực tế, các nhà phát triển xây dựng bộ công cụ của họ dựa trên giao diện lập trình Socket, được mượn từ Berkeley. Tầm quan trọng của giao diện phần mềm tăng lên cùng với sự ra đời của WINSock (Windows Socket), dẫn đến sự phát triển nhanh chóng của các ứng dụng máy tính để bàn mới có thể chạy trên bất kỳ giao diện WINSock nào tương thích với ngăn xếp TCP/IP.

10.19 Đọc thêm

Tiêu chuẩn TCP ban đầu được xác định trong RFC 793. Các yêu cầu nâng cấp, sửa đổi và tương thích được đề cập trong RFC 1122. Kern và Partridge đã xuất bản bài báo Cải thiện ước tính chuyến đi khứ hồi trong các giao thức vận chuyển đáng tin cậy Trong tạp chí Kỷ yếu của ACM SIGCOMM 1987. Bài viết của Jacobson Tránh và kiểm soát tắc nghẽn xuất hiện trong Kỷ yếu Hội thảo ACM SIGCOMM 1988. Jacobson cũng ban hành một số RFC sửa đổi các thuật toán hiệu suất.

Các máy chủ triển khai các giao thức này trên mạng công ty cung cấp cho khách hàng địa chỉ IP, cổng, mặt nạ mạng, máy chủ định danh và thậm chí cả máy in. Người dùng không phải cấu hình thủ công máy chủ của mình để sử dụng mạng.

Hệ điều hành QNX Neutrino triển khai một giao thức tự động cấu hình khác có tên AutoIP, đây là một dự án của Ủy ban Tự động cấu hình IETF. Giao thức này được sử dụng trong các mạng nhỏ để gán địa chỉ IP liên kết cục bộ cho máy chủ. Giao thức AutoIP xác định độc lập địa chỉ IP cục bộ của liên kết, sử dụng sơ đồ đàm phán với các máy chủ khác và không liên hệ với máy chủ trung tâm.

Sử dụng giao thức PPPoE

PPPoE viết tắt là viết tắt của Giao thức điểm-điểm qua Ethernet. Giao thức này đóng gói dữ liệu để truyền qua mạng Ethernet với cấu trúc liên kết bắc cầu.

PPPoE là thông số kỹ thuật để kết nối người dùng Ethernet với Internet qua kết nối băng thông rộng, chẳng hạn như đường thuê bao kỹ thuật số thuê bao, thiết bị không dây hoặc modem cáp. Việc sử dụng giao thức PPPoE và modem băng thông rộng cung cấp cho người dùng mạng máy tính cục bộ quyền truy cập cá nhân, được xác thực vào mạng dữ liệu tốc độ cao.

Giao thức PPPoE kết hợp công nghệ Ethernet với giao thức PPP, tạo ra kết nối riêng biệt đến máy chủ từ xa cho mỗi người dùng một cách hiệu quả. Kiểm soát truy cập, kế toán kết nối và lựa chọn nhà cung cấp dịch vụ được xác định cho người dùng chứ không phải máy chủ. Ưu điểm của phương pháp này là cả công ty điện thoại và nhà cung cấp dịch vụ Internet đều không phải cung cấp bất kỳ hỗ trợ đặc biệt nào cho việc này.

Không giống như kết nối quay số, kết nối DSL và modem cáp luôn hoạt động. Vì kết nối vật lý với nhà cung cấp dịch vụ từ xa được chia sẻ giữa nhiều người dùng nên cần có một phương pháp tính toán để ghi lại người gửi và đích đến của lưu lượng truy cập cũng như tính phí cho người dùng. Giao thức PPPoE cho phép người dùng và máy chủ từ xa đang tham gia phiên giao tiếp tìm hiểu địa chỉ mạng của nhau trong quá trình trao đổi ban đầu được gọi là phát hiện(khám phá). Khi phiên đã được thiết lập giữa người dùng cá nhân và máy chủ từ xa (ví dụ: nhà cung cấp dịch vụ Internet), phiên này có thể được giám sát vì mục đích tích lũy. Nhiều gia đình, khách sạn và tập đoàn cung cấp quyền truy cập Internet công cộng thông qua đường dây thuê bao kỹ thuật số sử dụng công nghệ Ethernet và giao thức PPPoE.

Một kết nối thông qua giao thức PPPoE bao gồm máy khách và máy chủ. Máy khách và máy chủ hoạt động bằng bất kỳ giao diện nào gần với thông số kỹ thuật Ethernet. Giao diện này được sử dụng để cấp địa chỉ IP cho máy khách và liên kết các địa chỉ IP đó với người dùng và tùy chọn với máy trạm, thay vì chỉ xác thực dựa trên máy trạm. Máy chủ PPPoE tạo kết nối điểm-điểm cho mỗi máy khách.

Thiết lập phiên PPPoE

Để tạo phiên PPPoE, bạn nên sử dụng dịch vụpppoed. mô-đunio-pkt-*nCung cấp dịch vụ giao thức PPPoE. Đầu tiên bạn cần chạyio-pkt-*Vớingười lái xe phù hợp. Ví dụ: