03/34 Chia dữ liệu thành gói tin Các chương

Gói tin là gì?

Mạng điện thoại phủ khắp nơi rồi, sao máy tính không gọi nhau như người?

Năm 1965, Larry Roberts và Thomas Marill nối máy TX-2 ở Massachusetts với máy Q-32 ở California qua mạng điện thoại.

Hai máy thực sự có thể chạy chương trình và lấy dữ liệu của nhau từ xa. Vấn đề là cách mạng điện thoại sử dụng đường truyền không hợp với máy tính.

Mạng điện thoại đã phủ khắp nơi rồi.

Vậy tại sao không để máy tính gọi nhau giống như người?

Cuộc gọi giữ một đường riêng

Mạng điện thoại thời đó dùng chuyển mạch kênh (circuit switching).

Khi một cuộc gọi bắt đầu, mạng thiết lập một mạch từ người gọi tới người nghe và giữ mạch đó cho cuộc gọi cho tới khi hai bên gác máy.

Với giọng nói, cách này khá hợp lý. Hai người có thể nói bất kỳ lúc nào và âm thanh cần được truyền liên tục.

Máy tính thì khác.

Một máy gửi vài dòng dữ liệu, chờ máy bên kia xử lý, nhận câu trả lời rồi lại im. Người dùng có thể mất vài giây để đọc kết quả trước khi gõ lệnh tiếp theo.

Dữ liệu đi thành những đợt ngắn:

Máy A gửi dữ liệu từng đợt giữa các khoảng nghỉ

Nếu giữ nguyên một mạch cho máy A, phần lớn thời gian đường truyền vẫn được dành cho A dù chẳng có bit nào chạy qua.

Có hàng trăm máy như vậy thì rất lãng phí.

Nhưng hiệu suất chưa phải vấn đề duy nhất.

Baran: nếu một nút của mạng bị phá thì sao?

Đầu thập niên 1960, Paul Baran ở RAND nghiên cứu một câu hỏi khác: làm sao xây một mạng liên lạc vẫn hoạt động khi một phần của nó bị phá hỏng?

Một mạng tập trung có một điểm yếu rất rõ.

(a) Tập trung 1 nút sống còn (b) Phi tập trung 6 nút sống còn (c) Phân tán không có nút sống còn

Ở mạng tập trung, các đầu cuối phụ thuộc vào nút ở giữa. Mất nút đó, những phần còn lại dù vẫn nguyên vẹn cũng không nói chuyện được với nhau.

Baran đề xuất một mạng phân tán hơn. Mỗi nút nối với một số nút khác, để từ A tới B có thể tồn tại nhiều đường khác nhau.

Nhưng lúc đó xuất hiện một vấn đề mới.

Giả sử một tin nhắn dài đang đi qua mạng và một đoạn đường phía trước bị hỏng. Làm sao chuyển nó sang đường khác?

Baran đề xuất chia thông tin thành những khối nhỏ, gọi là khối tin (message block).

Mỗi khối được chuyển từ nút này sang nút khác. Nút trung gian nhận khối, xem nó cần đi về đâu rồi chuyển tiếp sang bước kế tiếp. Nếu một đường bị hỏng nhưng mạng vẫn còn đường khác tới đích, dữ liệu có thể đi vòng qua phần bị hỏng.

Thay vì cả cuộc liên lạc phụ thuộc vào một mạch cố định, dữ liệu được chia thành những phần nhỏ có thể được chuyển tiếp riêng.

Ở Anh, Donald Davies đi tới một ý tưởng rất giống vậy, nhưng từ một vấn đề khác.

Davies: đừng để một máy giữ cả đường lúc nó đang im

Donald Davies làm việc tại Phòng thí nghiệm Vật lý Quốc gia Anh (NPL).

Ông quan tâm tới việc nhiều máy tính cùng sử dụng những đường truyền đắt tiền.

Nếu mỗi máy được cấp riêng một mạch, đường truyền bị bỏ trống phần lớn thời gian. Davies đề xuất chia dữ liệu thành những mẩu nhỏ rồi cho tất cả cùng sử dụng chung một mạng.

Ông gọi những mẩu đó là gói tin (packet).

Cách chuyển dữ liệu này được gọi là chuyển mạch gói (packet switching).

Giả sử ba máy đều muốn gửi dữ liệu qua một đường dài.

Nếu mỗi máy giữ một đường riêng, phần lớn thời gian các đường đều đang trống. Nếu chia thành gói, cả ba có thể dùng chung một đường:

Ba mạch riêng so với một đường truyền dùng chung

Máy A gửi xong một gói thì gói của B có thể đi ngay sau đó. Không cần chờ A kết thúc toàn bộ phiên liên lạc.

Đổi giữa hai cách để xem chuyện gì xảy ra khi một máy đang không gửi dữ liệu.

Cùng một đường truyền
Máy A A1 A2 A3 A4 Máy B B1 B2 B3 B4 ← chưa kịp gửi Máy C C1 C2 C3 ← chưa tới lượt Đường truyền thời gian → A giữ đường B giữ đường A1 Đường đang được A giữ, nhưng không có dữ liệu Đường đang được A giữ, nhưng không có dữ liệu A2 Đường đang được A giữ, nhưng không có dữ liệu A3 Đường đang được A giữ, nhưng không có dữ liệu A4 B1 Đường đang được B giữ, nhưng không có dữ liệu B2 Máy A A1 A2 A3 A4 Máy B B1 B2 B3 B4 Máy C C1 C2 C3 Đường truyền thời gian → A1 B1 C1 A2 B2 C2 A3 B3 C3 A4 B4

A không gửi gì, nhưng B và C vẫn chưa dùng được đường.

5 lượt truyền bị bỏ trống dù máy khác đang chờ.

Không ai giữ riêng đường. Máy nào có dữ liệu thì gói của nó dùng lượt truyền tiếp theo.

Không lượt truyền nào bị bỏ trống.

Baran muốn mạng chịu được hỏng hóc. Davies muốn đường truyền được sử dụng hiệu quả hơn.

Hai bài toán khác nhau dẫn tới cùng một ý tưởng: đừng giữ nguyên một đường cho cả cuộc liên lạc; hãy chia dữ liệu thành những phần nhỏ rồi chuyển từng phần qua mạng.

Một gói cần mang theo gì?

Nếu nhiều máy cùng gửi các gói của mình lên một mạng, thiết bị ở giữa phải biết mỗi gói cần đi đâu.

Một gói vì thế không chỉ chứa dữ liệu.

Có thể hình dung đơn giản:

Gói tin gồm phần đầu header và phần dữ liệu payload

Phần dữ liệu thực sự cần gửi gọi là phần dữ liệu (payload).

Phần thông tin đi kèm phía trước gọi là phần đầu (header).

Bộ định tuyến (router) trên đường đi đọc địa chỉ đích trong phần đầu IP rồi quyết định nên chuyển gói sang đâu tiếp theo.

Gói tin không tự biết đường tới đích. Nó chỉ mang thông tin để các thiết bị mạng đưa ra quyết định chuyển tiếp.

Ví dụ:

Router chọn đường chuyển gói từ máy A tới máy B

Trong ví dụ này, Router 1 chuyển gói qua Router 2 tới máy B. Nét đứt thể hiện một đường khác qua Router 3.

Router 1 không nhất thiết phải biết toàn bộ hành trình của gói. Nó chỉ cần biết nên chuyển gói sang đâu ở bước tiếp theo.

Đó là cách một mạng rất lớn có thể được ghép từ nhiều mạng nhỏ.

Các gói không nhất thiết đi cùng một đường

Khi một file được chia thành nhiều phần, không có gì đảm bảo mọi phần luôn đi qua chính xác cùng một hành trình.

Một gói có thể bị chậm vì phải xếp hàng. Một gói khác có thể đi qua một tuyến khác. Một gói thậm chí có thể bị mất.

Ba gói đi qua các router khác nhau tới cùng đích

Ba gói có thể đi qua những router khác nhau để tới cùng một đích. Hình không thể hiện thứ tự các gói đến nơi.

Bản thân mạng IP không đảm bảo rằng mọi gói đều tới nơi hay tới đúng thứ tự.

Nếu ứng dụng cần dữ liệu đầy đủ và đúng thứ tự, một giao thức khác có thể đảm nhiệm việc đó.

Ví dụ, giao thức TCP (Transmission Control Protocol) đánh số các byte dữ liệu được truyền. Nếu một phần bị mất, TCP có thể phát hiện và gửi lại. Nếu dữ liệu tới sai thứ tự, TCP sắp xếp lại trước khi đưa cho ứng dụng.

Vì vậy, việc gửi lại hay sắp xếp lại không phải là khả năng có sẵn của mọi gói IP.

Vì sao không chia thành những gói thật nhỏ?

Chia dữ liệu thành gói giúp nhiều máy dùng chung đường truyền, nhưng mỗi gói đều phải mang thêm thông tin.

Ví dụ, khi gửi dữ liệu bằng TCP qua IPv4 và Ethernet, dữ liệu được bọc qua nhiều lớp:

Dữ liệu ứng dụng được bọc bởi TCP IP và Ethernet

Phần đầu Ethernet thường là 14 byte, phần đầu IPv4 tối thiểu 20 byte và phần đầu TCP tối thiểu 20 byte.

Nếu mỗi gói chỉ mang vài byte dữ liệu thì phần thông tin đi kèm sẽ chiếm tỷ lệ rất lớn.

Nhưng gói cũng không thể lớn tùy ý.

Trên mạng Ethernet thông dụng, đơn vị truyền tối đa (MTU, Maximum Transmission Unit) thường là 1500 byte. Điều đó có nghĩa là một gói IP thường có thể dài tối đa 1500 byte trên đoạn Ethernet đó.

Nếu dùng IPv4 và TCP với phần đầu tối thiểu:

Gói IP 1500 byte chứa tối đa 1460 byte dữ liệu TCP

Con số thực tế có thể nhỏ hơn nếu phần đầu có thêm thông tin hoặc đường truyền sử dụng MTU khác.

Ý chính là dữ liệu không được chia tùy ý. Gói quá nhỏ thì tốn nhiều phần thông tin đi kèm, còn gói quá lớn có thể vượt quá kích thước mà đường truyền cho phép.

Từ một mạch riêng thành một mạng dùng chung

Mạng điện thoại truyền thống dành một mạch cho một cuộc gọi.

Mạng máy tính có thể làm khác:

Dữ liệu chia thành bốn gói rồi dùng chung đường truyền

Dữ liệu được chia thành các gói nhỏ. Gói của nhiều máy có thể xen kẽ trên cùng một đường truyền. Các thiết bị mạng đọc địa chỉ đích rồi chuyển từng gói sang bước tiếp theo.

Nhờ vậy, hai máy không cần giữ riêng một đường xuyên suốt thời gian chúng liên lạc.

Gói tin đã có rồi. Nhưng nó vẫn cần một đường vật lý để chạy.

Trong một văn phòng, các máy nối với nhau thế nào?

Nguồn bài viết (7)

  1. Brief History of the Internet · Internet Society
  2. Internet History of 1960s · Computer History Museum
  3. Paul Baran and the Origins of the Internet · RAND Corporation
  4. On Distributed Communications: I. Introduction to Distributed Communications Networks (RM-3420, 1964) · RAND Corporation
  5. Packet Switching: The first steps on the road to the information society · National Physical Laboratory
  6. Computer Pioneers: Donald W. Davies · IEEE Computer Society
  7. An Introduction to Computer Networks (Peter L. Dordal) · Loyola University Chicago