MTU là 65535 trong UDP như thế nào nhưng ethernet không cho phép kích thước khung lớn hơn 1500 byte


11

Tôi đang sử dụng ethernet nhanh 100 Mbps, có kích thước khung nhỏ hơn 1500 byte (1472 byte cho tải trọng theo sách giáo khoa của tôi). Trong đó, tôi có thể gửi và nhận gói UDP có kích thước thư 65507 byte, có nghĩa là kích thước gói là 65507 + 20 (Tiêu đề IP) + 8 (Tiêu đề UDP) = 65535.

Nếu chính kích thước tải trọng của khung là tối đa 1472 byte (theo sách giáo khoa của tôi), làm thế nào kích thước gói IP có thể lớn hơn kích thước ở đây là 65535?

Tôi đã sử dụng mã người gửi như

char buffer[100000];
for (int i = 1; i < 100000; i++)
{
    int len = send (socket_id, buffer, i);
    printf("%d\n", len);
}

Mã nhận như

while (len = recv (socket_id, buffer, 100000))
{
     printf("%d\n". len);
}

Tôi quan sát thấy send returns -1trên i > 65507recvin hoặc nhận một gói maximum of length 65507.

Câu trả lời:


11

Các datagram UDP ít liên quan đến kích thước MTU, bạn có thể làm cho chúng lớn như bạn muốn lên đến 64K được đề cập tối đa ở trên. Bạn thậm chí có thể gửi một trong số chúng trong toàn bộ gói miễn là bạn đang sử dụng các khung jumbo với kích thước lớn hơn datagram lớn.

Tuy nhiên, khung jumbo phải được hỗ trợ bởi tất cả các thiết bị mà khung sẽ vượt qua và đây là một vấn đề. Đối với các mục đích thực tế, các khung Ethernet là kích thước tranport phổ biến nhất, MTU cho các khoảng này là khoảng 1500 byte, tôi sẽ nói 1500 đi về phía trước, nhưng không phải lúc nào cũng vậy. Khi bạn tạo một datagram UDP lớn hơn MTU cơ bản (mà như được chỉ định thường là ethernet) thì nó sẽ lặng lẽ được chia thành một số khung 1500 byte. Nếu bạn truy cập lưu lượng này, bạn sẽ thấy một số gói bị hỏng ở ranh giới MTU sẽ có cờ phân đoạn nhiều hơn được đặt cùng với một số phân đoạn. Gói đầu tiên sẽ có số phân đoạn là 0 và các phân đoạn được đặt nhiều hơn và gói cuối cùng sẽ có số phân đoạn khác không và nhiều phân đoạn không được đặt.

Vậy tại sao phải quan tâm? Các chi tiết thực hiện vấn đề thực sự. Phân mảnh có thể làm tổn thương hiệu suất trong mạng không phải là vấn đề lớn nữa nhưng người ta phải nhận thức được. Nếu một kích thước datagram khổng lồ được sử dụng thì bất kỳ đoạn nào sẽ bị mất, toàn bộ datagram sẽ cần phải được gửi lại. Tương tự ở mức âm lượng cao và ngày nay đây là những khối lượng hoàn toàn có thể đạt được sau đó có thể liên kết sai các khung khi lắp lại. Cũng có thể có vấn đề khi nhận các gói UDP bị phân mảnh để vượt qua các cấu hình tường lửa doanh nghiệp nơi các bộ cân bằng tải trải rộng các gói ra, nếu một đoạn nằm trên một tường lửa và một cái khác trên một tường lửa khác thì lưu lượng sẽ bị giảm khi không đầy đủ.

Vì vậy, đừng tạo các datagram UDP lớn hơn phân mảnh kích thước MTU trừ khi bạn phải và nếu bạn phải xác định rằng cơ sở hạ tầng được truyền thông giữa là gần (cùng mạng con), tại đó các khung jumbo có thể là một lựa chọn tốt.


Thông tin tốt về 'cờ nhiều mảnh hơn'. Đó có phải là cờ trong tiêu đề UDP hoặc trong tiêu đề IP không?
John Jesus

Lưu ý: Một số HĐH sẽ KHÔNG truyền UDP nếu dữ liệu sẽ bị phân mảnh. Tài liệu IE Linux,By default, Linux UDP does path MTU (Maximum Transmission Unit) discovery. This means the kernel will keep track of the MTU to a specific target IP address and return EMSGSIZE when a UDP packet write exceeds it.
Rahly

