2008-12-09 23 views

Trả lời

14

Phân mảnh không phải lúc nào cũng vô hình đối với tất cả các lớp trên. Một số ngăn xếp TCP/IP đầu tiên (và thậm chí là hiện tại) đã không thực hiện đầy đủ các khả năng như xử lý phân mảnh. Sử dụng lá cờ trong tình huống đó sẽ đảm bảo rằng gói tin đã đến dạng ban đầu của nó thay vì nhiều mảnh mà đầu kia không thể xử lý được. Ngoài ra, khi sử dụng UDP, nó không cần thiết cho tất cả các mảnh để đến đích, ngăn chặn sự phân mảnh có nghĩa là tin nhắn đến hoặc không đến - không có khả năng chỉ một chút của gói dữ liệu UDP sẽ đến đích. Tôi không thể nhớ bao lâu TCP/IP ngăn xếp trên các gói IP chưa được lắp ráp đang đợi các mảnh bị thiếu, nhưng việc sử dụng cờ DF có nghĩa là không có tài nguyên không cần thiết bị trói buộc trong thời gian đó. Cuối cùng, bạn có thể sử dụng nó để kiểm tra hành vi của cơ sở hạ tầng mạng, chẳng hạn như những gì xảy ra khi bạn nhận được gói lớn hơn đơn vị truyền dẫn tối đa (DF sẽ ngăn chặn gói đó bị phân mảnh để 'siết chặt' lỗ) .

12

Ngoài @Pax's answer (hoặc có thể là một phần của thử nghiệm mà anh đã đề cập), cờ DP cũng được sử dụng trong . Đây là khi bạn cố gắng tìm ra gói dữ liệu lớn nhất có thể được gửi mà không bị phân mảnh là gì, đối với một liên kết đã cho. Nó thường hữu ích để tránh sự phân mảnh, mặc dù các giao thức cấp cao hơn trong lý thuyết phân lập từ cơ học của nó, chúng vẫn có thể "cảm thấy" hậu quả. Nếu một ứng dụng duy nhất cấp write() vào ổ cắm mạng kết thúc bị phân mảnh vì nó quá lớn và một trong các đoạn bị mất trong mạng, toàn bộ gói IP sẽ bị mất. Điều này tất nhiên ảnh hưởng đến thông lượng.

Vì lý do này, thường muốn biết đơn vị truyền tối đa , tức là gói lớn nhất có thể được gửi đến đích mà không bị phân mảnh. Phát hiện đường dẫn MTU được sử dụng để tìm kích thước này, đơn giản bằng cách thiết lập bit DF và gửi các gói lớn hơn liên tiếp cho đến khi báo cáo mạng (trên ICMP) thất bại.

+2

Điều đó rất tiện dụng để biết. +1. – paxdiablo

5

Do lưu ý rằng không có cách nào tiêu chuẩn để thiết lập DF trong C. Trên Linux, mã này hoạt động:

result = setsockopt(mysocket, IPPROTO_IP, 
       IP_MTU_DISCOVER, IP_PMTUDISC_DO, sizeof(int)); 

nhưng nó không trên FreeBSD 6

Ngoài ra, Path MTU phát hiện là cực kỳ không đáng tin cậy trên Internet thực. Quá nhiều tường lửa và hộp trung gian bị phá vỡ lọc các tin nhắn ICMP "Gói quá lớn" (đây là cách tốt để kiểm tra quản trị viên mạng trong một cuộc phỏng vấn: yêu cầu anh ta/cô ấy ngừng ping và anh/cô ấy có thể chặn ICMP hoàn toàn.) Xem RFC 2923: "TCP Vấn đề với Path MTU Discovery"

Đó là lý do tại sao IETF nay đề nghị một phương pháp mới để kiểm tra MTU, mà không dựa vào Path MTU Discovery: RFC 4821: "gói thoại lớp Path MTU Discovery"

Các vấn đề liên quan