You are on page 1of 103

MỤC LỤC

MỤC LỤC................................................................................................................ 1
Chương 1 Giới thiệu chung (3 - 4 tiết) ............................................................... 4
1.1 Hệ thống và lập trình hệ thống ................................................................... 4
1.1.1 Khái niệm hệ thống............................................................................ 4
1.1.2 Lập trình hệ thống.............................................................................. 5
1.2 Lập trình hệ thống mạng............................................................................. 9
1.2.1 Mô hình kiến trúc hệ thống mạng...................................................... 9
1.2.2 Môi trường lập trình mạng............................................................... 10
Chương 2 Các mô hình trong lập trình mạng (4-5 tiết) .................................... 16
2.1 Mô hình truyền thông trong kiến trúc mạng............................................. 16
2.1.1 Nguyên tắc truyền thông.................................................................. 16
2.1.2 Mô hình truyền thông đơn giản 3 tầng ............................................ 18
2.2 Mô hình tính toán phân tán Client/Server (khách/chủ) ............................ 23
2.2.1 Tổng quan ........................................................................................ 24
2.2.2 Sự phân lớp trong mô hình Client/Server ........................................ 28
2.3 Giao thức cho ứng dụng Client/Server ..................................................... 34
2.3.1 Giao thức.......................................................................................... 34
2.3.2 Phân loại giao thức .......................................................................... 34
2.3.3 Các yêu cầu đối với giao thức.......................................................... 35
2.3.4 Mô tả giao thức POP3...................................................................... 38
Chương 3 Lập trình với TCP socket (12 tiết) ................................................... 39
3.1 Giao thức TCP .......................................................................................... 39
3.1.1 Mô hình tham chiếu ......................................................................... 39
3.1.2 Thiết lập liên kết .............................................................................. 40
3.1.3 Truyền nhận dữ liệu ......................................................................... 42
3.1.4 Đóng liên kết.................................................................................... 43
3.2 Lập trình WinSock.................................................................................... 43

1
3.2.1 Giới thiệu BSD Socket.................................................................... 43
3.2.2 Tổng quan WinSock ........................................................................ 44
3.2.3 Khởi tạo và giải phóng Winsock ..................................................... 49
3.2.4 Hai chế độ làm việc trong Winsock................................................. 51
3.2.5 Chuyển đổi số và địa chỉ IP ............................................................. 53
3.2.6 Truy vấn địa chỉ, hostname, cổng và dịch vụ .................................. 55
3.2.7 Truyền thông client/server hướng kết nối........................................ 61
3.2.8 Ví dụ ứng dụng Client/Server sử dụng TCP.................................... 69
Chương 4 Lập trình với UDP Socket................................................................ 70
4.1 Giao thức UDP ......................................................................................... 70
4.2 Lập trình Datagram socket........................................................................ 70
4.2.1 Bước chuẩn bị trước khi truyền thông ............................................. 71
4.2.2 Gửi và nhận các gói tin UDP ........................................................... 72
4.2.3 Ứng dụng Client/Server dựa vào UDP, so sánh với TCP................ 74
4.2.4 Ví dụ về ứng dụng Client/Server sử dụng UDP .............................. 74
Chương 5 Các kĩ thuật trong Client/Server ...................................................... 75
5.1 Lập trình Multicast ................................................................................... 75
5.1.1 Multicast và Broadcast..................................................................... 75
5.1.2 Sử dụng Multicast ............................................................................ 76
5.2 Vấn đề xử lí đồng thời tại server và lập trình đa luồng ( Multithreading) 83
5.3 Tường lửa Firewall và máy chủ proxy ..................................................... 84
Chương 6 Truyền thông giữa các tiến trình...................................................... 87
6.1 Truyền thông Serialization ....................................................................... 87
6.2 Truyền thông Named Pipes ...................................................................... 87
6.3 Chia sẻ bộ nhớ .......................................................................................... 87
6.4 Lời gọi thủ tục phân tán (RPC)................................................................. 87
Chương 7 Giới thiệu Hệ phân tán..................................................................... 88
7.1 Hệ phân tán (Distributed System) ............................................................ 88
7.1.1 Phân loại hệ phân tán ....................................................................... 90

2
7.1.2 Các đặc trưng của hệ phân tán: ........................................................ 93
Phụ lục.................................................................................................................. 102

3
Chương 1 Giới thiệu chung (3 - 4 tiết)
Sau khi giới thiệu về môn học, mục đích của chương 1 là giúp SV có một cái nhìn
tổng quan về hệ thống và lập trình hệ thống nói chung , hệ thống mạng và lập trình
hệ thống mạng nói riêng.

1.1 Hệ thống và lập trình hệ thống


Khái quát về khái niệm hệ thống
Ta vẫn nói nhiều về hệ thống trong các lĩnh vực khác nhau của công nghệ thông
tin, ví dụ : hệ thống thông tin, hệ thống viễn thông, tích hợp hệ thống, phân tích và
thiết kế hệ thống, hệ thống mạng.
Người kỹ sư phần mềm cũng như kỹ sư mạng khi thiết kế, xây dựng hay vận hành,
quản trị một hệ thống cần hiểu rõ về hệ thống đó. Vậy thì ta hiểu ntn được gọi là
hệ thống ?

1.1.1 Khái niệm hệ thống


Khái niệm tổng quát:
Hệ thống là tập hợp của một số các đối tượng, các thực thể, các nguyên tố có sự
liên quan với nhau tạo thành một khối liên kết hợp nhất. Trong đó, các đối tượng,
thực thể, nguyên tố có tính chất và hoạt động có thể khác nhau nhưng phối hợp với
nhau để cùng thực hiện một mục đích chung.

Hệ thống máy tính : Máy tính (computer) là một hệ thống gồm nhiều thành phần.
Các thành phần đó có thể chia ra thành 2 nhóm: hệ thống phần cứng và hệ thống
phần mềm. Hệ thống phần cứng (theo kiến trúc máy tính) bao gồm các khối chức
năng như : bộ xử lý trung tâm, tập hợp các đường bus, khối quản lý bộ nhớ,
DMAC, khối điều khiển I/O, bộ nhớ RAM, hệ thống lưu trữ, các thiết bị ngoại vi...
Hệ thống phần mềm bao gồm phần mềm hệ thống và các phần mềm ứng dụng.
Hoạt động của máy tính dựa trên hoạt động và tương tác của các thành phần trên.

4
Như vậy, máy tính mà chúng ta đang sử dụng là một hệ thống rất phức tạp gồm rất
nhiều các thành phần khác nhau.

Hệ thống mạng: là tập hợp các máy tính, các thiết bị tự trị được kết nối với nhau
qua các đường truyền và theo kiến trúc mạng. Mỗi máy tính, hay thiết bị là một
thành phần của hệ thống mạng.

1.1.2 Lập trình hệ thống

1) Tổng quan
Khái niệm hệ thống trong CNTT thông tin trải dài trong nhiều mảng lĩnh vực khác
nhau. Ta gặp hệ thống ở mọi nơi với các quy mô và độ phức tạp khác nhau và có
thể có sự đan xen giữa các hệ thống. Ví dụ :
Một hệ thống thông tin được phân tán tại các vị trí địa lí khác nhau sẽ phải dựa
trên một hệ thống mạng truyền thông và các ứng dụng phần mềm. Các phần mềm
đó có thể chạy trên các máy tính khác nhau về cả kiến trúc phần cứng và hệ điều
hành. Mỗi máy tính là một hệ thống độc lập nhưng nhờ có kết nối mạng với nhau
và có phần mềm truyền thông nên người dùng vẫn có thể sử dụng mà không cần
quan tâm đến sự khác nhau đó. Tất cả tạo thành một hệ thống hoàn chỉnh phục vụ
cho mục đích của người dùng.
Đến đây ta cần làm rõ khái niệm lập trình hệ thống và các đối tượng của lập trình
hệ thống.
Định nghĩa :
Lập trình hệ thống được hiểu là hoạt động xây dựng và bảo trì, ở mức thấp (low-
level), các phần mềm hệ thống cho các hệ thống máy tính

Phần mềm hệ thống là thuật ngữ chung để chỉ các chương trình máy tính hoặc thư
viện phần mềm giúp cho hệ thống máy hoạt động, khác với phần mềm ứng dụng
dùng để trợ giúp giải quyết các bài toán hoặc cho phép người dùng sử dụng máy
tính để thực hiện các công việc tùy theo mục đích và yêu cầu. Phần mềm hệ thống

5
bao gồm hệ điều hành, các tiện ích hệ thống, các thư viện hệ thống, chương trình
dịch...

Lập trình hệ thống thường khác biệt so với lập trình ứng dụng và các lập trình viên
có xu hướng chuyên môn hóa vào một hoặc một số lĩnh vực. Đặc điểm nổi bật
nhất của lập trình hệ thống là hướng vào các thiết bị phần cứng mà các phần mềm
hoạt động bên trên, từ các dạng phát triển trình điều khiển thiết bị, sử dụng ngôn
ngữ assembly, cho đến việc thiết kế các chương trình dịch khai thác tối đa đặc tính
của hệ thống phần cứng.

Trong lập trình hệ thống, thường các tiện ích, công cụ lập trình bị giới hạn. Các kỹ
thuật như quản lý bộ nhớ tự động (garbage collection) là không phổ biến và công
việc bắt lỗi (debug) đôi lúc rất khó khăn. Các thư viện runtime, để đảm bảo gọn
nhẹ và tối ưu, thường rất ít thực hiện việc bắt kiểm soát lỗi. Vì vậy, cần phải giám
sát và ghi lại mọi hoạt động của hệ thống (logging); hệ điều hành thường có hệ
thống giám sát và logging rất chặt chẽ và chi tiết

Lúc đầu, những người lập trình hệ thống thường viết chương trình bằng ngôn ngữ
assembly. Tuy nhiên, do các hệ thống phần cứng đã dần hỗ trợ các ngôn ngữ bậc
cao. Ngày nay, C và C++ là ngôn ngữ phổ biến cho lập trình hệ thống.

Tuy nhiên, lập trình hệ thống không hoàn toàn chỉ là lập trình trên phần cứng. Khi
tốc độ xử lí và bộ nhớ của máy tính ngày càng mở rộng và với nhiều chuẩn ghép
nối như PCI, AGP, USB1.1, 2.0, các thiết bị phần cứng có thể ghép nối với máy
tính ngày càng nhiều và đi cùng nó là các ứng dụng khác nhau. Mặt khác, các phần
mềm tiện ích hệ thống cũng rất phát triển, đòi hỏi các ứng dụng cần được viết sao
cho gần với hệ thống hơn, tận dụng được đặc tính của các thiết bị phần cứng. Vì
vậy hệ điều hành đã cung cấp một giao diện các hàm hệ thống cho phép người lập
trình có thể giao tiếp với hệ thống ở các mức độ khác nhau từ cao đến thấp.

6
Giao diện lập trình ứng dụng:
API (giao diện lập trình ứng dụng) là giao diện qua đó các chương trình ứng dụng
truy nhập hệ điều hành và các dịch vụ khác. Các API được định nghĩa trong mã
nguồn cụ thể thông qua lập trình hệ thống và cung cấp một giao diện ở mức khái
quát giữa ứng dụng và nhân của hệ điều hành để đảm bảo tính khả chuyển của mã

API cũng có thể cung cấp giao diện giữa các ngôn ngữ bậc cao và các tiện ích, các
dịch vụ cấp thấp. Khi đó, nhiệm vụ chính của API là chuyển đổi danh sách tham
số từ dạng ứng với ngôn ngữ đó sang dạng được hiểu bởi tiện ích hay dịch vụ của
hệ thống.

Đối với các hệ thống mở như Linux, các lập trình viên và các nhà phát triển có thể
tham khảo mã nguồn và sửa đổi và phát triển hệ thống ở mức thấp nhất. Đối với hệ
điều hành đóng như Window, người lập trình bị hạn chế và không thể can thiệp
quá sâu vào hệ điều hành. Trong trường hợp phát triển trình điều khiển thiết bị,
Window cung cấp giao diện với hệ thống thông qua bộ DDK (Driver Development
Kit ). Trong trường hợp các hãng thứ 3 phát triển phần mềm tiện ích cấp thấp cần
can thiệp sâu, ví dụ như Norton Utilities, hoặc các nhà sản xuất phần cứng muốn
thiết bị của mình hoạt động được trên hệ điều hành Window thì họ phải mua giấy
phép để được Microsoft hỗ trợ trong quá trình phát triển. Khi hệ điều hành được
nâng cấp hay thay đổi phiên bản thì các phần mềm hoặc trình điều khiển cũng phải
được sửa đổi hoặc làm lại để tương thích.

2) Đối tượng trong lập trình hệ thống


Các hệ thống máy tính lập trình được:
Các hệ điều khiển, hệ nhúng (controller, system on chip, embedded
system ) dùng bộ vi xử lí chạy các chương trình nạp từ bộ nhớ ROM khi
khởi động. Có hệ thống có thể có hệ điều hành nhưng ở cấp độ đơn giản

7
và nhỏ gọn, yêu cầu đáp ứng thời gian thực (realtime). Không có giao
diện người dùng, hay thiết bị ngoại vi
Các máy tính và thiết bị cầm tay (pocket PC, Smart phone): có hạt nhân
hệ điều hành (Kernel), có giao diện API và ứng dụng. Có thể có thiết bị
ngoại vi ( thường là bàn phím và thiết bị lưu trữ )
Các máy tính đa năng (IBM PC, Macintosh, IBM AS400, SUN SPARC)
Các hệ phân tán gồm nhiều hệ thống máy tính kết nối với nhau.
Ngôn ngữ lập trình
Tập lệnh máy
Ngôn ngữ Assembly
Các ngôn ngữ bậc cao như C/C++
Một số ngôn ngữ dành riêng cho từng hệ thống
Công cụ lập trình
Thư viện lập trình
Các trình biên dịch : MASM, TASM, Turbo C/C++, Visual C++, C++
Builder và nhiều trình biên dịch chuyên dụng khác...
Các bộ nạp: Loader dùng để nạp chương trình cho các thiết bị
Các bộ mô phỏng (Simulator): Là phần mềm giả lập, mô phỏng các thiết
bị trên máy tính. Để phát triển ứng dụng cho máy cầm tay trên hệ điều
hành Window CE, Ms cung cấp một bộ giả lập Win CE trên máy PC.
Hoặc phần mềm giả lập mobiphone để test các chương trình viết cho
mobi phone.

3) Tại sao cần lập trình hệ thống


Xây dựng hệ thống
Khai thác các tính năng của hệ thống, phát triển ứng dụng
Để mở rộng chức năng
Để tích hợp
Để bảo trì và nâng cấp

8
1.2 Lập trình hệ thống mạng

1.2.1 Mô hình kiến trúc hệ thống mạng


Kiến trúc mạng gồm có topology và kiến trúc phân tầng các giao thức truyền
thông.
Topology chỉ là cấu hình kết nối vật lý không liên quan đến việc lập trình
Hệ thống các tầng giao thức mạng (ví dụ như OSI hay TCP/IP) là các thực thể
phần cứng, phần mềm đảm bảo hoạt động của hệ thống mạng.
Đối tượng lập trình hệ thống mạng chính là các thực thể phần mềm thực thi
giao thức trong hệ thống mạng.
Xét về mục đích, hệ thống mạng máy tính (cũng giống như máy tính) hướng tới
phục vụ người dùng, giúp người dùng giải quyết các vấn đề khác nhau thông
qua các phần mềm ứng dụng mạng (hay còn gọi là phần mềm phân tán). Các
phần mềm này được xây dựng trên nền tảng hệ thống máy tính bao gồm phần
cứng và hệ điều hành, đồng thời dựa trên kiến trúc phân tầng mạng (như mô
hình tham chiếu OSI),
Phần mềm sẽ thuộc tầng ứng dụng và phải sử dụng các dịch vụ do các thực thể
tầng dưới cung cấp.
Như vậy ta có thể hiểu lập trình hệ thống mạng như sau : lập trình hệ thống
mạng là tạo ra các thực thể phần mềm hoạt động trên một tầng trong mô hình
kiến trúc phân tầng OSI (hoặc một mô hình phân tầng mạng nào đó, ví dụ như
TCP/IP) có sử dụng đến các dịch vụ của các thực thể tầng kề dưới và cung cấp
dịch vụ cho các thực thể tầng trên. Đối với tầng ứng dụng, lập trình mạng là
cung cấp dịch vụ cho người dùng
Lập trình hệ thống mạng thường gắn liền với nền tảng hệ thống máy tính tương
ứng. Ví dụ như lập trình mạng trong Window, lập trình mạng trong UNIX có sự
khác biệt.
Có môi trường máy ảo như môi trường Java cho phép lập trình mạng trên nhiều
hệ thống khác nhau với mã nguồn giống nhau. Khi đó, lập trình mạng thường ở

9
mức cao trong mô hình 7 tầng. Mức độ chi tiết (specific) giảm và mức trừu
tượng (general) tăng. Ví dụ : Cùng một công việc, cùng một thực thể, khi viết
mã trong Window khác với viết mã trong UNIX. Nếu viết trên Java thì khi
được thực thi, máy ảo Java sẽ thực hiện theo cơ chế của hệ thống chủ, có thể là
Window hay UNIX. Và công việc vẫn được thực thi chính xác mà không phải
đổi lại mã nguồn.

1.2.2 Môi trường lập trình mạng


Trong phạm vi môn học, ta sẽ tập trung vào kĩ thuật lập trình sử dụng dịch vụ tại
tầng Transport để xây dựng các ứng dụng mạng. Trước hết ta cần xem xét môi
trường cho công việc lập trình.

1) Hạ tầng mạng truyền thông


Một ứng dụng hay một dịch vụ mạng cần có hạ tầng mạng bên dưới khi hoạt động.
Tùy theo các yếu tố kĩ thuật hay yêu cầu đối với ứng dụng mà ta cần phải lựa chọn
loại mạng cho ứng dụng và dịch vụ.
Mạng cục bộ LAN : đặc trưng về kĩ thuật của LAN là băng thông rộng, tốc độ
truyền dữ liệu cao và tỉ suất lỗi thấp. Do đó, LAN thích hợp với một lớp rộng
các ứng dụng mạng : từ những ứng dụng cơ bản như thư điện tử, chia sẻ file đến
các ứng dụng phân tán đòi hỏi băng thông như các ứng dụng database có mật độ
truy suất cao, các ứng dụng đa phương tiện với chất lượng dịch vụ cao.
Mạng diện rộng: Có nhiều kĩ thuật để lắp đặt một mạng WAN như lease-line,
Frame Relay, ISDN, ATM... Mỗi kĩ thuật có băng thông, tốc độ khác nhau và
do đó chi phí cũng khác nhau. Nói chung, WAN thường kết nối các LAN ở xa
nhau, và chi phí cho việc lắp đặt, thuê bao, vận hành và bảo trì WAN thường
tốn kém hơn LAN rất nhiều. Tuy nhiên, WAN đem lai lợi ích rất to lớn khi
công ty, tổ chức tiết kiệm được rất nhiều thời gian và tiền bạc nếu sử dụng
WAN cho các chi nhánh ở nhiều nơi. Thông thường, các ứng dụng dịch vụ đòi
hỏi băng thông lớn sẽ được đặt tại LAN, còn đường WAN thường sử dụng cho

10
mục đích truyền số liệu, kết nối từ xa, hội thảo từ xa, điện thoại VoIP. Ví dụ:
tổng công ty bảo hiểm Bảo Việt đầu tư cho đường truyền nối giữa trụ sở HN và
TP HCM để phục vụ ứng dụng hội thảo trực truyến và chuyển giao tài liệu, mỗi
tháng tiết kiệm được cả tỉ đồng. Nhà máy bia Hà Tây đặt một đường kết nối
giữa nhà máy và văn phòng tại HN, sử dụng VoIP để chuyển cuộc gọi từ nhà
máy lên HN thành cuộc gọi nội vùng tiết kiệm được chi phí viễn thông...
Internet : Úng dụng của Internet thì ai cũng biết. Hiện nay, do sự mở rộng, phát
triển mãnh mẽ và sự không đồng nhất thì nói chung Internet là môi trường kém
ổn định và không an toàn nhất so với LAN và WAN. Tuy nhiên, xu hướng phát
triển của Internet là tăng cường mở rộng băng thông và an toàn an ninh trên
mạng. Đối với Internet, ngoài các dịch vụ cơ bản như email, web với mục đích
giải trí, giao lưu, học tập, trao đổi tin tức, các dịch vụ cho doanh nghiệp, tổ chức
cũng đang ngày càng phát triển mạnh như thương mại điện tử, giao dịch trực
tuyến, các dịch vụ Web. Một số nhà cung cấp dịch vụ lớn như Yahoo đã triển
khai rất nhiều các dịch vụ trực tuyến cho toàn thế giới. Ta có thể thấy các dịch
vụ đó ngay tại trang chủ Yahoo. Ngoài ra còn có MSN của Microsoft, AOL...
Ngay cả dịch vụ tìm kiếm trên mạng cũng đang nở rộ, tiêu biểu với sự thành
công của Google. Công nghệ tìm kiếm của Google hiện nay vẫn là một bí mật.
Trong một môi trường luôn luôn sôi động như vậy, xây dựng dịch vụ và ứng
dụng trên Internet là không thể bỏ qua. Vấn đề quan trọng bậc nhất hiện nay với
Internet là vấn đề an toàn an ninh. Microsoft khi đưa ra nền tảng .NET là có
tham vọng xây dựng hệ thống và phần mềm của mình trên nền Internet, thống
nhất Internet với công nghệ của Microsoft. Tuy nhiên, tham vọng đó không
phải đạt được dễ dàng vì còn quá nhiều vấn đề, trong đó có an ninh an toàn, bảo
mật mà hiện nay, Microsoft vẫn đang là mục tiêu số 1 của các tin tặc trên
Internet.

11
2) Hệ điều hành
Như đã nói trong phần trên, phần mềm mạng hoạt động trên một hoặc nhiều hệ
thống máy tính nào đó. Do đó ta phải xem xét đến môi trường hệ thống, cụ thể là
hệ điều hành. Hiện nay, có một số hệ điều hành phổ biến:
UNIX là hệ điều hành do các nhà khoa học tại nhiều viện nghiên cứu, phòng thí
nghiệm (Bell Lab) khởi đầu xây dựng nên và được dùng rất phổ biến trong giới
khoa học và giáo dục. Sau một thời gian chứng minh được tính năng ưu việt,
một số công ty tập đoàn đã phát triển hệ thống UNIX của riêng công ty, ví dụ
HP UNIX, IBM UNIX, SUN SOLARIS...Hệ điều hành UNIX là hệ điều hành
đa nhiệm, đa người sử dụng và phục vụ truyền thông rất tốt. Tuy nhiên, UNIX
có hạn chế là có nhiều phiên bản, phức tạp trong quản trị và sử dụng, đòi hỏi
phải chạy trên các máy Server với cấu hình rất mạnh.
LINUX do Linus Tovald bắt đầu phát triển từ nhân của MINIX (một hệ điều
hành UNIX thu nhỏ được phát triển bởi A.Tanenbaum) với mục đích tạo ra mọt
hệ điều hành mới cho PC. Sau đó, cộng đồng mã nguồn mở đã tiếp tục cùng
phát triển Linux. Nhiều hãng cũng đã hỗ trợ và cho ra các phiên bản Linux khác
nhau như RedHat Linux, Mandrake Linux...Đồng thời các quốc gia cũng phát
triển hệ điều hành dựa trên Linux cho riêng mình như Hồng Kì của Trung Quốc
hay phiên bản Việt hóa Vietkey Linux của Việt Nam. Hiện nay, Linux được
dùng cả trên máy trạm, máy chủ và cả siêu máy tính, dần dần trở thành một đối
trọng cạnh tranh với cả Ms Window và UNIX nhờ các tính năng ưu việt. Giống
như UNIX, Linux cũng là hệ điều hành đa nhiệm, đa người dùng, tính ổn định
cao, hỗ trợ truyền thông tốt, có giao diện đồ họa XWindow và hơn cả là gần
như miễn phí (theo quy định về giấy phép sử dụng của GNU, GNU’s not
UNIX)
Window NT, Win32 bit là hệ điều hành của hãng Microsoft, cũng là hệ điều
hành đa nhiệm, đa người sử dụng, với các tính năng hỗ trợ mạng. Đặc điểm của
WinNT là tương đối dễ sử dụng (đúng phong cách của Microsoft), có các phiên
bản cho cả máy trạm và máy chủ. Ưu điểm nữa của WinNT là có số lượng các

12
ứng dụng rất lớn, được Microsoft phát triển nên tương thích với các phiên bản
Window khác khi kết nối mạng. WinNT cũng liên kết tốt với máy chủ Novell
Netware. Tuy nhiên, để chạy hiệu quả, WinNT cũng đòi hỏi cấu hình máy
tương đối mạnh.

3) Tập các giao thức


Trong chương trình này, ta thống nhất sử dụng bộ giao thức TCP/IP do các lí do
sau:
Là bộ giao thức phổ biến nhất, có thể dùng cho mọi loại mạng. TCP/IP là giao
thức dùng cho LAN, WAN và đặc biệt là Internet.
Mọi hệ điều hành, các thiết bị phần cứng đều hỗ trợ TCP/IP
Các giao thức trong TCP/IP đã được học trong học phần Mạng máy tính.

4) Ngôn ngữ lập trình và công cụ phát triển


Nói đến lập trình thì không thể không nói đến ngôn ngữ lập trình. Về lập trình
mạng nói chung, có rất nhiều ngôn ngữ cho phép các lập trình viện thực thi các tác
vụ qua mạng dựa trên các bộ thư viện khác nhau. Phổ biến và thông dụng nhất là
các ngôn ngữ sau
C/C++
Java
Basic
Delphi
Ngoài ra còn một số ngôn ngữ lập trình khác như Perl, PHP, Python...

5) Một số chú ý về kỹ thuật lập trình


Trong lập trình mạng, nhiều kĩ thuật lập trình khác nhau có thể áp dụng
Lập trình thủ tục (thông thường và quen thuộc)
o Chia chương trình thành các subroutine, thường được sử dụng trong
lập trình với hệ điều hành UNIX và lập trình SDK với Win32
Lập trình hướng đối tượng

13
o Thiết kế chương trình theo phương pháp hướng đối tượng, đóng gói
hàm thư viện phục vụ lập trình mạng thành các lớp đối tượng và sử
dụng một số các thư viện đối tượng có sẵn. Ví dụ như lập trình MFC
với Win32.
Lập trình đa luồng
o Để tận dụng khả năng của bộ xử lí, cho ứng dụng có khả năng chạy
đồng thời, thực hiện nhiều tác vụ cùng một lúc.
o Kĩ thuật lập trình đa luồng có theo một số nguyên tắc chung nhưng
sẽ có sự khác nhau theo từng hệ điều hành
Phong cách lập trình
o Nguyên tắc chung về lập tài liệu, chú thích, cách đặt tên, cách sắp
xếp mã, cách debug và sửa đổi nâng cấp, quản lí các phiên bản
chương trình bằng các tiện ích như CVS (Concurrent Version
System), Ms Visual SourceSafe
o Đối với từng ngôn ngữ như C++, Basic, Java...

6) Tài nguyên
Cộng đồng mã nguồn mở:
Hiện nay, phong trào mã nguồn mở trên thế giới đang phát triển rất mạnh nhờ
những tính chất như chia sẻ, cộng đồng, phi lợi nhuận và thường xuyên được
kiểm tra cũng như cập nhật.
Ở Việt Nam, một vài năm gần đây mới bắt đầu chú trọng đến OpenSource với
một số hội thảo và chương trình đào tạo và mã nguồn mở. Sinh viên là một bộ
phận rất quan trọng trong mã nguồn mở ( không chỉ đối với VN mà cả thế giới
vì cộng đồng nguồn mở đa phần tuổi đời rất trẻ- Linus Tovald bắt đầu viết
Linux khi đang là SV năm thứ 2 khoa CS đại học Helsinki ở Finland). Hôm
28/08 ở đại học BK HN đã tổ chức ngày Tự do phần mềm Softwarefreedom
Day. Trong các cuộc thi Trí tuệ Việt Nam gần đây, các sản phẩm được giải cao
đều ít nhiều dựa trên các phần mềm nguồn mở miễn phí. Và một mục tiêu đặt ra

14
đối với Việt Nam là phải đào tạo nguồn nhân lực để phát triển phần mềm nguồn
mở.
Đối với sinh viên CNTT thì phần mềm nguồn mở, các chương trình mã nguồn
mở trên Internet là tài nguyên tham khảo có giá trị. Tuy nhiên khi sử dụng phải
tuân thủ các quy tắc của GNU và của tác giả, chỉ sử dụng trong khuôn khổ cho
phép. Khi làm đồ án, việc tham khảo là cần thiết nhưng phải đảm bảo được :
o Hiểu được cách làm trong chương trình tham khảo
o Không được phép sao chép mà phải phát triển thêm. Đó cũng chính
là cách phát triển của mã mở. Mỗi người đóng góp một phần để phần
mềm ngày càng hoàn thiện hơn.

15
Chương 2 Các mô hình trong lập trình mạng (4-5 tiết)
Nội dung tóm tắt :
Giới thiệu khái quát phương thức truyền thông trong kiến trúc phân tầng của mạng
máy tính và tổng quan về hệ phân tán. Từ đó, trình bày các mô hình cụ thể hơn
như mô hình tính toán phân tán Client/Server và mạng ngang hàng Peer to Peer
Nhiệm vụ của lập trình mạng là tạo ra các thực thể thực thi các giao thức truyền
thông. Cốt lõi trong lập trình mạng cũng là đảm bảo vấn đề truyền thông hiệu quả
chính xác.

2.1 Mô hình truyền thông trong kiến trúc mạng

2.1.1 Nguyên tắc truyền thông


Để một mạng máy tính trở một môi trường truyền dữ liệu thì nó cần phải có những
yếu tố sau:
Các hệ thống được liên kết với nhau theo một cấu trúc kết nối (topology) nào
đó
Việc chuyển dữ liệu từ máy tính này đến máy tính khác do mạng thực hiện
thông qua những quy định thống nhất gọi là giao thức của mạng.
Phân chia hoạt động truyền thông của hệ thống thành nhiều lớp theo các
nguyên tắc nhất định

Việc xét các module một cách độc lập với nhau cho phép giảm độ phức tạp cho
việc thiết kế và cài đặt. Phương pháp này được sử dụng rộng rãi trong việc xây
dựng mạng và các chương trình truyền thông và được gọi là phương pháp phân
tầng (layer).
Nguyên tắc của phương pháp phân tầng là:

16
Mỗi hệ thống thành phần trong mạng được xây dựng như một cấu trúc nhiều
tầng và đều có cấu trúc giống nhau như: số lượng tầng và chức năng của mỗi
tầng.
Các tầng nằm chồng lên nhau, dữ liệu được chỉ trao đổi trực tiếp giữa hai tầng
kề nhau từ tầng trên xuống tầng dưới và ngược lại.
Cùng với việc xác định chức năng của mỗi tầng chúng ta phải xác định mối
quan hệ giữa hai tầng kề nhau. Dữ liệu được truyền đi từ tầng cao nhất của hệ
thống truyền lần lượt đến tầng thấp nhất sau đó truyền qua đường nối vật lý
dưới dạng các bit tới tầng thấp nhất của hệ thống nhận, sau đó dữ liệu được
truyền ngược lên lần lượt đến tầng cao nhất của hệ thống nhận.
Chỉ có hai tầng thấp nhất có liên kết vật lý với nhau còn các tầng trên cùng thứ
tư chỉ có các liên kết logic với nhau. Liên kết logic của một tầng được thực hiện
thông qua các tầng dưới và phải tuân theo những quy định chặt chẽ, các quy
định đó được gọi giao thức của tầng.

17
2.1.2 Mô hình truyền thông đơn giản 3 tầng
Trong kiến trúc phân tầng, một số mô hình được phát triển :
Mô hình tham chiếu kết nối các hệ thống mở OSI
Mô hình Internet : TCP/IP
Xét trên phương diện lập trình với máy tính, ta xét mô hình phân tầng thu gọn :
mô hình truyền thông đơn giản 3 tầng .
Nói chung trong truyền thông có sự tham gia của các thành phần: các chương
trình ứng dụng, các chương trình truyền thông, các máy tính và các mạng. Các
chương trình ứng dụng là các chương trình của người sử dụng được thực hiện trên
máy tính và có thể tham gia vào quá trình trao đổi thông tin giữa hai máy tính.
Trên một máy tính với hệ điều hành đa nhiệm (như Windows, UNIX) thường
được thực hiện đồng thời nhiều ứng dụng trong đó có những ứng dụng liên quan
đến mạng và các ứng dụng khác. Các máy tính được nối với mạng và các dữ liệu
được trao đổi thông qua mạng từ máy tính này đến máy tính khác.
Việc gửi dữ liệu được thực hiện giữa một ứng dụng với một ứng dụng khác trên
hai máy tính khác nhau thông qua mạng được thực hiện như sau: Ứng dụng gửi
chuyển dữ liệu cho chương trình truyền thông trên máy tính của nó, chương trình
truyền thông sẽ gửi chúng tới máy tính nhận. Chương trình truyền thông trên máy
nhận sẽ tiếp nhận dữ liệu, kiểm tra nó trước khi chuyển giao cho ứng dụng đang
chờ dữ liệu.
Với mô hình truyền thông đơn giản người ta chia chương trình truyền thông thành
ba tầng không phụ thuộc vào nhau là: tầng ứng dụng, tầng giao vận và tầng tiếp
cận mạng.
Tầng tiếp cận mạng liên quan tới việc trao đổi dữ liệu giữa máy tính và mạng
mà nó được nối vào. Để dữ liệu đến được đích máy tính gửi cần phải chuyển
địa chỉ của máy tính nhận cho mạng và qua đó mạng sẽ chuyển các thông tin tới
đích. Ngoài ra máy gửi có thể sử dụng một số phục vụ khác nhau mà mạng
cung cấp như gửi ưu tiên, tốc độ cao. Trong tầng này có thể có nhiều phần mềm

18
khác nhau được sử dụng phụ thuộc vào các loại của mạng ví dụ như mạng
chuyển mạch, mạng chuyển mạch gói, mạng cục bộ.
Tầng giao vận thực hiện quá trình truyền thông end-to-end giữa 2 ứng dụng
không liên quan tới mạng và nằm ở trên tầng tiếp cận mạng. Tầng truyền dữ
liệu không quan tâm tới bản chất các ứng dụng đang trao đổi dữ liệu mà quan
tâm tới làm sao cho các dữ liệu được trao đổi một cách an toàn. Tầng truyền dữ
liệu đảm bảo các dữ liệu đến được đích và đến theo đúng thứ tự mà chúng được
xử lý. Trong tầng truyền dữ liệu người ta phải có những cơ chế nhằm đảm bảo
sự chính xác đó và rõ ràng các cơ chế này không phụ thuộc vào bản chất của
từng ứng dụng và chúng sẽ phục vụ cho tất cả các ứng dụng.
Tầng ứng dụng sẽ chứa các module phục vụ cho tất cả những ứng dụng của
người sử dụng. Với các loại ứng dụng khác nhau (như là truyền file, truyền thư
mục) cần các module khác nhau.

Mô hình truyền thông 3 tầng

Trong một mạng với nhiều máy tính, mỗi máy tính một hay nhiều ứng dụng thực
hiện đồng thời (Tại đây ta xét trên một máy tính trong một thời điểm có thể chạy
nhiều ứng dụng và các ứng dụng đó có thể thực hiện đồng thời việc truyền dữ liệu
qua mạng). Một ứng dụng khi cần truyền dữ liệu qua mạng cho một ứng dụng
khác cần phải gọi 1 module tầng ứng dụng của chương trình truyền thông trên máy
của mình, đồng thời ứng dụng kia cũng sẽ gọi 1 module tầng ứng dụng trên máy

19
của nó. Hai module ứng dụng sẽ liên kết với nhau nhằm thực hiện các yêu cầu của
các chương trình ứng dụng.
Các ứng dụng đó sẽ trao đổi với nhau thông qua mạng, tuy nhiên trong 1 thời điểm
trên một máy có thể có nhiều ứng dụng cùng hoạt động và để việc truyền thông
được chính xác thì các ứng dụng trên một máy cần phải có một địa chỉ riêng biệt.
Rõ ràng cần có hai lớp địa chỉ:
Mỗi máy tính trên mạng cần có một địa chỉ mạng của mình, hai máy tính trong
cùng một mạng không thể có cùng địa chỉ, điều đó cho phép mạng có thể truyền
thông tin đến từng máy tính một cách chính xác.
Mỗi một ứng dụng trên một máy tính cần phải có địa chỉ phân biệt trong máy tính
đo. Nó cho phép tầng truyền dữ liệu giao dữ liệu cho đúng ứng dụng đang cần. Địa
chỉ đó được gọi là điểm tiếp cận giao dịch. Điều đó cho thấy mỗi một ứng dụng sẽ
tiếp cận các phục vụ của tầng truyền dữ liệu một cách độc lập.
Các module cùng một tầng trên hai máy tính khác nhau sẽ trao đổi với nhau một
cách chặt chẽ theo các qui tắc xác định trước được gọi là giao thức. Một giao thức
được thể hiện một cách chi tiết bởi các chức năng cần phải thực hiện như các giá
trị kiểm tra lỗi, việc định dạng các dữ liệu, các quy trình cần phải thực hiện để trao
đổi thông tin.

20
Ví dụ mô hình truyền thông đơn giản

Chúng ta hãy xét trong ví dụ (như hình vẽ trên): giả sử có ứng dụng có điểm cuối
(end-point) truyền thông 1 trên máy tính A muốn gửi thông tin cho một ứng dụng
khác trên máy tính B qua điểm cuối 2. Ứng dụng trên máy tính A chuyển các
thông tin xuống tầng giao vận của A với yêu cầu gửi chúng cho điểm cuối 2 trên
máy tính B. Tầng giao vận máy A sẽ chuyển các thông tin xuống tầng tiếp cận
mạng máy A với yêu cầu chuyển chúng cho máy tính B (Chú ý rằng mạng không
cần biết địa chỉ của điểm tiếp cận giao dịch mà chỉ cần biết địa chỉ của máy tính
B). Để thực hiện quá trình này, các thông tin kiểm soát cũng sẽ được truyền cùng
với dữ liệu.
Đầu tiên khi ứng dụng 1 trên máy A cần gửi một khối dữ liệu nó
Chuyển khối dữ liệu đó cho tầng giao vận.
Tầng giao vận có thể chia khối đó ra thành nhiều đoạn dữ liệu phụ thuộc vào
yêu cầu của giao thức của tầng. Tầng giao vận sẽ chuyển đoạn dữ liệu cho tầng
tiếp cận mạng.

21
Tầng này sẽ đóng gói chúng thành các gói tin (packet) và chuyển gói tin đến
tầng tiếp cận mạng của máy B. Mỗi một gói tin sẽ được bổ sung thêm các thông
tin kiểm soát của giao thức và được gọi là phần đầu (Header) của gói tin.
Tầng tiếp cận mạng ở máy B sẽ tách lấy đoạn dữ liệu và chuyển cho tầng giao
vận
Tại tầng giao vận sẽ diễn ra việc kiểm tra và ghép dữ liệu lại thành khối. Căn cứ
vào địa chỉ điểm cuối thu được từ header của mỗi đoạn dữ liệu, khối dữ liệu sẽ
được chuyển lên cho ứng dụng theo đúng địa chỉ điểm cuối, ví dụ như điểm
cuối 2

Mô hình thiết lập gói tin

Ví dụ về mô hình truyền thông: ứng dụng truyền file giữa một máy tính với
một máy tính khác cùng được gắn trên một mạng.
Ở đây chương trình truyền nhận file của mỗi máy tính được chia thành ba module
là: Module truyền và nhận File, Module truyền thông và Module tiếp cận mạng.
Hai module tương ứng sẽ thực hiện việc trao đổi với nhau trong đó:
Module truyền và nhận file cần được thực hiện tất cả các nhiệm vụ trong các
ứng dụng truyền nhận file. Ví dụ: truyền nhận thông số về file, truyền nhận các

22
mẫu tin của file, thực hiện chuyển đổi file sang các dạng khác nhau nếu cần.
Module truyền và nhận file không cần thiết phải trực tiếp quan tâm tới việc
truyền dữ liệu trên mạng như thế nào mà nhiệm vụ đó được giao cho module
truyền thông.
Module truyền thông quan tâm tới việc các máy tính đang hoạt động và saün
sàng trao đổi thông tin với nhau. Nó còn kiểm soát các dữ liệu sao cho những
dữ liệu này có thể trao đổi một cách chính xác và an toàn giữa hai máy tính.
Điều đó có nghĩa là phải truyền file trên nguyên tắc đảm bảo an toàn cho dữ
liệu, tuy nhiên ở đây có thể có một vài mức độ an toàn khác nhau được dành
cho từng ứng dụng. Ở đây việc trao đổi dữ liệu giữa hai máy tính không phụ
thuộc vào bản chất của mạng đang liên kết chúng. Những yêu cầu liên quan đến
mạng đã được thực hiện ở module thứ ba là module tiếp cận mạng và nếu mạng
thay đổi thì chỉ có module tiếp cận mạng bị ảnh hưởng.
Module tiếp cận mạng được xây dựng liên quan đến các quy cách giao tiếp với
mạng và phụ thuộc vào bản chất của mạng. Nó đảm bảo việc truyền dữ liệu từ
máy tính này đến máy tính khác trong mạng.
Như vậy thay vì xét cả quá trình truyền file với nhiều yêu cầu khác nhau như một
tiến trình phức tạp thì chúng ta có thể xét quá trình đó với nhiều tiến trình con
phân biệt dựa trên việc trao đổi giữa các Module tương ứng trong chương trình
truyền file. Cách này cho phép chúng ta phân tích kỹ quá trình file và dễ dàng
trong việc viết chương trình.

2.2 Mô hình tính toán phân tán Client/Server (khách/chủ)


Một trong những mô hình ứng dụng mạng cơ bản nhất là mô hình client/server và
đa số các ứng dụng mạng hiện nay được thiết kế và lập trình theo mô hình này.

23
2.2.1 Tổng quan
Trong nhiều năm gần đây, thuật ngữ client/server đã trở nên phổ biến trong lĩnh
vực công nghệ thông tin. Các công ty xem client/server như là một mô hình công
nghệ mang tính cách mạng để trợ giúp cho việc quản lý và điều hành các hoạt
động của công ty.
Nhiều năm trước, khi các máy tính lớn mainframe của IBM còn thống trị trong các
lĩnh vực điện toán, một cách tiếp cận mới công nghệ mạng máy tính với tên gọi
“client/server” đã xuất hiện vào đầu thập niên 80 và nhanh chóng phổ biến. Đến
cuối thập niên 80, các mô hình client/server thật sự được chấp nhận và đã xuất
hiện các ứng dụng đầu tiên. Ngày nay, “client/server” đã trở nên thông dụng và
phổ biến đến mức hầu hết các ứng dụng mạng đều dựa trên nguyên tắc
client/server. Mô hình này đã được chứng minh là phương pháp hiệu quả về mặt
chi phí khi xây dựng nhiều loại mạng và dịch vụ mạng, đặc biệt đối với mạng
LAN ( PCs ) chạy các ứng dụng end-user database.
Khái niệm client/server
Định nghĩa cơ bản nhất :
Một mô hình kiến trúc tính toán (computational architecture) gồm các tiến trình
khách ( client ) yêu cầu dịch vụ từ các tiến trình phục vụ ( server )
Về mặt mô hình kiến trúc ứng dụng
Client/server là dạng phổ biến của mô hình ứng dụng phân tán trong đó phần mềm
được chia thành các tiến trình client và các tiến trình server. Một client sẽ gửi yêu
cầu cho một server theo một giao thức định sẵn (để server có thể hiểu được yêu
cầu của client), để lấy thông tin hoặc chỉ thị server thực hiện một tác vụ nào đó.
Sau khi thực hiện xong yêu cầu của client, server sẽ trả lời.
Ví dụ : Mối quan hệ tương tác qua lại tương tự như người khách hàng gửi một đơn
đặt hàng theo một mẫu đến một nhà cung cấp, sau đó sẽ cung cấp hàng và hóa
đơn. Mấu đơn hàng và hóa đơn là một phần của giao thức.
Client/server thường được dịch qua tiếng Việt là khách/chủ. Tuy nhiên ý nghĩa của
nó không hoàn toàn giống như vậy mà gần với quan hệ: khách hàng/người cung

