Mô hình ứng dụng mạng (client-server, p2p), tiến trình
Như chúng ta đã biết qua các bài trước, ứng dụng mạng là một hệ thống phần mềm chạy trên các thiết bị đầu cuối khác nhau và trao đổi thông tin qua mạng máy tính.
“Hệ thống” ở đây mang ý nghĩa rằng ứng dụng mạng bao gồm nhiều thành phần phối hợp hoạt động với nhau trong một thể thống nhất. Sự phối hợp có được nhờ môi trường mạng (cho phép trao đổi thông tin) và giao thức truyền thông (các quy tắc chi phối quá trình trao đổi thông tin).
Ngoài các yếu tố trên, sự phối hợp trong hệ thống phần mềm mạng còn thể hiện ở sự thỏa thuận về mặt nhiệm vụ giữa các thành phần. Sự thỏa thuận đó thể hiện qua mô hình (hay kiến trúc) ứng dụng mạng.
Trong bài học này chúng ta tiếp tục đi sâu vào các vấn đề của ứng dụng mạng, bao gồm các mô hình của ứng dụng mạng (mô hình client – server, mô hình p2p) và truyền thông liên tiến trình trong ứng dụng mạng.
Mô hình ứng dụng mạng
Khi bắt tay vào xây dựng một ứng dụng mạng, một trong những vấn đề đầu tiên đặt ra chính là lựa chọn mô hình (đôi khi cũng được gọi là kiến trúc) cho ứng dụng mạng. Mặc dù phần mềm mạng rất đa dạng nhưng có thể phân chia chúng vào 2 mô hình cơ bản theo cách thức phân chia vai trò nhiệm vụ của các thành phần: mô hình chủ-khách (client-server) và mô hình ngang hàng (peer-to-peer, P2P).
Mô hình chủ – khách (client – server)
Trong mô hình chủ-khách ứng dụng được chia làm hai thành phần: một thành phần chuyên phục vụ các yêu cầu gửi đến từ các thành phần khác, gọi là thành phần server; một hoặc nhiều thành phần đưa ra yêu cầu sử dụng dịch vụ, gọi là thành phần client.
Server và client chạy trên các thiết bị đầu cuối khác nhau khác nhau. Thiết bị đầu cuối nơi chạy chương trình server cũng thường được gọi tắt là máy chủ (trên máy chủ vật lý đó cũng thường cài đặt nhiều chương trình server khác nhau). Thiết bị đầu cuối nơi chạy chương trình client thường được gọi tắt là máy khách hay máy trạm.
Mô hình client / server
Một số ứng dụng phổ biến sử dụng mô hình chủ-khách bao gồm Web, FTP, Telnet, Email.
Ví dụ, hệ thống web bao gồm một chương trình luôn hoạt động (chương trình máy chủ web) trên một máy tính riêng có IP cố định để chờ phục vụ các truy vấn đến từ các chương trình trình duyệt (browser). Khi chương trình máy chủ nhận được một truy vấn từ trình duyệt, nó sẽ xử lý và trả lại dữ liệu mà trình duyệt yêu cầu. Các trình duyệt chỉ trao đổi thông tin với chương trình máy chủ mà không tương tác trực tiếp với nhau. Quá trình trao đổi thông tin truy vấn / phản hồi giữa chương trình máy chủ và trình duyệt được hỗ trợ bởi giao thức Http.
Chế độ hoạt động
Trong mô hình này, server luôn hoạt động (chế độ luôn mở) để chờ phục vụ client. Chương trình server phải hoạt động trên máy có địa chỉ IP cố định.
Client có thể hoạt động ở chế độ luôn mở (always-on) hoặc mở không thường xuyên (sometimes-on). Các client không giao tiếp trực tiếp với nhau mà chỉ giao tiếp với server. Chương trình client phải biết được địa chỉ IP của máy chủ.
Do chương trình server luôn hoạt động và chạy trên máy tính có IP cố định và được công bố, chương trình khách có thể liên lạc với máy chủ bất kỳ khi nào cần sử dụng dịch vụ do chương trình máy chủ cung cấp.
Giao tiếp client – server
Việc giao tiếp giữa client và server được thực hiện dưới hình thức trao đổi các thông điệp (message):
Client gửi thông điệp yêu cầu (request message) cho server để mô tả công việc cần thực hiện.
Khi nhận được thông điệp này, server sẽ phân tích và xác định công việc phải thực hiện.
Nếu quá trình xử lý sinh ra kết quả cần trả cho client thì server sẽ gửi cho client thông điệp trả lời (reply message).
Định dạng và ý nghĩa của các thông điệp trao đổi giữa client và server được quy định bởi giao thức dùng trong ứng dụng.
Thin client, Fat client
Trong mô hình chủ khách, tùy thuộc vào việc phân phối nhiệm vụ giữa client và server, người ta phân chia làm hai loại client: fat client, và thin client.
Trong mô hình sử dụng fat client, server chủ yếu chịu trách nhiệm truy vấn và lưu trữ thông tin. Mô hình này tạo ra ít lưu thông trên mạng do dữ liệu được lưu trữ tạm thời và tính toán ở client nhưng yêu cầu cấu hình máy khách cao hơn.
Trong mô hình dùng thin client, client chỉ cần hiển thị và kiểm tra tính hợp lệ của dữ liệu người dùng nhập vào. Mô hình này cho phép tạo ra các client nhẹ và đơn giản nhưng làm tăng lưu thông trên mạng do dữ liệu phải chuyển qua lại liên tục giữa client và server.
Server và Data center
Thông thường trong ứng dụng client/server, một máy chủ (vật lý) đơn lẻ thường không đủ khả năng phục vụ tất cả truy vấn từ client. Ví dụ, một website mạng xã hội lớn sẽ rất nhanh bị quá tải nếu chỉ có một server phục vụ.
Vì lý do này người ta tạo ra các trung tâm dữ liệu (data center) chứa số lượng lớn máy (vật lý) để cùng tạo một server (ảo) đủ mạnh. Ví dụ, theo thống kê (wikipedia) Google có từ 30 đến 50 data center phân bố khắp thế giới với khoảng hơn hai triệu máy chủ để cùng phục vụ yêu cầu tìm kiếm, dịch vụ Gmail và YouTube. Mỗi data center chứa hàng trăm ngàn máy chủ vật lý.
Mô hình ngang hàng
Trong kiến trúc ngang hàng (còn gọi là kiến trúc peer-to-peer hay viết tắt là P2P), tất cả các thành phần của hệ thống đều thực hiện các nhiệm vụ giống nhau, không có người phục vụ (server) chuyên biệt.
Như vậy, trong ứng dụng P2P không có sự phụ thuộc (hoặc phụ thuộc rất ít) vào server. Mỗi ứng dụng chạy trên một máy gọi là peer. Ứng dụng trên mỗi đôi máy (các peer) trực tiếp tiến hành truyền thông với nhau mà không phải thông qua một server trung gian nào. Vì lý do này mô hình được gọi là peer-to-peer. Các peer này không do các nhà cung cấp dịch vụ quản lý mà thực chất là các máy tính cá nhân do người dùng quản lý.
Hiện nay các ứng dụng đòi hỏi lưu lượng dữ liệu lớn thường hoạt động theo mô hình P2P: ứng dụng phân phối file (BitTorrent, µTorrent), ứng dụng chia sẻ file (eMule, LimeWire), điện thoại Internet (Skype), truyền hình IP (PPLive).
Mô hình peer-to-peer
Ưu điểm của P2P
Một trong những ưu điểm của kiến trúc P2P là khả năng mở rộng.
Ví dụ, trong ứng dụng chia sẻ file P2P, mặc dù mỗi peer trong khi yêu cầu file tự tạo ra một khối lượng công việc cho mình, mỗi peer đồng thời bổ sung khả năng phục vụ của mình cho hệ thống bằng cách phân phối lại file cho các peer khác.
Kiến trúc P2P cũng có ưu thế về giá thành vì nó không đòi hỏi hạ tầng về máy chủ và băng thông.
Nhược điểm của P2P
Ứng dụng P2P cũng gặp những khó khăn nhất định.
Thứ nhất, các nhà cung cấp dịch vụ Internet (ISP) cho hộ gia đình thường để tốc độ tải xuống lớn hơn tốc độ tải lên. Trong khi đó, dịch vụ phát video (streaming) hoặc phân phối file P2P đều đòi hỏi tốc độ tải lên cao. Từ đó, ISP địa phương phải chịu áp lực lớn về băng thông. Người ta gọi đây là tình trạng “không thân thiện” giữa ứng dụng P2P và ISP.
Thứ hai, do bản chất mở và phân tán, ứng dụng P2P có hạn chế về tính an toàn và bảo mật. Ngoài ra, ứng dụng P2P cũng dễ dàng liên quan tới các vấn đề vi phạm bản quyền vì dữ liệu chia sẻ không bị kiểm soát.
Vấn đề thứ ba là sự thành công của ứng dụng P2P phụ thuộc vào khả năng “thuyết phục” người dùng tham gia vào mạng lưới ứng dụng P2P. Khi tham gia, người dùng sẽ phải “tự nguyện” cung cấp tài nguyên của máy tính cá nhân cho ứng dụng như băng thông, lưu trữ, CPU. Ví dụ, khi tham gia vào hệ thống chia sẻ file P2P, mỗi phần mềm trên máy tính cá nhân đều phải chiếm dụng thêm băng thông, ổ cứng, thời gian xử lý của CPU và cung cấp tài nguyên này cho hệ thống cùng sử dụng.
Ngoài hai mô hình trên, hiện nay một số ứng dụng sử dụng kiến trúc lai, kết hợp cả mô hình chủ-khách và mô hình P2P. Ví dụ, trong nhiều ứng dụng nhắn tin tức thời, server chỉ dùng để theo dõi địa chỉ IP của người dùng, còn tin nhắn giữa người dùng được truyền trực tiếp giữa các máy khách mà không đi qua máy chủ.
Tiến trình
Khi một chương trình được tải vào bộ nhớ và bắt đầu thực hiện cách lệnh của mình, nó được gọi là một tiến trình (process). Như vậy, một ứng dụng mạng (khi hoạt động) sẽ bao gồm ít nhất hai tiến trình (process) hoạt động trên hai thiết bị đầu cuối khác nhau. Các tiến trình này trao đổi các thông điệp qua mạng. Việc trao đổi thông tin này được gọi là truyền thông liên tiến trình.
Ví dụ, Trong hệ thống web, tiến trình chạy trên máy khách (tiến trình của browser) trao đổi với tiến trình của máy chủ web; trong hệ thống chia sẻ file P2P, file được truyền từ một tiến trình trên một peer (một máy tính) tới một tiến trình trên một peer khác.
Tiến trình chủ, tiến trình khách
Với mỗi cặp tiến trình như vậy, chúng ta thường gọi một tiến trình là tiến trình chủ (server process, server) và tiến trình còn lại là tiến trình khách (client process, client).
Ví dụ, trong ứng dụng web, trình duyệt là tiến trình khách còn web server là tiến trình chủ. Trong ứng dụng chia sẻ P2P, peer tải file về được coi là tiến trình khách, còn peer tải file lên được gọi là tiến trình chủ.
Trong phạm vi của phiên truyền thông giữa một cặp tiến trình, tiến trình nào khởi tạo quá trình truyền thông được gọi là tiến trình khách, tiến trình nào chờ để được liên lạc thì gọi là tiến trình chủ.
Chúng ta có thể thấy như trong ứng dụng chia sẻ P2P, một tiến trình có thể là chủ, cũng có thể là khách (chú ý, trong mô hình P2P các tiến trình tham gia vào truyền thông chỉ phân chia chủ khách trong phạm vi của phiên truyền thông).
Quá trình giao tiếp giữa tiến trình chủ và khách có thể diễn ra theo chế độ: chế độ nghẽn (blocking), chế độ không nghẽn (non-blocking).
Trong chế độ nghẽn, khi tiến trình khách hoặc chủ phát ra lệnh gửi dữ liệu, tiến trình sẽ bị tạm dừng cho đến khi tiến trình nhận phát ra lệnh nhận dữ liệu. Tương tự, khi tiến trình phát ra lệnh nhận dữ liệu mà chưa có dữ liệu gửi đến, tiến trình sẽ bị tạm dừng cho đến khi có dữ liệu tới.
Ở chế độ không nghẽn, khi tiến trình chủ hoặc khách phát ra lệnh gửi dữ liệu, sự thực thi của nó vẫn tiếp tục, không quan tâm tới việc có tiến trình nào phát ra lệnh nhận dữ liệu đó hay không.
Đánh địa chỉ tiến trình
Các loại địa chỉ
Các tiến trình nếu tham gia vào quá trình truyền thông mạng bắt buộc phải lựa chọn một trong hai giao thức của tầng giao vận làm công cụ truyền thông tin liên tiến trình. Các giao thức tầng giao vận, đến lượt mình, phải “trông cậy” vào giao thức IP để có thể truyền các gói tin của mình đến máy đầu cuối. Tại máy nhận, các gói tin IP được ghép nối và chuyển lên tầng giao vận, sau đó chuyển đến cho tiến trình đang chờ nhận thông tin.
Để quá trình truyền thông phức tạp này có thể thực hiện, các thành phần tham gia cần được đánh địa chỉ để có thể xác định được đích đến của các gói tin. Việc đánh địa chỉ này bao gồm hai phần: địa chỉ máy và địa chỉ tiến trình.
Địa chỉ của mỗi máy tham gia vào mạng truyền thông sử dụng bộ giao thức TCP/IP được gọi là địa chỉ IP. Địa chỉ này xác định duy nhất một máy trên liên mạng và là điều kiện để giao thức IP hoạt động. Mỗi giao diện mạng khi tham gia vào quá trình truyền thông đều được gán một địa chỉ IP.
Trên một máy tính thông thường có nhiều tiến trình cùng hoạt động. Mỗi khi các gói tin đến đích cần một cơ chế để có thể phân biệt gói tin đó cần gửi đến cho tiến trình nào. Do đó, mỗi tiến trình khi tham gia vào quá trình truyền thông được gán một địa chỉ riêng, gọi là số cổng (port number).
Số cổng
Cổng (Port) là một số bất kỳ nằm trong khoảng từ 0 đến 65535. Các tiến trình có thể chọn ngẫu nhiên bất kỳ giá trị số cổng nào, miễn là giá trị đó chưa được sử dụng cho tiến trình khác.
Các tiến trình tham gia vào quá trình truyền thông phải thỏa thuận được với nhau về giá trị cổng. Các giá trị cổng nguồn (tiến trình gửi) và cổng đích (tiến trình nhận) đều được gửi đi kèm gói tin TCP (hoặc UDP) để các máy có thể xác định được cần chuyển gói tin đến cho tiến trình nào.
Tổ hợp của địa chỉ IP và số cổng có thể đại diện cho một tiến trình trong mạng truyền thông và được gọi là địa chỉ của tiến trình. Cấu trúc địa chỉ này như sau: địa chỉ IP:sốcổng.
Ví dụ, 192.168.1.10:80 là địa chỉ đại diện cho một tiến trình chạy trên máy có địa chỉ IP 192.18.1.10 và chiếm cổng 80. Thực tế, có thể xác định đây là địa chỉ của một chương trình máy chủ web sử dụng giao thức HTTP.
Cổng dành riêng
Mặc dù giá trị số cổng có thể gán ngẫu nhiên cho các tiến trình, một số ứng dụng mạng luôn chiếm một cổng cố định. Ví dụ, chương trình máy chủ web khi chạy luôn chiếm cổng 80, chương trình máy chủ FTP chiếm cổng 20, 21. Đây là những ứng dụng mạng phổ biến đi kèm với giao thức tầng ứng dụng của riêng chúng.
Giá trị cổng mà các chương trình này chiếm dụng được quy định trong các bảng đặc tả của giao thức. Các số cổng từ 0 đến 1023 thường được dùng cho các dịch vụ hệ thống hoặc các chương trình ứng dụng mạng phổ biến và thường được gọi là “cổng nổi tiếng” hoặc “cổng hệ thống”.
Dưới đây là danh sách một số cổng được “chiếm dụng” sẵn bởi các ứng dụng / giao thức mạng phổ biến: