Một hoặc nhiều thông điệp có thể được gửi đến một cổng và các tiến trình có thể sử dụng một hay nhiều cổng để nhận thông điệp.. Bất kì một tiến trình nào cũng có thể biết được số cổng mà
Trang 14 TRUYỀN THÔNG GIỮA CÁC TIẾN TRÌNH 1
4.1 Giới thiệu 1
4.2 API cho các giao thức Internet 2
4.2.1 Các đặc điểm của truyền thông giữa các tiến trình 2
4.2.2 Sockets 3
4.2.3 UDP 4
4.2.4 TCP 6
4.3 Biểu diễn dữ liệu ngoài và marshalling 7
4.3.1 CORBA’s Common Data Representation (CDR) 7
4.3.2 Java object serialization 8
4.3.3 XML 10
4.3.4 Remote object references 11
4.4 Truyền thông Multicast 12
4.4.1 IP Multicast 12
4.4.2 Tính tin cậy và tính có thứ tự của Multicast 14
4.5 Mạng ảo 14
4.5.1 Mạng Overlay 14
4.5.2 Skype 16
4.6 Trường hợp nghiên cứu: MPI 18
4.7 Tóm tắt 18
4 TRUYỀN THÔNG GIỮA CÁC TIẾN TRÌNH
4.1 Giới thiệu
Chương này và hai chương tiếp theo nghiên cứu những kiến thức liên quan đến truyền thông ở mức middleware Chương này sẽ nghiên cứu những vấn đề liên quan đến việc thiết kế ở mức tối hơn (được thể hiện trong hình 4.1) Lớp trên được thảo luận trong chương 5 trong đó xem xét đến lời gọi thủ tục từ xa, chương 6 là những kiến
Trang 24.2 API cho các giao thức Internet
4.2.1 Các đặc điểm của truyền thông giữa các tiến trình
4.2.1.1 Đồng bộ và không đồng bộ
Một hàng đợi được kết hợp với một điểm đến của thông điệp Tiến trình gửi sẽ đưa thông điệp đó vào hàng đợi từ xa và tiến trình nhận đọc các thông điệp từ hàng đợi địa phương Truyền thông giữa các tiến trình gửi và nhận có thể là đồng bộ hoặc không đồng bộ
Trong hình thức đồng bộ: tiến trình gửi và nhận được đồng bộ hóa tại mỗi thông điệp Người gửi bị “khóa” nghĩa là bị “đóng băng” trong khi gửi cho đến khi có phản hồi từ người nhận Ví dụ: Yêu cầu rút tiền từ máy ATM, máy ATM bị khóa cho đến khi nhận được xác nhận quyền truy xuất từ ngân hàng
Trong hình thức không đồng bộ: tiến trình gửi không bị chặn, tiến trình nhận hoặc là bị chặn hoặc là không chặn Người gửi có thể thực hiện một tiến trình khác sau khi thông điệp đã được gửi đi Ví dụ: email là thông điệp không đồng bộ, bạn gửi email sau đó làm việc khác trong khi chờ phản hồi
4.2.1.2 Nơi đến của một thông điệp
Trong chương 3 đã giải thích rằng, trong các giao thức Internet thì thông điệp được gửi đến theo một cặp (địa chỉ Internet và cổng cục bộ) Một cổng cục bộ là nơi đến trên một máy tính, quy định là một số nguyên Một cổng chỉ có một người nhận (trừ multicast) nhưng có thể có nhiều người gửi Một hoặc nhiều thông điệp có thể được gửi đến một cổng và các tiến trình có thể sử dụng một hay nhiều cổng để nhận thông điệp Bất kì một tiến trình nào cũng có thể biết được số cổng mà nó có thể gửi thông điệp đến đó Các server thường công khai số cổng của họ để phục vụ khách hàng sử dụng
Trang 34.2.1.3 Độ tin cậy
Chương 2 định nghĩa đáng tin cậy trong thời hạn hiệu lực và toàn vẹn Một dịch
vụ tin nhắn point – to – point có thể được mô tả như là đáng tin cậy nếu thông điệp được đảm bảo là được giao mặc dù có một số “hợp lí” các gói tin có thể bị rơi hoặc mất, ngược lại là không đáng tin cậy Đối với tính toàn vẹn, tin nhắn đến phải không bị hỏng và không bị trùng lặp
4.2.1.4 Tính có thứ tự
Một số ứng dụng đòi hỏi thông điệp phải được nhận có thứ tự đó là thứ tự mà chúng được chuyển bởi người gửi Thông điệp được phân phối theo thứ tự gửi
4.2.2 Sockets
4.2.2.1 Khái niệm
Socket là một thiết bị truyền thông hai chiều tương tự như tập tin , chúng ta có thể đọc hay ghi lên nó , tuy nhiên mỗi socket là một thành phần trong một mối nối nào
đó giữa các máy trên mạng máy tính và các thao tác đọc/ghi chính là sự trao đổi dữ liệu giữa các ứng dụng trên nhiều máy khác nhau
Sử dụng socket có thể mô phỏng hai phương thức liên lạc trong thực tế: liên lạc thư tín (socket đóng vai trò bưu cục), liên lạc điện thoại (socket đóng vai trò tổng đài)
4.2.2.2 Các thuộc tính của socket:
-Type: định nghĩa các đặc điểm liên lạc
-Sự tin cậy:
-Sự bảo toàn thứ tự dữ liệu:
-Lặp lại dữ liệu:
-Chế độ nối kết:
-Bảo toàn giới hạn thông điệp
-Khả năng gửi thông điệp khẩn
Để thực hiện liên lạc bằng socket cần thực hiện các thao tác:
-Tạo lập hay mở một socket
-Gắn kết một socket với một địa chỉ
-Liên lạc: có 2 kiểu liên lạc tùy thuộc vào chế độ nối kết
Trang 44.2.2.3 Các hình thức liên lạc trong socket
a Liên lạc trong chế độ không liên kết: liên lạc theo hình thức hộp thư
- Hai tiến trình liên lạc với nhau không kết nối trực tiếp
-Mỗi thông điệp phải kèm theo địa chỉ người nhận
Hình thức liên lạc này có đặc điểm:
-Người gửi không chắc chắn thông điệp của họ được gửi đến người nhận
-Một thông điệp có thể được gửi nhiều lần
-Hai thông điệp được gửi theo một thứ tự nào đó có thể đến tay người nhận theo một thứ tự khác
Một tiến trình sau khi đã mở một socket có thể sử dụng nó để liên lạc với nhiều tiền
trình khác nhau nhờ sử dụng hai primitive send và receive
b Liên lạc trong chế độ kết nối
Một liên kết được thành lập giữa hai tiến trình Trước khi mối liên kết này được thiết lập, một trong hai tiến trình phải đợi một tiến trình khác yêu cầu kết nối Có thể sử dụng socket để liên lạc theo mô hình client – server Trong mô hình này server sử dụng lời gọi hệ thống listen và accept để kết nối với client, sau đó client và server có
thể trao đổi thông tin bằng cách sử dụng primitive send và receive
Ví dụ: trong giao thức truyền thông TCP, mỗi mối nối giữa hai máy tính được xác định bằng một port, khái niệm port ở đây không phải là một cổng giao tiếp trên thiết bị vật
lí mà chỉ là một khái niệm logic trong cách nhìn của người lập trình, mỗi port được tương ứng với một số nguyên dương
4.2.3 UDP
4.2.3.1 Message size
Tiến trình nhận phải chỉ định một mảng các byte của một kích thước cụ thể để nhận một thông điệp Nếu thông điệp là quá lớn đối với mảng thì nó sẽ được cắt ngắn
Trang 5khi đến Các giao thức IP cơ bản cho phép độ dài gói tin lên đến 216 byte, trong đó bao gồm cả tiêu đề của thông điệp Tuy nhiên hầu hết các môi trường đều áp đặt một hạn chế về kích thước là 8KB Bất kỳ ứng dụng nào yêu cầu thông điệp lớn hơn mức tối đa đều phải được phân đoạn vào khối kích thước đó
4.2.3.2 Blocking
Socket thông thường cung cấp non-blocking sends và blocking receives trong truyền thông theo gói Việc gửi sẽ được trả lại khi nó đã trao thông điệp đến giao thức
cơ bản UDP và IP (có trách nhiệm truyền tải thông điệp đến đích) Khi đến thông điệp
sẽ được đặt trong một hàng đợi cho các socket Thông điệp có thể được thu thập bởi một lời gọi giải quyết ngay hoặc lời gọi tương lai của quá trình nhận trên socket Thông điệp sẽ được bỏ vào điểm đến nếu không có một tiến trình nào đã có socket bị ràng buộc vào cổng đích Phương thức nhận sẽ bị chặn cho đến khi một gói được nhận, trừ khi có một thời gian chờ được thiết lập trên socket Nếu tiến trình đó gọi phương thức nhận có công việc khác để làm trong thời gian chờ thông điệp, nên được bố trí sử dụng một luồng riêng biệt Chủ đề về luồng riêng biệt được thảo luận trong chương 7
Ví dụ: khi server nhận được thông điệp từ client, thông điệp có thể chỉ định công việc
để làm, trong trường hợp này server sẽ sử dụng luồng riêng biệt để làm việc và chờ đợi các thông điệp từ các client khác
4.2.3.3 Timeouts
Việc nhận thông điệp có thể bị tắc nghẽn mãi mãi khi mà một server đang chờ đợi để nhận yêu cầu từ phía client, nhưng trong một số chương trình nó không phải là thích hợp đó là một tiến trình đã sử dụng hệ điều hành, trong tình huống này có thể sẽ phải đợi vô hạn khi mà tiến trình gửi có thể đã bị rơi hoặc thông điệp dự kiến có thể đã
bị mất Để cho phép các yêu cầu như vậy, thời gian chờ có thể được thiết lập vào socket Chọn một khoảng thời gian thích hợp là rất khó, nhưng nó nên được chọn là một khoảng thời gian lớn hơn khá nhiều so với thời gian để chuyển một thông điệp
4.2.3.4 Receive from any
Các phương pháp nhận không ghi rõ nguồn gốc xuất xứ của các thông điệp Thay vào đó có một lời gọi nhận một thông điệp gửi tới socket của nó từ bất kì nguồn gốc nào Các phương pháp nhận trả về địa chỉ Internet và cổng nội bộ của người gửi cho phép người nhận kiểm tra thông điệp đến từ đâu Có thể có một kết nối từ datagram socket tới một cổng từ xa đặc biệt và địa chỉ Internet, trong trường hợp này socket chỉ
có thể gửi thông điệp đến và nhận thông điệp từ một địa chỉ
Trang 64.2.4 TCP
4.2.4.1 Message size
Ứng dụng có thể chọn bao nhiêu dữ liệu được viết vào dòng hoặc đọc từ nó Nó
có thể đối phó với một bộ dữ liệu rất nhỏ hoặc rất lớn Các thực hiện cơ bản của một dòng TCP quyết định bao nhiêu dữ liệu được thu thập trước khi truyền nó đi, có thể là một hoặc nhiều hơn các gói tin IP Khi đến nơi các dữ liệu được giao cho bên ứng dụng theo yêu cầu Nếu cần thiết các ứng dụng có thể buộc dữ liệu được gửi ngay lập tức
4.2.4.2 Lost message
Các giao thức TCP sử dụng một “tin báo nhận” Mô đun TCP tại đầu kia gửi lại
tin báo nhận (acknowledgement) cho các gói tin đã nhận được thành công, một "đồng hồ" (timer) tại nơi gửi sẽ báo time-out nếu không nhận được tin báo nhận trong khoảng
thời gian bằng một round-trip time (RTT), và dữ liệu (được coi là bị thất lạc) sẽ được gửi lại
4.2.4.3 Flow control
Các giao thức TCP cố gắng để phù hợp với tốc độ của các tiến trình đọc , ghi
dữ liệu vào dòng Nếu việc ghi quá nhanh cho việc đọc, nó có thể chặn lại việc ghi cho đến khi việc đọc đã xử lí hết dữ liệu
4.2.4.4 Message duplication and ordering
TCP kiểm tra để đảm bảo không có gói tin nào bị thất lạc bằng cách gán cho mỗi
gói tin một "số thứ tự" (sequence number) Số thứ tự này còn được sử dụng để đảm
bảo dữ liệu được trao cho ứng dụng đích theo đúng thứ tự
4.2.4.5 Message destinations
TCP đòi hỏi thiết lập kết nối trước khi bắt đầu gửi dữ liệu và kết thúc kết nối khi việc gửi dữ liệu hoàn tất Cụ thể, các kết nối TCP có ba pha:
1 Thiết lập kết nối
2 Truyền dữ liệu
3 Kết thúc kết nối
Để thiết lập một kết nối, TCP sử dụng một quy trình bắt tay 3 bước (3-way handshake) Trước khi client thử kết nối với một server, server phải đăng ký một cổng và mở cổng
đó cho các kết nối: đây được gọi là mở bị động Một khi mở bị động đã được thiết lập
Trang 7thì một client có thể bắt đầu mở chủ động Để thiết lập một kết nối, quy trình bắt tay 3 bước xảy ra như sau:
1 Client yêu cầu mở cổng dịch vụ bằng cách gửi gói tin SYN (gói tin TCP) tới
server, trong gói tin này, tham số sequence number được gán cho một giá trị ngẫu nhiên X.
2 Server hồi đáp bằng cách gửi lại phía client bản tin SYN-ACK, trong gói tin
này, tham số acknowledgment number được gán giá trị bằng X + 1, tham
số sequence number được gán ngẫu nhiên một giá trị Y
3 Để hoàn tất quá trình bắt tay ba bước, client tiếp tục gửi tới server bản tin ACK, trong bản tin này, tham số sequence number được gán cho giá trị bằng
X + 1 còn tham số acknowledgment number được gán giá trị bằng Y + 1
Tại thời điểm này, cả client và server đều được xác nhận rằng, một kết nối đã được thiết lập.
4.3 Biểu diễn dữ liệu ngoài và marshalling
Biểu diễn dữ liệu bên ngoài: một tiêu chuẩn thống nhất cho các đại diện của cấu trúc dữ liệu và giá trị nguyên thủy
Marshalling: quá trình lấy một tập hợp các mục dữ liệu và lắp ráp chúng thành một hình thức thích hợp để truyền
Unmarshalling: tháo (khôi phục) dữ liệu ban đầu khi đến
4.3.1 CORBA’s Common Data Representation (CDR)
Biểu diễn dự liệu phổ biến đại diện cho tất cả các loại dữ liệu có thể được sử dụng làm tham số hoặc giá trị trả về trong lời gọi đối tượng từ xa trong CORBA Gồm
15 loại cơ bản: short (16-bit), long bit), unsigned short, unsigned long, float (32-bit),double (64-bit), char, boolean (TRUE, FALSE), octet (8-bit), hoặc một trong số
loại cơ bản hoặc có cấu trúc được mô tả trong hình 4.7
Trang 8Các loại cơ bản: CDR xác định một diễn tả có thứ tự cho cả big – endian và little – endian Các giá trị được truyền đi theo thứ tự của người gửi và được xác định trong mỗi thông điệp Người nhận dịch nếu nó đòi hỏi một trật tự khác Ví dụ: một thông điệp chứa 2byte (16bits) theo big – endian những bit có trọng số lớn (MSB) chiếm byte đầu tiên, những bit có trọng số nhỏ (LSB) chiếm byte thứ hai
Các loại có cấu trúc: các giá trị cơ bản bao gồm từng loại có cấu trúc được thêm vào chuỗi các byte theo thứ tự nhất định (hình 4.7)
Hình 4.8 cho thấy một thông điệp trong CORBA CDR có chứa ba trường của một cấu trúc mà các loại tương ứng là string, string và unsigned long Hình trên cũng cho thấy chuỗi các byte với bốn byte trong mỗi hàng
4.3.2 Java object serialization
Java cung cấp một cơ chế, được gọi là đối tuợng tuần tự (object serialization) nơi mà các đối tuợng đuợc biểu diễn như một chuỗi các bytes đuợc sắp xếp tuần tự bao gồm dữ liệu của đối tượng cũng như thông tin về kiểu của đối tượng và kiểu dữ liệu được lưu trữ trong đối tượng Sau khi một đối tuợng đã được ghi và lưu trữ xuống thành file (tệp tin), nó có thể đọc từ tập tin và tái tạo lại đối tượng từ tập tin đã lưu trữ theo đúng trình tự đã được nạp trong quá trình tuần tự hóa, đây là quá trình giải tuần tự hóa (deserialized) Serialization là quá trình chuyển các cấu trúc dữ liệu và các đối tượng thành một định dạng có thể lưu trữ được (vào file, in-memory buffer, hoặc truyền qua network), sau đó có thể phục hồi lại các cấu trúc dữ liệu và đối tượng như ban đầu, trên cùng môi trường hoặc môi trường khác
Tiến trình deserialized một đối tượng có thể kiểm tra xem nó có đúng phiên bản của lớp Đối tượng Java có thể chứa tham chiếu đến các đối tượng khác Khi một đối tượng được tuần tự hóa, tất cả các đối tượng mà nó tham chiếu đến cũng được tuần tự hóa để đảm bảo rằng khi các đối tượng được xây dựng lại thì các tham chiếu cũng
Trang 9được thực hiện tại điểm đến Tham chiếu tuần tự như handles, trong trường hợp này handle là một tham chiếu đến một đối tượng trong hình thức tuần tự, ví dụ: các số tiếp theo trong một chuỗi các số nguyên dương, các thủ tục serialization phải đảm bảo rằng
có tương ứng 1 – 1 giữa các đối tượng tham chiếu và handle
Thông thường thuật toán Serialization sẽ thực hiện các công việc sau:
- Ghi xuống các siêu dữ liệu (metadata) về class (ví dụ như tên của class, version của class, tổng số các field của class,….) , của đối tượng đó
- Ghi đệ quy các thông tin chi tiết của các lớp cha cho tới khi nó gặp class Object
- Sau khi hoàn tất việc ghi các siêu dữ liệu, tiến trình sẽ bắt đầu ghi các dữ liệu thật sự của các đối tượng
Mỗi lớp được đưa ra một xử lý, và không có lớp được viết nhiều hơn một lần đến dòng byte (handle được viết thay vào đó khi cần thiết)
Nội dung của các biến là các loại cơ bản như: integers, chars, boolean, bytes hay longs được viết bằng một định dạng nhị phân bằng cách sử dụng phương pháp của lớp ObjectOutputStream Các chuỗi và các kí tự được viết bởi UTF, sử dụng phương thức UTF – 8 cho phép các kí tự ASCII được đại diện không đổi trong một byte, trong khi
đó các kí tự Unicode được đại diện bởi nhiều byte hơn Các chuỗi đều được bắt đầu bằng số byte mà nó chiếm trong dòng
Như một ví dụ, hãy xem xét các serialization của các đối tượng sau đây:
Person p = new Person ("Smith", "London", 1984);
Biến đầu tiên (1984) là một số nguyên có độ dài cố định, các biến tiếp theo là chuỗi và đứng đầu là số độ dài của nó Để sử dụng Java serialization, ví dụ để tuần tự hóa đối tượng Person, tạo ra một thể hiện của lớp ObjectOutputStream và gọi phương pháp writeObject của nó, đi qua các đối tượng Person như là đối số của nó Để giải tuần tự hóa một đối tượng từ một dòng dữ liệu, mở một ObjectInputStream trên dòng và sử dụng phương pháp readObject của nó để tái tạo lại các đối tượng ban đầu
Trang 10Serialization và deserialization của các đối số và kết quả của lời gọi từ xa thường được thực hiện tự động bởi lớp middleware, mà không có bất kỳ sự tham gia của các lập trình viên ứng dụng Nếu cần thiết các lập trình viên với những yêu cầu đặc biệt có thể viết thêm những phiên bản riêng của chính họ về phương pháp đọc và ghi đối tượng
Để tìm hiểu làm thế nào để làm điều này và có thêm thông tin về serialization trong Java, đọc các hướng dẫn về đối tượng serialization trong java.sun.com II
4.3.3 XML
XML (viết tắt từ tiếng Anh eXtensible Markup Language, "Ngôn ngữ đánh dấu
Mở rộng") là ngôn ngữ đánh dấu với mục đích chung do W3C đề nghị, để tạo ra các ngôn ngữ đánh dấu khác Đây là một tập con đơn giản của SGML, có khả năng mô tả nhiều loại dữ liệu khác nhau Mục đích chính của XML là đơn giản hóa việc chia sẻ dữ liệu giữa các hệ thống khác nhau, đặc biệt là các hệ thống được kết nối với Internet Các ngôn ngữ dựa trên XML: RDF, RSS, MathML, XHTML, SVG, GML và cXML, được định nghĩa theo cách thông thường, cho phép các chương trình sửa đổi và kiểm tra hợp lệ bằng các ngôn ngữ này mà không cần có hiểu biết trước về hình thức của chúng XML cung cấp một phương tiện dùng văn bản (text) để mô tả thông tin và áp
dụng một cấu trúc kiểu cây cho thông tin đó Tại mức căn bản, mọi thông tin đều thể hiện dưới dạng text, chen giữa là các thẻ đánh dấu (markup) với nhiệm vụ ký hiệu sự
phân chia thông tin thành một cấu trúc có thứ bậc của các dữ liệu ký tự, các phần
tử dùng để chứa dữ liệu, và các thuộc tính của các phần tử đó Về mặt đó, XML tương
tự với các biểu thức S (S-expression) của ngôn ngữ lập trình LISP ở chỗ chúng đều mô
tả các cấu trúc cây mà trong đó mỗi nút có thể có một danh sách tính chất của riêng mình.
Hình 4.10 cho thấy mô tả XML của cấu trúc Person trong đó:
- phần tử: một phần tử trong XML bao gồm nội dung dữ liệu nằm trong 2 thẻ mở và
đóng, ví dụ: dữ liệu Smith nằm trong cặp thẻ <name> và </name>, lưu ý phần tử này nằm trong phần tử khác với cặp thẻ <person id=”123456789”> và </person>đây
chính là cấu trúc có thứ bậc của dữ liệu trong XML