24
cấp dịch vụ. Tuy nhiên, đó không phải là mô tả chung cho hoạt động của
client/server. Bản thân thuật ngữ client/server, cũng giống như các thuật ngữ tin
học khác, không thể suy trực tiếp từ nghĩa của client và server mà đã trở thành một
khái niệm độc lập.

Nhìn chung, trong client/server duy trì một sự phân biệt rõ rệt giữa các tiến trình
và các thiết bị mạng. Thường thì máy tính client và máy server là hai thiết bị mạng
riêng rẽ và có kiến trúc, cấu hình theo mục đích đã được thiết kế. Ví dụ, một máy
chủ Web thường có cấu hình mạnh với năng lực xử lí cao (CPU) và bộ nhớ dung
lượng lớn trong khi các Web client thường gồm các tính năng hỗ trợ giao diện đồ
họa của trình duyệt như chất lượng hiển thị của card đồ họa, độ phân giải, kích
thước màn hình …

Tuy nhiên, client/server tập trung chủ yếu vào các ứng dụng hơn là hệ thống phần
cứng. Cùng một thiết bị có thể vừa là client vừa là server. Ví dụ : khi chạy trình
duyệt trên máy chủ Web, máy chủ đó lại trở thành client. Tương tự, một thiết bị tại
thời điểm này là server nhưng khi cần có thể đảo ngược vai trò để trở thành client
đối với một server khác
Một số các ứng dụng phổ thông nhất trong môi trường Internet dựa trên
client/server :
Email
FTP
Web

Đặc trưng của mô hình client/server


Trong kiến trúc Client/Server, client, chương trình đại diện cho người dùng đang
cần các dịch vụ tài nguyên tính toán, và server, chương trình cung cấp các dịch vụ,
là các đối tượng logic riêng rẽ tách biệt trao đổi, tương tác với nhau qua một một
mạng máy tính truyền thông để cùng nhau thực hiện một tác vụ nào đó. Client tạo

25
một yêu cầu dịch vụ và nhận được kết quả trả lời cho dịch vụ đó. Server sẽ nhận
và xử lí các yêu cầu từ client, sau đó gửi trả lại. Mô hình có những đặc trưng sau:
Giao thức bất đối xứng: thể hiện ở quan hệ một-nhiều giữa các client và
một server. Client luôn bắt đầu phiên hội thoại bằng cách yêu cầu dịch
vụ. Server luôn sẵn sàng chờ những yêu cầu từ client.
Đóng gói dịch vụ (Encapsulation of service): Server như một chuyên gia,
luôn biết làm thế nào để hoàn thành tác vụ đáp ứng lại các yêu cầu từ
client. Server có thể được nâng cấp mà không ảnh hưởng đến client
(tất nhiên là thông điệp trao đổi giữa hai bên không đổi và cả hai cùng
hiểu nhau)
Tính toàn vẹn : Mã và dữ liệu đối với một server được bảo trì tập trung
để giảm chi phí bảo trì và bảo vệ sự toàn vẹn của các dữ liệu chung
(được chia sẻ giữa các server). Trong khi đó, client duy trì tính chất cá
nhân và độc lập.
Trong suốt định vị : Server là một tiến trình chạy trên cùng một máy với
client hoặc trên một máy khác trong hệ thống mạng. Các phần mềm
client/server thường ẩn vị trí của server đối với client bằng cách chuyển
hướng các yêu cầu dịch vụ. Một chương trình có thể là server hoặc đồng
thời cả hai
Trao đổi dựa trên thông điệp (message-based): client yêu cầu dịch vụ và
server trả lời đều qua các message
Tính modun, và khả năng điều chỉnh thích hợp: Một ứng dụng
Client/Server được thiết kế gồm nhiều modun. Mục đích là để :
Chia để trị : một ứng dụng lớn được chia thành các modun nhỏ
hơn làm cho việc thiết kế, phát triển và bảo trì trở nên đơn giản
hơn
Khả năng chịu lỗi : lỗi xảy ra ở một modun nào đó không làm sập
toàn bộ hệ thống. Cơ chế chia tải (workload sharing) và dự phòng
(redundancy) cũng làm tăng độ tin cậy.

26
Khả năng điều chỉnh : ứng dụng có thể đáp ứng tự động đối với
sự tăng hay giảm của tải hệ thống bằng cách thêm vào hoặc tắt
bớt các server và dịch vụ trong hệ thống.
Tính không phụ thuộc nền tảng hệ thống: một ứng dụng client/server lí
tưởng là phải có khả năng không phụ thuộc nền tảng phần cứng và hệ
điều hành, cho phép sử dụng nhiều platform đối với cả client và server.
Khả năng dùng lại mã : khi thiết kế ra một ứng dụng client/server, các
đoạn mã chương trình của một tiến trình server có thể dùng lại trong
nhiều tiến trình server khác
Tính co giãn (mở rộng hoặc thu hẹp): Hệ thống client/server có thể co
giãn theo chiều ngang và chiều dọc. Co giãn theo chiều ngang nghĩa là
có thể thêm hay bớt các máy trạm client với ảnh hưởng vê hiệu năng
tương đối nhỏ. Co giãn theo chiều dọc nghĩa là chuyển dịch vụ sang
server mạnh hơn hoặc bổ sung thêm máy server.
Tách biệt chức năng giữa client và server: hai bên đảm nhận chức năng
riêng
Chia sẻ tài nguyên : Một server có thể cung cấp dịch vụ cho nhiều client
tại một thời điểm. Server cũng điều phối truy nhập của client đến các các
tài nguyên dùng chung

Ưu điểm của mô hình client/server


Client/server được phát triển với mục đích cho phép nhiều người dùng cùng chia
sẻ truy nhập đến các dịch vụ hay ứng dụng database. So sánh với mainframe,
client/server đem lại khả năng mở rộng tốt hơn vì có thể tạo thêm các kết nối theo
nhu cầu sử dụng mà không cần phải sử dụng thêm hard-wired. Mô hình
client/server cũng hỗ trợ các ứng dụng được modun hóa. Trong từng trường hợp,
một phần mềm ứng dụng được chia thành nhiều modun, mỗi modun được cài đặt
trên các hệ thống phần cứng khác nhau được chuyên biệt hóa cho hê thống modun
đó, được gọi là mô hình client/server “hai lớp” hoặc “ba lớp”

27
Server có thể tập trung hoặc phân tán trên nhiều máy, cho phép client và server có
thể đặt tách biệt trên nhiều node trong mạng, mỗi node là một hệ thống máy tính
độc lập, có cấu hình phần cứng, hệ điều hành , phần mềm khác nhau để phù hợp
với tính năng và nhiệm vụ của nó.
Tóm lại, mục đích của client/server là để nâng cao tính dễ sử dụng (usability),
tính thích nghi linh hoạt (flexibility), tính trao đổi tương tác (interoperability) và
tính co giãn (scalability) của một hệ thống tính toán
Nhược điểm
Một vấn đề được quan tâm đặc biệt trong mô hình client/server là quản trị hệ
thống. Khi các ứng dụng được phân bố trên toàn hệ thống mạng, sẽ rất khó khăn
để duy trì thông tin cấu hình luôn cập nhật và nhất quán giữa tất cả các thiết bị.
Tương tự, nâng cấp một phiên bản mới của ứng dụng client/server rất khó đồng
bộ. Cuối cùng, một hệ thống client/server phụ thuộc rất nhiều và độ tin cậy của
mạng, nâng cao tính dự phòng và các tính năng chịu lỗi có thể làm tăng chi phí
triển khai hệ thống.
Chi phí đầu tư cho việc thiết kế, cài đặt, quản trị và bảo trì là rất lớn. Ngoài ra,
những kĩ sư hệ thống và người quản trị phải đối mặt với các vấn đề hóc búa như
sự tương tác trong hệ thống, tính tương thích của các thành phần cũng như việc
cấu hình hệ thống.

2.2.2 Sự phân lớp trong mô hình Client/Server


Mọi ứng dụng client/server đều có 3 khối chức năng :
Khối logic trình diễn hay giao diện người dùng ( ví dụ máy rút tiền tự
động ATM )
Khối logic nghiệp vụ (business logic, ví dụ các phần mềm cho phép
khách hàng yêu cầu bản cân đối tài khoản)
Khối dữ liệu (cơ sở dữ liệu lưu trữ các bản ghi tài khoản của khách hàng)

28
Trong mô hình client/server, các khối chức năng trên được gọi là lớp. Trong một
ứng dung, ba khối chức năng đó có thể nằm trên client hoặc một hoặc nhiều
server. Do đó sẽ có nhiều dạng tổ chức khác nhau tùy thuộc vào cách chia ứng
dụng và phần middleware được sử dụng để kết nối giữa các lớp.

Middleware nói chung là phần mềm dùng để kết nối các ứng dụng hoặc dịch vụ
riêng biệt lại với nhau. Nó làm nhiệm vụ trung gian quản lý tương tác giữa các tiến
trình ứng dụng tách biệt trong môi trường tính toán không đồng nhất, thường là
môi trường phân tán dựa trên mạng truyền thông.

1) Kiến trúc client/server 2 lớp


Mục đích và xuất xứ
Kĩ thuật
Trong ứng dụng client/server 2 lớp, khối nghiệp vụ được đặt bên trong lớp giao
diện người dùng tại client hoặc được đặt bên trong lớp cơ sở dữ liệu dưới dạng các
stored procedure. Khối nghiệp vụ cũng có thể được chia ra đặt tại cả client và
server. File server và database server với stored procedure là ví dụ kiến trúc 2 lớp
Sử dụng

Hạn chế

2) Kiến trúc client/server 3 lớp


Mục đích và xuất xứ
o Mô hình kiến trúc 3 lớp bắt đầu phát triển vào thập niên 90’s, khi
nhu cầu đối với những hệ thống lớn hơn và ổn định hơn mà mô hình
2 lớp chưa đáp ứng được.
o Mô hình kiến trúc 3 lớp vẫn dựa trên ý tưởng phân lớp các khối chức
năng của hệ thống và được mở rộng từ mô hình 2 lớp.

29
o Mô hình kiến trúc 3 lớp nâng cao hiệu năng (performance), tính linh
hoạt (flexibility), khả năng bảo trì (maintainability), khả năng dùng
lại (reusability) và tính co giãn (scalability) trong khi ẩn đi sự phức
tạp của quá trình xử lí phân tán đối với người dùng. Những đặc tính
trên đã khiến cho kiến trúc 3 lớp trở thành sự lựa chọn cho nhiều
ứng dụng Internet và các hệ thống thông tin mạng.
Kĩ thuật
Trong kiến trúc 3 lớp, hệ thống giao diện nằm tại lớp ngoài cùng, nơi các đặt các
dịch vụ dành cho người dùng ( ví dụ như session, text, dialog, và display
management).
Chức năng quản trị cơ sở dữ liệu gồm dịch vụ file và data đặt tại lớp trong cùng.
Thành phần quản trị dữ liệu đảm bảo rằng sự nhất quán của dữ liệu trong môi
trường phân tán thông qua các tính năng như : data lock, consistency và
replication. Kết nối giữa các lớp có thể được thay đổi phụ thuộc vào yêu cầu của
người dùng đối với dịch vụ và dữ liệu.
Lớp thứ 3 nằm giữa lớp giao diện và quản trị dữ liệu, vì vậy còn được gọi là lớp
trung gian (middle tier). Tại lớp này đặt khối nghiệp vụ bao gồm các tiến trình xử
lí nghiệp vụ được tách biệt khỏi dữ liệu và giao diện người dùng. Khối này có thể
cung cấp dịch vụ quản lí các tiến trình nghiệp vụ cho nhiều ứng dụng khác nhau
Theo cách đó, các tiến trình xử lí nghiệp vụ được triển khai và quản lý tách biệt
với dữ liệu và giao diện người dùng. Như vậy, hệ thống 3 lớp có thể tích hợp dữ
liệu từ nhiều nguồn khác nhau. Lớp middle tier giúp hệ thống nâng cao các khả
năng (như đã nói trên) nhờ việc tập trung các tiến trình nghiệp vụ vào 1 lớp riêng,
sử dụng server riêng, làm cho việc giám sát, thay đổi, quản trị được dễ dàng hơn.
Những thay đổi, nâng cấp có thể thực hiện tại lớp middle tier chỉ một lần và có tác
dụng đối với toàn bộ hệ thống. Đó là ưu điểm của kiến trúc 3 lớp so với kiến trúc 2
lớp.
Hơn thế nữa, lớp middle tier sẽ điều khiển các giao dịch và các hàng đợi yêu cầu (
asynchronous queuing) để đảm bảo giao dịch được thực hiện trọn vẹn và chính

30
xác. Truy nhập đến các tài nguyên theo tên (không theo vị trí) , các thành hệ thống
được cài đặt thêm hoặc gỡ bỏ một cách đơn giản, không ảnh hưởng đến hoạt động
của toàn bộ hệ thống.
Trong một số trường hợp, lớp middle tier được chia thành hai hoặc nhiều đơn vị
(unit) với các chức năng khác nhau, và kiến trúc client server được xem như là
nhiều lớp (multi layer). Một ví dụ là các ứng dụng Internet Web based. Client (lớp
giao diện) là trình duyệt, với nội dung thể hiện dưới dạng HTML (gọi là light
client). Lớp middle tier đặt tại Application Server, viết bằng C++ hoặc Java. Việc
kết nối giữa 2 lớp client và middle tier gặp khó khăn. Do đó có thêm một lớp trung
gian nữa làm nhiệm vụ nhận yêu cầu từ client và tạo ra nội dung HTML nhờ
những dịch vụ cung cấp bởi lớp nghiệp vụ. Lớp này chính là Web Server, với
những dạng ngôn ngữ script mà nó hỗ trợ như ASP, JSP, PHP ..., tạo nên sự tách
biệt rõ rệt hơn giữa nghiệp vụ ứng dụng (application logic) và việc sắp đặt nội
dung hiển thị (application layout)
Sử dụng
o Kiến trúc 3 lớp được sử dụng trong môi trường client/server phân
tán, trong các ứng dụng thương mại (commerce) và quân sự, với
nhiều hệ cơ sở dữ liệu và các nghiệp vụ khác nhau
o Kiến trúc này có thể hỗ trợ hàng trăm người dùng, quy mô lớn hơn
nhiều so với kiến trúc 2 lớp
o Kiến trúc giúp đơn giản công việc phát triển phần mềm vì mỗi lớp
có thể được xây dựng và chạy trên các nền tảng hệ thống khác nhau.
Hơn nữa, kiến trúc này cho phép các lớp khác nhau có thể phát triển
trên các ngôn ngữ khác nhau. Ví dụ như : Client sử dụng ngôn ngữ
HTML; lớp trung gian, làm nhiệm vụ sắp xếp nội dung hiển thị
(layout) cho client và liên kết với lớp nghiệp vụ, sử dụng các ngôn
ngữ script như Perl, PHP, ASP, JSP...;lớp middle tier được phát triển
bằng C++, Java, SmallTalk, Delphi; ngôn ngữ SQL và một số ngôn
ngữ khác cho từng DBMS riêng sử dụng cho lớp data.

31
o Di chuyển một hệ thống ứng dụng cũ sang kiến trúc 3 lớp có thể
thực hiện với ít rủi ro và chi phí thấp theo cách : duy trì cơ sở dữ liệu
cũ, khối tiến trình xử lí nghiệp vụ để hệ thống cũ và mới cùng song
hành hoạt động cho đến khi mỗi thành phần ứng dụng hoặc dữ liệu
được chuyển sang thiết kế mới

Hạn chế
o Xây dựng một ứng dụng theo kiến trúc 3 lớp là một công việc phức
tạp. Các công cụ thiết kế và lập trình không cung cấp tất cả các dịch
vụ cần thiết để hỗ trợ môi trường tính toán phân tán.
o Một vấn đề quan trọng khác trong thiết kế là việc phân tách 3 lớp
không phải lúc nào cũng rõ ràng. Nó đòi hỏi phải có những phân tích
tốt và khả năng linh hoạt và cân đối trong thiết kế cũng như là các
kinh nghiệm thực tế. Việc sắp đặt một chức năng nhất định vào một
lớp nên dựa trên các tiêu chí sau :
 Khả năng dễ dàng trong phát triển và test (usability)
 Dễ dàng trong quản trị
 Khả năng co giãn của các server (scalability): đặt chức năng
không hợp lí có thể làm giảm tính co giãn của hệ thống.
 Hiệu năng : được cân đối giữa tải xử lí và tải đường truyền.
Ví dụ như xử lí toàn bộ trên trên một lớp chỉ trả về kết quả
cuối cùng hay chia tải xử lí cho nhiều thành phần trên các lớp
khác nhau. Rõ ràng khi đó thì tải đường truyền sẽ tăng.

32
Ví dụ về ứng dụng sử dụng các kiến trúc ứng dụng trong các môi trường khác
nhau :
Cửa hàng nhỏ hay ứng dụng cá nhân : cả ba khối chức năng nằm trên cùng một
máy tính (ứng dụng desktop)
Công ty nhỏ hoặc một chi nhánh, một phòng ban: Cần một ứng dụng với một
server dựa trên mạng LAN. Trong ứng dụng này, nhiều client sẽ kết nối với một
server, việc quản trị là khá đơn giản, bảo mật được triển khai ở cấp độ từng hệ
thống máy tính, các lỗi xảy ra dễ được phát hiện
Công ty lớn, tập đoàn : nhiều server cung cấp các dịch vụ và chức năng khác
nhau, được đặt trong mạng LAN, mạng Intranet của công ty hay mạng Internet
với khả năng co giãn. Các server có thể được phân vùng theo chức năng, tài
nguyên, cơ sở dữ liệu và có thể lặp để tăng tính năng chịu lỗi và hiệu năng hệ
thống. Mô hình này có tính linh hoạt cao và khả năng xử lí mạnh

33
2.3 Giao thức cho ứng dụng Client/Server

2.3.1 Giao thức


Giao thức ở đây là bộ các khuôn dạng bản tin, tập trạng thái và các quy tắc, quy
ước trong truyền thông giữa client và server.
Khi tạo ra một ứng dụng client/server, việc đầu tiên là phải thiết kế giao thức. May
mắn cho chúng ta là các giao thức phổ biến như FTP, HTTP, SMTP, RPC... đều
đã đươc IETF (nằm trong Internet Architecture Board-IAB) chuẩn hóa thành các
giao thức chuẩn. Các chuẩn này được được đưa trong khuyến nghị của IAB gọi là
RFC (Request for Comment). Mỗi một chuẩn hoặc một giao thức cho Internet đều
được đánh số trong RFC.

Khi lập trình database theo mô hình client/server, giao thức trao đổi các câu truy
vấn và tập các bản ghi đã được quy định và hỗ trợ bởi hệ quản trị Database DBMS
và các thư viện lập trình. Do đó, ta cũng không phải quan tâm thiết kế giao thức
truyền thông trong ứng dụng database. Khi lập trình sẽ có sẵn các giao diện giúp ta
thực thi việc tương tác giữa Client và Database server. Trong môi trường 3 lớp, thì
lớp Middleware ở giữa cũng sẽ cung cấp giao diện để thực thi việc gọi hàm từ xa
(Remote Procedure Call-RPC). Đây là một kĩ thuật cho phép các ứng dụng client
server tương tác với nhau bằng phương pháp gọi hàm thông thường. Nó cung cấp
giao diện gọi hàm mà che đi công tác truyền thông client server và việc truyền
thông là trong suốt đối với người lập trình. Kĩ thuật này sẽ được trình bày trong
phần sau.
Nói chung là ta nên theo các giao thức chuẩn có sẵn cho mỗi ứng dụng phổ biến.
Tuy nhiên, khi xây dựng một ứng dụng riêng chưa có giao thức chuẩn thì ta phải
thiết kế giao thức.

2.3.2 Phân loại giao thức


Có thể chia giao thức thành 2 dạng cơ bản :

34
Giao thức đồng bộ (Synchronous Protocol)
o Trong dạng giao thức này, quá trình truyền thông giữa client và
server diễn ra theo hai chiều nhưng không đồng thời mà được thực
hiện lần lượt. Mỗi bên sau khi truyền dữ liệu hoặc thông báo cho bên
kia sẽ ngừng lại để chờ bên kia gửi sang
o Ví dụ về các giao thức kiểu này là : HTTP, POP, SMTP...
Giao thức không đồng bộ (Asynchronous Protocol)
o Đối với giao thức dạng không đồng bộ, client và server có thể đồng
thời gửi thông tin cho nhau mà không cần phải chờ đợi phản hồi của
bên kia
o Các giao thức này thường là các giao thức stateless như TELNET,
RLOGIN...
Ngoài ra có thể có dạng giao thức hybrid là sự kết hợp của hai dạng giao thức
đồng bộ và không đồng bộ

2.3.3 Các yêu cầu đối với giao thức


Việc thiết kế được một giao thức tốt là rất khó khăn và phải đáp ứng các yêu cầu
cơ bản sau:
Rõ ràng (well-defined)
Trong mỗi dạng bản tin được truyền đi, mọi trường dữ liệu phải được
định nghĩa trong giao thức - rõ ràng về kích thước, ý nghĩa, các trường
hợp liên quan đến từng bit.
Giao thức chính là ngôn ngữ, do đó đòi hỏi phải chính xác, không có sự
nhập nhằng
Sử dụng các phương pháp diễn tả mang tính hình thức (common formal
decscription) như dạng BNF (trong automata)
Nếu sử dụng các ngôn ngữ mô tả thì dạng ngôn ngữ đó cũng phải được
trình bày trong tài liệu giao thức (để người đọc có thể hiểu được)
Nên sử dụng các ví dụ minh họa cho giao thức

35
Đầy đủ (bao hết mọi khả năng có thể), là các vấn đề sau
Dữ liệu hỏng, không hợp lệ (khuôn dạng, kích thước, tránh tràn bộ đệm)
Các phiên bản cũ (tương thích). Ví dụ, một client phiên bản proto là 1.0
kết nối với server phiên bản 1.2
Các yêu cầu không hợp lệ. Lệnh sai hoặc tham số sai hoặc trình tự yêu
cầu không đúng quy tắc, hoặc lệnh không được phép...
Các điều kiện giới hạn. Kiểm tra một số điều kiện nào đó trước khi tiến
hành bước tiếp theo. Ví dụ, kiểm tra tính xác thực, kiểm tra điều kiện
cho phép...
Có thể phân tích cú pháp trong các bản tin. Mục tiêu đặt ra là :
Phân chia rõ ràng thông tin trong một bản tin(cho phép tách riêng cú
pháp và ngữ nghĩa). Cú pháp để đảm bảo khi phân tích sẽ cho kết quả
đúng hoặc sai. Sau khi phân tích cú pháp, dựa vào trạng thái hiện tại sẽ
xác định ngữ nghĩa để quyết định thực hiện bước sắp tới. Ví dụ, bản tin
này có ngữ nghĩa là yêu cầu, thông báo hoặc đơn giản là không làm gì cả
Nhất quán : trong cú pháp và trong ngữ nghĩa
Trong ngữ nghĩa phải nhất quán để tránh nhập nhằng dẫn đến việc
bên nhận hiểu sai ý nghĩa bản tin của bên gửi.
Trong cú pháp, cần có sự nhất quán trong văn phạm sử dụng.
Tránh dùng nhiều dạng văn phạm, nhiều kiểu biểu đạt để có thể
dùng chung một modun khi phân tích cú pháp của bản tin.
Một số vấn đề khác khi thiết kế và triển khai giao thức
o Khả năng mở rộng và tương thích giữa các version
o Thứ tự byte
o Giao thức là hướng kí tự hay hướng bit
o Tính hiệu quả
 Đồng bộ và không đồng bộ
 Thông tin điều khiển, header
 Thời gian trễ round trip

36
o Trạng thái
 Ai đọc, ai ghi (ai truyền, ai nhận)
o Timeout : Đây là vấn đề không thể thiếu đối với ứng dụng mạng do
tính biến động và không biết trước của trạng thái mạng.

1) Request For Comments (RFC)


Bắt đầu từ năm 1969, là một trong seri các tài liệu thông tin và chuẩn Internet
(được đánh số kí hiệu) và được chấp nhận rộng rãi của các phần mềm thương mại
và miễn phí trong cộng đồng UNIX và Internet. Một số RFC là chuẩn nhưng đa số
chuẩn Internet được ghi lại trong RFC. Một trong những chuẩn RFC nổi tiếng và
quan trọng là RFC 822, quy định về định dạng và cấu trúc của thư điện tử.
RFC khác thường ở chỗ, được tạo dựng từ các chuyên gia kĩ thuật hoặc nhóm nhỏ
chuyên gia làm việc độc lập và kết quả được kiểm tra đánh giá bởi cả cộng đồng
Internet chứ không phải như các chuẩn chính quy do các viện, các tổ chức như
ANSI ban hành. TCP, IP và nhiều giao thức quan trọng khác cũng được đưa vào
trong RFC.
RFC thể hiện sự xuất sắc nổi bật ở khả năng làm việc rất tốt. Nó tránh được sự
nhầm lẫn, không rõ ràng phổ biến trong các các đặc tả không chính thức và sự sai
lầm so không thống nhất quan điểm thường có trong các chuẩn chính thức.
Một số RFC phổ biến :
RFC 821 : SMTP (Simple Message Transfer Protocol)
RFC 1939 : POP3 ( Post Office Protocol)
RFC 2616 : HTTP 1.1
RFC 959 : FTP
RFC 318,854 : TELNET (Remote virtual Terminal)
RFC 1436 : GOPHER (Search and Retrieve Document)
RFC 977 : NNTP ( Network News Transfer Protocol)
RFC 2045, 1521 : MIME ( Multipurpose Internet Mail Extensions)

37
2.3.4 Mô tả giao thức POP3
Mô tả chung :

38
Chương 3 Lập trình với TCP socket (12 tiết)

3.1 Giao thức TCP

3.1.1 Mô hình tham chiếu


TCP là một giao thức "có liên kết" (connection - oriented), nghĩa là cần phải thiết
lập liên kết giữa hai thực thể TCP trước khi chúng trao đổi dữ liệu với nhau. Một
tiến trình ứng dụng trong một máy tính truy nhập vào các dịch vụ của giao thức
TCP thông qua một cổng (port) của TCP. Số hiệu cổng TCP được thể hiện bởi 2
bytes.

Cổng truy nhập dịch vụ TCP

Một cổng TCP kết hợp với địa chỉ IP tạo thành một đầu nối TCP/IP (socket) duy
nhất trong liên mạng. Dịch vụ TCP được cung cấp nhờ một liên kết logic giữa một
cặp đầu nối TCP/IP. Một đầu nối TCP/IP có thể tham gia nhiều liên kết với các
đầu nối TCP/IP ở xa khác nhau. Trước khi truyền dữ liệu giữa 2 trạm cần phải
thiết lập một liên kết TCP giữa chúng và khi không còn nhu cầu truyền dữ liệu thì
liên kết đó sẽ được giải phóng.

39
Các thực thể của tầng trên sử dụng giao thức TCP thông qua các hàm gọi (function
calls) trong đó có các hàm yêu cầu để yêu cầu, để trả lời. Trong mỗi hàm còn có
các tham số dành cho việc trao đổi dữ liệu.

3.1.2 Thiết lập liên kết


Các bước thực hiện để thiết lập một liên kết TCP/IP: Thiết lập một liên kết mới có
thể được mở theo một trong 2 phương thức: chủ động (active) hoặc bị động
(passive).
Phương thức bị động, người sử dụng yêu cầu TCP chờ đợi một yêu cầu
liên kết gửi đến từ xa thông qua một đầu nối TCP/IP (tại chỗ). Người sử
dụng dùng hàm passive Open có khai báo cổng TCP và các thông số
khác (mức ưu tiên, mức an toàn)
Với phương thức chủ động, người sử dụng yêu cầu TCP mở một liên kết
với một một đầu nối TCP/IP ở xa. Liên kết sẽ được xác lập nếu có một
hàm Passive Open tương ứng đã được thực hiện tại đầu nối TCP/IP ở xa
đó.
Bảng liệt kê một vài cổng TCP phổ biến.

Số hiệu cổng Mô tả

0 Reserved

5 Remote job entry

7 Echo

9 Discard

11 Systat

13 Daytime

40
15 Nestat

17 quote (quote odd day

20 ftp-data

21 ftp (control)

23 Telnet

25 SMTP

37 Time

53 Name Server

102 ISO - TSAP

103 X.400

104 X.400 Sending

111 Sun RPC

139 Net BIOS Session source

160 – 223 Reserved

Khi người sử dụng gửi đi một yêu cầu mở liên kết sẽ được nhận hai thông số trả
lời từ TCP.
Thông số Open ID được TCP trả lời ngay lập tức để gán cho một liên kết cục
bộ (local connection name) cho liên kết được yêu cầu. Thông số này về sau
được dùng để tham chiếu tới liên kết đó. (Trong trường hợp nếu TCP không thể

41
thiết lập được liên kết yêu cầu thì nó phải gửi tham số Open Failure để thông
báo.)
Khi TCP thiết lập được liên kết yêu cầu nó gửi tham số Open Success được
dùng để thông báo liên kết đã được thiết lập thành công. Thông báo này dược
chuyển đến trong cả hai trường hợp bị động và chủ động. Sau khi một liên kết
được mở, việc truyền dữ liệu trên liên kết có thể được thực hiện.

3.1.3 Truyền nhận dữ liệu


Các bước thực hiện khi truyền và nhận dữ liệu: Sau khi xác lập được liên kết
người sử dụng gửi và nhận dữ liệu. Việc gửi và nhận dữ liệu thông qua các hàm
Send và receive.
Hàm Send: Dữ liệu được gửi xuống TCP theo các khối (block). Khi nhận được
một khối dữ liệu, TCP sẽ lưu trữ trong bộ đệm (buffer). Nếu cờ PUSH được
dựng thì toàn bộ dữ liệu trong bộ đệm được gửi, kể cả khối dữ liệu mới đến sẽ
được gửi đi. Ngược lại cờ PUSH không được dựng thì dữ liệu được giữ lại
trong bộ đệm và sẽ gửi đi khi có cơ hội thích hợp (chẳng hạn chờ thêm dữ liệu
nữa để gửi đi với hiệu quả hơn).
Hàm receive: Ở trạm đích dữ liệu sẽ được TCP lưu trong bộ đệm gắn với mỗi
liên kết. Nếu dữ liệu được đánh dấu với một cờ PUSH thì toàn bộ dữ liệu trong
bộ đệm (kể cả các dữ liệu được lưu từ trước) sẽ được chuyển lên cho người sử
dụng. Còn nếu dữ liệu đến không được đánh dấu với cờ PUSH thì TCP chờ tới
khi thích hợp mới chuyển dữ liệu với mục tiêu tăng hiệu quả hệ thống.
Nói chung việc nhận và giao dữ liệu cho người sử dụng đích của TCP phụ thuộc
vào việc cài đặt cụ thể. Trường hợp cần chuyển gấp dữ liệu cho người sử dụng thì
có thể dùng cờ URGENT và đánh dấu dữ liệu bằng bit URG để báo cho người sử
dụng cần phải sử lý khẩn cấp dữ liệu đó.

42
3.1.4 Đóng liên kết
Các bước thực hiện khi đóng một liên kết: Việc đóng một liên kết khi không cần
thiết được thực hiên theo một trong hai cách: dùng hàm Close hoặc dùng hàm
Abort.
Hàm Close: yêu cầu đóng liên kết một cách bình thường. Có nghĩa là việc truyền
dữ liệu trên liên kết đó đã hoàn tất. Khi nhận được một hàm Close TCP sẽ truyền
đi tất cả dữ liệu còn trong bộ đệm thông báo rằng nó đóng liên kết. Lưu ý rằng
khi một người sử dụng đã gửi đi một hàm Close thì nó vẫn phải tiếp tục nhận dữ
liệu đến trên liên kết đó cho đến khi TCP đã báo cho phía bên kia biết về việc
đóng liên kết và chuyển giao hết tất cả dữ liệu cho người sử dụng của mình.
Hàm Abort: Người sử dụng có thể đóng một liên kết bất và sẽ không chấp nhận
dữ liệu qua liên kết đó nữa. Do vậy dữ liệu có thể bị mất đi khi đang được
truyền đi. TCP báo cho TCP ở xa biết rằng liên kết đã được hủy bỏ và TCP ở xa
sẽ thông báo cho người sử dụng của mình.
Một số hàm khác của TCP:
Hàm Status: cho phép người sử dụng yêu cầu cho biết trạng thái của một liên kết
cụ thể, khi đó TCP cung cấp thông tin cho người sử dụng.
Hàm Error: thông báo cho người sử dụng TCP về các yêu cầu dịch vụ bất hợp lệ
liên quan đến một liên kết có tên cho trước hoặc về các lỗi liên quan đến môi
trường.

3.2 Lập trình WinSock

3.2.1 Giới thiệu BSD Socket


Socket là gì ?
Sau khi giao thức TCP/IP ra đời, hệ điều hành BSD Unix (được phát triển tại
trường UCB) đã chính thức hỗ trợ giao thức này trong truyền thông mạng và đưa
ra khái niệm socket, một giao diện lập trình mạng với TCP/IP (vì vậy socket còn
được gọi là Berkeley socket). Cùng với TCP/IP, mô hình lập trình mạng với

43
socket đã trở thành một chuẩn không chính thức trong các hệ điều hành khác nhau
như UNIX, Linux, Window.

Định nghĩa : Một socket là một điểm cuối của một cuộc truyền thông và là khối
cơ bản trong truyền thông. Khi dữ liệu đi vào một socket ở một đầu thì sẽ đi ra từ
một socket ở đầu khác. (Socket được trừu tượng hóa thành một giao diện)
Một cuộc truyền thông bao giờ cũng gồm có 2 socket ở 2 đầu cuối (end to end),
mỗi socket có thể gắn với một hay nhiều tiến trình.
Có bốn loại socket
stream socket: luồng dữ liệu truyền giữa 2 socket là hai chiều, tin cậy,
tuần tự và không lặp lại. Giữa 2 socket có thiết lập liên kết giống như
một đường ống nối hai đầu cuối truyền thông. (không bị giới hạn độ lớn
của bản tin truyền qua socket)
datagram socket: hỗ trợ luồng dữ liệu 2 chiều nhưng không đảm bảo tin
cậy, đúng thứ tự và không lặp. Giữa 2 socket không thiết lập liên kết và
độ lớn dữ liệu bị giới hạn.
Raw socket: cho phép người dùng truy nhập giao thức truyền thông bên
dưới giao diện socket. Raw socket không sử dụng cho lập trình mạng
thông thường mà mục đích là cung cấp cho những người phát triển giao
thức truyền thông mới khả năng truy nhập đến những dịch vụ tài nguyên
bên trong những giao thức đã có.
Sequenced packet socket: giống như stream socket nhưng giới hạn dữ
liệu. Socket này dùng với mục đích an ninh, cho phép người dùng đặt
header các packet chuyển đi và nhận được các header của packet đến
Trong 4 loại trên thì stream và datagram socket là phổ biến hơn và chương trình
này sẽ chủ yếu đề cập đến hai lại socket đó

3.2.2 Tổng quan WinSock


Winsock là gì ?

44
Winsock là (viết tắt của Window Socket Application Programming Interface) là
một thư viện các hàm hệ thống triển khai giao diện socket được đặc tả trong BSD
UNIX nhưng được phát triển theo các cơ chế và đặc tính của hệ điều hành
Window.

Hệ điều hành Window là hệ điều hành dựa trên cơ chế hướng sự kiện và Winsock
có hỗ trợ cơ chế đó. Phần Các chế độ làm việc trong Winsock và các phần sau sẽ
trình bày rõ hơn về vấn đề này
Các phiên bản Winsock
Winsock 1.0 : Phiên bản đầu tiên triển khai đặc tả Winsock
Winsock 1.1 : dựa trên phiên bản 1.0 và có một số thay đổi nhỏ
Winsock 2: là phiên bản mới nhất (2000.08.10 2.2.2)
Điểm khác biệt lớn nhất giữa Winsock 2 và Winsock 1.1 là
Winsock 1.1 chỉ hỗ trợ giao thức TCP/IP còn Winsock 2 đã chính thức
hỗ trợ một loạt các giao thức giao vận khác như OSI, Novell SPX/IPX
và Digital DECNet và cho phép người lập trình không phụ thuộc giao
thức bên dưới
Một số tính năng mới khác của Winsock 2
Overlapped I/O: sử dụng cơ chế vào ra hiệu suất cao (trong nhân
hệ điều hành)
Multicasting, multipoint: truyền thông multicast độc lập giao thức
QoS : thương lượng và giữ băng thông cho mỗi socket
Socket sharing : cho phép nhiều tiến trình cùng chia sẻ một socket
Layered Service Provider : cho phép thêm các dịch vụ bên trên
tầng giao vận (plug-in)
Các tính năng mở rộng của Winsock 2 sẽ được trình bày riêng ở phần
sau
Kiến trúc Winsock 1.1

45
Winsock và hệ điều hành Window

Sử dụng Winsock ntn ? :


Kết nối stream socket thích hợp để cung cấp dịch vụ truyền thông trong
kiến trúc client/server sử dụng giao thức giao vận TCP.

46
Các kiểu socket khác như : datagram socket dành cho các ứng dụng sử
dụng giao thức không hướng kết nối (connectionless) như UDP, raw
socket được sử dụng để phát triển các giao thức riêng, mở rộng thêm các
lớp dịch vụ.
Lập trình mạng trong Window, cả phía client và server đều sử dụng
Winsock. Tuy nhiên, đó không phải điều bắt buộc. Trong một số trường
hợp, một trong hai bên client và server có thể hoạt động trên một hệ
thống khác Window, miễn là các hệ thống đó cùng hỗ trợ một giao thức
truyền thông.
Ngôn ngữ lập trình C/C++, môi trường phát triển: Visual C++ và MFC
Thư viện : Wsock32.lib, Wsock32.dll, winsock.h ( Winsock1.1) và
ws2_32.lib, ws2_32.dll, winsock2 ( Winsock 2). Giữa phiên bản 1.1 và

47
2.2 có sự tương thích, đảm bảo các chương trình viết bằng Ws 1.1 có thể
chạy với thư viện của Ws2. Sở dĩ có khả năng đó là do, Winsock2 được
xây dựng trên kiến trúc khác với Winsock 1.1. Cụ thể sẽ trình bày trong
phần giới thiệu Winsock2
Khi lập trình có thể gắn trực tiếp thư viện LIB vào chương trình. Điều đó
dẫn đến kích thước chương trình sẽ tăng lên khá nhiều. Hoặc có thể liên
kết động đến các thư viện DLL

Platform Winsock Version

Windows 95 1.1 (2.2)

Windows 98 2.2

Windows NT 4.0 2.2

Windows 2000 2.2

Windows CE 1.1

Các phiên bản Ws trên các hệ điều hành Window

Lí do chọn Winsock :
Winsock là một bộ thư viện lập trình mạng chuyên nghiệp dành cho
nhiều nền tảng hệ điều hành của Microsoft, đảm bảo theo chuẩn BSD
Socket và còn có thêm nhiều tính năng mở rộng.
Hệ điều hành Window rất phổ biến trong khi ta lại không có điều kiện và
trang thiết bị để lập trình trong môi trường UNIX
Với Window, có thể xây dựng được ngay các ứng dụng có giao diện thân
thiện.

48
3.2.3 Khởi tạo và giải phóng Winsock
Trước khi ứng dụng sử dụng các hàm Winsock để truyền thông, cần phải gọi thủ
tục khởi tạo Winsock WSAStartup()
Trước khi ứng dụng kết thúc, nên gọi hàm giải phóng tài nguyên Winsock
WSACleanup().
Hai hàm này không thể thiếu trong lập trình Winsock

1) Hàm khởi tạo

a) Khuôn dạng hàm :


int WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData);

b) Tham số :
wVersionRequired chỉ ra phiên bản cao nhất của Winsock mà ứng dụng có thể sử
dụng. Kiểu tham số là một từ 2 byte, byte thứ tự cao là chỉ số thứ 2 của phiên bản,
byte thấp là chỉ số thứ nhất của phiên bản. Ví dụ: phiên bản 1.0 thì byte cao có giá
trị 0, byte thấp có giá trị 1. Cách tạo giá trị tham số này
wVersionRequired = MAKEWORD(0, 1);

lpWSAData là tham số kiểu con trỏ, trỏ đến cấu trúc WSADATA. Sau khi hàm
khởi tạo được gọi, cấu trúc này chứa các thông tin về Winsock

typedef struct WSAData {


WORD wVersion;
WORD wHighVersion;
char szDescription[WSADESCRIPTION_LEN+1];
char szSystemStatus[WSASYS_STATUS_LEN+1];
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR * lpVendorInfo;
} WSADATA;

c) Chức năng của hàm :


Khởi tạo Winsock bằng cách tạo liên kết đến thư viện Winsock thích hợp, cấp
phát tài nguyên để ứng dụng sẵn sàng sử dụng.

49
Kiểm tra phiên bản qua giá trị trả về wVersion trong cấu trúc WSADATA để
xác nhận version Ws có phù hợp với yêu cầu của ứng dụng không. Đoạn mã sau
là ví dụ của việc kiểm tra đó.
WORD wVersionRequested = MAKEWORD(1, 1); // WinSock 1.1 requested
WSADATA wsaData; // WinSock details
int nErrorStatus; // error status
nErrorStatus = WSAStartup(wVersionRequested, &wsaData);
if (nErrorStatus != 0)
{
// display an error message explaining that WinSock
// initialization has failed and return
return;
}
// check the WinSock version information
if ( (LOBYTE(wsaData.wVersion) != LOBYTE(wVersionRequested)) ||
(HIBYTE(wsaData.wVersion) != HIBYTE(wVersionRequested)) )
{
// display an error message explaining that the WinSock
// implementation doesn’t meet the version requirements
// of the application
WSACleanup(); // terminate WinSock use
return;
}
Lấy các thông tin về nhà phát triển và các tính năng của bộ giao thức TCP/IP
được cung cấp bởi nhà phát triển đó. Các thông tin này nằm trong các trường
còn lại trong cấu trúc WSADATA
Hàm khởi tạo bao giờ cũng được triệu gọi đầu tiên, trước khi chương trình sử
dụng Winsock. Vì vậy nó thường được đặt trong hàm WinMain() trong một
chương trình Window SDK, hoặc CWinApp::InitInstance với chương trình
MFC

2) Hàm giải phóng Winsock

a) Khuôn dạng
int WSACleanup(void);

b) Chức năng
Kết thúc một chương trình có sử dụng Ws. Hàm bao giờ cũng đi với hàm khởi tạo.
Bất cứ chương trình nào có gọi hàm khởi tạo thì khi thoát ra khoit vòng lặp chính
đều phải gọi hàm WSACleanup(). Trong MFC, hàm này thường được gọi trong
hàm CWinApp::ExitInstance

50
3) Hàm trả về lỗi gần nhất

a) Khuôn dạng
int WSAGetLastError(void);

b) Chức năng
Hàm trả về lỗi gần nhất gây ra bởi một hàm Ws nào đó được gọi. Ví dụ trong
trường hợp hàm khởi tạo, một số lỗi có thể xảy ra như:
WSAVERNTSUPPORTED- không hỗ trợ phiên bản Ws yêu cầu,
WSASYSNOTREADY-mạng có lỗi, WSAEINVAL-tham số không hợp lệ.
Đối với mỗi hàm, nếu xảy ra lỗi thì sẽ có một số giá trị lỗi trả về nhất định, người
lập trình sẽ căn cứ vào mã lỗi errnum để debug chương trình và đưa ra thông báo
về sự cố.

3.2.4 Hai chế độ làm việc trong Winsock


Như đã nói ở trên, Winsock là thư viện socket trong môi trường Window và nó hỗ
trợ cơ chế hướng sự kiện. Vì vậy, Winsock có hai chế độ làm việc.

