Dịch vụ truyền thông, bộ giao thức và mô hình TCP/IP

    0

    bài trước chúng ta xem xét mạng máy tính và giao thức ở dạng mô tả tổng quát nhất. Trong bài học này chúng ta đi vào xem xét cụ thể một loại mạng được sử dụng trong khuôn khổ chương trình học: mạng TCP/IP.

    Quay trở lại Hướng dẫn tự học lập trình socket Tcp/Ip.

    Dịch vụ truyền thông Tcp/Ip cung cấp cho ứng dụng

    Mạng Tcp/Ip cung cấp ba dịch vụ truyền thông cho ứng dụng:

    1. Dịch vụ Tcp: truyền thông end-to-end, truyền thông tin cậy hướng liên kết; Dịch vụ này do giao thức Tcp cung cấp.
    2. Dịch vụ Udp: truyền thông end-to-end, truyền không tin cậy phi liên kết theo thời gian thực; Dịch vụ này do giao thức Udp cung cấp.
    3. Dịch vụ Ip: truyền thông host-to-host, truyền không tin cậy phi liên kết; dịch vụ này cho giao thức Ip cung cấp.

    Khi phát triển ứng dụng mạng đầu tiên cần lựa chọn loại dịch vụ truyền thông end-to-end sẽ được sử dụng. Hai loại dịch vụ này được gọi chung là dịch vụ giao vận.

    Dịch vụ truyền host-to-host chỉ được sử dụng khi phát triển một số loại ứng dụng đặc biệt (như ping, tracert).

    Dịch vụ và giao thức TCP

    Giao thức TCP cung cấp cho ứng dụng dịch vụ hướng kết nối (connection-oriented service), dịch vụ truyền tin cậy (reliable data transfer service).

    Dịch vụ hướng kết nối: trong truyền thông qua giao thức TCP, các chương trình phải trao đổi thông tin kiểm soát trước khi dữ liệu của ứng dụng được truyền đi. Thủ tục này được gọi là ‘bắt tay ba bước’ và tạo ra một kết nối TCP (TCP connection) giữa hai chương trình. Đây là loại kết nối song công (full-duplex), nghĩa là hai chương trình có thể đồng thời gửi dữ liệu cho nhau. Khi ứng dụng hoàn thành việc gửi dữ liệu, kết nối TCP có thể được hủy bỏ.

    Dịch vụ truyền tin cậy: TCP đảm bảo các chương trình tham gia truyền thông có thể truyền toàn bộ dữ liệu mà không bị lỗi và tới theo đúng thứ tự. Nói một cách khác, khi một chương trình nguồn truyền dữ liệu đi, TCP đảm bảo chương trình đích sẽ nhận được đúng dữ liệu đó, không mất hoặc dư thừa byte nào.

    Tcp được sử dụng nếu đặt ra yêu cầu cao về tính toàn vẹn của dữ liệu khi truyền nhưng có thể chấp nhận tốc độ truyền thấp.

    Dịch vụ và Giao thức UDP

    UDP là một giao thức đơn giản cung cấp dịch vụ phi liên kết (connectionless service) cho ứng dụng. Khi sử dụng UDP không tạo ra kết nối giữa các chương trình tham gia truyền thông, và do đó, cũng không có các thủ tục bắt tay như TCP. Dữ liệu truyền theo UDP ở dạng các gói tin gọi là Datagram.

    UDP cung cấp dịch vụ truyền dữ liệu không tin cậy (unreliable data transfer service). Khi một chương trình gửi dữ liệu qua UDP, giao thức UDP không đảm bảo dữ liệu đó sẽ đến đích, đồng thời, các dữ liệu truyền tới đích có thể không theo đúng thứ tự như khi nó được gửi đi.

    UDP không có cơ chế kiểm soát nghẽn, do đó máy nguồn có thể gửi dữ liệu theo bất kỳ tốc độ nào.

    Giao thức UDP thường được sử dụng trong các ứng dụng thời gian thực do các ứng dụng loại này có thể chấp nhận thất thoát dữ liệu nhưng yêu cầu tốc độ truyền dữ liệu cao hơn. Do tường lửa trên các thiết bị luôn có xu hướng chặn phần lớn các loại dòng dữ liệu UDP nên cần chú ý khi lựa chọn giao thức UDP.

    Dịch vụ mã hóa

    Cả TCP và UDP đều không cung cấp dịch vụ mã hóa dữ liệu. Nếu một tiến trình gửi mật khẩu dưới dạng văn bản không mã hóa đi thì mật khẩu này sẽ được truyền qua tất cả các liên kết dọc đường đi tới tiến trình đích. Do vấn đề bảo mật đóng vai trò then chốt đối với nhiều ứng dụng, cộng đồng Internet đã phát triển một phần mở rộng cho TCP và được gọi là tầng socket bảo mật (Secure Sockets Layer, SSL).

    SSL cung cấp tất cả các dịch của TCP, đồng thời cung cấp thêm các dịch vụ bảo mật: mã hóa, đảm bảo toàn vẹn dữ liệu, và xác thực điểm cuối. SSL không phải là loại giao thức thứ 3 của tầng giao vận (cùng cấp độ với TCP và UDP) mà là một phần mở rộng cho TCP và được xây dựng ở tầng ứng dụng.

    Quan hệ giữa ứng dụng và dịch vụ truyền thông

    Như đã nhắc đến trong bài trước, mỗi chương trình ứng dụng đều phải xây dựng ra hoặc sử dụng một giao thức nào đó. Mỗi giao thức này đều sử dụng một trong hai dịch vụ (giao thức) Tcp hoặc Udp để truyền dữ liệu người dùng tới chương trình đối tác.

    Ví dụ, trong hệ thống web, chương trình web client (browser) và web server sử dụng một giao thức có tên HTTP (HyperText Transfer Protocol) để trao đổi dữ liệu. Đây thực chất là một giao thức hướng văn bản (dữ liệu toàn là văn bản) được thực thi ở dạng phần mềm và tích hợp sẵn trong trình duyệt và chương trình máy chủ web. Chương trình HTTP tích hợp này lại sử dụng dịch vụ TCP để truyền và nhận dữ liệu.

    Bảng dưới đây giới thiệu một số ứng dụng mạng phổ biến cùng với tên giao thức và dịch vụ truyền thông chúng sử dụng.

    Ứng dụng Giao thức ứng dụng Dịch vụ giao vận
    Email SMTP TCP
    Truy cập từ xa Telnet TCP
    Web HTTP TCP
    Truyền file FTP TCP
    Multimedia streaming HTTP, RTP TCP/UDP
    Điện thoại Internet SIP, RTP UDP

    Mô hình và bộ giao thức TCP/IP

    Kiến trúc phân tầng và mô hình mạng

    Như các phần trên chúng ta đã thấy, trong một mạng máy tính luôn có rất nhiều giao thức cùng hoạt động để thực hiện những chức năng khác nhau. Để phục vụ thiết kế và quản lý các giao thức mạng, người ta tổ chức các giao thức theo kiến trúc phân tầng.

    Theo cấu trúc này, mỗi giao thức được xếp vào một trong số các tầng (layer). Số lượng tầng, vai trò và chức năng của chúng được định nghĩa từ trước trong một mô hình mạng. Tất cả các giao thức trong các tầng khác nhau được gọi chung là một ngăn xếp giao thức.

    Trong các mô hình mạng khác nhau, số tầng, tên của các tầng, và chức năng của các tầng cũng không giống nhau. Mục đích của mỗi tầng là cung cấp các dịch vụ nhất định cho tầng bên trên liền kề nó, đồng thời ẩn đi những chi tiết về cách xây dựng dịch vụ của tầng đó. Nói cách khác, mỗi tầng hoạt động tương tự như một kiểu máy ảo cung cấp những dịch vụ nhất định cho tầng bên trên liền kề nó, nhưng không cho tầng trên biết dịch vụ đó được xây dựng ra sao.

    Khi nhìn nhận các giao thức từ khía cạnh thực thi có thể hình dung rằng, các “chương trình” giao thức ở các tầng hoạt động gần giống như các hàm gọi lẫn nhau. Các hàm cấp độ cao hơn gọi các hàm ở cấp thấp hơn để thực hiện các nhiệm vụ cụ thể. Các hàm cấp dưới lại có thể gọi tới các hàm cấp dưới nữa.

    Mô hình phân tầng này quy định rằng, chỉ có các hàm ở các cấp liền kề nhau mới có thể gọi nhau. Các hàm này gọi nhau theo kiểu “gọi qua giao diện”, tức là không trực tiếp gọi mà thông qua một giao diện (interface) trung gian. Cách thức làm việc này giúp các hàm không phụ thuộc chặt với nhau, khi cần thiết có thể thay thế hàm nọ bằng hàm kia mà không ảnh hưởng đến hàm cấp cao hơn.

    Mô hình TCP/IP

    Có hai mô hình mạng phân tầng được sử dụng phổ biến nhất là mô hình kết nối các hệ thống mở (mô hình OSI) và mô hình TCP/IP. Trong bài học (và tài liệu) này, chúng ta chỉ sử dụng mô hình TCP/IP.

    TCP/IP là tên của một mô hình tham chiếu, đồng thời cũng là tên của tập hợp các giao thức, thường gọi là bộ giao thức TCP/IP, đóng vai trò nền tảng cho hoạt động của Internet ngày nay.

    Mô hình này được đặt tên theo hai giao thức nòng cốt của nó, giao thức TCP và giao thức IP.

    Thiết kế của mô hình TCP/IP dựa theo kiến trúc phân tầng. Tên gọi các tầng theo mô hình TCP/IP theo thứ tự từ thấp lên cao lần lượt là: tầng liên kết, tầng internet, tầng giao vận, và tầng ứng dụng.

    Các tầng trong mô hình TCP/IP

    Tầng ứng dụng (TA: Application layer) chịu trách nhiệm làm việc với dữ liệu người dùng. Các giao thức thuộc tầng này sẽ sử dụng một trong hai giao thức của tầng giao vận để truyền thông tin tới điểm cuối. Các giao thức tầng ứng dụng thường gặp: Telnet, FTP, DNS, SMTP, SNMP, TFTP, NFS, DHCP. Các giao thức tầng này được thực thi trực tiếp trong ứng dụng.

    Tầng giao vận (TA: Transport layer) chứa hai giao thức TCP (TA: Transmission Control Protocol, TCP) và UDP (TA: User Datagram Protocol, UDP), chịu trách nhiệm phục vụ tầng tầng ứng dụng và đảm bảo truyền thông điểm cuối – điểm cuối giữa các máy trong mạng. Các giao thức này được thực thi ở dạng phần mềm và cài đặt trực tiếp trong hệ điều hành.

    Tầng internet (TA: Internet layer) (còn được gọi là tầng mạng (TA : Network layer)) chịu trách nhiệm vận chuyển các gói tin qua mạng. Tầng này chứa tất cả các giao thức định tuyến (IGMP, ICMP, RIP, OSPF) và giao thức vận chuyển dữ liệu người dùng IP. Các thiết bị hoạt động ở tầng này (router) có nhiệm vụ nhận gói tin, xác định điểm đến của gói tin, và chuyển gói tin về phía máy đích.

    Tầng này cũng chứa các giao thức gửi và nhận thông báo lỗi và các thông điệp điều khiển. Các giao thức ở tầng này có thể được thực hiện ở cả phần cứng và phần mềm. Giao thức IP trên máy tính được thực hiện ở dạng hàm hệ thống, trên router được thực hiện ở phần cứng.

    Tầng liên kết (TA: Link layer) (còn được gọi là tầng giao diện mạng (TA: Network Interface layer)) chịu trách nhiệm hoạt động với trình điều khiển thiết bị và các giao diện phần cứng để kết nối máy tính với môi trường truyền. Một số giao thức tầng liên kết: ATM, Ethernet, PPP, Frame Relay, Token Ring, FDDI. Các giao thức ở tầng này được thực thi hầu hết trong phần cứng.

    Tương quan giữa các tầng của mô hình TCP/IP với mô hình OSI cùng với các giao thức của các tầng được thể hiện ở dưới đây.

    So sánh mô hình TCP/IP, OSI và các giao thức

    So sánh mô hình TCP/IP, OSI và các giao thức

    Ứng dụng mạng và Giao thức tầng ứng dụng

    Như chúng ta đã xem xét ở các phần trên, các phần của ứng dụng mạng trao đổi thông tin với nhau bằng cách gọi một trong số các dịch vụ truyền dữ liệu của tầng giao vận.

    Tuy nhiên, rất nhanh sẽ xuất hiện các vấn đề như: cấu trúc các gói tin ra sao, ý nghĩa của từng trường trong gói tin, khi nào các chương trình thành phần gửi và nhận các gói tin, v.v.. Trả lời cho những câu hỏi này có thể xem gần tương đương như việc xây dựng một giao thức tầng ứng dụng.

    Cụ thể hơn, một giao thức tầng ứng dụng xác định:

    • Các loại thông điệp cần trao đổi: ví dụ, hai loại thông điệp thường gặp nhất là truy vấn (request) và phản hồi (response).
    • Cú pháp của các loại thông điệp: ví dụ, danh sách các trường trong từng loại thông điệp và cách thức tạo ra các trường đó.
    • Ý nghĩa của các trường: giá vị và vai trò của thông tin trong các trường.
    • Các quy tắc xác định thời điểm và cách thức một thành phần gửi thông điệp và phản hồi cho thông điệp.

    Giao thức mở và giao thức độc quyền

    Một số giao thức tầng ứng dụng được mô tả trong RFC (Request for Comments) và có thể truy cập tự do. Ví dụ, giao thức của ứng dụng web HTTP được mô tả trong RFC 2616. Nếu một nhà phát triển trình duyệt tuân thủ các quy tắc trong RFC của HTTP, trình duyệt đó có thể truy xuất trang web từ bất kỳ chương trình máy chủ web nào (với điều kiện chương trình máy chủ cũng phải tuân thủ RFC của HTTP).

    Một số giao thức tầng ứng dụng khác không được mô tả trong RFC mà đi kèm với ứng dụng. Ngoại trừ nhà phát triển phần mềm đó, những người khác không biết gì về giao thức này, và do đó, không (hoặc khó) thực hiện được giao thức đó cho ứng dụng của mình. Các loại giao thức như vậy gọi là giao thức độc quyền. Ví dụ, Skype sử dụng một số giao thức độc quyền.

    Lưu ý rằng, giao thức tầng ứng dụng chỉ là một bộ phận (và đặc biệt quan trọng) của một hệ thống ứng dụng mạng. Giao thức tầng ứng dụng do nhà phát triển phần mềm tạo ra và thường đi cùng với ứng dụng cụ thể.

    Trong quá trình học lập trình mạng, chúng ta sẽ lần lượt tạo ra nhiều giao thức tầng ứng dụng khác nhau (mặc dù rất đơn giản) để sử dụng trong từng ứng dụng.

    Phát triển ứng dụng mạng

    Phát triển ứng dụng mạng, về bản chất, là viết chương trình chạy trên các hệ thống đầu cuối khác nhau và giao tiếp với nhau qua mạng. Ứng dụng mạng có thể được viết bằng các ngôn ngữ lập trình thông dụng như C/C++, Java, Python, C#, Visual Basic v.v., tương tự như bất kỳ một ứng dụng “không mạng” nào.

    Việc cung cấp các dịch vụ mạng và khả năng lập trình với các dịch vụ này thuộc phạm vi của hệ điều hành. Các ngôn ngữ và công cụ lập trình cấp cao có thể cung cấp những hỗ trợ bổ sung để tăng hiệu quả của việc phát triển ứng dụng mạng.

    Khi lập trình ứng dụng mạng, lập trình viên phải giao tiếp được với ngăn xếp giao thức mạng do hệ điều hành cung cấp để yêu cầu các dịch vụ này thực hiện việc gửi và nhận dữ liệu qua mạng. Tùy thuộc vào dịch vụ chuyển vận được lựa chọn, chúng ta phải tuân thủ theo quy trình hoạt động của giao thức đó.

    Cụ thể, nếu lựa chọn dịch vụ Tcp, chúng ta phải tuân thủ quy tắc hoạt động của Tcp, bao gồm: thiết lập liên kết, gửi/nhận dữ liệu, đóng liên kết; Nếu lựa chọn dịch vụ Udp thì có thể trực tiếp gửi/nhận dữ liệu giữa các điểm cuối mà không cần thiết lập liên kết. Dịch vụ tầng chuyển vận sẽ thực hiện các yêu cầu và người lập trình không cần quan tâm đến cách thức chúng thực hiện yêu cầu đó.

    Phân loại ứng dụng mạng

    Phụ thuộc vào giao thức, người ta cũng thường phân ra hai loại ứng dụng mạng.

    Các ứng dụng cài đặt các giao thức chuẩn đã được mô tả trong RFC hoặc một số tài liệu chuẩn khác. Ví dụ, trong RFC 959 mô tả một giao thức để truy xuất hệ thống file từ xa gọi là FTP (File Transfer Protocol). Chúng ta có thể viết chương trình thực thi thành phần client hoặc thành phần server của FTP. Nếu các lập trình viên khi viết code cho client và server (độc lập) và tuân thủ các quy tắc của FTP thì hai chương trình này có thể tương tác với nhau và tạo thành một hệ thống phần mềm mạng.

    Thực tế hiện nay rất nhiều phần mềm mạng được tạo ra bởi các nhà phát triển khác nhau như vậy. Ví dụ, trình duyệt FireFox và chương trình máy chủ web Apache do các nhà phát triển khác nhau tạo ra nhưng hoàn toàn có thể tương tác tạo ra một hệ thống ứng dụng web.

    Các ứng dụng mạng độc quyền. Trong trường hợp này, các thành phần trao đổi dữ liệu với nhau bằng một giao thức độc quyền (không công bố). Một/một nhóm nhà phát triển cùng xây dựng tất cả các thành phần của ứng dụng và tự thiết kế giao thức của riêng mình. Các nhà phát triển khác không thể xây dựng ra phần mềm để tương tác với hệ thống này.

    Bình luận

    avatar
      Đăng ký theo dõi  
    Thông báo về