Phân mảnh và hợp nhất gói tin IP

Một phần của tài liệu Bài giảng mạng máy tính ths nguyễn xuân anh (Trang 144 - 147)

Không phải tất cả các giao thức của tầng liên kết dữ liệu đều có khả năng truyền các gói tin có cùng độ lớn, một vài giao thức có thể gửi những gói tin lớn trong khi một vài giao thức chỉ có thể gửi những gói tin nhỏ. Ví dụ: mạng Ethernet có độ lớn không quá 1500 bytes, trong khi gói tin trên những liên kết ở mạng diện rộng có độ lớn không vượt quá 576 bytes, số lượng dữ liệu tối đa của một gói tin trên một đường truyền vật lý được định nghĩa là MTU (maximum transfer unit). Gói dữ liệu IP được đặt trong gói dữ liệu của tầng liên kết dữ liệu giữa hai thiết bị định tuyến kế tiếp nhau trên đường truyền. Do vậy giá trị MTU của giao thức của tầng liên kết dữ liệu giới hạn độ dài của gói tin IP. Giới hạn kích thước của gói tin IP không phải là vấn đề lớn, vấn đề ở đây là các kết nối giữa các thiết bị định tuyến dọc theo tuyến đường từ nơi gửi đến nơi nhận có thể sử dụng các giao thức liên kết dữ liệu khác nhau với những giá trị MTU khác nhau.

Một thiết bị định tuyến kết nối đến nhiều đường vật lý khác nhau, mỗi kết nối có một giao thức liên kết dữ liệu khác nhau với các giá trị MTU khác nhau. Giả sử khi nhận được một gói dữ liệu đến từ một liên kết nào đó, thiết bị định tuyến căn cứ vào địa chỉ đích kiểm tra trong bảng định tuyến để xác định cần gửi gói tin đi ra theo kết nối nào. Tuy nhiên đường kết nối ra ngoài này có giá trị MTU nhỏ hơn độ dài gói dữ liệu IP, khi đó thiết bị định tuyến phải phân mảnh (fragmentation) dữ liệu trong gói dữ liệu IP thành nhiều gói dữ liệu IP nhỏ hơn và sau đó gửi những gói dữ liệu nhỏ hơn này trên đường kết nối. Mỗi gói dữ liệu IP nhỏ này được coi là một mảnh (fragment).

Hình 7.19 Phân mảnh và hợp nhất gói tin

Các mảnh tách rời này cần được ráp lại trước khi chuyển lên tầng vận tải tại máy tính nhận. Rõ ràng là cả TCP và UDP đều mong muốn nhận được một đoạn tin đầy đủ, không bị phân mảnh từ tầng mạng. Việc hợp nhất các gói dữ liệu tại các thiết bị định tuyến sẽ làm giao thức phức tạp lên nhiều và làm giảm hiệu suất của thiết bị định tuyến. Giữ vững nguyên tắc thiết kế tầng mạng đơn giản nhất có thể, IPv4 quyết định việc hợp nhất các mảnh dữ liệu được thực hiện tại các thiết bị đầu cuối chứ không phải là tại các thiết bị định tuyến.

Khi máy tính đích nhận được một loạt các gói dữ liệu tớ cùng một nguồn, nó cần phải xác định liệu đấy là những gói dữ liệu độc lập hay là các mảnh của một gói dữ liệu lớn ban đầu. Trong trường hợp thứ hai, nó phải tiếp tục xác định