1) Chế độ Blocking
Chế độ này còn gọi là chế độ đồng bộ (Synchronous). Ta đã biết trong môi trường
mạng, có rất nhiều yếu tố ảnh hưởng đến việc truyền thông và không có gì đảm
bảo chắc là nhiệm vụ được thực hiện ngay và luôn thành công. Do đó, một tiến
trình sau khi gọi một hàm socket phải chờ kết quả trả về, trong quá trình đó, tiến
trình bị block lại tại vị trí gọi hàm với một khoảng thời gian không xác định. Như
vậy là tiến trình sẽ không thể làm được các việc khác cho đến khi hàm socket thực
hiện xong.
Điều đó dẫn đến việc chương trình bị treo tạm thời và như vậy sẽ rất lãng phí tài
nguyên CPU và thời gian, nhất là đối với Server. Giả sử server chỉ có 1 tiến trình
thì tất cả các client phải lần lượt đợi cho các yêu cầu trước được thực hiện xong.
Vì vậy, khi làm việc ở chế độ blocking, phải sử dụng cơ chế multitask và
multithreading (cả trong UNIX và Window) : mỗi socket (cặp điểm truyền thông)

51
sẽ gắn với hai tiến trình hoặc thread (Trong môn hệ điều hành đã học về process,
multitask, thread và multithreading. Process là the sequence of states of an
executing program. A process consists of the program code (which may be shared
with other processes which are executing the same program), private data, and the
state of the processor, particularly the values in its registers. It may have other
associated resources such as a process identifier, open files, CPU time limits,
shared memory, child processes, and signal handlers. One process may, on some
platforms, consist of many threads. A multitaskingoperating system can run
multiple processes concurrently or in parallel, and allows a process to spawn
"child" processes).
Một server hay client có thể gồm nhiều tiến trình hoặc một tiến trình có nhiều
thread (thường là nhiều thread), để khi bị block tại lúc gọi hàm tại một thread thì
các công việc của các thread khác không bị ngưng lại.
Cách này tận dụng tốt khả năng của CPU và hệ điều hành, có hiệu quả trong lập
trình client server, tuy nhiên cần có thiết kế, kinh nghiệm và khả năng lập trình tốt
vì khi dùng nhiều thread rất dễ gây lỗi bộ nhớ, chờ đợi vòng quanh hoặc khóa chết
(deadlock)

2) Chế độ Non-Blocking
Chế độ này còn gọi là chế độ không đồng bộ (Asynchronous) ngược lại với chế độ
đồng bộ.
Winsock sử dụng kĩ thuật non-block dựa vào cơ chế hướng sự kiện (event
notification) và xử lí (Event-message processing) thông điệp trong hàng đợi gắn
với một cửa sổ (window)
Người lập trình sẽ tạo ra các hàm xử lí riêng cho mỗi sự kiện nhận được từ hàng
đợi.
Để làm việc ở chế độ này, Ws cung cấp các hàm non-block. Các hàm này sẽ trả về
ngay sau khi được gọi dù đã có kết quả hay chưa và tiếp tục thực hiện công việc
tiếp theo (không cần chờ kết quả từ host bên kia nên gọi là hàm không đồng bộ).

52
Khi có kết quả của việc gọi hàm, các thông tin sẽ được đưa vào 1 dạng thông điệp
nhất định để chuyển vào hàng đợi của 1 cửa sổ nào đó do người lập trình đặt ra.
Danh sách các sự kiện :
• FD_CONNECT – Một kết nối đến một host hoặc đến một phiên multicast
được thiết lập
• FD_ACCEPT – Một host gửi yêu cầu kết nối
• FD_READ – Dữ liệu đã đến và sẵn sàng để đọc
• FD_WRITE – Bộ đệm đã sẵn sàng cho việc nhận dữ liệu cần truyền đi
• FD_OOB – Dữ liệu Out of band sẵn sàng để đọc
• FD_CLOSE - Host bên kia đóng kết nối
• FD_QOS – Có một thay đổi trong QoS levels
• FD_GROUP_QOS – Để dành

Phần sau sẽ trình bày các công việc hậu trường trong lập trình Winsock, cũng rất
cần thiết, trước khi đi vào trình bày nhiệm vụ chính là truyền thông theo mô hình
client/server

3.2.5 Chuyển đổi số và địa chỉ IP


Ws cung cấp một tập các hàm chuyển đổi (database function) để chuyển tên máy
(host) và tên dịch vụ mà người lập trình sử dụng sang định dạng máy có thể hiểu
được. Các hàm này còn có chức năng chuyển đổi khuôn dạng dữ liệu để đảm bảo
dữ liệu truyền đi giữa các máy tính trong một hệ thống mạng luôn theo một định
dạng chung.

1) Các hàm chuyển đổi thứ tự byte


Như đã biết, Ws cho phép các máy tính có kiến trúc phần cứng khác nhau (dựa
theo kiến trúc CPU) có thể truyền thông được với nhau. Tuy nhiên, các hệ thống
khác nhau thường có cách lưu trữ dữ liệu số bên trong bộ nhớ khác nhau. Trong
kiến trúc máy tính, ta đã biết cách CPU lưu trữ số bên trong theo thứ tự byte.

53
Ví dụ: CPU kiến trúc Intel 80x86 có thứ tự byte little edian nghĩa là lưu byte có ý
nghĩa thấp hơn (LSB) tại phần địa chỉ thấp hơn trong không gian địa chỉ của số
nguyên
Ngược lại, Motorola 68000 có thứ tự byte big edian, lưu MSB tại phần địa chỉ
thấp hơn
Vì vậy, Ws cung cấp một số hàm chuyển đổi thứ tự byte của máy tính sang thứ tự
byte của mạng trước khi truyền và ngược lại sau khi nhận dữ liệu. Thứ tự byte của
mạng đã được chuẩn hóa trong giao thức TCP/IP.
Khi xây dựng chương trình, có thể dễ bỏ qua các hàm này mà chương trình vẫn
hoạt động đúng vì trong trường hợp đó các máy tính trong mạng đều theo cùng
một kiểu thứ tự byte.
Có 4 hàm chuyển đổi thứ tự byte
Hàm chuyển đổi kiểu dữ liệu unsigned short (2 bytes)
u_short htons(u_short hostshort); // chuy•n th• t• byte c•a host
sang network
u_short ntohs(u_short netshort); // chuy•n th• t• byte c•a
network sang host

Ví dụ : Trong máy tính kiến trúc Intel, số 43794 ở dạng Hecxa là AB12 thì được
lưu trong bộ nhớ dưới dạng 12AB. Khi qua hàm chuyển đổi htons sẽ được chuyển
lại thành 12AB theo đúng thứ tự network ( đối với M 68000 thì không cần chuyển
đổi)
Hàm chuyển đổi kiểu dữ liệu unsigned long : tương tự như hai hàm nêu trên, dữ
liệu chuyển đổi là kiểu unsigned long integer (4 bytes)
u_long PASCAL FAR htons(u_long hostlong);
u_long PASCAL FAR ntohs(u_long netlong);

2) Chuyển đổi địa chỉ IP


Ta thường viết địa chỉ IP theo quy cách số thập phân được ngăn cách bởi dấu
chấm vì dễ hiểu và rõ ràng nhất. Tuy nhiên, để biểu diễn theo cách này phải sử
dụng xâu kí tự và cần phải chuyển về dạng số 4 byte khi truyền địa chỉ làm tham
số. Ví dụ: “203.167.0.5” chuyển về dạng số Hecxa 4 byte là CBA70005. Địa chỉ

54
viết trong xâu dễ đọc hơn địa chỉ dưới dạng số. Tuy nhiên, nó chỉ có ích cho người
dùng, còn khi muốn kết nối thì phải sử dụng địa chỉ số
Ws cung cấp hàm chuyển đổi địa chỉ IP từ dạng chuỗi kí tự sang dạng số nguyên 4
byte và ngược lại

Hàm chuyển địa chỉ dạng xâu kí tự sang dạng số (binary)


Hàm chuyển địa chỉ dạng số sang dạng xâu kí tự

3) Truy vấn hostname


Các ứng dụng thường cần phải biết hostname của máy tính mà ứng dụng đó đang
chạy. Do đó, Ws cung cấp hàm gethostname() để lấy hostname

3.2.6 Truy vấn địa chỉ, hostname, cổng và dịch vụ

1) Truy vấn địa chỉ IP qua tên host


Người dùng thường sử dụng hostname dạng kí tự trong việc kết nối với các máy
tính khác. Trong khi máy tính yêu cầu địa chỉ host là một số 32bit lưu trữ ở dạng
chuẩn theo thứ tự network và chỉ kết nối được khi nào đã có địa chỉ. Để nhận được
IP add từ hostname, người lập trình cần phải sử dụng hàm gethostbyname(). Hàm
này sẽ nhận tham số là chuỗi biểu diễn tên host và trả lại địa chỉ IP dưới dạng số.
Để thực hiện nhiệm vụ này, hàm có thể thực hiện theo 2 cách:
+ Tìm trong bảng địa chỉ nằm trong file host được lưu tại chính máy đó
+ Gửi yêu cầu đến một DNS server trong mạng
Tuy nhiên, người lập trình không cần quan tâm hàm thực hiện theo cách nào
Ví dụ :
#define HOST_NAME_LEN (50)
char lpszHostName[HOST_NAME_LEN]; // will accept the host name
char lpszMessage[100]; // informational message
char lpszIP[16]; // IP address string
PHOSTENT phostent; // pointer to host entry structure
IN_ADDR in; // Internet address structure
// find the name of the machine this program is running on
if (gethostname(lpszHostName, HOST_NAME_LEN) != 0)
wsprintf(lpszMessage, “gethostname() generated error %d”,
WSAGetLastError());

55
else
{
// get the host entry structure for this machine
if ((phostent = gethostbyname(lpszHostName)) == NULL)
wsprintf(lpszMessage, “gethostbyname() generated error %d”,
WSAGetLastError());
else
{
// copy the four byte IP address into a Internet address
structure
memcpy(&in, phostent->h_addr, 4);
// format the results, converting the IP address into a string
wsprintf(lpszMessage, “Host %s has IP address “, phostent-
>h_name);
wsprintf(lpszIP, “%s”, inet_ntoa(in));
lstrcat(lpszMessage, lpszIP);
}
}
MessageBox(NULL, lpszMessage, “Info”, MB_OK);

Nhóm các hàm tìm một yếu tố thông qua một yếu tố khác như hàm
gethostbyname() gọi chung là các hàm getXbyY()
Lúc trước ta đã đề cập đến chế độ blocking và non-blocking. Có một điều cần chú
ý là hàm gethostbyname() có thể phải gửi yêu cầu đến server và chờ server gửi lại
kết quả và sẽ bị block. Thời gian đáp ứng của ứng dụng sẽ tùy thuộc vào việc hàm
bị block trong bao lâu (chính vào thời gian đáp ứng của server và không đảm bảo
là sẽ có kết quả). Để tránh bị block, ta sẽ sử dụng hàm non-blocking
WSAAsynGetHostByName().
HANDLE WSAAPI
WSAAsyncGetHostByName (
IN HWND hWnd,
IN unsigned int wMsg,
IN const char FAR * name,
OUT char FAR * buf,
IN int buflen
);
Ví d• :
// global variables
#define WM_USER_GETHOSTBYNAME (WM_USER + 1)
#define HOST_NAME_LEN (50)
char lpszHostName[HOST_NAME_LEN]; // will accept the host name
char lpszMessage[100]; // informational message
char lpszIP[16]; // IP address string
PHOSTENT phostent; // pointer to host entry structure
char lpszHostEntryBuf[MAXGETHOSTSTRUCT]; // host entry structure
IN_ADDR in; // Internet address structure
HANDLE hGetHostByName; // handle of asynchronous request

56
// this function is [part of] the window procedure
long FAR PASCAL WndProc(HWND hWnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
switch (message)
{
// check menu items
case WM_COMMAND:
// handle the menu item to get this host’s name and IP address
if (wParam == ID_GETHOSTBYNAME)
{
// find the name of the machine this program is running on
if (gethostname(lpszHostName, HOST_NAME_LEN) != 0)
{
wsprintf(lpszMessage, “gethostname() generated error %d”,
WSAGetLastError());
MessageBox(NULL, lpszMessage, “Info”, MB_OK);
}
else
{
// get the host entry structure for this machine
if ((hGetHostByName = WSAAsyncGetHostByName(hWnd,
WM_USER_GETHOSTBYNAME, lpszHostName,
lpszHostEntryBuf, MAXGETHOSTSTRUCT)) == 0)
{
wsprintf(lpszMessage, “WSAAsyncGetHostByName() generated error
%d”,
WSAGetLastError());
MessageBox(NULL, lpszMessage, “Info”, MB_OK);
}
}
}
break;
case WM_USER_GETHOSTBYNAME:
// check for an error
if (WSAGETASYNCERROR(lParam) != 0)
MessageBox(NULL, “WSAAsyncGetHostByName() had an error”, “Info”,
MB_OK);
else
{
// assign a hostent host entry pointer to the buffer
phostent = (PHOSTENT)lpszHostEntryBuf;
// copy the four byte IP address into a Internet address
structure
memcpy(&in, phostent->h_addr, 4);
// format the results, converting the IP address into a string
wsprintf(lpszMessage, “Host %s has IP address “, phostent-
>h_name);
wsprintf(lpszIP, “%s”, inet_ntoa(in));
lstrcat(lpszMessage, lpszIP);
MessageBox(NULL, lpszMessage, “Info”, MB_OK);
}
break;
default:
break;
}
}

57
Chú ý
Giá trị HANDLE trả về bởi các hàm WSAAsyncGetXByY() được dùng để chấm
dứt quá trình đó thông qua gọi hàm WSACancelAsyncRequest()
int WSAAPI WSACancelAsyncRequest(HANDLE hAsyncTaskHandle);

Nếu thành công, hàm trả lại giá trị 0, ngược lại là SOCKET_ERROR. Có thể dùng
hàm WSAGetLastError() để lấy giá trị mã lỗi
Bằng cách dùng WSACancelAsyncRequest(), người sử dụng sẽ có nhiều khả năng
kiểm soát chương trình hơn.

2) Truy vấn tên host qua địa chỉ IP


Như ta đã trình bày, gethostbyname() chỉ là một hàm trong nhóm getXbyY().
Ngược lại với gethostbyname() là gethostbyaddr(). Chức năng của hàm là lấy
thông tin về host qua giá trị trả về là con trỏ đến cấu trúc HOSTENT. Chi tiết và ví
dụ về sử dụng hàm xem trong tài liệu tham khảo. Hàm này cũng có một phiên bản
non-blocking là WSAAsyncGetHostByAddr().

3) Truy vấn tên dịch vụ


Sau khi đã biết địa chỉ, liệu đã có thể kết nối được chưa ? Câu trả lời là chưa. Địa
chỉ IP chỉ là một nửa của phương trình để thiết lập kết nối giữa các ứng dụng
client và server. Số hiệu cổng (port number) sẽ cung cấp nửa còn lại của phương
trình. Cổng đóng vai trò như địa chỉ của một socket trên một hệ thống máy tính.
Socket muốn truyền thông thì phải được gắn với môt cặp địa chỉ:cổng được chấp
nhận trong giao thức TCP/IP. Định dạng của địa chỉ IP và số hiệu cổng đã trình
bày trong phần giao thức TCP.
Khi một ứng dụng server chạy trên một máy tính, nó sẽ cung cấp dịch vụ tại địa
chỉ của máy tính đó thông qua việc “lắng nghe” tại một cổng dịch vụ well-known.
Trên cùng một máy tính có thể có nhiều tiến trình server cung cấp các dịch vụ
khác nhau. Vì vậy, mỗi dịch vụ được xác định bởi một cổng và chương trình client

58
muốn kết nối với dịch vụ nào phải biết địa chỉ máy và cả số hiệu cổng. Số hiệu
cổng là duy nhất và phải well-known. Ví dụ :

Về phía client, người lập trình khi tạo socket không cần chỉ rõ số hiệu cổng. Mỗi
socket sẽ được tự động gán một số hiệu cổng duy nhất lúc runtime bởi TCP/IP
stack.
Hàm getservbyname() có chức năng truy vấn số hiệu cổng khi biết tên dịch vụ. Sử
dụng tên dịch vụ trong chương trình sẽ cho phép người sử dụng chương trình lựa
chọn cổng cho dịch vụ. Như vậy, người dùng sẽ có quyền linh hoạt trong việc cấu
hình chương trình và các dịch vụ.
Ws cung cấp phiên bản non-blocking WSAAsyncGetServByName()
Tên dịch vụ được chuyển sang số hiệu cổng được thực hiện qua việc truy vấn một
file dữ liệu gọi là service file
Cấu trúc Service file

Cấu trúc service file

59
Đối với ứng dụng, việc sử dụng service file cho phép người lập trình tự do đưa vào
các dịch vụ và số hiệu cổng gắn với nó. Điều đó tạo nên sư linh hoạt trong việc
gán cổng cho dịch vụ tránh được trường hợp xung đột về cổng với một số chương
trình server khác. Nếu người dùng fix cứng số hiệu cổng thì khi muốn đổi lại phải
biên dịch lại chương trình. Trong trường hợp sử dụng service file, thì cả phía
client và server đều phải cấu hình để việc kết nối được thực hiện chính xác.
Khuôn dạng hàm :
struct servent* getservbyname(const char * name,
const char * proto);
Cấu trúc SERVENT
struct servent {
char FAR * s_name; // official service name
char FAR * FAR * s_aliases; // alias list
short s_port; // port #
char FAR * s_proto; // protocol to use
};
Ví d• tìm c•ng cho d•ch v• Time trên giao th•c UDP
PSERVENT pservent; // pointer to service entry structure
char lpszMessage[100]; // informational message
char lpszPort[6]; // port number string
Chapter 6 n Conversion and Database Functions 95
// get the service entry structure for the time service using UDP
if ((pservent = getservbyname(“time”, “udp”)) == NULL)
wsprintf(lpszMessage, “getservbyname() generated error %d”,
WSAGetLastError());
else
{
// format the results
wsprintf(lpszMessage, “Service %s using protocol %s has port “,
pservent->s_name, pservent->s_proto);
wsprintf(lpszPort, “%d”, ntohs(pservent->s_port));
lstrcat(lpszMessage, lpszPort);
}
MessageBox(NULL, lpszMessage, “Info”, MB_OK);

Hàm Non-blocking:
HANDLE WSAAsyncGetServByName(HWND hWnd, u_int wMsg,
const char * name, const char * proto,
char * buf, int buflen);

Hàm ngược với hàm trên là getservbyport(), sẽ lấy thông tin về dịch vụ qua tham
số là số hiệu cổng. Cách sử dụng hàm trên cũng tương tự như hàm
getservbyname()

60
Trong phần tới, sẽ trình bày cách để tạo socket, kết nối thông qua socket và truyền
dữ liệu qua lại để có thể viết được một chương trình Winsock đầy đủ chức năng.

3.2.7 Truyền thông client/server hướng kết nối


Hai phần trước đã trình bày về cách khởi tạo và cách truy vấn hostname, địa chỉ,
dịch vụ. Phần này sẽ hướng dẫn cách sử dụng các hàm Winsock để tạo các ứng
dụng truyền thông qua mạng sử dụng giao thức TCP (hướng kết nối)

1) Tạo socket
Để tham chiếu đến socket, Ws tạo một kiểu dữ liệu riêng SOCKET (gọi là socket
descriptor). Trong chương trình, muốn sử dụng socket thì ta phải có biến kiểu
SOCKET tham chiếu đến socket đó.
Do ta có hai giao thức truyền thông, dẫn đến có hai loại socket phổ biến. Cách tạo
cả hai loại giống nhau, đều sử dụng hàm socket()
Chú ý : Phân biệt giữa hai loại socket và tham số để tạo ra hai loại :
SOCK_STREAM và SOCK_DGRAM
Dạng hàm như sau :
SOCKET WSAAPI socket(int af, int type, int protocol);

af Họ địa chỉ Internet


type Loại socket.
protocol Giao thức được sử dụng cùng với dạng địa chỉ
Có một hằng số đặc biệt, có tên là INVALID_SOCKET. Nếu biến kiểu socket có
giá trị bằng INVALID_SOCKET thì socket là không hợp lệ. Nếu thành công, hàm
sẽ trả về một socket descriptor, nếu không sẽ trả về INVALID_SOCKET.

Ví dụ

SOCKET s; // socket descriptor


char lpszMessage[100]; // informational message
s = socket(AF_INET, SOCK_STREAM, 0);// ••a ch• Internet là IP,
Lo•i Stream Socket, tham s• cu•i 0 là giao th•c m•c ••nh, • •ây
là TCP vì hai tham s• ••u •ã có th• xác ••nh giao th•c
if (s == INVALID_SOCKET)

61
wsprintf(lpszMessage, “socket() generated error %d”,
WSAGetLastError());
else
lstrcpy(lpszMessage, “socket() succeeded”);
MessageBox(NULL, lpszMessage, “Info”, MB_OK);

Chú ý : Các tham số trong hàm socket() phải phù hợp. Nếu họ địa chỉ và loại
socket không thích hợp với giao thức, hàm sẽ trả về lỗi và một số các error number

Sau đây là tiến trình các bước cần tiến hành ở phía client và server để thiết lập một
cuộc truyền thông có kết nối.

Kết nôi stream giữa client và server

2) Lập trình phía server


Truyền thông client/server sử dụng giao thức TCP và stream socket phức tạp hơn
so với truyền thông không kết nối. Cả phía client và server phải tiến hành một số
bước trước khi thực sự trao đổi dữ liệu. Trình bày về stream socket trước sẽ giúp
các bạn hiểu nhanh hơn đối với datagram socket.

62
Tại phía Server, socket sẽ gắn với một socket name nhất định (wellknown) bao
gồm địa chỉ và cổng. Ứng dụng server sẽ lắng nghe, chờ kết nối trên socket đó.
Khi client kết nối đến server, server sẽ chấp nhận kết nối ( nếu có thể) và sau đó cả
hai tiến hành truyền nhận dữ liệu.
Gán tên cho socket
Sau khi tạo socket, ta mới chỉ có một socket descriptor chưa gắn với một địa chỉ
và cổng dịch vụ nào cả. Để socket hoạt động, trước hết ta phải gán tên cho socket
bằng hàm bind()
Dạng hàm như sau:
int PASCAL FAR bind(SOCKET s, const struct sockaddr FAR *addr,
int namelen);

