Tìm hiểu về cách hoạt động của TCP/IP trong hệ thống mạng internet

Mạng máy tính ngày nay đã trở thành một thành phần quan trọng trong ngành truyền thông. Trên thế giới, ban đầu chỉ có vài mạng máy tính được đưa vào sử dụng ở các viện nghiên cứu và phục vụ cho quốc phòng. Cùng với thời gian, khoa học phát triển, giá máy giảm, mạng máy tính đã có mặt ở khắp nơi, từ trường học, nhà máy đến các học viện.

Đặc biệt sự bùng nổ của mạng thông tin toàn cầu Internet đã đưa khả năng sử dụng mạng đến từng người dân. Hàng ngày bạn dạo chơi trên Internet, lướt trên các trang Web, có bao giờ bạn tự hỏi làm thế nào mà con người có được khả năng truy cập thông tin mạnh mẽ và tiện lợi đến như vậy?

Trả lời đầy đủ câu hỏi này quả là không đơn giản vì đó là thành quả của hàng ngàn con người, lao động trong hàng chục năm, không thể trình bày gói gọn chỉ trong vài trang viết. Bài báo này không đi vào chi tiết mà chỉ xin được cung cấp một số kiến thức cơ bản nhất về Internet và nguyên lý hoạt động của nó.

Mô hình tổng quát của mạng Internet
security (1).JPG (750×330)


Như trong hình 1, kết cấu vật lý của mạng Internet gồm có mạng chính chứa các server cung cấp dịch vụ cho mạng, mạng nhánh bao gồm các trạm làm việc sử dụng dịch vụ do Internet cung cấp. "Đám mây Internet" hàm chứa vô vàn mạng chính, mạng nhánh và bao phủ toàn thế giới. Để một hệ thống phức tạp như vậy hoạt động trơn tru và hiệu quả thì điều kiện tiên quyết là mọi máy tính trong mạng, dù khác nhau về kiến trúc, đều phải giao tiếp với mạng theo cùng một quy luật. Đó là giao thức TCP/IP.

Quá trình truyền dữ liệu qua mạng Internet

Nếu đã từng lập trình, bạn hẳn biết rằng một chương trình hoàn chỉnh được tạo nên từ nhiều module với các chức năng và nhiệm vụ khác nhau nhưng lại liên kết chặt chẽ với nhau. Quá trình truyền dữ liệu cũng như vậy. Để có thể truyền qua mạng Internet, dữ liệu phải được xử lý qua nhiều tầng. Một mạng intranet theo chuẩn OSI thường có bảy tầng nhưng Internet chỉ có bốn tầng xử lý dữ liệu là:

* Tầng application

* Tầng transport còn gọi là tầng TCP (Transmission Control Protocol)

* Tầng network còn gọi là tầng IP (Internet Protocol)

* Tầng Datalink/Physical

Giả sử bạn đang ở máy A và muốn gửi một thông điệp tới máy B. Bạn dùng một trình soạn thảo văn bản để soạn thư, sau đó nhấn nút Send. Tính từ thời điểm đó dữ liệu được xử lý lần lượt như trong hình 2.

Đầu tiên, dữ liệu được xử lý bởi tầng application. Tầng này có nhiệm vụ tổ chức dữ liệu theo khuôn dạng và trật tự nhất định để tầng application ở máy B có thể hiểu được. Điều này giống như khi bạn viết một chương trình thì các câu lệnh phải tuân theo thứ tự và cú pháp nhất định thì chương trình mới chạy được. Tầng application gửi dữ liệu xuống tầng dưới theo dòng byte nối byte. Cùng với dữ liệu, tầng application cũng gửi xuống các thông tin điều khiển khác giúp xác định địa chỉ đến, đi của dữ liệu.

Khi xuống tới tầng TCP, dòng dữ liệu sẽ được đóng thành các gói có kích thước không nhất thiết bằng nhau nhưng phải nhỏ hơn 64 KB. Cấu trúc của gói dữ liệu TCP gồm một phần header chứa thông tin điều khiển và sau đó là dữ liệu. Sau khi đóng gói xong ở tầng TCP, dữ liệu được chuyển xuống cho tầng IP.