2

Lớp IP sẽ phân mảnh gói tin của bạn ở đầu gửi, sau đó lắp lại nó ở đầu nhận, trước khi chuyển nó lên UDP. Từ lớp UDP, bạn thực sự không thể biết rằng gói đã bị phân mảnh. Nếu bạn sử dụng một công cụ chụp gói như Wireshark , bạn sẽ có thể thấy rằng máy tính của bạn đang nhận các gói IP giới hạn trong MTU.


1

Hóa ra, việc cho phép ngăn xếp TCP / IP thành các gói phân đoạn khi cần là chi phí thấp hơn rất nhiều so với việc gửi các gói riêng lẻ.


1
Bạn có nghĩa là TCP / IP đang phân mảnh và tự lắp ráp lại không? Nếu có, thì tại sao mọi người nói tất cả thời gian rằng mã của bạn nên quan tâm đến việc lắp lại ở đầu thu. Tôi đã không quan sát sự phân mảnh như bây giờ, nhưng đã thấy nhiều diễn đàn nói điều này và thậm chí mọi người chấp nhận nó.

Đối với những người trong chúng ta là mô hình OSI bị thách thức, bạn có thể thêm một chút chi tiết vào câu trả lời của bạn không?
Robert Harvey

Tôi đã hơi khó tính vì tôi không thể biết đây có phải là bài tập về nhà hay không. Đó là một sự đánh đổi: vì UDP không đảm bảo việc phân phối, nếu bất kỳ đoạn gói nào bị mất, toàn bộ gói sẽ bị mất. Nếu bạn muốn một phương tiện giao thông đáng tin cậy trên UDP, bạn cần tự mình xử lý tất cả những điều này; nhưng nếu bạn đang thực hiện (nói) các giao thức phát trực tuyến (hoặc NFS qua UDP, có đường dẫn giống như phát trực tuyến) thì chi phí thấp hơn chỉ đơn giản là bỏ các gói đó hoặc truyền lại gói lớn hơn sau một thời gian trễ nếu cần. Bạn cần cân bằng nhu cầu của mình với các tính năng giao thức và chi phí giao thức.
geekizard

1

UDP không biết gì về MTU. Các gói UDP có thể có bất kỳ kích thước nào từ 8 đến 65535 byte. Các lớp giao thức bên dưới UDP có thể gửi một gói có kích thước cụ thể hoặc sẽ từ chối gửi gói đó có lỗi nếu quá lớn.

Lớp bên dưới UDP thường là IP, là IPv4 hoặc IPv6. Và gói IP có thể có bất kỳ kích thước nào từ 20 (IPv4) / 40 (IPv6) đến 65535 byte, đó là mức tối đa tương đương với UDP. Tuy nhiên, IP hỗ trợ một cơ chế gọi là phân mảnh . Nếu một gói IP có kích thước lớn hơn những gì lớp bên dưới có thể vận chuyển, IP có thể chia một gói duy nhất thành nhiều gói được gọi là các đoạn. Mỗi mảnh trên thực tế là một gói IP của riêng nó (có tiêu đề IP riêng) và cũng được gửi riêng đến đích; Sau đó, nhiệm vụ của đích là thu thập tất cả các mảnh và xây dựng lại gói đầy đủ từ chúng trước khi truyền dữ liệu nhận được ở lớp cao hơn tiếp theo (ví dụ UDP).

Giao thức Ethernet chỉ có thể vận chuyển các khung có tải trọng từ 46 đến 1500 byte (có trường hợp ngoại lệ nhưng điều đó nằm ngoài phạm vi của câu trả lời này). Nếu dữ liệu tải trọng nhỏ hơn 46 byte, dữ liệu được đệm là 46 byte. Nếu dữ liệu tải trọng vượt quá 1500 byte, giao diện sẽ từ chối chấp nhận nó. Nếu điều đó xảy ra, giờ đây, lớp IP sẽ quyết định phân mảnh gói, do đó không có đoạn nào lớn hơn 1500 byte hoặc báo lỗi cho lớp cao hơn tiếp theo nếu phân mảnh bị vô hiệu hóa hoặc bị cấm đối với kết nối cụ thể này.