Nếu thành công, hàm sẽ trả về giá trị 0, ngược lại SOCKET_ERROR
Các trường hợp có thể tạo ra lỗi cho hàm bind()
+
+
Các tham số của hàm :
+ addr là một con trỏ đến cấu trúc sockaddr
struct sockaddr
{
u_short sa_family; // address family
char sa_data[14]; // up to 14 bytes of direct address
};

Khuôn dạng của sa_data lại tùy thuộc vào họ địa chỉ. Trong Winsock 1.1, chỉ có
họ địa chỉ Internet được hỗ trợ (Winsock2 hỗ trợ nhiều họ địa chỉ khác). Vì vậy,
Ws định nghĩa cấu trúc thêm cấu trúc sockaddr_in để lưu trữ địa chỉ Internet (IP
Address)
struct sockaddr_in
{
short sin_family; // address family
u_short sin_port; // service port
struct in_addr sin_addr; // Internet address
char sin_zero[8]; // filler
};

63
Trong cấu trúc này, trường đầu tiên chỉ họ địa chỉ và đương nhiên phải bằng
AF_INET. Trường thứ 3 là một cấu trúc 4 byte in_addr mô tả địa chỉ internet.
Trường cuối cùng để điền thêm cho đủ 14 byte. Thực chất, trường thứ 3
IN_ADDR có độ lớn bằng 4 bytes và là cấu trúc có dạng sau :
struct in_addr
{
union
{
struct { u_char s_b1, s_b2, s_b3, s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
} S_un;
#define s_addr S_un.S_addr // can be used for most tcp & ip code
#define s_host S_un.S_un_b.s_b2 // host on imp
#define s_net S_un.S_un_b.s_b1 // network
#define s_imp S_un.S_un_w.s_w2 // imp
#define s_impno S_un.S_un_b.s_b4 // imp #
#define s_lh S_un.S_un_b.s_b3 // logical host
};

Đây là những cấu trúc và thông số cơ bản để tạo nên socket, vì vậy cần trình bày
rõ. Ví dụ sử dụng hàm bind:
SOCKET s; // socket descriptor
char lpszMessage[100]; // informational message
SOCKADDR_IN addr; // Internet address
// create a stream socket
s = socket(AF_INET, SOCK_STREAM, 0);
if (s != INVALID_SOCKET)
{
// fill out the socket’s address information
addr.sin_family = AF_INET;
addr.sin_port = htons(1050);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
// bind the socket to its address
if (bind(s, (LPSOCKADDR)&addr, sizeof(addr)) == SOCKET_ERROR)
{
wsprintf(lpszMessage, “ bind() generated error %d”,
WSAGetLastError());
MessageBox(NULL, lpszMessage, “Info”, MB_OK);
}
else
...
}

Chú ý cách gán địa chỉ INADDR_ANY: có ý nghĩa là socket này sẽ lắng nghe kết
nối từ bấy kì mạng nào mà host đó có kết nối. Nếu muốn hạn chế kết nối thì chỉ
nghe trên một địa chỉ nhất định.

64
Server có 2 giao diện kết nối với 2 mạng khác nhau

Ví dụ : theo hình minh họa trên, server có hai card mạng Ethernet. Một card có địa
chỉ IP là 203.162.25.200, một card có địa chỉ 203.162.15.157. Nếu muốn giới hạn
địa chỉ mà client có thể kết nối tới vào một trong hai giao diện Ethernet card, có
thể làm như sau :
addr.sin_addr.s_addr = inet_addr(“203.162.25.200”);

Lắng nghe kết nối


Sau khi gán tên cho socket, bước tiếp theo là cho socket “lắng nghe” kết nối từ
phía client. Hàm listen() sẽ thực hiện công việc đó. Socket được truyền vào làm
tham số trong hàm listen sẽ trở thành một server socket chờ sẵn trên địa chỉ và
cổng xác định.
Sử dụng hàm : hàm listen() chỉ có tác dụng sau khi đã tạo thành công socket và đã
gán cho socket một địa chỉ cụ thể bằng hàm bind()
Dạng hàm :

65
int WSAAPI listen (
IN SOCKET s,
IN int backlog
);
s là socket descriptor, backlog là số lượng các kết nối xếp trong hàng đợi chờ xử lý
( trong trường hợp server socket đang xử lý nhiều kết nối), giá trị từ 1 – 5
Nếu thành công, hàm trả về giá trị 0, ngược lại, trả về SOCKET_ERROR
Ví dụ :
SOCKET s; // socket descriptor
char lpszMessage[100]; // informational message
SOCKADDR_IN addr; // Internet address
// create a stream socket
s = socket(AF_INET, SOCK_STREAM, 0);
if (s != INVALID_SOCKET)
{
// fill out the socket’s address information
addr.sin_family = AF_INET;
addr.sin_port = htons(1050);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
// bind the socket to its address
if (bind(s, (LPSOCKADDR)&addr, sizeof(addr)) != SOCKET_ERROR)
{
// listen for connections (queueing up to three)
if (listen(s, 3) == SOCKET_ERROR)
{
wsprintf(lpszMessage, “listen() generated error %d”,
WSAGetLastError());
MessageBox(lpszMessage, “Info”);
}
else
...
}
}

Chú ý :
Tham số Backlog giữ vai trò bảo đảm an toàn thông qua việc hạn chế việc cấp
phát nhiều tài nguyên hệ thống
Chấp nhận kết nối
Sau khi “lắng nghe” bằng cách gọi hàm listen() và mỗi khi có yêu cầu kết nối từ
client gửi đến địa chỉ mà socket đang hoạt động, socket có thể thiết lập kết nối
bằng cách gọi hàm Accept() để chấp nhận yêu cầu đó
Dạng hàm :
SOCKET PASCAL FAR accept(SOCKET s, struct sockaddr FAR *addr,

66
int FAR *addrlen);

Tham số addr là con trỏ đến cấu trúc sockaddr dùng để lưu địa chỉ của socket gửi
yêu cầu kết nối. Nếu không quan tâm, có thể truyền giá trị NULL. Nếu thành
công, hàm sẽ trả về một socket descriptor. Đây chính là socket dùng để truyền
thông với phía client. Socket descriptor s sẽ tiếp tục được duy trì để chấp nhận
những kết nối mới. Nếu thất bại, giá trị trả về là INVALID_SOCKET, có thể dùng
hàm WSAGetLastError() để kiểm tra nguyên nhân gây ra lỗi.

Sử dụng hàm : Trong trường hợp blocking và không sử dụng callback function, ta
cần sử dụng một tuyến riêng cho server socket và hàm Accept() cần được đặt
trong vòng lặp để xử lý nhiều yêu cầu kết nối.
Ví dụ:
SOCKET s; // socket descriptor
SOCKET clientS; // client socket descriptor
char lpszMessage[100]; // informational message
SOCKADDR_IN addr; // Internet address
SOCKADDR_IN clientAddr; // Internet address
IN_ADDR clientIn; // IP address
int nClientAddrLen;
// create a stream socket
s = socket(AF_INET, SOCK_STREAM, 0);
if (s != INVALID_SOCKET)
{
// fill out the socket’s address information
addr.sin_family = AF_INET;
addr.sin_port = htons(1050);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
// bind the socket to its address
if (bind(s, (LPSOCKADDR)&addr, sizeof(addr)) != SOCKET_ERROR)
{
// listen for connections (queueing up to three)
if (listen(s, 3) != SOCKET_ERROR)
{
// set the size of the client address structure
nClientAddrLen = sizeof(clientAddr);
// accept a connection
int numClient = 0
While (numClient<3) // Server ch• ph•c v• 3 client
{
clientS = accept(s, (LPSOCKADDR)&clientAddr, &nClientAddrLen);
if (clientS == INVALID_SOCKET)
{
wsprintf(lpszMessage, “ accept() generated error %d”,
WSAGetLastError());
MessageBox(lpszMessage, “Info”);

67
}
else
{
// copy the four byte IP address into an IP address structure
memcpy(&clientIn, &clientAddr.sin_addr.s_addr, 4);
// print an informational message
wsprintf(lpszMessage,“accept() ok: client IP address is %s, port
is %d”,inet_ntoa(clientIn), ntohs(clientAddr.sin_port));
MessageBox(lpszMessage, “Info”);
...
}
} // End While
}
}

Bên cạnh cách dùng hàm Accept() để lấy địa chỉ của client kết nối đến, có thể sử
dụng hàm getpeername()
Trong trường hợp không có yêu cầu từ client
Khi server đang thực hiện hàm accept() mà không có một client nào kết nối đến,
ứng dụng server, cụ thể hơn là tiến trình hay tuyến mà socket server đang chạy
hàm accept() sẽ bị block và chờ yêu cầu kết nối từ client. Kịch bản này tương tự
với trường hợp sử dụng các hàm dạng GetXbyY(). Để tránh cho chương trình
không bị block, có thể xử lí theo 2 cách :
Xử lí theo cách của Window
Ví dụ:
Chú ý:

3) Lập trình phía Client


Gán cho socket tên mặc định
Kết nối tới Server
Trường hợp không có Server lắng nghe

4) Truyền và nhận dữ liệu qua socket


Truyền dữ liệu
Nhận dữ liệu

68
5) Đóng kết nối

3.2.8 Ví dụ ứng dụng Client/Server sử dụng TCP


TCP socket thích hợp với những loại ứng dụng nào ? Tại sao
Sơ lược về lập trình Window và MFC

69
Chương 4 Lập trình với UDP Socket

4.1 Giao thức UDP


UDP (User Datagram Protocol) là giao thức theo phương thức không liên kết được
sử dụng thay thế cho TCP ở trên IP theo yêu cầu của từng ứng dụng. Khác với
TCP, UDP không có các chức năng thiết lập và kết thúc liên kết. Tương tự như IP,
nó cũng không cung cấp cơ chế báo nhận (acknowledgment), không sắp xếp tuần
tự các gói tin (datagram) đến và có thể dẫn đến tình trạng mất hoặc trùng dữ liệu
mà không có cơ chế thông báo lỗi cho người gửi. Qua đó ta thấy UDP cung cấp
các dịch vụ vận chuyển không tin cậy như trong TCP.
Khuôn dạng UDP datagram được mô tả với các vùng tham số đơn giản hơn nhiều
so với TCP segment.

Dạng thức của gói tin UDP

UDP cũng cung cấp cơ chế gán và quản lý các số hiệu cổng (port number) để định
danh duy nhất cho các ứng dụng chạy trên một trạm của mạng. Do ít chức năng
phức tạp nên UDP thường có xu thế hoạt động nhanh hơn so với TCP. Nó thường
được dùng cho các ứng không đòi hỏi độ tin cậy cao trong giao vận.

4.2 Lập trình Datagram socket

 Sử dụng Socket (giống như TCP)


 Khác với TCP:
 Kiểu Socket : sử dụng Datagram Socket
 Các công đoạn, các bước lập trình

70
Vì UDP là giao thức không hướng kết nối nên lập trình UDP với Datagram socket
không cần phải mở kết nối mà thực hiện theo các bước sau.

4.2.1 Bước chuẩn bị trước khi truyền thông

1) Tại phía Server


 Tạo socket với kiểu SOCK_DGRAM
SOCKET s;
s = socket(AF_INET, SOCK_DGRAM, 0);
 Gắn socket với một địa chỉ Socket
addr.sin_family = AF_INET;
addr.sin_port = htons(2050);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(s, (LPSOCKADDR)&addr, sizeof(addr)) ==
SOCKET_ERROR)
{...
 Server socket đã sẵn sàng nhận data từ cổng 2050 và bất cứ net interface
nào gắn với host
 Server nhận dữ liệu
• Hàm recvfrom()
int PASCAL FAR recvfrom(SOCKET s, char FAR * buf, int
len, int flags,
struct sockaddr FAR *from, int FAR * fromlen);
• Tham số
 S : socket nhận data
 Buf : bộ đệm nhận dữ liệu
 Len : kích thước bộ đệm
 Flags : Cờ chỉ định nhận data
 From : con trỏ cấu trúc địa chỉ socket gửi data ( dùng để nhận
thông tin của bên gửi)
 Return value : số byte nhận được (nếu thành công), hoặc
SOCKET_ERROR

71
2) Tại phía Client
 Chỉ cần tạo socket
SOCKET s;
s = socket(AF_INET, SOCK_DGRAM, 0);
 Thực hiện truyền nhận data
 Truyền
int PASCAL FAR sendto(SOCKET s, const char FAR * buf,
int len, int flags,
const struct sockaddr FAR *to, int tolen);

 Nhận
int PASCAL FAR recvfrom(SOCKET s, char FAR * buf, int
len, int flags,
struct sockaddr FAR *from, int FAR * fromlen);

4.2.2 Gửi và nhận các gói tin UDP


Sơ đồ truyền thông

SERVER

Socket()
CLIENT
Bind()
Socket()
Recvfrom()
Sendto()
blocked

Sendto()
Recvfrom()

Close()

72
1) Truyền datagram
Để truyền một datagram, sử dụng hàm sendto()
int PASCAL FAR sendto(SOCKET s, const char FAR * buf, int len,
int flags,
const struct sockaddr FAR *to, int tolen);
Trong đó : s là socket dùng để truyền data, buf là con trỏ đến vùng đệm chứa dữ
liệu cần truyền, len là độ lớn của dữ liệu cần truyền, flag là tham số xác định cách
hàm sendto được gọi
Chú ý : Mã lỗi WSAEMSGSIZE sẽ phát sinh nếu hàm sendto() gửi đi một
datagram có kích thước vượt quá kích thước quy định. Kích thước tối đa phụ thuộc
vào phiên bản của Winsock và có thể kiểm tra qua tham số iMaxUdpDg trong cấu
trúc WSAData truyền vào hàm WSAStartup()
Ví dụ :
SOCKET s;
SOCKADDR_IN addr;
#define BUFSIZE (100)
char pszBuf[BUFSIZE];
int nBufLen;
int nBytesSent;
int nError;
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s == INVALID_SOCKET)
{
nError = WSAGetLastError();
// ...
}
else
{
// fill out the address of the recipient
addr.sin_family = AF_INET;
addr.sin_port = htons(2050);
addr.sin_addr.s_addr = inet_addr(“166.78.16.150”);
// assign some data to send
lstrcpy(pszBuf, “Hello, World!”);
nBufLen = lstrlen(pszBuf);
// send the datagram
nBytesSent = sendto(s, pszBuf, nBufLen, 0, (LPSOCKADDR)&addr,
sizeof(addr));
if (nBytesSent == SOCKET_ERROR)
{
nError = WSAGetLastError();
// ...
}
else
{
// data was sent
}

73
closesocket(s);
}

Hàm Sendto() có thể bị block

2) Nhận datagram
Trình bày
Chú ý
Ví dụ

4.2.3 Ứng dụng Client/Server dựa vào UDP, so sánh với TCP
Ứng dụng UDP
Các ứng dụng trao đổi các bản tin ngắn một chiều, không cần các thao tác
khác như bắt tay thỏa thuận, đăng nhập
Domain Name System (DNS)
Các ứng dụng thới gian thực đòi hỏi tốc độ truyền tin nhanh nhưng không
yêu cầu chính xác tuyệt đối.
Voice over IP
Các ứng dụng Multicasting, một server đồng bộ cho nhiều client
Video conferencing, image broadcasting

Ứng dụng TCP


Các ứng dụng hướng kết nối, có thủ tục bắt tay, quá trình trao đổi thông
tin liên tục hai chiều và chia làm nhiều bước, qua nhiều trạng thái
database
Các ứng dụng đòi hỏi độ tin cậy chính xác của dữ liệu
Database, FTP, HTTP, Telnet....

4.2.4 Ví dụ về ứng dụng Client/Server sử dụng UDP

74
Chương 5 Các kĩ thuật trong Client/Server

5.1 Lập trình Multicast

5.1.1 Multicast và Broadcast

1) Khái niệm và mô hình


 Multicast là kĩ thuật truyền dữ liệu trên Internet từ 1 điểm đến nhiểu điểm
khác
 Multicast xuất phát từ nhu cầu đối với việc quảng bá các thông tin trên
mạng giống như đối với radio hay TV
 Ví dụ: quảng bá âm thanh, hình ảnh thời gian thực đến một tập các
điểm đã được đăng kí trước vào một conference
 Unicast là bất cứ hình thức truyền nào không phải Multicast (Nói cách
khác, truyền mà chỉ có nhiều nhất một điểm nhận)
 TCP và UDP đều là Unicast-oriented nhưng UDP không bị giới hạn chỉ với
Unicast.
 Unicast đáp ứng tốt các ứng dụng thông thường như Web, email, file access
nhưng có nhiều bất cập với ứng dụng kiểu TV hay radio, hoặc các ứng
dụng truyền thông theo nhóm
Hạn chế của Unicast và Broadcast
 Trường hợp : truyền data là audio và video cho nhiều điểm trên mạng
 Unicast : cần băng thông rất lớn và duy trì nhiều kết nối -> server và
mạng sẽ khó đáp ứng
 Broadcast: tất cả các host trên mạng nhận được data nhưng vấn đề là
chỉ một phần trong số đó thực sự cần data đó. Hơn nữa Broadcast chỉ
làm việc tốt trong mạng LAN

75
5.1.2 Sử dụng Multicast
Giải pháp Multicast
 Sử dụng một địa chỉ đặc biệt cho 1 nhóm ( giống như tần số phát sóng của
Radio hay TV)
 Các host muốn nhận data sẽ đăng kí tham gia vào nhóm và có thể nhận
được các gói tin với địa chỉ đích là địa chỉ nhóm.
 Các gói tin đặc biệt này được kernel định tuyến bằng phương pháp riêng
Nhóm Multicast

B1
A1

Internet

B2

B1
B2
A1

C1 C1

Tạo nhóm Multicast

Cơ chế nhóm Multicast :


 “Control plane” là cách tổ chức các thành viên vào một nhóm Multicast
 Có 2 kiểu control plane
 Rooted control plane : có duy nhất 1 thành viên đặc biệt c_root kiểm
soát việc ra nhập nhóm
 Ví dụ : giao thức ATM

76
 Nonrooted control plane : các thành viên có thể tự do ra nhập nhóm
không bị hạn chế
 Ví dụ : giao thức IP

1) IP Multicast
 Phương pháp Multicast dùng cho giao thức IP và mạng Internet
 Thực hiện kiểu nonrooted trong kiểm soát nhóm (control plane) và truyền
nhận dữ liệu (data plane)

Địa chỉ Multicast :

 Địa chỉ IPv4 32 bit được phân lớp A,B,C,D


 Trong đó địa chỉ lớp D dành cho Multicast
 Mọi gói tin có địa chỉ bắt đầu bằng 1110 là gói tin Multicast
 28 bit còn lại dùng để định danh nhóm (group) Multicast.
 Có một số Well-known Multicast groups được chỉ ra trong
“Assigned number” RFC
 Một số dải địa chỉ được dùng cho các mục đích đặc biệt do Internet
Assigned Names and Numbers Authority (IANA) quy định trong
RFC 3171

77
 224.0.0.0 Base address (reserved)
 224.0.0.1 All systems on this subnet
 224.0.0.2 All routers on this subnet
 224.0.1.1 Network time protocol
 224.0.0.9 RIP version 2 group address
 224.0.1.24 WINS server group address
 …
Các mức đáp ứng Multicast :
 Mức 0 : Không đáp ứng hoàn toàn. Phần lớn các host và router trên Internet
ở mức này
 Mức 1 : Hỗ trợ gửi gói tin Multicast nhưng không nhận  không cần thiết
phải tham gia nhóm multicast mới có thể gửi được data cho nhóm đó.
 Mức 2: Hoàn toàn chấp nhận Multicast
 Tham gia nhóm hoặc rời khỏi nhóm Multicast
 Chuyển thông tin về nhóm cho các router hỗ trợ multicast bằng một
giao thức riêng
Giao thức IGMP
 IGMP (Internet Gateway Management Protocol)
 IGMP là backbone của Multicast
 Host sử dụng IGMP để báo cho router việc tham gia nhóm multicast
 Các router đặt giữa subnet của các host cùng phải hỗ trợ IGMP
 Lệnh JOIN cùng tham số TTL sẽ chuyển thông tin tham gia nhóm
của host đến các router trên mạng
 Các bước thực hiện :
 Một host muốn tham gia nhóm Multicast với địa chỉ 224.a.b.c
 Gửi lệnh JOIN với TTL = 2
 Các router của local subnet nhận được lệnh sẽ ghi nhận yêu cầu
tham gia nhóm

78
 Để chuyển tiếp yêu cầu, router giảm TTL đi 1, rồi chuyển tiếp cho
các router ở subnet khác
 Tiếp diễn quá trình đó cho đến khi TTL = 0
 IGMP v1 không hỗ trợ phương thức rời khỏi nhóm  chiếm dụng băng
thông mạng nếu host tham gia nhiều group
 IGMP v2 hỗ trợ phương thức LEAVE để báo cho router biết là host muốn
ra khỏi nhóm.
 Windows 98, Windows 2000 hỗ trợ version 2
Gửi gói tin Multicast
 Truyền thông Multicast được xử lí tại tầng UDP
 Để gửi gói tin Multicast, ứng dụng cần mở UDP socket với địa chỉ đích
thuộc lớp D
 TTL : rất quan trọng trong Multicast (threshold)
 Loopback : trường hợp host gửi data cũng thuộc nhóm Multicast sẽ nhận
data
 Lựa chọn Interface mạng :Nếu host có nhiều interface, trước khi truyền cần
chỉ rõ sử dụng interface nào
Nhận gói tin Multicast
 Tham gia vào nhóm “joint group”
 Đăng kí với kernel (OS) qua Winsock API. Kernel sẽ sử dụng giao
thức IGMP để báo cho router
 Gói tin multicast sẽ được router lọc và chuyển đến host và ứng dụng
 Nhiều ứng dụng trên 1 host có thể tham gia vào các nhóm
 Rời khỏi nhóm : huỷ đăng kí với kernel
 Ánh xạ giữa địa chỉ Multicast IP và địa chỉ Ethernet (LAN)