`

liệu đã nhận được đầy đủ các mảnh chưa và làm sao để ráp các mảnh này tại theo trật tự ban đầu để tạo ra gói dữ liệu nguyên thủy. Máy tính đích sẽ sử dụng các trường identifcation, flag và fragmentation để thực hiện công việc hợp nhất này. Khi tạo ra một gói dữ liệu IP, ngoài địa chỉ gửi và địa chỉ nhận, máy tính gửi sẽ đặt vào trường identifcation một số định danh. Giá trị của sổ định danh sẽ tăng dần. Khi một thiết bị định tuyến cần chia chia nhỏ một gói dữ liệu, thì tất cả các gói dữ liệu con được tạo ra đều có địa chỉ nguồn, địa chỉ đích và giá trị trường định danh giống hệt gói dữ liệu ban đầu. Khi đích nhận được một loạt các gói dữ liệu từ cùng một nơi gửi đến, nó có thể kiểm tra giá trị định danh để xác định liệu những gói dữ liệu đó có là các mảnh của một gói dữ liệu lớn hơn hay không. Vì dịch vụ IP không tin cậy nên một số mảnh có thể không đến được đích. Để máy tính nhận có thể chắc chắn là đã nhận được mảnh cuối cùng của gói dữ liệu ban đầu, thì trường cờ của mảnh cuối cùng phải có giá trị 0, trong khi trường cờ của các mảnh khác có giá trị là 1. Tương tự để máy nhận xác định được liệu có mất mảnh nào không (và để ghép các mảnh theo đúng thứ tự), trường Offset được sử dụng để xác định vị trí của mảnh trong gói dữ liệu IP ban đầu. Xét ví dụ trên hình 7.19, một gói dữ liệu có độ lớn 4000 bytes đến thiết bị định tuyến và phải gửi qua gói dữ liệu ban đầu phải được tách ra thành ba mảnh phân biệt (mỗi mảnh trở thành một gói dữ liệu IP độc lập). Giả sử gói dữ liệu ban đầu có trường định danh nhận giá trị 777. Giá trị các trường trong ba mảnh này được chỉ ra trong bảng sau:

Fragment Bytes ID Offset Flag

1 1480 byte trong trường dữ liệu

identification=777 offset=0 (dữ liệu Bắt đầu từ byte thứ 0)

flag=1 (còn mảnh nữa) 2 1480 byte trong trường dữ

liệu

identification=777 offset=1480 (dữ liệu bắt đầu từ byte thứ 1480)

flag=1 (còn mảnh nữa) 3 1020 byte(3980-1480-1480)

trong trường dữ liệu

identification=777 offset=2960 (dữ liệu bắt đầu từ byte thứ 2960)

flag=0 (đây là mảnh cuối cùng)

Dữ liệu của gói IP chỉ được chuyển đến tầng vận tải tại máy tính nhận khi tầng IP tái tạo hoàn chỉnh gói dữ liệu IP ban đầu. Nếu một số mảnh diệu bị mất không đến được đích, thì toàn bộ gói dữ liệu sẽ bị loại bỏ và không được chuyển lên tầng vận tải. Nếu sử dụng giao thức TCP ở tầng vận tải, thì thực thể TCP sẽ khắc phục mất mát do bên phát sẽ gửi lại đoạn tin. Phân đoạn và hợp nhất đặt thêm các nhiệm vụ cho các thiết bị định tuyến, vì vậy người ta cố gắng giảm thiểu việc phân mảnh dữ liệu. Điều này thường được thực hiện bằng cách giới hạn độ lớn gói dữ liệu của tầng vận tải (TCP hay UDP segment) bởi một giá trị tương đối nhỏ. Khi đó việc phân mảnh trở nên không cần thiết. Phần lớn các giao thức liên kết dữ liệu hỗ trợ IP có MTU tối thiểu là 536 byte, có thể loại bỏ hoàn toàn việc phân mảnh nếu đặt giá trị MSS là 536 byte với 20 byte tiêu đề của gói TCP và 20 byte tiêu đề của gói IP. Đây chính là lý do hầu hết các gói TCP khi truyền khối lượng lớn dữ liệu (chẳng hạn FTP) có độ dài từ 512 đến

536 byte. Nếu đoạn tin TCP được bọc trong gói IP và cả hai gói TCP và IP đều không có trường tùy chọn thì gói dữ liệu IP sẽ có 40 byte thông tin điều khiển, phần còn lại là dữ liệu của tầng ứng dụng.

Một phần của tài liệu Bài giảng mạng máy tính ths nguyễn xuân anh (Trang 144 - 147)