Gói dữ liệu xuống tới tầng IP sẽ tiếp tục bị đóng gói lại thành các gói dữ liệu IP nhỏ hơn sao cho có kích thước phù hợp với mạng chuyển mạch gói mà nó dùng để truyền dữ liệu. Trong khi đóng gói, IP cũng chèn thêm phần header của nó vào gói dữ liệu rồi chuyển xuống cho tầng Datalink/Physical.

Khi các gói dữ liệu IP tới tầng Datalink sẽ được gắn thêm một header khác và chuyển tới tầng physical đi vào mạng. Gói dữ liệu lúc này gọi là frame. Kích thước của một frame hoàn toàn phụ thuộc vào mạng mà máy A kết nối.

Trong khi chu du trên mạng Internet, frame được các router chỉ dẫn để có thể tới đúng đích cần tới. Router thực ra là một module chỉ có hai tầng là Network và Datalink/Physical. Các frame tới router sẽ được tầng Datalink/Physical lọc bỏ header mà tầng này thêm vào và chuyển lên tầng Network (IP). Tầng IP dựa vào các thông tin điều khiển trong header mà nó thêm vào để quyết định đường đi tiếp theo cho gói IP. Sau đó gói IP này lại được chuyển xuống tầng Datalink/Physical để đi vào mạng. Quá trình cứ thế tiếp tục cho đến khi dữ liệu tới đích là máy B.

Khi tới máy B các gói dữ liệu được xử lý theo quy trình ngược lại với máy A. Theo chiều mũi tên, đầu tiên dữ liệu qua tầng datalink/physical. Tại đây frame bị bỏ đi phần header và chuyển lên tầng IP. Tại tầng IP, dữ liệu được bung gói IP, sau đó lên tầng TCP và cuối cùng lên tầng application để hiển thị ra màn hình.



Hệ thống địa chỉ và cơ chế truyền dữ liệu trong mạng Internet: Để một gói dữ liệu có thể đi từ nguồn tới đích, mạng Internet đã dùng một hệ thống đánh địa chỉ tất cả các máy tính nối vào mạng như hình 3.

Những tên và địa chỉ này được gửi cho máy tính nhận dữ liệu.

Để phân tích hệ thống tên/địa chỉ, hãy bắt đầu từ thấp lên cao:

a. Địa chỉ vật lý, còn gọi là địa chỉ MAC

Sở dĩ có tên gọi như vậy là vì địa chỉ này gắn liền với phần cứng và đại diện cho một thiết bị. Thông thường địa chỉ vật lý được đặt ngay trên bảng mạch máy tính hay trên thiết bị kết nối trực tiếp với máy (modem, card mạng...)

Địa chỉ vật lý được sử dụng như sau:

Thiết bị nhận dữ liệu kiểm tra địa chỉ vật lý đích của gói dữ liệu ở tầng vật lý. Nếu địa chỉ đích này phù hợp địa chỉ vật lý của thiết bị thì gói dữ liệu sẽ được chuyển lên tầng trên, nếu không nó sẽ bị bỏ qua.

b. SAP: Dùng để đại diện cho giao thức bên trên tầng MAC, ở đây là IP.

c. Địa chỉ mạng (network address)

Một thực thể trong mạng được xác định chỉ qua địa chỉ mạng mà không cần địa chỉ vật lý. Dữ liệu được truyền qua mạng chỉ dựa vào địa chỉ mạng. Khi nào dữ liệu tới mạng LAN thì địa chỉ vật lý mới cần thiết để đưa dữ liệu tới đích.

Ví dụ:
Máy gửi có địa chỉ 128.1.6.7 ->địa chỉ mạng là 128.1
Máy nhận có địa chỉ 132.5.8.12 ->địa chỉ mạng là 132.5
Mạng Internet có trách nhiệm dựa vào 2 địa chỉ mạng trên để đưa dữ liệu tới mạng 132.5. Khi tới mạng 132.5 thì dựa vào địa chỉ 8.12 sẽ tìm ra địa chỉ vật lý thực để truyền dữ liệu tới đích. Như vậy có một thắc mắc là: đã có địa chỉ vật lý rồi, tại sao lại cần thêm địa chỉ mạng?

Việc tồn tại 2 loại địa chỉ là do các nguyên nhân:

* 2 hệ thống địa chỉ được phát triển một cách độc lập bởi các tổ chức khác nhau.

* Địa chỉ mạng chỉ có 32 bit sẽ tiết kiệm đường truyền hơn so với địa chỉ vật lý 48 bit.