79
2) Phương pháp lập trình Multicast với UDP Socket
So sánh với lập trình Unicast
 Giống nhau
 Đều sử dụng giao diện SOCKET trong SDK hoặc lớp CSocket,
CAsyncSocket trong MFC
 Các bước lập trình giống nhau
 Khác nhau:
 Chỉ sử dụng giao thức UDP với loại socket là SOCK_DGRAM
 Đặt chế độ làm việc của socket ở chế độ MULTICAST qua hàm
setsockopt()
Sử dụng hàm setsockopt()
 Dạng hàm
int setsockopt(Socket s, int level, int optname, const
void* optval, int optlen);

 Để thay đổi các tuỳ chọn (option) của socket khi hoạt động
 Tham số của hàm
 s : Socket sẽ được thay đổi tuỳ chọn
 level : mức tại đó giá trị option được áp dụng
 Optname : Tên option được thay đổi giá trị
 Optval: con trỏ đến vùng nhớ chứa giá trị option sẽ áp dụng
 Optlen: kích thước của vùng nhớ optval
Các tham số MULTICAST
 Được truyền vào tham số Optname trong hàm setsockopt
 IP_MULTICAST_LOOP
 IP_MULTICAST_TTL
 IP_MULTICAST_IF
 IP_ADD_MEMBERSHIP
 IP_DROP_MEMBERSHIP
IP_MULTICAST_LOOP

80
 Là option : data gửi đi từ một host có được gửi trở lại host hay không (loop
back)
 Ví dụ:
 Truyền dữ liệu video : không cần loop back
u_char loop;
loop =1; // or loop = 0;
setsockopt(socket, IPPROTO_IP, IP_MULTICAST_LOOP,
&loop, sizeof(loop));

IP_MULTICAST_TTL
 Là option : để đặt giới hạn TTL cho giao thưc IGMP
 Giá trị của option từ 0-255
u_char ttl;
setsockopt(socket, IPPROTO_IP, IP_MULTICAST_TTL, &ttl,
sizeof(ttl));

IP_MULTICAST_IF
 Là option để lựa chọn giao diện mạng mặc định để gửi các gói tin multicast
(chọn địa chỉ nguồn cho gói tin)
 Với giá trị INADDR_ANY, lựa chọn giao diện mặc định
struct in_addr interface_addr;
setsockopt (socket, IPPROTO_IP, IP_MULTICAST_IF,
&interface_addr, sizeof(interface_addr));

IP_ADD_MEMBERSHIP
 Là option để yêu cầu tham gia vào một nhóm Multicast
 Optval sẽ phải chỉ ra địa chỉ của nhóm Multicast đó và địa chỉ của giao diện
mạng ( địa chỉ host sẽ tham gia vào nhóm)
struct ip_mreq {
struct in_addr imr_multiaddr; /* IP multicast address of group
*/
struct in_addr imr_interface; /* local IP address of interface
*/
};
setsockopt (socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq,
sizeof(mreq));

IP_DROP_MEMBERSHIP

81
 Là option để yêu cầu rời khỏi nhóm Multicast
 Tương tự như IP_ADD_MEMBERSHIP khi gọi hàm
struct ip_mreq mreq;
setsockopt (socket, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq,
sizeof(mreq));

Các bước lập trình Multicast


 Tại phía nhận dữ liệu :
 Tạo một UDP socket (SOCK_DGRAM)
 Gắn socket đó với một địa chỉ A của host (bind)
 Đặt tham số IP_MULTICAST_TTL, IP_MULTICAST_LOOP
 Tham gia vào nhóm Multicast có địa chỉ D, tạo một ánh xạ địa chỉ
giữa D và A
 Tạo và bind UDP Socket
 Sử dụng lớp kế thừa từ CAsyncSocket
class CMulticastSocket : public CAsyncSocket
 Thêm một số phương thức vào lớp CMulticastSocket()
BOOL JoinGroup(CString, UINT, UINT, BOOL);
BOOL LeaveGroup();
BOOL SendTo(const void*, int);
void SetLoopBack(BOOL);
BOOL SetTTL(UINT nTTL);
BOOL CreateSendingSocket(UINT, BOOL);
BOOL CreateReceivingSocket(LPCTSTR, UINT);
 Gọi phương thức Creat(…)
Create(nPort, SOCK_DGRAM, FD_READ);
 Tham gia nhóm Multicast
BOOL CMulticastSocket::CreateReceivingSocket(LPCTSTR strGroupIP,
UINT nGroupPort)
{
/* Create socket for receiving packets from multicast group */
if(!Create(nGroupPort, SOCK_DGRAM, FD_READ)) // Nhan su kien
FD_READ
return FALSE;
BOOL bMultipleApps = TRUE;/* allow reuse of local port if needed
*/
SetSockOpt(SO_REUSEADDR, (void*)&bMultipleApps, sizeof(BOOL),
SOL_SOCKET);
/* Fill m_saHostGroup_in for sending datagrams */
memset(&m_saHostGroup, 0, sizeof(m_saHostGroup));
m_saHostGroup.sin_family = AF_INET;
m_saHostGroup.sin_addr.s_addr = inet_addr(strGroupIP);
m_saHostGroup.sin_port = htons((USHORT)nGroupPort);

82
/* Join the multicast group */
m_mrMReq.imr_multiaddr.s_addr = inet_addr(strGroupIP);
/* group addr */
m_mrMReq.imr_interface.s_addr = INADDR_ANY;
//inet_addr("127.0.0.1");/* use default */
if(SetSockOpt(IP_ADD_MEMBERSHIP, (char FAR *)&m_mrMReq,
sizeof(m_mrMReq), IPPROTO_IP ) < 0)
return FALSE;
return TRUE;
}

3) Ứng dụng Multicast

5.2 Vấn đề xử lí đồng thời tại server và lập trình đa luồng (


Multithreading)

5.2.1 Cơ chế Multithread


Tiến trình và tuyến (thread)
Tiến trình (process) :
 Có không gian địa chỉ riêng biệt
 Các tiến trình truyền thông qua cơ chế IPC (Interprocess
Communication)
Tuyến (thread)
 Nhiều thread có cùng một không gian địa chỉ
 Các thread truyền thông qua các biến toàn cục
Mô hình Multithread
Một process có thể bao gồm nhiều thread có chung không gian địa
chỉ của process đó.
Một process khi đó được chia thành 2 thành phần :
 Tài nguyên được sử dụng trong toàn bộ tiến trình bao gồm mã
lệnh và dữ liệu toàn cục
 Các cấu trúc thông tin của từng thread, lưu giữ trạng thái thực
hiện lệnh, bộ nhớ stack chứa các dữ liệu cục bộ của các
thread thuộc tiến trình

83
Các thread có thể truy nhập các tài nguyên toàn cục
 Thực thi mã lệnh các hàm toàn cục
 Đọc ghi các biến toàn cục
Trạng thái thực thi lệnh và giá trị các biến cục bộ của thread là khác
nhau

5.3 Tường lửa Firewall và máy chủ proxy

5.3.1 Giới thiệu Firewall


Định nghĩa
o Nghĩa gốc : “bức tường ngăn lửa”
o Gắn chặt với Network security
o Cung cấp một tấm barie chắn giữa các Network để ngăn chặn hoặc
từ chối các truy nhập trái phép hoặc các luồng dữ liệu không mong
muốn
o Định nghĩa : “là một hệ thống hoặc một nhóm các hệ thống để kiểm
soát truy nhập giữa 2 network :một network tin cậy được và một
network không tin cậy, sử dụng cơ chế lọc và một số luật (rule) được
xác định trước
Hệ thống Firewall có thể cài đặt từ một router, nhiều router, một hệ thống máy
tính hoặc nhiều hệ thống máy tính có cài đặt phần mềm Firewall
Hệ thống Firewall có thể là kết hợp của nhiều thiết bị, phần cứng, phần mềm
Các Firewall khác nhau về thiết kế, chức năng, kiến trúc và chi phí

84
Ưu điểm :
o Xác thực người truy nhập mạng để giới hạn truy nhập được phép
o Logging truy nhập, lưu lượng, thống kê các thông số hoạt động
mạng, có giá trị với người quản trị
o An ninh : giấu cấu trúc bên trong, bảo vệ mạng tin cậy đối với mạng
không tin cậy. Ẩn các dịch vụ mạng khỏi các thao tác dò tìm để truy
nhập từ bên ngoài mạng
Hạn chế:
o Tắc nghẽn giao thông mạng : bottleneck
o Nếu firewall đứng chắn đường link duy nhất và bị fail thì sẽ chặn
lưu thông
o Gây khó chịu cho người dùng
o Tăng trách nhiệm của việc quản trị : làm cho mạng trợ nên phức tạp
và khó cấu hình hơn. Các thao tác bảo trì cập nhật là cân thiết
Firewall không đồng nghĩa với an toàn tuyệt đối,
Firewall không thể ngăn chặn những hành động tấn công từ chính bên trong
mạng
Firewall không thể ngăn cản những truy nhập trái phép nhưng không theo
đường chính mà bằng “back door”
Firewall không có khả năng ngăn chặn virus và phần lớn firewall không kiểm
soát nội dung gói tin
Các lỗi chủ quan của người dùng, các chính sách về phân quyền và an ninh
mạng, hoặc do phương pháp quản trị mạng không đáp ứng kịp với tính hình an

85
ninh. Ví dụ : người dùng để lộ password cho tin tặc, hoặc vô tình tạo điều kiện
cho virus tạo back door.
Lỗi không thể tránh : đó là lỗi của phần mềm hệ thống và phần mềm ứng dụng
được sử dụng bên trong mạng, tạo ra các lỗ hổng cho sự xâm nhập trái phép mà
firewall không thể hạn chế được

5.3.2 Chức năng Firewall

5.3.3 Phân loại

86
Chương 6 Truyền thông giữa các tiến trình

6.1 Truyền thông Serialization

6.2 Truyền thông Named Pipes

6.3 Chia sẻ bộ nhớ

6.4 Lời gọi thủ tục phân tán (RPC)

87
Chương 7 Giới thiệu Hệ phân tán

7.1 Hệ phân tán (Distributed System)


Giới thiệu
Hệ phân tán là đề tài của rất nhiều nghiên cứu trong lĩnh vực công nghệ
máy tính và viễn thông. Có khá nhiều mẫu mô hình hệ phân tán đã được xây dựng
tại các trường đại học, trong các ngành công nghiệp,thương mại và cả trong chính
phủ với đủ các quy mô . Bao quát toàn bộ các nghiên cứu trong hệ phân tán là
không thể, vì đến nay các nhà nghiên cứu ,các nhà thiết kế và triển khai hệ phân
tán đã đạt được rất nhiều thành tựu và còn tiếp tục phát triển. Vì vậy báo cáo chỉ
trình bày các khái niệm chung nhất, các đặc tính cơ bản của hệ phân tán cùng với
một số vấn đề trong lĩnh vực truyền thông của hệ phân tán.
Khái niệm hệ phân tán
Hệ phân tán nhiều hơn một khái niệm, mỗi khái niệm đều có điểm chung
nêu lên được thế nào là hệ phân tán, đồng thời cũng phản ánh các cách nhìn khác
nhau , các mức độ chi tiết khác nhau hoặc theo các giai đoạn phát triển.
Định nghĩa (1)
Hệ phân tán là một hệ thống trong đó các chức năng và dữ liệu được phân tán trên
các trạm kết nối với nhau thông qua một mạng máy tính.
Định nghĩa trên nhấn mạnh đến tính chất phân tán về địa lí,và theo đó hệ
thống nào bao gồm nhiều máy kết nối nằm ở nhiều vị trí ,có sự phân chia về chức
năng hay dữ liệu là hệ phân tán.
Định nghĩa (2)
Hệ phân tán là tập hợp các máy tính tự trị được kết nối với nhau bởi một mạng
máy tính và được cài đặt phần mềm phân tán.

88
Định nghĩa trên có sự mở rộng hơn về tính tự trị của các trạm thành viên,
và đưa ra khái niệm phần mềm phân tán. Phần mềm phân tán bản thân nó đã bao
hàm sự phân tán chức năng và dữ liệu.Từ đó xuất hiện một công thức:

Hệ phân tán = Mạng máy tính + phần mềm phân tán tán

Đây là một công thức quan trọng trong đánh giá hiệu năng hệ phân tán.
Định nghĩa (3)
Hệ phân tán ( hệ máy tính phân tán ) là một tập hợp các bộ đôi vi xử lí-bộ nhớ
được kết nối qua mạng truyền thông và tích hợp logic bằng hệ điều hành phân tán
hay một hệ cơ sở dữ liệu phân tán.
Theo định nghĩa trên,hệ phân tán không chỉ bao gồm các trạm terminal là
các máy tính đơn mà có thể hiệu rộng hơn là một hệ tính toán( từ các máy tính cá
nhân,máy mini cho đến các siêu máy tính ) kết nối vào mạng truyền thông và
được tích hợp nhờ các phần mềm phân tán.Hệ phân tán có thể được cài đặt trên
nhiều nền tảng phần cứng khác nhau từ một vài trạm trong mạng LAN đơn lẻ cho
đến mạng toàn cầu Internet kết nối hàng nghìn hàng triệu máy tính.
Phạm vi ứng dụng của hệ phân tán rất rộng, từ các hệ thống tính toán đa
năng cho đến các công việc của ngành ngân hàng như rút tiền tự động,giao dịch
chuyển khoản ...Nói chung các lĩnh vực cần trợ giúp của công nghệ thông tin đều
ứng dụng hệ phân tán. Sự phát triển của hệ phân tán bắt đầu cùng với mạng LAN
từ thập kỉ 70. Tuy nhiên gần đây, do các máy tính ngày càng mạnh và giá thành
không quá đắt nên xu hướng là thay thế các hệ tập trung ,đa người dùng bằng các
hệ phân tán thông qua mạng truyền thông, chạy các phần mềm phân tán.Phần lớn
các nghiên cứu và phát triển nhằm tạo ra các nguyên lí căn bản làm nền tảng cho
việc thiết kế các hệ phân tán.
Ưu điểm của hệ phân tán
Hệ phân tán có rất nhiều ưu điểm: hiệu năng cao, độ tin cậy cao,chi phí
giảm đi nhờ chia sẻ tài nguyên và đặc biệt là khả năng mở rộng ( extensibility )

89
Hiệu năng được cải thiện do nhiều trạm xử lí và hiệu năng mạng truyền thông ,
tránh được các hiện tượng tắc nghẽn trong các hệ tập trung đa người dùng.Độ tin
cậy được nâng cao do hiện tượng dư thừa dữ liệu cũng như các lệnh điều khiển có
thể chấp nhận được,do tính phân tán về mặt địa lí,cũng như khả năng trao đổi
tương tác,kiểm tra lẫn nhau giữa các trạm trong cùng hệ thống.Ngoài ra với hệ
thống mạng và một phần mềm phân tán hiệu quả thì có thể chia sẻ nhiều tài
nguyên nên chi phí cho thiết bị sẽ giảm. Ưu điểm quan trọng nhất của hệ phân
tán là khả năng mở rộng, cho phép hệ thống thích nghi với những điều kiện trong
tương lai mà không cần phải thay đổi đáng kể.Đối với tương lai gần là kiểm tra tải
và lưu lượng trên mạng , các lỗi nghiêm trọng có thể xảy ra , cũng như có thể
thêm các trạm hay các mạng con vào hệ thống .Đối với tương lai xa là các thay
đổi cho phù hợp với yêu cầu mới của hệ thống.

7.1.1 Phân loại hệ phân tán


Những nghiên cứu về hệ phân tán có phạm vi khá rộng, bao gồm: mạng
truyền thông, mạng máy tính LAN , WAN, hệ điều hành phân tán , cơ sở dữ liệu
phân tán, ngôn ngữ lập trình phân tán, ngôn ngữ đặc tả hệ thống có tương tranh,
các giải thuật phân tán, giải thuật song song , các hệ thống có độ tin cậy rất cao và
khả năng chịu lỗi và hệ thống phân tán multimedia thời gian thực...Tuy nhiên hệ
phân tán nói chung được coi là tổng của một mạng vật lí và tất cả các phần mềm
phân tán trên mạng đó nên có thể phân loại hệ phân tán thành 3 loại:
Hệ điều hành phân tán.
Cơ sở dữ liệu phân tán
Các hệ tính toán phân tán
Để tổng quát hơn ,hệ phân tán được chia thành 2 loại :
Hệ điều hành phân tán
Hệ thông tin phân tán

Hệ điều hành phân tán ( Distributed Operating System –DOS )

90
Một trong những hướng nghiên cứu và phát triển đang được quan tâm trong hệ
phân tán, đó là xây dựng hệ điều hành phân tán. Giống như hệ điều hành thông
thường, hệ điều hành phân tán ( DOS ) là một bộ các phần mềm để đơn giản hoá
các tác vụ phức tạp ,ví dụ như chia các công việc thành chuỗi các thao tác đơn vị,
và hỗ trợ nhiều nhất có thể các ứng dụng. Tuy nhiên , không giống như hệ điều
hành thông thường, DOS được modun hoá và có thể mở rộng, nghĩa là có thể thêm
vào DOS các thành phần mới để đáp ứng các yêu cầu của ứng dụng mới.Tính
modun của DOS dựa trên sự hỗ trợ đối với liên kết tương tác giữa các modun. Do
có khả năng mở rộng nên không thể chỉ ra chính xác một danh sách cố định các
thành phần tạo nên hệ điều hành phân tán.Một vài thành phần có thể nằm ở ranh
giới giữa hệ điều hành và ứng dụng.

Hệ điều hành phân tán là một hệ điều hành duy nhất cho tất cả các node trong một
hệ phân tán, coi như một hệ thống duy nhất. Các chức năng cơ bản của hệ điều
hành phân tán:

1) Quản trị tài nguyên:


Cấp phát và quản lý bộ nhớ
Tạo tiến trình và lập lịch tiến trình
Truyền thông liên tiến trình.

2) Cung cấp các dịch vụ cơ bản:


Quản trị tệp, các phương tiện truy cập tệp.
Các phương tiện đồng bộ.
Kiểm soát truy cập và xác thực người dùng
Khả năng mở rộng các dịch vụ cung cấp

91
Đã có khá nhiều hệ điều hành phân tán được nghiên cứu ,thiết kế và phát triển như
hệ điều hành Amoeba tại trường đại học Urije (Hà Lan ), hệ điều hành Mach tại
đại học Carnegie-Mellon (Mĩ ) ,hệ điều hành Chorus tại viện INRIA (Pháp).
Hệ thông tin phân tán
Hệ thông tin phân tán có phạm vi khá rộng, đó là các hệ thống phân tán được ứng
dụng trong nhiều lĩnh vực bao gồm các hệ tính toán đa năng , các hệ tác nghiệp
trong các ứng dụng thông tin quản lí bao gồm hệ cơ sở dữ liệu phân tán, các ứng
dụng multimedia...
Các ứng dụng thương mại:
Đó là các hệ thống quản lí thông tin thương mại có sử dụng truyền thông.ví dụ như
các hệ thống đặt trước chỗ máy bay, các hệ thống giao dịch, thương mại điện tử
hay hệ thống rút tiền tự động của các ngân hàng. Các ứng dụng trên cần sự bảo
mật và độ tin cậy cao tránh thiệt hại do các tác động bên ngoài và bảo vệ các thông
tin mật mà hệ thống lưu trữ. Đồng thời,các hệ thống này phải cung cấp quyền truy
nhập cho nhiều người sử dụng cùng một lúc,đảm bảo đáp ứng nhanh chóng và các
điểm truy nhập dịch vụ được phân bố ở nhiều địa điểm cách có thể cách xa nhau
về mặt địa lí .
Các ứng dụng Multimedia
Các ứng dụng multimedia dựa trên kĩ thuật hình ảnh và âm thanh được số hoá và
được truyền tải trên mạng để hỗ trợ cho người sử dụng thực hiện các công việc
như dạy học bằng máy tính, đào tạo từ xa , hội nghị từ xa...
Có nhiều các ứng dụng dựa trên nền tảng hệ phân tán cho phép nhiều người tương
tác với nhau hoặc chia sẻ tài nguyên. Các yêu cầu cần đáp ứng khi xây dựng hệ
phân tán đối với ứng dụng multimedia:

Tín hiệu hình ảnh và âm thanh là liên tục và có tương quan với nhau. Nếu âm
thanh không được tái tạo với tốc độ như lúc phát ra thì sẽ không giữ được thông
tin ban đầu. Hình ảnh video nếu không duy trì đúng hay không đồng bộ với âm
thanh thì thông tin sẽ sai lệch. Đối với các ứng dụng nêu trên , tín hiệu video cần

92
được tái tạo với tốc độ 16 khung hình trong 1 giây,mỗi khung gồm có 512 × 512 ×
16 bit ,tính ra tốc độ truyền dữ liệu khoảng 100 Mbps .Tuy nhiên ,với kĩ thuật nén
hình ảnh hiện nay , tốc độ cần thiết có thể giảm xuống trung bình khoảng 1Mbps .
Trong ứng dụng tương tác như điện thoại video hay hội nghị từ xa ,còn có thêm
một số yêu cầu khác : ví dụ như độ trễ giữa thời điểm khởi đầu cuộc đối thoại tại
một bên và thời điểm các dữ liệu đến phía bên kia và được tái tạo lại phải nhỏ hơn
100 ms
Các dịch vụ lưu trữ và truyền các dạng dữ liệu thời gian thực như hình ảnh âm
thanh phải đảm bảo rằng : dữ liệu được lưu trữ , đọc ra và truyền đi với độ trễ lớn
nhất mà vẫn duy trì được chất lượng thích hợp của hình ảnh và âm thanh . Sự phát
triển của các ứng dụng multimedia và các phần cứng , phần mềm ,các mạng truyền
thông hỗ trợ cũng mới bắt đầu và ngày càng được quan tâm hơn. Tuy nhiên phần
lớn các hệ thống là đang trong thử nghiệm và bị giới hạn bởi công nghệ mạng
được sử dụng. Một phần của báo cáo này sẽ trình bày về hiệu năng của hệ phân
tán ứng dụng trong lĩnh vực đồ hoạ và multimedia.

