Đại Học Cần Thơ - Khoa Công Nghệ Thông Tin - Giáo Trình Mạng Máy Tính – V1.0
rằng dữ liệu nào đã đến, cái nào chưa và cuối cùng khởi động lại từ điểm bị bỏ dở dang. Dữ liệu bị
mất hoặc bị hư hỏng sẽ được phục hồi bởi lớp vận chuyển, do đó việc chuyển dữ liệu an toàn hơn.
Như thường lệ, tại lớp vận chuyển, người ta thiết kế các hàm dịch v
ụ cơ sở để triệu gọi các dịch vụ
vận chuyển và các hàm này là đơn giản, duy nhất và độc lập với các hàm cơ sở ở tầng mạng. Nhờ
vào sự độc lập này, sự phức tạp ở mức mạng bị che đi, các nhà lập trình ứng dụng có thể viết mã
lệnh dựa vào một tập hợp chuẩn các hàm cơ sở mức vận chuyển và cho ch
ương trình của họ chạy
trên nhiều loại mạng mà không bị đau đầu bởi các vấn đề về giao diện các mạng con khác nhau và
việc truyền tải không tin cậy.
7.1.2 Các hàm dịch vụ cơ sở
Các hàm dịch vụ cơ sở ở lớp vận chuyển được chia thành hai nhóm theo phương thức hoạt động:
có nối kết và không nối kết.
7.1.3 Các hàm dịch vụ hướng nối kết
Hàm Gói tin gởi đi Ý nghĩa
LISTEN Không có
Nghẽn cho đến khi tiến trình nào đó nối kết
tới
CONNECT
Yêu cầu kết nối
(Connection Request)
Chủ động yêu cầu thiết lập nối kết đến tiến
trình khác
SEND Dữ liệu (Data) Gởi thông tin đi
RECEIVE Không có
Nghẽn cho đến khi một gói tin đến và nhận
nó
DISCONNECT
Yêu cầu hủy kết nối
xa nhau.
7.2.1 Định địa chỉ
Khi một tiến trình mong muốn thiết lập nối kết với một tiến trình khác từ xa, nó phải chỉ ra rằng
nó muốn kết nối với tiến trình nào. (Vận chuyển hướng không nối kết cũng gặp vấn đề tương tự:
thông điệp sẽ gởi đến ai?). Một phương pháp định địa chỉ ở tầng vận chuyển của Internet là dùng
số hiệu cổng (port), còn ở
trong mạng ATM là AAL-SAP. Chúng ta sẽ dùng từ chung nhất để định
địa chỉ tiến trình là TSAP (Transport Service Access Point). Tương tự, địa chỉ trong tầng mạng
được gọi là NSAP.
Hình H7.3 mô phỏng mối quan hệ giữa NSAP, TSAP và kết nối vận chuyển. Các tiến trình ứng
dụng, cả client và server đều phải gắn vào một TSAP và thiết lập nối kết đến TSAP khác. Và kết
nối này chạy qua cả hai TSAP. Mục tiêu của việc sử dụng các TSAP là vì trong một số
mạng, mỗi
máy tính chỉ có một NSAP, do đó cần phải có cách phân biệt nhiều điểm cuối mức vận chuyển khi
chúng đang chia sẻ một NSAP.
Ví dụ, dàn cảnh một cuộc kết nối mức vận chuyển có thể diễn ra như sau:
1. Một server phục vụ thông tin về thời gian trên host 2 gắn nó vào TSAP 1522 để chờ một
cuộc gọi đến.
2. Một tiến trình ứng d
ụng chạy trên host 1 muốn biết giờ hiện tại, vì thế nó đưa ra một yêu
cầu nối kết chỉ ra TSAP 1208 là cổng nguồn và TSAP 1522 là cổng đích. Hành động này
dẫn đến một kết nối vận chuyển được thiết lập giữa hai tiến trình client và server trên hai
host 1 và 2. H 6.3. TSAP, NSAP và kết nối vận chuyển
3. Tiến trình client gởi một yêu cầu đến server để hỏi về thời gian.
4. Server trả lời thời gian hiện tại cho client.
5. Kết nối vận chuyển cuối cùng được giải phóng.
nhận ở chiều thứ ba của host 1 lại bị trễ. Khi host 1 nhận được báo nhận ACK (seq=y, ACK=x), nó
nhận ra rằ
ng thông báo DATA (seq=x, ACK=z) bị trễ, do đó nó từ bỏ nối kết này.
H7.4 Khung cảnh việc bắt tay 3 chiều.
(a) Hoạt động bình thường.
(b) Bản CR bị trùng lắp.
(c) Cả CR và ACK đều bị trùng lắp
Biên Sọan: Th.s Ngô Bá Hùng – Ks Phạm Thế Phi - 01/2005
138
Đại Học Cần Thơ - Khoa Công Nghệ Thông Tin - Giáo Trình Mạng Máy Tính – V1.0
7.2.3 Giải phóng nối kết
Việc giải phóng nối kết đơn giản hơn thiết lập nối kết. Tuy nhiên, người ta sẽ còn gặp nhiều khó
khăn không ngờ tới. Bây giờ chúng ta sẽ đề nghị hai kiểu giải phóng nối kết: dị bộ và đồng bộ.
Kiểu dị bộ hoạt động như sau: khi một bên cắt nối kết, kết nối sẽ bị hủy bỏ (giống như trong hệ
thống điện thoại). Kiểu đồng bộ làm việc theo phương thức ngược lại: khi cả hai đồng ý hủy bỏ
nối kết, nối kết mới thực sự được hủy.
Giải phóng nối kết kiểu dị bộ là thô lỗ và có thể dẫn đến mất dữ liệu. Ví dụ tình huống trong Hình
H7.5. Sau khi nối kết thành công, host 1 gởi một gói dữ liệu đến đúng host 2. Sau đ
ó host 1 gởi
tiếp một gói dữ liệu khác. Không may, host 2 gởi đi một yêu cầu cắt nối kết (DISCONNECT)
trước khi gói dữ liệu thứ hai đến. Kết quả là kết nối được giải phóng và dữ liệu bị mất.
H7.5 Sự cắt kết nối một cách thô lỗ sẽ dẫn đến mất dữ liệu
Giả sử chỉ huy cánh quân xanh số 1 gởi thông điệp đến chỉ huy cánh quân xanh số 2: “Tôi dự định
tấn công vào lúc hoàng hôn ngày 14 tháng 12 năm 2004, có được không?”. May mắn thay, chỉ huy
cánh quân xanh số 2 nhận được thông điệp và trả lời “Đồng ý”. Vậy cuộc tấn công có chắc xảy ra
không? Không chắc, bởi vì chỉ huy cánh quân xanh số 2 không chắc câu trả lời của anh ta đến
được chỉ huy của cánh quân số 1.
Bây giờ ta cải tiến giao th
ức thêm một bước: cho nó trở thành giao thức ba chiều: Bên cánh quân
số 1 gởi bản hiệp đồng tấn công cho bên cánh quân số 2, bên cánh quân số 2 trả lời đồng ý, bên
cánh quân 1 thông báo cho bên 2 nó đã biết được sự đồng ý của bên 2. Thế nhưng nếu thông báo
cuối cùng của bên 1 bị mất thì sao? Bên 2 cũng sẽ không tấn công!
Nếu ta cố cải tiến thành giao thức n chiều đi nữa thì việc hiệp đồng vẫn thất bại nếu thông báo
cu
ối cùng bị mất.
Ta có thể thấy mối tương đồng giữa bài toán hai sứ quân và giải pháp giải phóng nối kết. Thay vì
hợp đồng tấn công, hai bên hợp đồng hủy nối kết!
Giải pháp cuối cùng là hai bên sử dụng phương pháp hủy nối kết ba chiều cùng với bộ định thời:
Bên phát động việc hủy nối kết sẽ bật bộ định thời cho mỗi yêu cầu giả
i phóng nối kết của
nó, nếu yêu cầu giải phóng nối kết bị mãn kỳ mà chưa nhận được trả lời của bên đối tác,
nó sẽ gởi lại yêu cầu một lần nữa. Nếu yêu cầu hủy nối kết bị mãn kỳ liên tục N lần, bên
phát động sẽ tự ý hủy bỏ nối kết đó.
Bên đối tác khi nhận được yêu cầu hủy nối k
ết từ phía phát động, sẽ trả lời chấp thuận và
cũng bật bộ định thời. Nếu mãn kỳ mà trả lời chấp thuận của nó không có báo trả từ phía
phát động, bên đối tác sẽ tự hủy nối kết.
Hình H7.7 sẽ mô phỏng một số tình huống phát sinh trong quá trình hủy nối kết 3 chiều có sử
dụng bộ định thời.
A Thông điệp B Giải thích
1
<yêu cầu 8 buffers> A muốn B cung cấp 8 buffers
2 <ack = 0, buf = 4> B chỉ cấp cho A 4 buffers thôi
3 <seq = 0, data = m0> A còn lại 3 buffers
4 <seq = 1, data = m1> A còn lại 2 buffers
5 <seq = 2, data = m2>
…
Thông điệp bị mất, nhưng A nghĩ nó còn 1 buffer
6 <ack = 1, buf = 3> B báo nhận cho thông điệp 0 và 1, còn 3 buffers
7 <seq = 3, data = m3> A còn lại 1 buffer
8 <seq = 4, data = m4> A không còn buffer nào và phải dừng
9 <seq = 2, data = m2> Thông điệp thứ 2 của A mãn kỳ và được truyền lại
10 <ack = 4, buf = 0> Mọi thứ đã được báo nhận, nhưng A vẫn nghẽn
Biên Sọan: Th.s Ngô Bá Hùng – Ks Phạm Thế Phi - 01/2005
141
Đại Học Cần Thơ - Khoa Công Nghệ Thông Tin - Giáo Trình Mạng Máy Tính – V1.0
11
<ack = 4, buf = 1> A có thể gởi 1 gói tin thứ 5
12 <ack = 4, buf = 2> B có thêm 1 buffer nữa
13 <seq = 5, data = m5> A còn lại 1 buffer
ChecksumLength
Data
01631
H7.9 Khuôn dạng của một segment UDP
Giải thích:
SrcPort: Địa chỉ cổng nguồn, là số hiệu của tiến trình gởi gói tin đi.
DstPort: Địa chỉ cổng đích, là số hiệu của tiến trình sẽ nhận gói tin.
Length: Tổng chiều dài của segment, tính luôn cả phần header.
Checksum: Là phần kiểm tra lỗi. UDP sẽ tính toán phần kiểm tra lỗi tổng hợp trên phần
header, phần dữ liệu và cả phần header ảo. Phần header ảo ch
ứa 3 trường trong IP header:
địa chỉ IP nguồn, địa chỉ IP đích, và trường chiều dài của UDP. Phương thức tính toán như
sau:
Biên Sọan: Th.s Ngô Bá Hùng – Ks Phạm Thế Phi - 01/2005
142
Đại Học Cần Thơ - Khoa Công Nghệ Thông Tin - Giáo Trình Mạng Máy Tính – V1.0
u_short
cksum(u_short *buf, int count)
{
register u_long sum = 0;
while (count--)
{
sum += *buf++;
if (sum & 0xFFFF0000)
{
vào đó, thực thể TCP trên máy nguồn trữ tạm đủ số bytes phát ra từ tiến trình gởi để tạo nên một
gói tin có kích thước hợp lý rồi mới gởi gói tin đó
đến thực thể TCP ngang hàng bên máy đích.
Thực thể TCP bên máy đích sẽ bóc các bytes dữ liệu trong gói tin ra và đặt chúng vào buffer của
nó. Tiến trình bên nhận từ đó có thể đọc các bytes từ buffer này tùy thích. Quá trình truyền nhận
trên được mô phỏng trong Hình H7.10.
H7.10. Cách thức TCP quản lý luồng các bytes
Biên Sọan: Th.s Ngô Bá Hùng – Ks Phạm Thế Phi - 01/2005
143
Đại Học Cần Thơ - Khoa Công Nghệ Thông Tin - Giáo Trình Mạng Máy Tính – V1.0
7.3.2.2 Khuôn dạng TCP Segment
Các gói tin được trao đổi bởi hai thực thể TCP trong Hình H7.10 được gọi là các segment (đoạn),
do mỗi gói tin mang theo một đoạn của cả một luồng các bytes. Mỗi segment có một header như
được chỉ ra trong Hình H7.11. H.11 Khuôn dạng TCP header
Giải thích:
Các trường SrcPort và DstPort chỉ ra địa chỉ cổng nguồn và đích, giống như trong UDP.
Hai trường này cùng với hai địa chỉ IP nguồn và đích sẽ được kết hợp với nhau để định
danh duy nhất một kết nối TCP. Nghĩa là một kết nối TCP sẽ được định danh bởi một bộ 4
trường
(Cổng nguồn, Địa chỉ IP nguồn, Cổng đích, Địa chỉ IP đích)
Các trường Acknowledgement, SequenceNum và AdvertisedWindow tất cả được sử
dùng để thông báo rằng bên nhận đã bị rối (ví dụ như nó đã nhận một segment mà đáng lẽ
ra không phải là segment đó), vì thế nó muốn hủy b
ỏ nối kết.
Trường Checksum được sử dụng chính xác giống như trong giao thức UDP.
Do header của TCP có độ dài thay đổi, nên trường HdrLen sẽ chỉ ra độ dài cụ thể của
phần header này.
7.3.2.3 Bắt tay trong TCP
TCP sử dụng giao thức bắt tay 3 chiều.
Bước 1: Cient (bên chủ động) gởi đến server một segment yêu cầu nối kết, trong đó chứa
số thứ tự khởi đầu mà nó sẽ dùng (Flags = SYN, SequenceNum = x).
Bước 2: Server trả lời cho client bằng một segment, trong đó báo nhận rằng nó sẵn sàng
nhận các byte dữ liệu bắt đầu từ số thứ tự x+1 (Flags = ACK, Ack = x + 1) và cũng báo
rằng số
thứ tự khởi đầu của bên server là y (Flags = SYN, SequenceNum = y).
Bước 3: Cuối cùng client báo cho server biết, nó đã biết số thứ tự khởi đầu của server là y
(Flags = ACK, Ack = y+1).
H7.12 Bắt tay 3 chiều trong TCP
7.3.2.4 Hủy bắt tay trong TCP
Việc hủy bắt tay trong TCP được thực hiện qua 4 bước:
Bước 1: Cient (bên chủ động) gởi đến server một segment yêu cầu hủy nối kết (Flags =
FIN).
Bước 2: Server nhận được một segment FIN, sẽ trả lời bằng một segment ACK. Sau khi đã
hoàn tất hết mọi thứ để đóng nối kết, server sẽ gởi cho client tiếp một segment FIN.
Bước 3: Client nhận được FIN s
ẽ trả lời ACK sau đó nó sẽ chuyển sang trạng thái chờ đợi
có định hạn. Trong thời gian chờ đợi này, client sẽ trả lời ACK cho mọi khung FIN. Hết
thời gian chờ đợi, client sẽ thật sự đóng nối kết.
Bước 4: Server khi nhận được ACK sẽ thật sự đóng nối kết.
ốt n bytes
này và chờ nhận tiếp từ byte thứ Acknowledgement (Acknowledgement = SequenceNum + n).
H7.16 Ví dụ về điều khiển thông lượng trong TCP
Biên Sọan: Th.s Ngô Bá Hùng – Ks Phạm Thế Phi - 01/2005
147
Đại Học Cần Thơ - Khoa Công Nghệ Thông Tin - Giáo Trình Mạng Máy Tính – V1.0
Do kích thước cửa sổ là động, nên trong mỗi khung báo nhận của mình, bên nhận đính kèm theo
thông báo về kích thước cửa sổ sẵn dùng của nó (lượng buffer còn trống), đó chính là trường
AdvertisedWindow trong TCP segment. Lần sau, bên gởi sẽ không được gởi lượng bytes vượt
quá AdvertisedWindow.
Trong ví dụ trên, lúc đầu bên nhận có kích thước buffer là 4 KB. Bên gởi đặt số thứ tự khởi đầu là
0, sau đó truyền 2 KB. Buffer bên nhận còn lại 2 KB rỗng, do đó nó báo nhận
“Acknowledgement = 2048, AdvertisedWindow = 2048”. Bên gở
i gởi tiếp 2 KB, khi đó buffer
bên nhận bị đầy, nó liền báo nhận “Acknowledgement = 4096, AdvertisedWindow = 0”. Không
còn buffer nhận, nên bên gởi sẽ tạm thời bị nghẽn. Sau khi bên nhận xử lý xong 2 KB, nó liền báo
“Acknowledgement = 4096, AdvertisedWindow = 2048”. Lúc này bên gởi có thể gởi tiếp tối đa
là 2 KB, nhưng nó chỉ còn 1 KB dữ liệu để gởi mà thôi.
Biên Sọan: Th.s Ngô Bá Hùng – Ks Phạm Thế Phi - 01/2005
148
Đại Học Cần Thơ - Khoa Công Nghệ Thông Tin - Giáo Trình Mạng Máy Tính – V1.0
Chương 8: CÁC ỨNG DỤNG MẠNG
Chương này sẽ tìm hiểu một số ứng dụng mạng phổ biến hiện nay, chủ yếu tập trung vào giao
thức hoạt động của chúng.
Ví dụ đầu tiên được xem xét là dịch vụ tên phân tán, dịch vụ đầu tiên được cài đặt trong một mạng
máy tính. Về thực chất dịch vụ tên là cái mà các ứng dụng khác phải phụ thuộc vào. Một server
phục vụ tên thường được sử dụng bởi các
ứng dụng khác hơn là bởi con người.
Sau đó, các ứng dụng mạng truyền thống và phổ biến sẽ được giới thiệu, bao gồm các dịch vụ
MAIL, WEB và FTP.
Cũng cần nói trước rằng, những dịch vụ mạng vừa nói sẽ dựa trên hai giao thức vận chuyển đã
được đề cập trong chương 6 là TCP và UDP.
8.1 Dịch vụ tên (DNS)
Cho đến bây giờ, chúng ta vẫn dùng địa chỉ để định danh các host. Trong khi rất thuận tiện cho
việc xử lý của các router, các địa chỉ số không thân thiện với người dùng lắm. Vì lý do này, các
host thường được gán cho một cái tên thân thiện và dịch vụ tên được sử dụng để ánh xạ từ cái tên
thân thiện với người dùng này sang địa chỉ số vốn rất thân thiện với các router. Dịch vụ như vậy
thường là ứng d
ụng đầu tiên được cài đặt trong một mạng máy tính do nó cho phép các ứng dụng
khác tự do định danh các host bằng tên thay vì bằng địa chỉ. Dịch vụ tên thường được gọi là phần
Biên Sọan: Th.s Ngô Bá Hùng – Ks Phạm Thế Phi - 01/2005
149