* Khi mạch máy hỏng thì địa chỉ vật lý cũng mất.

* Trên quan điểm người thiết kế mạng thì sẽ rất hiệu quả khi tầng IP không liên quan gì với các tầng dưới.

Như trên đã nói, từ địa chỉ mạng có thể tìm được địa chỉ vật lý. Công việc tìm kiếm này được thực hiện bởi giao thức ARP (Address Resolution Protocol). Nguyên tắc làm việc của ARP là duy trì một bảng ghi tương ứng địa chỉ IP - địa chỉ vật lý. Khi nhận được địa chỉ IP, ARP sẽ dùng bảng này để tìm ra địa chỉ vật lý. Nếu không thấy, nó sẽ gửi một gói dữ liệu, gọi là ARP request, chứa địa chỉ IP vào mạng LAN. Nếu máy nào nhận ARP request và nhận ra địa chỉ IP của mình thì sẽ gửi lại một gói dữ liệu chứa địa chỉ vật lý của nó.

Vậy từ địa chỉ vật lý, một máy tính trong mạng có thể biết địa chỉ IP của mình hay không? Câu trả lời là có. Giao thức gọi là RARP (Reverse Address Resolution Protocol) thực hiện công việc này. Giả sử trong mạng có một máy cần biết địa chỉ IP của mình, nó gửi một gói dữ liệu cho tất cả các máy trong mạng LAN. Mọi máy trong mạng đều có thể nhận gói dữ liệu này, nhưng chỉ có RARP server mới trả lại thông báo chứa địa chỉ mạng của máy đó.

Trên thực tế, khi muốn nhập vào một địa chỉ Internet nào đó, bạn hay đánh vào dòng chữ như "WWW.hotmail.com" mà ít thấy những dòng địa chỉ số khô khốc. Vậy có điều gì mâu thuẫn? Chẳng sao cả, Internet đã dùng một hệ thống gọi là DNS (Domain Name System) để đặt tên cho một host và cung cấp một số giao thức để chuyển đổi từ địa chỉ chữ ra địa chỉ số và ngược lại. Cách tổ chức tên của DNS tuân theo dạng hình cây như hình 4.

Một máy tính trong mạng sẽ ứng với một nút của cây. Như ở cây trên, máy ở lá FPT sẽ có địa chỉ hoàn chỉnh là fpt.com.vn. Mỗi nút trên cây biểu diễn một miền (domain) trong hệ thống DNS; mỗi miền lại có một hay nhiều miền con. Tại mỗi miền này đều phải có máy chủ DNS tương ứng quản lý hệ thống tên trong miền đó. Để hiểu rõ hơn hoạt động của DNS, lấy một ví dụ sau:

Một máy trạm có tên là test.fpt.com.vn muốn biết địa chỉ IP của máy www.microsoft. com, quá trình hỏi của nó như sau:

Khi máy test.fpt.com.vn gửi yêu cầu hỏi về máy www. microsoft.com tới DNS của miền fpt.com.vn, DNS xác định là tên đó không nằm trong miền mà nó quản lý và gửi ngược lên cho miền ở mức cao hơn là com.vn. Tại đây, DNS cũng không tìm được thông tin thoả mãn nên phải hỏi ngược lên DNS của miền vn.

Quá trình cứ thế tiếp diễn đến khi câu hỏi được gửi tới DNS của miền microsoft.com và tại đây câu hỏi được giải đáp.

Để hoạt động hiệu quả như trên, mỗi máy chủ DNS lưu trữ một cơ sở dữ liệu gồm các bản ghi chứa thông tin:

+ Tên của DNS cấp cao hơn

+ Địa chỉ IP

+ Địa chỉ dạng chữ tương ứng

Chỉ số của bản ghi được lấy từ địa chỉ IP tương ứng, nhờ đó từ địa chỉ IP có thể dễ dàng tìm ra địa chỉ chữ.

d. Protocol ID chỉ ra giao thức của tầng giao vận. Trên Internet trường này là TCP hoặc UDP.

e. Port là một số đặc trưng cho một chương trình chạy trên Internet. Ví dụ, chương trình lấy thư điện tử qua giao thức IMAP có port=143, truyền file có port =21, v.v...

f. Username là tên người đăng kí sử dụng chương trình.