7.1.2 Các đặc trưng của hệ phân tán:


Hệ phân tán có 6 đặc trưng lớn ,đó là
Phân chia tài nguyên
Tính mở
Tính tương tranh
Tính linh hoạt về quy mô
Tính chịu lỗi
Tính trong suốt
Các đặc trưng trên không phải là hệ quả tự có của hệ phân tán. Hệ thống và các
ứng dụng phải thiết kế sao cho đảm bảo được các tính chất trên.

Chia sẻ tài nguyên

93
Tài nguyên trong hệ phân tán bao gồm tất các các thực thể có thể được chia sẻ một
cách hữu ích trong hệ thống. Tài nguyên có thể là các thành phần phần cứng như ổ
đĩa ,máy in ,hoặc phần mềm như tệp, cơ sở dữ liệu ...Tài nguyên trong hệ phân
tán được đặt tại một hay nhiều trạm , các máy trạm khác chỉ có thể truy nhập bằng
truyền thông .Mỗi một tài nguyên sẽ được quản lí bằng một chương trình. Chương
trình đó sẽ tạo ra giao diện cho phép tài nguyên được truy nhập, quản lí và cập
nhật tài nguyên. Mỗi loại tài nguyên cần có các chính sách và phương thức quản lí
riêng mặc dù cũng có các yêu cầu chung như lược đồ định danh cho mỗi lớp các
tài nguyên ,hoặc cho phép các tài nguyên riêng lẻ có thể được truy nhập từ bất cứ
nơi nào trong hệ thống, ánh xạ các tên tài nguyên tới các địa chỉ trong mạng ,sắp
xếp các tương tranh cùng làm thay đổi trạng thái của tài nguyên để duy trì sự toàn
vẹn. Đặc tính này của hệ phân tán dẫn đến 2 mô hình rất quan trọng : mô hình
client / server và mô hình object-based.
Mô hình client-server
Mô hình client-server được chấp nhận và sự dụng rất rộng rãi trong các hệ phân
tán. Theo mô hình này , có một tập các tiến trình server ,mỗi tiến trình đóng vai trò
như một bộ quản lí một lớp các tài nguyên cùng loại ,và một tập các tiến trình
client , mỗi tiến trình thực hiện một tác vụ cần phải truy nhập đến một hay nhiều
tài nguyên có thể chia sẻ. Tất cả các tài nguyên dùng chung được quản lí bởi các
tiến trình server.Tiến trình client sẽ gửi yêu cầu đến server khi cần phải truy nhập
tài nguyên. Nếu yêu cầu đó hợp lệ, server sẽ thực hiện và yêu cầu và gửi trả lại kết
quả cho client.
Mô hình client / server mang lại một phương pháp hiệu và đa năng để chia sẻ
thông tin và tài nguyên trong hệ phân tán. Mô hình này được áp dụng trên nhiều
môi trường phần cứng và phần mềm khác nhau. Các tiến trình server và client có
thể chạy trên cùng một máy, tiến trình server này có thể sử dụng dịch vụ của tiến
trình server khác nhưng có một số hạn chế sau:
Mỗi tiến trình server có thể xem là một bộ quản lí và phân phối tiến trình tập
trung.

94
Phân phối tài nguyên một cách tập trung không phải là mục tiêu của hệ phân tán
Cách quản lí và phân phối tài nguyên trong mô hình client server không phải thích
hợp với tất cả các loại tài nguyên của hệ phân tán. Để tính toán nhanh và hiệu quả
hơn, một số tài nguyên cần phải được đặt tại mỗi máy, như bộ xử lí trung tâm, bộ
nhớ chính và thiết bị giao tiếp mạng
Mô hình hướng đối tượng:
Cần phân biệt mô hình hướng đối tượng của HPT và mô hình lập trình
hướng đối tượng truyền thống.
Trong mô hình hướng đối tượng cho HPT, mỗi tài nguyên dùng chung
được coi là một đối tượng. Đối tượng có định danh duy nhất và có thể di chuyển
mọi nơi trên mạng mà không thay đổi định danh. Khi một trương trình cần truy
nhập tài nguyên, nó gởi một thông điệp yêu cầu tới đối tượng tương ứng. Thông
điệp sau đó sẽ được chuyển cho một thủ tục trong tiến trình thực hiện yêu cầu và
gửi trả thông điệp cho tiến trình đã yêu cầu tài nguyên.
Mô hình hướng đối tượng có ưu điểm là đơn giản và linh hoạt. Tất cả tài nguyên
chia sẻ đều được cung cấp cho người dùng dưới hình thức thống nhất là các đối
tượng.Một đối tượng vừa có thể là người sử dụng, vừa có thể là người quản lí tài
nguyên.
Trong mô hình đối tượng, khái niệm bộ quản lí đối tượng dùng để chỉ một tập các
thủ tục và dữ liệu mô tả đặc trưng một lớp các đối tượng. Giữa khái niệm này và
bộ quản lí tài nguyên trong mô hình client – server có sự tương đồng.
Trong mô hình đối tượng cũng nảy sinh một số vấn đề sau:
Tại bất cứ một nơi nào mà đối tượng di chuyển đến phải có bộ quản lí đối tượng
tương ứng với loại đối tượng đó. Mỗi đối tượng trạng thái cần phải có bộ quản lí
đặt cùng vi trí với đối tượng để truy nhập trạng thái của nó. Nếu đối tượng không
có khả năng di chuyển thì điều này là đơn giản. Tuy nhiên hiện nay nhiều mô hình
đối tượng phân tán có thể di chuyển tự do đã được nghiên cứu và thử nghiệm. Đối
tượng được định vị cùng một bộ quản lí tương ứng. Khi đối tượng di chuyển sang
trạm khác thì bộ quản lí được lặp lại tại trạm đó.

95
Tính mở
Tính chất xác định khả năng mở rộng của hệ thống theo nhiều hướng khác
nhau được gọi là tính mở.
Một hệ thống có thể là mở hoặc đóng đối với các thành phần cứng, ví dụ:
khả năng thêm các thiết bị ngoại vi, bộ nhớ, bộ xử lí... hay đối với các thành phần
phần mềm như thêm các tính năng của hệ điều hành, các giao thức truyền thông
hay các dịch vụ chia sẻ tài nguyên.
Tính mở của HPT xác định chủ yếu dựa trên khả năng mở rộng các dịch
vụ chia sẻ tài nguyên mà không gây phá vỡ hệ thống hay làm hệ thống ngừng hoạt
động.
Có thể tạo ra tính mở bằng cách mô tả và cung cấp tài liệu các giao diện
chính của hệ thống cho những nhà phát triển phần mềm, do đó họ có thể mở rộng
các ngôn ngữ, cho phép hỗ trợ các phần cứng mới và thêm các tính năng của hệ
điều hành.
Hệ điều hành UNIX là một ví dụ của hệ thống mở. Tài nguyên của UNIX
được truy nhập qua một tập các thủ tục được mô tả đầy đủ và có sẵn cho các
chương trình viết bằng C hoặc các ngôn ngữ hỗ trợ việc gọi các thủ tục của UNIX.
Khi một loại thiết bị mới được cài đặt trong hệ thống UNIX, hệ điều hành sẽ mở
rộng cho phép các trình ứng dụng truy cập đến bằng cách thêm các thủ tục, lời gọi
hệ thống hoặc thêm các thêm các tham số mới cho các thủ tục sẵn có.
Các lời gọi hệ thống được thực hiện bằng chương trình nhân (Kernel).
Kernel sẽ quản lí và điều khiển các thiết bị phần cứng để cung cấp các dịch vụ và
tài nguyên mà các chương trình truy cập thông qua lời gọi hệ thống.
Truyền thông liên tiến trình được đưa vào trong BSD UNIX và một số hệ
điều hành khác, cùng các giao thức truyền thông chuẩn làm tăng khả năng mở
rộng của hệ thống.Các tiến trình server chạy ở bất cứ máy nào, bất cứ hệ điều hành
nào cũng có thể cung cấp dịch vụ cho phép các tiến trình chạy trên các máy khác
truy nhập tài nguyên. Phạm vi tài nguyên và dịch vụ đối với một ứng dụng không

96
bị hạn chế bởi tập các lời gọi hệ thống của hệ điều hành địa phương. Đó chính là
cơ sở để phát triển các HPT hiện nay – các HPT mở.

Tính tương tranh


Khi có nhiều tiến trình cùng tồn tại trong một máy đơn, ta nói các tiến trình
đó có sự tương tranh. Đó là hiện tượng tại một thời điểm có nhiều tiến trình cùng
hoạt động.
Nếu một máy chỉ có một bộ xử lí trung tâm thì các tiến trình thực hiện đan
xen. Nếu máy có N bộ xử lí trung tâm, và có N tiến trình thì các tiến trình có thể
được thực hiện song song. Trong HPT có nhiều trạm, mỗi trạm có thể có một hoặc
nhiều bộ xử lí trung tâm. Giả sử có M trạm, mỗi trạm có một bộ xử lí trung tâm,
thì có thể cùng lúc chạy trên M tiến trình song song trên M trạm.
Do có sự chia sẻ tài nguyên trong HPT, có thể chia hiện tượng tương tranh
thành hai loại:
Nhiều người dùng cùng một lúc gọi đến lệnh hay tương tác với các ứng dụng.
Nhiều tiến trình server cùng chạy, mỗi tiến trình đáp ứng một yêu cầu từ một tiến
trình client.
Trường hợp thứ nhất: phát sinh do người sử dụng chạy một hay nhiều ứng
dụng. Trong kiến trúc HPT, tiến trình ứng dụng chạy trên một trạm của người
dùng này sẽ không xung đột với tiến trình ứng dụng trên trạm của người sử dụng
khác.Nếu trạm có một bộ xử lí và nhiều hơn một tiến trình thì cơ chế được thực
hiện đan xen. Ngược lại, các trình ứng dụng có thể được thực hiện song song.
Trường hợp thứ hai: Nhiều tiến trình server cùng chạy. Các tiến trình đó có
thể phân tán trên nhiều máy cho phép mỗi tiến trình thực hiện song song với tiến
trình khác. Yêu cầu truy nhập tài nguyên được xếp hàng tại server, được xử lí tuần
tự nếu chỉ có một tiến trình server hoặc vài yêu cầu được xử lí một lúc nếu có
nhiều tiến trình server.

97
Nếu có nhiều tiến trình cùng truy cập đến các tài nguyên, server phải đồng
bộ các thao tác của tiến trình đó để tránh xẩy ra xung đột hay ảnh hưởng đến tinh
nhất quán.
Tóm lại, tính tương tranh và thực hiện song song trong HPT phát sinh từ
các hoạt động riêng rẽ của người sử dụng, sự độc lập của tài nguyên và định vị các
tiến trình server trên các máy khác nhau, điều đó cho phép thực hiện tác vụ được
tiến hành song song trên nhiều máy.
Tính co giãn
Hệ phân tán có thể thao tác hiệu quả với quy mô khác nhau từ hệ nhỏ nhất
chỉ gồm hai trạm với một file server cho đến hệ lớn hơn dựa trên mạng LAN với
hàng trăm trạm và rất nhiều máy server. Các máy cục bộ thường kết nối với nhau
tạo thành liên mạng, và có thể bao gồm hàng ngàn máy tính, tạo thành một hệ
phân tán duy nhất, và cho phép chia sẻ tài nguyên trong toàn bộ hệ thống.
Các phần mềm hệ thống và các phần mềm ứng dụng không cần thay đổi khi
quy mô của hệ thống tăng lên. Đặc tính này có ý nghĩa rất lớn trong các hệ thống
phân tán hiện nay.
Tính co giãn không chỉ là vấn đề của phần cứng hay hiệu năng mạng, mà
ảnh hưởng đến mọi lĩnh vực trong thiết kế HPT. Về mặt lí thuyết , hệ phân tán
không có giới hạn trong cung cấp tài nguyên, hệ có thể bao gồm rất nhiều các máy
tính với số lượng không giới hạn . Mỗi máy tính đều có các tài nguyên riêng biệt
như bộ nhớ chính, bộ xử lí trung tâm và các thiết bị vào ra khác nhau. Do khả
năng chia sẻ tài nguyên nên lượng tài nguyên của toàn hệ sẽ bằng tất cả tài nguyên
của các máy gộp lại. Tuy nhiên , trên thực tế vẫn có sự giới hạn nếu thiết kế không
đảm bảo tính co giãn của hệ, không nhìn trước và giải quyết nhu cầu mở rộng
phạm vi hệ thống từ khi bắt đầu thiết kế. Chính tính co giãn làm nảy sinh ra mục
tiêu thiết kế hệ phân tán , đó là không có sự giới hạn về đáp ứng các nhu cầu về tài
nguyên.Khi quy mô hệ thống tăng lên, nhu cầu sử dụng tài nguyên cũng tăng lên
thì khả năng của hệ thống vẫn đáp ứng được.Đó là mô hình hệ phân tán tương lai
,tuy nhiên đó cũng là thách thức đối với các phần mềm ,nhất là hệ điều hành để

98
sao cho quy mô mở rộng nhưng vẫn đảm bảo các tính chất và hiệu năng của hệ
phân tán.
Tính chịu lỗi
Các hệ thống máy tính khi hoạt động liên tục sẽ có thể gặp lỗi .Hiện tượng có
thể là hệ thống hoạt động không ổn định, thiếu chính xác thậm chí phải ngừng hoạt
động . Khi có lỗi phần cứng hoặc phần mềm ,chương trình có thể cho kết quả sai
hoặc ngừng đột ngột trước khi hoàn thành công việc.Như vậy không chỉ ảnh
hưởng đến công việc của người sử dụng mà còn có thể gây tác hại lớn.Thiết kế hệ
phân tán có khả năng chịu lỗi dựa trên hai hướng tiếp cận sau:
Các thành phần phần cứng dự phòng khi có lỗi
Khôi phục trạng thái chương trình khi gặp lỗi
Để khắc phục sự cố phần cứng, có thể sử dụng hai máy cùng liên kết với nhau
và có thể cùng chức năng ,cùng chạy một chương trình. Một máy sẽ là xử lí chính,
máy còn lại ở trạng thái chờ phòng khi có sự cố đối với máy chính
Phương pháp này đòi hỏi chi phí tăng gấp đôi, thường được sử dụng cho các hệ
thống cần độ tin cậy cao. Để nâng cao hiệu năng, tránh gây lãng phí thì máy dự
phòng sẽ không “ nghỉ “ mà thực hiện các tác vụ không quan trọng lắm khi chưa
có lỗi xảy ra và chưa cần thay thế
Vấn đề khôi phục trạng thái và dữ liệu của chương trình được giải quyết bằng
các kĩ thuật thiết kế phần mềm. Các tiến trình khi gặp lỗi sẽ được nhận biết. Trong
quá trình thực hiện ,trạng thái của các tiến trình được ghi nhận lại sau một số bước
để nếu gặp lỗi có thể quay ngược lại trạng thái cũ , nếu không hoàn thành công
việc cũng đảm bảo tính toàn vẹn dữ liệu và không ảnh hưởng đến các tiến trình
khác.
Một đặc tính khác của hệ phân tán nằm trong tính chịu lỗi là tính sẵn sàng để
sử dụng. Giả sử hệ thống gặp lỗi và công việc bị ngắt, thời gian chờ để có thể lại
tiếp tục công việc sẽ gắn liền với đặc tính đó .Khả năng đó là do tính phân tán và
chia sẻ tài nguyên của hệ phân tán. Khi một thành phần trong hệ phân tán gặp lỗi,
chỉ có những công việc liên quan đến thành phần đó bị ảnh hưởng . Khi đó, người

99
sử dụng có thể chuyển sang một trạm khác nếu trạm của anh ta bị lỗi.Một tiến
trình server cũng có thể khởi động lại tại một máy khác.
Mạng máy tính của hệ phân tán không có khả năng dự phòng như từng máy
riêng lẻ. Nếu mạng gặp lỗi thì các chương trình có sử dụng mạng sẽ “treo” cho đến
khi mạng được khôi phục.Các dịch vụ sẽ bị gián đoạn.Quá tải với mạng sẽ làm
giảm hiệu năng và khả năng đáp ứng của hệ thống đối với người sử dụng. Thiết kế
mạng có độ tin cậy cao là yếu tố quan trọng để tăng tính chịu lỗi của hệ phân tán.
Tính trong suốt
Tính trong suốt là sự che giấu tính phân tán của các thành và tính chia sẻ tài
nguyên đối với những người sử dụng cũng như các nhà lập trình ứng dụng.Đối với
họ thì hệ thống như là một hệ tổng thể tập trung với rất nhiều tài nguyên.Điều đó
là nguyên tắc đối với thiết kế phần mềm phân tán.
Tính phân tán của các thành phần là thuộc tính cố hữu của hệ phân tán.Hệ quả của
nó là nhu cầu về truyền thông và các kĩ thuật quản trị cũng như tích hợp hệ thống .
Sự phân tán cho phép chạy một chương trình một cách song song , có các thành
phần lỗi và khả năng khôi phục khi gặp lỗi mà không làm down hệ thống .Sử dụng
sự tách biệt và kiểm soát các kênh truyền thông như một phương thức tăng cường
an ninh và bảo vệ thông tin...
Tổ chức ISO đưa ra Mô hình tham chiếu cho xử lí phân tán mở ( Reference Model
for Open Distributed Processing ), mô hình này chỉ ra 8 dạng trong suốt sau:
Trong suốt truy cập : cho phép các đối tượng thông tin cục bộ hay ở xa đều được
truy cập bằng tập các thao tác như nhau
Trong suốt định vị: cho phép truy nhập các đối tượng mà không cần biết vị trí các
đối tượng
Trong suốt tương tranh: Cho phép nhiều tiến trình hoạt động đồng thời, chia sẻ
thông tin chung mà không gây cản trở lẫn nhau.
Trong suốt lặp: cho phép dùng nhiều bản sao của các đối tượng để tăng độ tin cậy
và hiệu năng.
Trong suốt lỗi : cho phép che giấu các lỗi hay sự cố xảy ra

100
Trong suốt di trú : cho phép di chuyển các đối tượng trong hệ thống mà không để
người sử dụng nhận thấy.
Trong suốt hiệu năng: cho phép hệ thống có thể cấu hình lại để tăng hiệu năng khi
tải thay đổi.
Trong suốt thay đổi quy mô: cho phép hệ thống và ứng dụng thay đổi quy mô mà
không phải thay đổi kiến trúc hệ thống hay giải thuật
Hai dạng trong suốt quan trọng nhất là trong suốt truy cập và trong suốt định vị vì
nó ảnh hưởng lớn đến việc sử dụng tài nguyên, gọi chung là trong suốt mạng.
Tóm lại hệ phân tán đã trở thành tiêu chuẩn chung cho mọi tổ chức và các
hãng máy tính lớn.Hệ phân tán có thể được sử dụng để triển khai các hệ thống tính
toán tương tác đa năng , và hỗ trợ các ứng dụng trong công nghiệp ,thương mại và
trong khoa học kĩ thuật.Hệ phân tán ngày càng được sử dụng rông rãi hơn trong
các ứng dụng mới như các dịch vụ thông tin hay các ứng dụng đa phương tiện, mà
tại đó truyền thông là yêu cầu cơ bản. Các đặc tính của hệ phân tán đã mạng lại lợi
ích sử dụng và là tiền đề cho các phát triển trong tương lai.Các kiến thức về hệ
phân tán có được là nhờ rất nhiều các nghiên cứu và phát triển trong nhiều năm trở
lại đây.

101
Phụ lục

Cấu trúc segment trong giao thức TCP


Đơn vị dữ liệu sử dụng trong TCP được gọi là segment (đoạn dữ liệu), có các tham
số với ý nghĩa như sau:

Hình 7.5: Dạng thức của segment TCP

Source port (16 bits): Số hiệu cổng TCP của trạm nguồn.

Destination Port (16 bit): Số hiệu cổng TCP của trạm đích.

Sequence Number (32 bit): số hiệu của byte đầu tiên của segment trừ khi
bit SYN được thiết lập. Nêus bit SYN được thiết lập thì Sequence Number
là số hiệu tuần tự khởi đầu (ISN) và byte dữ liệu đầu tiên là ISN+1.

Acknowledgment Number (32 bit): số hiệu của segment tiếp theo mà trạm
nguồn đang chờ để nhận. Ngầm ý báo nhận tốt (các) segment mà trạm đích
đã gửi cho trạm nguồn.

Data offset (4 bit): số lượng bội của 32 bit (32 bit words) trong TCP
header (tham số này chỉ ra vị trí bắt đầu của nguồn dữ liệu).

Reserved (6 bit): dành để dùng trong tương lai

102
Control bit (các bit điều khiển):

URG: Vùng con trỏ khẩn (urgent Pointer) có hiệu lực.

ACK: Vùng báo nhận (ACK number) có hiệu lực.

PSH: Chức năng PUSH.

RST: Khởi động lại (reset) liên kết.

SYN: Đồng bộ hóa số hiệu tuần tự (sequence number).

FIN: Không còn dữ liệu từ trạm nguồn.

Window (16 bit): cấp phát credit để kiểm soát nguồn dữ liệu (cơ chế cửa
sổ). Đây chính là số lượng các byte dữ liệu, bắt đầu từ byte được chỉ ra
trong vùng ACK number, mà trạm nguồn đã saün sàng để nhận.

Checksum (16 bit): mã kiểm soát lỗi cho toàn bộ segment (header + data)

urgent Pointer (16 bit): con trỏ này trỏ tới số hiệu tuần tự của byte đi theo
sau dữ liệu khẩn. Vùng này chỉ có hiệu lực khi bit URG được thiết lập.

Options (độ dài thay đổi): khai báo các option của TCP, trong đó có độ dài
tối đa của vùng TCP data trong một segment.

padding (độ dài thay đổi): phần chèn thêm vào header để đảm bảo phần
header luôn kết thúc ở một mốc 32 bit. Phần thêm này gồm toàn số 0.

TCP data (độ dài thay đổi): chứa dữ liệu của tầng trên, có độ dài tối đa
ngầm định là 536 byte. Giá trị này có thể điều chỉnh bằng cách khai báo
trong vùng options.

103

You might also like