2010-09-14 57 views
12

Tôi đang cố gắng hiểu một số hành vi mà tôi thấy trong ngữ cảnh gửi gói UDP.Phân mảnh IP UDP và MTU

Tôi có hai chương trình Java nhỏ: một chương trình truyền các gói UDP và gói còn lại nhận các gói đó. Tôi đang chạy chúng cục bộ trên mạng của tôi giữa hai máy tính được kết nối thông qua một công tắc duy nhất.

Cài đặt MTU (được báo cáo bởi/sbin/ifconfig) là 1500 trên cả hai bộ điều hợp mạng.

  • Nếu tôi gửi gói có kích thước < 1500, tôi nhận được gói. Kỳ vọng.
  • Nếu tôi gửi gói với 1500 < kích thước < 24258 Tôi nhận được chúng. Kỳ vọng. Tôi đã xác nhận qua wireshark rằng lớp IP đang phân mảnh chúng.
  • Nếu tôi gửi các gói có kích thước> 24258, chúng sẽ bị mất. Không mong đợi. Khi tôi chạy wireshark ở phía bên nhận, tôi không thấy bất kỳ gói nào trong số các gói này.

Tôi có thể thấy hành vi tương tự với ping -s.

ping -s 24258 hostA công trình nhưng

ping -s 24259 hostA thất bại.

Có ai hiểu điều gì có thể xảy ra hoặc có ý tưởng về những gì tôi nên tìm kiếm không?

Cả hai máy tính đều đang chạy CentOS 5 64 bit. Tôi đang sử dụng một JDK 1,6, nhưng tôi không thực sự nghĩ rằng đó là một vấn đề lập trình, đó là một mạng hoặc có thể vấn đề hệ điều hành.

+0

Bạn có thể có may mắn hơn khi yêu cầu điều này trên serverfault.com. –

+3

Công cụ wireshark hiển thị ở phía gửi kết nối cho các gói với 'size> 24258'? –

+1

@Kaleb Tôi không phải là chuyên gia về Wireshark, nhưng việc chụp ở phía gửi cũng giống nhau dù kích thước gói là> hoặc <24258. Tôi thấy các gói IP bị phân mảnh, nhưng tôi chỉ thấy các gói UDP cho các gói nhỏ (tôi có kết hợp các gói rất nhỏ và rất lớn). Dữ liệu tôi gửi là nhị phân, vì vậy thật khó để tìm ra gói IP nào thuộc về gói UDP nào. Tôi có thể thử làm một bài kiểm tra đơn giản hơn với nhiều dữ liệu có thể đoán trước hơn và xem những gì wireshark hiển thị. Tôi có thể không nhận được điều đó cho đến ngày mai mặc dù. @ire_and_curses, cảm ơn tôi không chắc chắn chính xác máy chủ nào đã được bao hàm. Tôi có thể thử ở đó. – wolfcastle

Trả lời

10

Việc triển khai giao thức IP không bắt buộc phải có khả năng xử lý các gói lớn tùy ý. Về lý thuyết, kích thước gói tin IP tối đa có thể là 65,535 octet, nhưng tiêu chuẩn chỉ yêu cầu các triển khai đó hỗ trợ ít nhất 576 octet.

Dường như việc triển khai của máy chủ của bạn hỗ trợ kích thước tối đa lớn hơn 576, nhưng vẫn nhỏ hơn đáng kể so với kích thước lý thuyết tối đa 65.535. (Tôi không nghĩ rằng chuyển đổi nên là một vấn đề, bởi vì nó không cần phải làm bất kỳ phân mảnh - nó thậm chí không hoạt động ở lớp IP).

Tiêu chuẩn IP đề xuất thêm rằng máy chủ không gửi gói lớn hơn 576 byte, trừ khi họ chắc chắn rằng máy chủ nhận có thể xử lý kích thước gói lớn hơn. Bạn nên cân nhắc xem chương trình của bạn có gửi gói kích thước nhỏ hơn hay không. 24.529 dường như quá lớn đối với tôi. Tôi nghĩ có thể có rất nhiều máy chủ sẽ không xử lý các gói lớn.

Lưu ý rằng các giới hạn kích thước gói này hoàn toàn tách biệt với MTU (kích thước khung tối đa được hỗ trợ bởi giao thức lớp liên kết dữ liệu).

+1

Tôi không biết rằng việc triển khai có thể có kích thước gói tối đa nhỏ hơn. Bạn có biết cách xác định giá trị này là gì không? Tôi đồng ý 24k là một kích thước rất lớn và có lẽ tôi sẽ không gửi nhiều gói đó trong hệ thống được triển khai, tôi chỉ chạy qua trong khi thử nghiệm. Tôi có toàn quyền kiểm soát mạng trong hệ thống được triển khai (tất cả các máy tính/thiết bị chuyển mạch/bộ định tuyến). Chúng tôi đang sử dụng Gigabit ethernet, vì vậy nếu chúng tôi cũng sử dụng khung jumbo tôi thu thập tôi * nên * có thể sử dụng kích thước gói 9000 (tiêu đề UDP + tải trọng) mà không cần phân đoạn lớp IP. – wolfcastle

5

tôi tìm thấy sau đó có thể quan tâm:

Câu trả lời của Dan hữu ích nhưng lưu ý rằng sau khi tiêu đề bạn thực sự bị giới hạn ở 65507 byte.

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