ở phần II có nói tại router, IP sử dụng các thông tin điều khiển trong header của gói dữ liệu IP để quyết định đường đi tiếp theo của gói này. Có rất nhiều thông tin điều khiển nhưng ở đây chỉ xin phân tích các thông tin quan trọng.

- Đầu tiên là địa chỉ đích. Nếu địa chỉ đích trùng với địa chỉ của router đó thì gói dữ liệu được truyền trực tiếp cho host B. Nếu không trùng thì dữ liệu sẽ được truyền đến router tiếp theo trên đường đi. Vấn đề là router nào được chọn. Có 2 khả năng để lựa chọn router, tức là 2 khả năng để dẫn đường:

+ Thứ nhất là tuân theo một cách nghiêm ngặt source routing. Dữ liệu sẽ được truyền cho router tiếp theo trong source routing. Nhưng dữ liệu chỉ được truyền đi khi router được chọn có trong bảng các router có thể đến được của router hiện tại, bằng không sẽ sinh ra lỗi.

+ Thứ hai là "quên đi" source routing và tìm đường mới tới đích. Router tiếp theo được chọn dựa trên sự tìm đường này. Thông thường sự tìm đường dựa trên thuật toán Dijstra tìm kiếm theo chiều rộng. Trên thực tế, cách này đang được sử dụng rộng rãi và có thể trở thành chuẩn trong tương lai.

- Các gói dữ liệu IP thường có kích thước phụ thuộc vào mạng con. Các mạng con khác nhau thì kích thước gói IP của chúng cũng khác nhau. Vậy giả sử mạng A truyền được gói dữ liệu có kích thước lớn nhất là 1024 byte, mạng B truyền được gói dữ liệu có kích thước lớn nhất là 256 byte thì gói dữ liệu từ mạng A có kích thước 1024 byte qua mạng B như thế nào?

Để giải quyết vấn đề này, IP cung cấp khả năng phân và gom mảnh gói dữ liệu. Đây chính là lúc IP sử dụng trường flags và offset trong gói dữ liệu IP. Trường flags thực chất là các cờ thông báo gói dữ liệu này có bị phân mảnh hay không, trường offset chứa giá trị tương đối của gói con trong gói to ban đầu. Khi phân mảnh các cờ được bật lên, đồng thời trường offset được thiết lập giá trị. Dựa vào các dữ liệu trên, IP có thể dễ dàng gom mảnh gói dữ liệu, hồi phục khối dữ liệu to ban đầu.

Kiểm soát lỗi

Qua các phần trên ta thấy quá trình dữ liệu đi trên mạng đã khá rõ ràng nhưng trên một mạng rộng lớn như Internet thì có gì đảm bảo dữ liệu sẽ tới đích một cách an toàn? Điều gì xảy ra nếu trên đường đi các gói dữ liệu bị mất, tắc nghẽn, lạc đường...? Đây chỉ đơn thuần là các sự cố, nhưng thật đáng tiếc là nó lại rất hay xảy ra trên thực tế, do đó một yêu cầu đặt ra là phải có cơ chế thông báo và sửa lỗi trên mạng. Khi có lỗi, tầng IP đơn thuần huỷ bỏ dữ liệu và thông báo lỗi. Thông báo lỗi được thực hiện qua một giao thức gọi là ICMP (Internet Control Message Protocol). ICMP có thể coi là bạn đồng hành với IP và có một số đặc điểm sau:

- Dùng IP để truyền thông báo qua mạng

- Không có chức năng sửa lỗi mà chỉ đơn thuần là máy thông báo lỗi. Chức năng sửa lỗi là của tầng trên (tầng TCP)

- Thông báo lỗi về gói dữ liệu IP nhưng lại không thể thông báo lỗi về gói dữ liệu của chính mình

- Nếu gói dữ liệu IP bị phân mảnh thì khi xảy ra lỗi, ICMP chỉ thông báo lỗi của mảnh đầu tiên

Nói rằng việc sửa lỗi là của TCP nhưng thật ra TCP chẳng sửa lỗi gì cả, khi có lỗi xảy ra nó chỉ làm mỗi một việc là truyền lại. Hãy xem nó làm việc đó như thế nào. TCP truyền dữ liệu theo cơ chế "flow window". Tất cả các byte truyền đều được đánh số thứ tự và TCP quản lý việc truyền dữ liệu dựa vào số thứ tự đó.

