Giới thiệu bộ giao thức TCP/IP
Đây là bộ giao thức được sử dụng phổ biến nhất. Mối quan hệ
giữa năm tầng của bộ giao thức TCP/IP và bảy tầng của mô hình OSI được minh họa
trong hình dưới đây.
Application
|
Application
|
|
Presentation
|
||
Sessision
|
||
Transport
|
Transport
|
|
Network
|
Internet
|
|
Data link
|
Data link
|
|
Physical
|
Physical
|
|
OSI
|
TCP/IP
|
Năm tầng của bộ giao thức TCP/IP gồm: application,
transport, internet, data link và physical. Hai tầng data link và physical đôi
khi được nhóm lại thành 1 tầng, gọi là tầng network interface (tầng giao tiếp
mạng) hoặc network access hoặc host-to-network.
Tầng application của TCP/IP bao gồm các chức năng của tầng
application, presentation và session trong mô hình OSI.
Các ứng dụng trong tầng application bao gồm:
-
FTP (File Transfer Protocol) và TFTP (Trivial File
Transfer Protocol): truyền file giữa các thiết bị.
-
SMTP (Simple Mail Transfer Protocol) và POP3 (Post
Office Protocol): cung cấp dịch vụ email.
-
HTTP (HyperText Transfer Protocol): truyền thông tin
giữa WWW server và trình duyệt web.
-
Telnet (telecommunication network hoặc terminal network
hoặc teletype network): cung cấp dịch vụ kết nối và thao tác với một máy tính ở
xa thông qua môi trường mạng LAN hoặc Internet.
-
DNS (domain name system): chuyển đổi tên của thiết bị
mạng (tên miền) sang địa chỉ (IP) và ngược lại.
-
SNMP (simple network management protocol): sử dụng để
quản lý và theo dõi mạng.
-
DHCP (dynamic host configuration protocol): cung cấp
địa chỉ IP động cho thiết bị.
Các giao thức tầng transport của bộ giao thức TCP/IP
Tầng này gồm hai giao thức:
-
TCP (transmission control protocol): giao thức TCP cung
cấp khả năng truyền dữ liệu tin cậy và có yêu cầu thiết lập kết nối (hướng kết
nối). Trước khi truyền dữ liệu, TCP trên thiết bị nguồn sẽ thiết lập một kết
nối với TCP trên thiết bị đích, thực hiện đồng bộ giữa hai thiết bị. Trong quá
trình trao đổi dữ liệu giữa hai thiết bị sẽ có cơ chế hồi báo, nếu bên nhận
chưa nhận đủ dữ liệu nó sẽ yêu cầu bên gửi thực hiện gửi lại phần dữ liệu còn
thiếu. Ví dụ: FTP là ứng dụng sử dụng giao thức TCP, giao thức này giúp FTP
truyền dữ liệu đúng và đủ.
-
UDP (user datagram protocol): giao thức UDP cung cấp cơ
chế truyền dữ liệu không có hồi báo, không thực hiện thiết lập kết nối trước
khi truyền (connectionless). Nói cách khác, UDP không đảm bảo tất cả dữ liệu đã
được gửi đi từ máy gửi sẽ đến máy đích. Việc kiểm tra dữ liệu đã được truyền đi
có thành công hay không? đầy đủ hay chưa? có phải truyền lại hay không? là nhiệm
vụ của các tầng cao hơn hoặc của người sử dụng. Ví dụ: TFTP là một ứng dụng sử
dụng UDP. Sau khi nhận được dữ liệu, TFTP sẽ kiểm tra lỗi, kiểm tra tính toàn
vẹn của dữ liệu, nếu có lỗi xảy ra, nó sẽ cảnh báo người dùng và yêu cầu truyền
lại toàn bộ dữ liệu.
Hình sau minh họa các trường trong gói dữ liệu của TCP và
UDP (PDU tại tầng này là segment)
Các trường của 1 UDP segment:
-
Source port number và destination port number (mỗi
trường 16 bit): là các số nguyên không âm cho biết giao thức của tầng bên trên
(tầng application) tại máy gửi và máy nhận.
-
Length (16 bit): kích thước của vùng header và data, đơn
vị tính là từ nhớ 32-bit (32-bit word).
-
Checksum (16 bit): giá trị kiểm tra (checksum) của
trường header và data, được sử dụng để đảm bảo dữ liệu (segment) đã nhận được
là chính xác.
-
Data (kích thước có thể thay đổi): PDU của tầng bên
trên.
Các trường của một TCP segment:
-
Source port number và destination port number (mỗi
trường 16 bit): là các số nguyên không âm cho biết giao thức của tầng bên trên
(tầng application) tại máy gửi và máy nhận.
-
Sequence number và acknowledgment number (mỗi trường 32
bit): là các số nguyên, được sử dụng để kiểm soát quá trình truyền dữ liệu,
giúp đảm bảo các gói dữ liệu nhận được có thứ tự chính xác và đảm bảo dữ liệu
gửi đã tới được đích.
-
Header length (4 bit): kích thước của header, tính bằng
từ nhớ 32-bit.
-
Reserved
(6 bit): không sử dụng, mang giá trị 0.
-
Code
bit (6 bit): mã xác định kiểu của segment. Ví dụ, bit SYN (synchronize) được sử
dụng để thiết lập phiên kết nối, bit ACK (acknowledge) được sử dụng để hồi báo,
và bit FIN (finish) được sử dụng để đóng phiên kết nối.
-
Window
size (16 bit): số octet mà thiết bị nhận có thể tiếp nhận, trước khi phải gửi
một hồi báo cho thiết bị gửi, một octet gồm tám bit dữ liệu.
-
Checksum
(16 bit): giá trị kiểm tra của trường header và data, được sử dụng để đảm bảo
dữ liệu đã nhận được là chính xác.
-
Urgent
(16 bit): báo hiệu kết thúc của phần dữ liệu cần truyền gấp.
-
Option
(0 hoặc 32 bit): là trường tùy chọn, xác định kích thước tối đa của một TCP
segment.
-
Data
(kích thước không cố định): dữ liệu của tầng phía trên.
Chú ý, header của
UDP có kích thước nhỏ hơn header của TCP. UDP không cần các trường sequence,
acknowledgment, window size, vì nó không cần cơ chế đảm bảo truyền tin cậy, không
thiết lập và duy trì kết nối.
Port number
TCP và UDP sử
dụng port number để phân biệt các ứng dụng đang chạy trên cùng một thiết bị.
Port number được chia thành ba loại: well-known, registered
và public/private.
-
Well-known là các port có giá trị từ 0 -> 1023, dùng
cho các ứng dụng phổ biến. Ví dụ:
o FTP:
TCP sử dụng port 20 cho truyền dữ liệu (data) và port 21 cho điều khiển
(control).
o TFTP:
UDP sử dụng port 69.
o SMTP:
TCP sử dụng port 25.
o POP3: TCP sử dụng port 110.
o HTTP:
TCP sử dụng port 80.
o
Telnet:
TCP sử dụng port 23.
o
DNS:
TCP và UDP sử dụng port 53.
o
SNMP:
UDP sử dụng port 161.
-
Registered
là các port có giá trị từ 1024 -> 49151, người dùng muốn sử dụng các port
này, cần phải đăng kí với tổ chức IANA.
-
Public/private
là các port có giá trị từ 49152 -> 65535, người dùng được phép sử dụng tự do
các port này mà không cần đăng kí.
Hình dưới đây minh họa thiết bị tại Toronto
đang mở một phiên làm việc Telnet với thiết bị ở London. Để ý là, giá trị source port từ Toronto là 50051, nghĩa
là, Toronto ghi nhận phiên làm việc telnet này
với London ở cổng 50051, để phân biệt với các
phiên làm việc telnet khác có thể đang chạy trên chính máy Toronto.
Thiết bị tại London
nhận được gói tin với giá trị dest port là 23, nó nhận ra đây là một phiên làm
việc telnet. Trong gói trả lời, nó sử dụng dest port là 50051, với giá trị dest
port này, Toronto sẽ biết đây là phiên telnet mà
nó đã mở để làm việc với London.
Sequencing (sắp tuần
tự), acknowledgment (hồi báo) và Windowing (khung truyền) của TCP
Để minh họa hoạt động của TCP, hãy xem xét một phiên làm
việc của TCP từ lúc thiết lập kết nối, truyền dữ liệu và đóng kết nối.
Một kết nối TCP được thiết lập bằng quá trình “three-way
handshake” – ba lần bắt tay. Quá trình này sử dụng trường code bit (SYN, ACK),
trường sequence number và acknowledgment number.
Hình sau thể hiện quá trình “three-way handshake”:
Ở ví dụ trên, người dùng tại Toronto
muốn thiết lập một phiên làm việc dựa trên TCP với thiết bị ở London để chạy chương trình telnet.
Bước đầu tiên của “three-way handshake” là bước khởi tạo, Toronto gửi đi một segment
với bit SYN được thiết lập – có nghĩa là nó muốn bắt đầu một phiên làm việc và
thực hiện đồng bộ với London. Segment này có giá trị sequence number khởi tạo
là 21.
Giả sử thiết bị tại London
đồng ý thiết lập phiên làm việc, nó sẽ gửi lại một segment với bit SYN được
thiết lập. Ngoài ra, bit ACK cũng được thiết lập, vì London
phải gửi hồi báo cho Toronto biết là đã nhận
được segment mà Toronto
đã gửi trước đó. Giá trị acknowledgment number được thiết lập là 22, chỉ ra
rằng London
đang mong nhận được segment thứ 22, tức là nó đã nhận được segment 21. Segment
mới thiết lập giá trị sequence number là 75.
Cuối cùng, Toronto trả lời
bằng một segment hồi báo với sequence number là 22 (như London đang mong đợi), và acknowledgment
number là 76, chỉ ra rằng, nó đang mong đợi segment thứ 76, nghĩa là segment
thứ 75 đã truyền tới đích thành công. Phiên làm việc đã được thiết lập, và hai
máy Toronto và London có thể bắt đấu trao đổi dữ liệu.
Chú ý: sequence và acknowledgment number chính là số octet,
chứ không phải số segment. Để dễ hiểu, ở ví dụ trên đã giả sử một segment là một
octet dữ liệu. Trong thực tế điều này không đúng.
Trường window size trong segment có nhiệm vụ kiểm soát lưu
lượng (flow) của phiên truyền dữ liệu. Nó cho biết số octet mà một thiết bị có
thể nhận trước khi phải gửi một hồi báo. Vì mỗi thiết bị có khả năng tiếp nhận
dữ liệu khác nhau (nếu thiết bị quá bận nó sẽ yêu cầu gửi số lượng dữ liệu ít
hơn), nên mỗi thiết bị có thể có windows size khác nhau. Ví dụ minh họa trong
hình dưới đây.
Ví dụ ở hình trên, window size tại Toronto
có giá trị 3, và tại London
có giá trị 2. Vì vậy, khi Toronto gửi dữ liệu tới
London, nó có thể gửi hai octet trước khi phải đợi một hồi báo, Ngược lại, khi London gửi dữ liệu tới Toronto, nó có thể gửi ba octet trước khi
phải đợi một hồi báo.
Chú ý: window size được tính bằng số octet có thể gửi, không
phải số segment. Để dễ hiểu, ví dụ ở trên đã coi một segment có kích thước bằng
một octet. Thực tế, kích thước của window size lớn hơn nhiều so với ví dụ, điều
này cho phép thiết bị truyền một khối lượng lớn dữ liệu giữa các lần hồi báo.
Sau khi toàn bộ dữ liệu của phiên đã được truyền, phiên làm
việc sẽ được đóng. Quá trình đóng cũng tương tự như quá trình thiết lập, cũng
sử dụng “handshake”, gồm bốn bước, được minh họa trong hình sau:
Ở hình trên, Toronto muốn
đóng phiên telnet với London.
Bước đầu tiên của quá trình “handshake” là Toronto gửi một segment với bit FIN được
thiết lập, với mục đích là kết thúc phiên làm việc. Segment này cũng bao gồm
sequence number mà Toronto
đang sử dụng (sequence number = 107).
London ngay lập tức trả lời
yêu cầu của Toronto.
Với segment có bit ACK được thiết lập và giá trị của ack = 108, có nghĩa là London đã nhận được
segment số 107. Segment của London
thiết lập sequence number 322. Sau đó London
thông báo cho ứng dụng telnet biết là kết nối telnet từ Toronto
tới nó đã bị đóng (đóng một chiều, từ Toronto
tới London).
Khi ứng dụng tại London gửi
yêu cầu đóng kết nối chiều ngược lại, London
sẽ gửi một segment mới, với cờ FIN được thiết lập, nghĩa là muốn đóng phiên làm
việc.
Cuối cùng, Toronto
đáp lại với một segment hồi báo có acknowledgment number = 323 (nghĩa là thiết
bị này đã nhận được segment 322). Phiên làm việc bây giờ đã được đóng ở cả hai
phía.
-------------------------------------------------------
LGC - Lược dịch “Designing for Cisco Internetwork
Solutions”