Sự phân mảnh nói chung là để tránh, như

  • là lãng phí tài nguyên ở phía người gửi.
  • nó lãng phí tài nguyên ở phía người nhận.
  • nó làm tăng chi phí giao thức cho cùng một lượng dữ liệu tải trọng.
  • nếu một mảnh bị mất, toàn bộ gói bị mất.
  • nếu một đoạn bị hỏng, toàn bộ gói bị hỏng.
  • trong trường hợp gửi lại, tất cả các mảnh vỡ phải được gửi lại.

Đó là lý do tại sao TCP chấp nhận một cách thông minh kích thước khung của nó để các gói không bao giờ yêu cầu IP phân mảnh chúng. Điều này có thể được thực hiện bằng cách cấm IP đối với các gói phân mảnh và nếu IP báo cáo rằng một gói quá lớn sẽ được gửi, TCP sẽ giảm kích thước khung và thử lại, cho đến khi không còn báo cáo lỗi nữa.

Tuy nhiên, đối với UDP, đây sẽ là nhiệm vụ của chính ứng dụng, vì UDP là giao thức "ngu ngốc", nó không có logic quản lý riêng, điều này làm cho nó rất linh hoạt, nhanh chóng và đơn giản.

Kích thước UDP duy nhất bạn có thể dựa vào để luôn có thể vận chuyển là 576 trừ 8 byte tiêu đề UDP và trừ tiêu đề IP 20 (v4) / 40 (v6), vì tiêu chuẩn IP yêu cầu mọi máy chủ IP có thể nhận các gói IP với tổng kích thước 576 byte. Việc thực hiện giao thức của bạn sẽ không tuân thủ tiêu chuẩn nếu nó không thể chấp nhận các gói có kích thước tối thiểu đó. Tuy nhiên, lưu ý rằng tiêu chuẩn không nói 576 mà không bị phân mảnh, do đó, ngay cả gói IP 576 byte cũng có thể bị phân mảnh giữa hai máy chủ.

Kích thước gói duy nhất bạn có thể dựa vào để có thể vận chuyển mà không bị phân mảnh là 24 byte cho IPv4 và 56 byte IPv6, vì các tiêu đề IP nhỏ nhất cho một đoạn là 20/48 byte (v4 / v6) và một đoạn phải có ít nhất 4/8 dữ liệu tải trọng byte (v4 / v6). Do đó, một hệ thống vận chuyển bên dưới lớp IP không thể vận chuyển ít nhất các gói có kích thước luận án, không thể được sử dụng để vận chuyển lưu lượng IP.

Và trước khi mọi người nhận xét rằng một tiêu đề IPv6 chỉ có 40 byte: Điều đó là chính xác, nhưng không giống như tiêu đề IPv4, tiêu đề IPv6 tiêu chuẩn không có trường tiêu đề để phân mảnh. Nếu một gói phải được phân đoạn, thì phải thêm tiêu đề mở rộng phân mảnh bên dưới tiêu đề cơ sở IPv6 và tiêu đề mở rộng này dài 8 byte. Ngoài ra, không giống như IPv4, các phần bù phân mảnh trong IPv6 được tính bằng 8 byte chứ không phải 4 đơn vị byte, do đó, một đoạn chỉ có thể mang tải trọng là bội số của 8 byte trong trường hợp IPv6.


0

Để trả lời câu hỏi của bạn, "Nếu chính kích thước tải trọng của khung tối đa là 1472 byte (theo sách giáo khoa của tôi), làm thế nào kích thước gói IP có thể lớn hơn ở đây là 65535?"

Đó là do một tính năng giảm tải được gọi là UFO. (Giảm phân mảnh UDP). Vui lòng tham khảo liên kết này .

Bạn có thể xác minh và chuyển đổi các tính năng giảm tải thông qua ethtool -k ethX và ethtool -K ethX tương ứng.


0

Nếu bạn đang theo dõi các khung gửi đi, có thể bộ điều hợp mạng của bạn hỗ trợ giảm tải phân đoạn và nó được bật. Khi bật giảm tải phân đoạn, card mạng tự xử lý phân đoạn gói / khung thành kích thước phù hợp, thay vì ngăn xếp mạng. Điều này giải phóng CPU trong máy tính để thực hiện các tác vụ khác, cải thiện hiệu suất. Trên linux, "ethtool -k [device]" sẽ hiển thị các cờ giảm tải.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.