Giả sử có 13 byte dữ liệu gửi cho máy B (hình 5) .

Byte 0 đã gửi đi và được xác nhận là tới nơi. Sự xác nhận này được thực hiện bằng cách khi nhận được dữ liệu gửi đến, máy B sẽ gửi một thông báo về cho máy gửi. Thông báo đó có chứa số thứ tự của byte được chấp nhận chứa trong trường ACK.

Byte 1, 2 đã được gửi nhưng chưa có xác nhận, các byte 3, 4, 5 trong khung sẽ được truyền đi, các byte từ 6 trở đi không thể được truyền. Giá trị window limit được tính bằng công thức sau:

Window limit=SND UNA + SND WND
SND UNA = số byte đã gửi đi nhưng chưa được xác nhận

SND WND= số byte trong ô, giá trị này được lấy từ trường window trong gói dữ liệu TCP dùng để xác nhận các byte đã tới nơi. Giá trị này chính là số dữ liệu mà máy B có thể chấp nhận.

Máy B bây giờ lại gửi một thông báo thừa nhận có ACK=3, Window=6. Lúc này dữ liệu có dạng như hình 6.

Các byte 0, 1, 2 đã được xác nhận, cửa sổ đã mở rộng ra, window limit nhận giá trị 3+6 =9. Như vậy số byte có thể truyền đi được điều khiển bởi máy B, điều này giúp giảm đi sự tắc nghẽn giao thông trên mạng và làm cho máy B có thể chủ động xử lý dữ liệu đến một cách trôi chảy.

Khi có lỗi xảy ra trên đường truyền và phải truyền lại dữ liệu thì TCP không chờ đợi thông báo xác nhận từ phía máy B mà nó làm theo cách sau: khi truyền một gói dữ liệu, TCP bấm giờ và nếu thời gian hết mà không thấy thông báo xác nhận thì nó tiến hành truyền lại.

Như vậy thời gian để bấm giờ hết sức quan trọng. Ban đầu thời gian này được thiết lập xung quanh khoảng thời gian kể từ khi TCP A gửi dữ liệu đi đến khi nhận được thông báo xác nhận. Nhưng về sau do cách tính này không hợp lý nên người ta đã đưa ra nhiều cách thiết lập khác nhau. Một trong các cách tính được dùng phổ biến hiện nay là thuật toán của Phil Karn. Nội dung căn bản của thuật toán là mỗi khi hết thời gian thì khoảng thời gian bấm đồng hồ tăng lên gấp một số lần cho trước.

NVT=A x VT

NVT: giá trị thời gian mới để bấm đồng hồ

A : hằng số, thường lấy bằng 2

VT: giá trị thời gian cũá

Cơ chế kết nối giữa hai máy trong mạng Internet

Chặng cuối cùng trong hoạt động của mạng Internet là cơ chế kết nối giữa hai máy. Để toàn bộ các hoạt động truyền tin giữa hai máy trong mạng có thể diễn ra thì phải hình thành kênh liên lạc hay một kết nối giữa chúng. Quá trình đó diễn ra như sau (hình 7):

1: ULP B giả sử là một chương trình mail server ở Mỹ. Do là server nên lúc nào nó cũng chờ đợi sự kết nối.

2: ULP A là chương trình nhận thư điện tử của bạn. Để kết nối, bạn gửi yêu cầu kết nối xuống cho tầng TCP.

3: TCP chuẩn bị một gói dữ liệu TCP với cờ SYN=1 yêu cầu có sự đồng bộ hoá, SEQ có thể lấy bất kì giá trị nào, ở đây là =100 và gửi cho TCP B.

4: Sau khi nhận gói dữ liệu có SYN=1, TCP B gửi trả lại một thông báo có SYN=1, ACK=101, SEQ có thể lấy bất kì giá trị nào, ở đây là =177.

5: TCP A nhận được gói dữ liệu từ TCP B sẽ gửi tiếp một gói dữ liệu có ACK=178.

6: TCP A chuyển chấp nhận kết nối lên chương trình A.

7: Sau khi nhận nốt gói dữ liệu có ACK=178, TCP B chuyển chấp nhận kết nối lên chương trình B.

Sự kết nối giữa 2 module TCP ở các bước 3, 4, 5 gọi là cơ chế bắt tay 3 bước (three way handshake).

Quá trình đóng một kết nối cũng thực hiện tương tự.