Kích thước gói UDP an toàn lớn nhất trên Internet là bao nhiêu


201

Tôi đã đọc một số bài viết về kích thước gói UDP nhưng không thể đưa ra kết luận về những gì chính xác.

Một số dịch vụ giới hạn gói UDP lớn nhất tới 512 byte (như dns)

Cho MTU tối thiểu trên internet là 576 và kích thước của tiêu đề IPv4 là 20 byte và tiêu đề UDP 8 byte. Điều này để lại 548 byte có sẵn cho dữ liệu người dùng

Tôi có thể sử dụng các gói có kích thước lên tới 548 mà không bị phân mảnh gói không? Hoặc có điều gì đó mà những người tạo DNS đã biết và đó là lý do tại sao họ giới hạn nó ở mức 512 byte.

Tôi thậm chí có thể đi cao hơn 548 byte một cách an toàn không?



10
Đó là một câu hỏi khác nhau của slighlty. Tôi đang hỏi gói lớn nhất tôi có thể gửi qua internet là gì (mà không có bất kỳ kiến ​​thức nào về các mạng khác hoặc thăm dò) sẽ không bị phân mảnh. Về cơ bản kích thước an toàn tối đa, sẽ hoạt động trên mọi thứ mà không phải lo lắng về việc thăm dò kết nối.
KM

2
Bạn không thể loại bỏ khả năng phân mảnh, nhưng điều này không làm cho mọi thứ trở nên kém an toàn. Nếu một đoạn bị bỏ đi, nó giống như khi toàn bộ gói bị bỏ, điều này xảy ra với UDP. Không an toàn sẽ là nếu một gói vượt quá kích thước tối thiểu mà các bộ định tuyến được yêu cầu hỗ trợ, và do đó không được đảm bảo có thể phân phối được (so với đảm bảo được phân phối). Đây là nơi mà con số 512 byte xuất hiện.
Beejor

Câu trả lời:


129

Đúng là một tiêu đề IPv4 thông thường là 20 byte và tiêu đề UDP là 8 byte. Tuy nhiên, có thể bao gồm các tùy chọn IP có thể tăng kích thước của tiêu đề IP lên tới 60 byte. Ngoài ra, đôi khi các nút trung gian cần phải đóng gói các datagram bên trong một giao thức khác như IPsec (được sử dụng cho VPN và tương tự) để định tuyến gói đến đích. Vì vậy, nếu bạn không biết MTU trên đường dẫn mạng cụ thể của mình, tốt nhất là để lại một mức hợp lý cho các thông tin tiêu đề khác mà bạn có thể không lường trước được. Tải trọng UDP 512 byte thường được coi là để làm điều đó, mặc dù điều đó thậm chí không đủ không gian cho tiêu đề IP kích thước tối đa.


36
Nói rõ hơn: có kích thước nhỏ để tránh phân mảnh không khiến việc phân phối gói "An toàn", vẫn có vô số khả năng khiến việc giao hàng không đáng tin cậy như chó ăn cáp mạng của tôi. Mà nói; có ít mảnh vỡ làm cho việc phân phối trở nên "an toàn" hơn bởi vì nếu có nhiều hơn một và bất kỳ một trong số chúng không bao giờ được thực hiện - toàn bộ gói (datagram) sẽ bị UDP bỏ.
markmnl

3
Đối với mục đích của một câu hỏi, người ta sẽ cho rằng sử dụng định nghĩa áp phích 'an toàn', không phải là một số định nghĩa trong một số cuốn sách tiêu chuẩn mà họ chưa từng thấy.
Astara

Các bộ định tuyến trong thế giới thực đã được biết là bỏ các gói UDP thay vì phân đoạn chúng?
dùng253751

60

Giới hạn lý thuyết (trên Windows) cho kích thước tối đa của gói UDP là 65507 byte. Điều này được ghi lại ở đây :

Kích thước thông báo UDP tối đa chính xác là 65507, được xác định theo công thức sau: 0xffff - (sizeof (IP Header) + sizeof (UDP Header)) = 65535- (20 + 8) = 65507

Điều đó đang được nói, hầu hết các giao thức giới hạn ở kích thước nhỏ hơn nhiều - thường là 512 hoặc đôi khi là 8192. Bạn thường có thể tăng cao hơn 548 một cách an toàn nếu bạn ở trên một mạng đáng tin cậy - nhưng nếu bạn đang phát sóng trên internet lớn hơn, thì càng lớn bạn đi, càng có nhiều khả năng bạn sẽ gặp phải các sự cố và mất gói truyền.


39
Một liên kết Microsoft không phải là một tài liệu tham khảo quy phạm. Các RFC là tài liệu tham khảo quy phạm; và những gì bạn đã trích dẫn chỉ áp dụng cho IPv4.
Hầu tước Lorne

2
Chỉ vì MS cho phép điều đó không có nghĩa là nó luôn luôn là một ý tưởng tốt, vì các bộ định tuyến trung gian, v.v. có thể bị buộc phải phân mảnh kích thước gói lớn hơn (như bạn đã đề cập).
rogerdpack

1
@EJP Họ không giải thích rõ ràng về liên kết của Microsoft, nhưng dường như đó là hậu quả cần thiết của IPv4: Trường tổng chiều dài của IPv4 là 16 bit và giá trị đó phải bao gồm độ dài của tiêu đề IP và độ dài của Tiêu đề UDP.
jtpereyda

@jtpereyda Tôi hoàn toàn nhận thức được tất cả những điều đó. Quan điểm của tôi là chính xác những gì tôi đã nêu: bạn nên trích dẫn các tài liệu tham khảo quy phạm nơi chúng tồn tại.
Hầu tước Lorne

Tôi không nghĩ kích thước gói UDP tối đa sẽ là 65.507 byte, do thẻ wifi của tôi (IEEE 802.3) chỉ có thể thực hiện 1500 MTU và các khung jumbo chỉ có 9k byte.
Christian Stewart

52

Tải trọng UDP an toàn tối đa là 508 byte. Đây là kích thước gói 576, trừ tiêu đề IP 60 byte tối đa và tiêu đề UDP 8 byte. Bất kỳ tải trọng UDP nào có kích thước này hoặc nhỏ hơn đều được đảm bảo có thể phân phối qua IP (mặc dù không được đảm bảo sẽ được phân phối). Bất cứ điều gì lớn hơn được phép hoàn toàn bị bỏ bởi bất kỳ bộ định tuyến vì bất kỳ lý do. Ngoại trừ trên tuyến chỉ có IPv6, trong đó tải trọng tối đa là 1.212 byte. Như những người khác đã đề cập, các tiêu đề giao thức bổ sung có thể được thêm vào trong một số trường hợp. Thay vào đó, giá trị bảo thủ hơn khoảng 300-400 byte có thể được ưu tiên.

Bất kỳ gói UDP nào cũng có thể bị phân mảnh. Nhưng điều này không quá quan trọng, vì mất một đoạn có tác dụng tương tự như mất một gói không phân mảnh: toàn bộ gói bị bỏ. Với UDP, điều này sẽ xảy ra một trong hai cách.

Điều thú vị là, kích thước gói lý thuyết tối đa là khoảng 30 MB (1.500 ethernet MTU - 60 IP tiêu đề x 65.536 số lượng phân đoạn tối đa), mặc dù khả năng nó vượt qua sẽ là vô cùng lớn.

Nguồn: RFC 791, RFC 2460


2
Bất kỳ gói UDP nào, theo mặc định, được coi là "_U_nreliable". Kích thước gói UDP an toàn duy nhất mà bạn có thể mong đợi nhận được là 1, gói không phân mảnh. Nếu bạn muốn các gói "an toàn", hãy sử dụng giao thức gói trên TCP.
Astara

26
@Astara Đúng, bản chất UDP là không đáng tin cậy. Nhưng câu hỏi là liệu một gói có kích thước nhất định có được đảm bảo có thể giao được hay không, không được đảm bảo để được giao. Các gói trên một kích thước nhất định có thể bị (và) bỏ bởi bất kỳ bộ định tuyến nào vì bất kỳ lý do nào, trong khi các gói nhỏ hơn phải được xử lý tốt nhất bởi tất cả các bộ định tuyến, theo tiêu chuẩn ngành. Vì vậy, "an toàn" trong trường hợp này có nghĩa là "xe của tôi sẽ nằm gọn dưới cầu" chứ không phải "xe của tôi có bị kẹt xe không".
Beejor

1
Tôi khuyên bạn nên ngừng lặp lại những gì một số người ngẫu nhiên nói và kiểm tra sự thật, bởi vì UDP thực sự khá đáng tin cậy. BTW Tôi có các gói an toàn trên UDP mà không cần chi phí TCP không cần thiết. openmymind.net/How-Unreliable-Is-UDP
Pablo Ariel

5
UDP không "không đáng tin cậy" vì số lượng gói bị bỏ, nhưng vì các gói có thể bị (và) bị loại bỏ. Bạn không thể "dựa" vào bất kỳ gói đến, đặt hàng hoặc xác nhận cụ thể nào. Dữ liệu rất mong manh và giống như nói lái xe ô tô hoạt động 99% thời gian và 89% đi đúng hướng là đáng tin cậy. Không phải UDP không tuyệt vời cho nhiều thứ, chỉ là nó yêu cầu bạn phải viết phiên bản "TCP" của riêng bạn trên nó. Đây là một trường hợp thực tế hấp dẫn trong thế giới nhà phát triển trò chơi (mặc dù hơi lỗi thời): gamasutra.com/view/feature/131781
Beejor

@Beejor Bạn đã đi đúng hướng, nhưng "về cơ bản, bạn yêu cầu bạn phải viết phiên bản" TCP "của riêng bạn trên đó" là sai hoàn toàn. UDP là tuyệt vời để phát sóng và tuyệt vời để gửi nhanh dữ liệu 'không quan trọng'. (Liên quan đến trò chơi), bạn có thể khám phá (LAN) máy chủ / dịch vụ bằng UDP và sử dụng UDP để gửi vị trí người chơi nhanh chóng. Nếu một gói đang bị loại bỏ; bạn không quan tâm vì gói tiếp theo sẽ có vị trí cập nhật hơn của (các) người chơi khác. TCP có thể có các gói "không theo thứ tự", có phí và không thực hiện nhiều kết nối một-nhiều. Trong một số trường hợp, UDP có thể được áp dụng nhiều hơn.
Paul

46

576 là kích thước bộ đệm lắp lại tối đa tối thiểu , tức là mỗi lần thực hiện phải có khả năng tập hợp lại các gói có kích thước tối thiểu đó. Xem IETF RFC 1122 để biết chi tiết.


2
Nếu và chỉ khi bạn có một mạng không mang IPv6. Nếu nó mang IPv6, hãy sử dụng kích thước gói tối đa của các tiêu đề IPv6 sau đó trừ các tiêu đề đóng gói để thực hiện IPv4 qua IPv6. ;-)
Astara

@Astara Trong IPv6, việc phân mảnh được thực hiện bởi người gửi, do đó không có vấn đề gì với các bộ định tuyến trung gian không tuân thủ. Và nếu người nhận không phải là kích thước nhúng bị hạn chế bộ nhớ thì có lẽ nó có thể lắp ráp lại các gói tối thiểu lên đến 64kB.
dùng253751

@ user253751 Không chỉ các bộ định tuyến không tuân thủ có thể phân mảnh. Có Path MTU Discovery, nhưng thậm chí điều đó không đủ để loại bỏ hoàn toàn sự phân mảnh.
dstromberg

@dstromberg Trong các tình huống nào các bộ định tuyến IPv6 được phép phân đoạn các datagram?
dùng253751

@ user253751 Tôi chưa có nhiều IPv6, nhưng đây là một ví dụ: hãy tưởng tượng một mạng IPv6 gửi jumbogram (> 65536 byte) đến một mạng IPv6 khác cũng hỗ trợ jumbogram. Hơn nữa giả sử rằng Path MTU Discovery nói rằng những jumbogram đó nên được hỗ trợ mà không bị phân mảnh. Nhưng sau đó, một bộ định tuyến được cung cấp năng lượng và một phần của đường dẫn mạng được thay thế bằng thiết bị không được cấu hình cho hình chữ nhật.
dstromberg

14

Bài viết này mô tả đơn vị truyền tối đa (MTU) http://en.wikipedia.org/wiki/Maximum_transmission_unit . Nó tuyên bố rằng các máy chủ IP phải có khả năng xử lý 576 byte cho một gói IP. Tuy nhiên, nó lưu ý mức tối thiểu là 68. RFC 791: "Mỗi mô-đun internet phải có thể chuyển tiếp một datagram 68 octet mà không bị phân mảnh thêm. Điều này là do tiêu đề internet có thể lên tới 60 octet và đoạn tối thiểu là 8 octet . "

Do đó, kích thước gói an toàn 508 = 576 - 60 (tiêu đề IP) - 8 (tiêu đề udp) là hợp lý.

Như user607811 đã đề cập, phân mảnh bởi các lớp mạng khác phải được ghép lại. https://tools.ietf.org/html/rfc1122#page-56 3.3.2 Tái cấu trúc Lớp IP PHẢI thực hiện việc lắp lại các datagram IP. Chúng tôi chỉ định kích thước datagram lớn nhất có thể được lắp lại bởi EMTU_R ("MTU hiệu quả để nhận"); điều này đôi khi được gọi là "kích thước bộ đệm lắp lại". EMTU_R PHẢI lớn hơn hoặc bằng 576


11

Kích thước bộ đệm tái cấu trúc tối thiểu của IPv4 là 576, IPv6 có ở mức 1500. Trừ các kích thước tiêu đề từ đây. Xem Lập trình mạng UNIX của W. Richard Stevens :)


1
Tối thiểu, tất nhiên. Cảm ơn vì đã phát hiện ra nó. Không biết làm thế nào không ai nhận thấy sai lầm trong những năm qua.
Nikolai Fetissov

1
Mặc dù IPv6 có thể có bộ đệm lắp lại tối thiểu 1500, các gói IPv6 không được phép phân mảnh và MTU IPv6 tối thiểu là 1280. Một thiết bị đầu cuối không bao giờ cần phải lắp lại gói IPv6 bị phân mảnh.
Ron Maupin

1
Các gói IPv6 @RonMaupin có thể bị phân mảnh bởi các điểm cuối. Chỉ không phải bởi các bộ định tuyến ở giữa.
Navin

3
@Navin, không, các gói IPv6 sẽ không bị phân mảnh, dữ liệu phải được phân mảnh trước khi được đóng gói thành các gói IPv6, nhưng bản thân các gói không bị phân mảnh. Có một sự khác biệt. Không giống như các tiêu đề gói IPv4 có các trường để xử lý phân mảnh, các tiêu đề gói IPv6 không có gì để xử lý phân mảnh. Tiêu đề gói IPv6 đơn giản hơn nhiều so với tiêu đề gói IPv4.
Ron Maupin

6

512 là đặt cược tốt nhất của bạn. Nó được sử dụng ở nơi khác và là một số chẵn đẹp (một nửa của 1024).


6

Cho rằng IPV6 có kích thước 1500, tôi sẽ khẳng định rằng các nhà mạng sẽ không cung cấp các đường dẫn riêng cho IPV4 và IPV6 (cả hai đều là IP với các loại khác nhau), buộc họ phải trang bị cho ipv4 sẽ cũ, dư thừa, tốn kém hơn để duy trì và ít đáng tin cậy Nó sẽ không có ý nghĩa gì. Ngoài ra, làm như vậy có thể dễ dàng được coi là cung cấp chế độ ưu đãi cho một số lưu lượng truy cập - không có quy tắc nào có thể họ không quan tâm nhiều (trừ khi họ bị bắt).

Vì vậy, 1472 phải an toàn cho sử dụng bên ngoài (mặc dù điều đó không có nghĩa là một ứng dụng như DNS không biết về EDNS sẽ chấp nhận nó) và nếu bạn đang nói về mạng nội bộ, nhiều khả năng bạn có thể biết bố cục mạng của mình trong trường hợp nào kích thước gói jumbo áp dụng cho các gói không phân mảnh, vì vậy đối với 4096 - 4068 byte và đối với thẻ intel có bộ đệm 9014 byte, kích thước gói là ... chờ ... 8086 byte, có phải là ... trùng hợp tối đa? cười thầm

**** CẬP NHẬT ****

Các câu trả lời khác nhau cho các giá trị tối đa được cho phép bởi nhà cung cấp 1 SW hoặc các câu trả lời khác nhau giả sử đóng gói. Người dùng không yêu cầu giá trị thấp nhất có thể (như "0" cho kích thước UDP an toàn), nhưng kích thước gói an toàn lớn nhất.

Giá trị đóng gói cho các lớp khác nhau có thể được bao gồm nhiều lần. Vì một khi bạn đã đóng gói một luồng - không có gì cấm, giả sử, một lớp VPN bên dưới lớp đó và một bản sao hoàn chỉnh của các lớp đóng gói ở trên đó.

Vì câu hỏi là về các giá trị an toàn tối đa, tôi giả sử rằng họ đang nói về giá trị an toàn tối đa cho gói UDP có thể nhận được. Vì không có gói UDP nào được đảm bảo, nếu bạn nhận được gói UDP, kích thước an toàn lớn nhất sẽ là 1 gói qua IPv4 hoặc 1472 byte.

Lưu ý - nếu bạn đang sử dụng IPv6, kích thước tối đa sẽ là 1452 byte, vì kích thước tiêu đề của IPv6 là 40 byte so với kích thước 20 byte của IPv4 (và dù bằng cách nào, người ta vẫn phải cho phép 8 byte cho tiêu đề UDP).


1
Bạn đang tính 1472 như thế nào? ethernet có MTU là 1500, đó có phải là những gì bạn đang đề cập đến?
rogerdpack

4
@rogerdpack Tôi nghĩ rằng anh ta có nghĩa là vì IPv4 và IPv6 có khả năng chia sẻ nhiều cơ sở hạ tầng và IPv6 đang trở nên tương đối phổ biến, nên sẽ an toàn khi giả sử các giới hạn IPv6 (vì vậy là 1500). Làm thế nào hợp lệ lý do này là, tuy nhiên, tôi không thể nói.
Thomas

2
1500 phải được hỗ trợ bởi các thành phần tương thích IPv6 trong "chuỗi" mạng - nếu một người sử dụng IPv4, có thể đi qua chuỗi hỗ trợ IPv6 (mặc dù điều ngược lại là không đúng), thì kích thước tiêu đề của IPv4 là 20 byte và Kích thước tiêu đề của UDP là 8 byte, sẽ để lại 1500-20-8 = 1472 là kích thước an toàn tối đa (vì IPv6 không cho phép phân đoạn). Lưu ý - nếu mọi người thêm đủ các lớp đóng gói, người ta có thể hình dung không có không gian cho DATA. Vì bạn đã yêu cầu MAX, người ta sẽ cho rằng nhiều lớp chi phí đóng gói KHÔNG được sử dụng.
Astara

" 1500 phải được hỗ trợ bởi các thành phần tương thích IPv6 trong chuỗi mạng. " Không, MTU IPv6 tối thiểu là 1280. MTU ethernet là 1500.
Ron Maupin

@RonMaupin - Q ban đầu là kích thước gói UDP an toàn lớn nhất, không phải MTU. Xem RFC2460. Cũng như đề cập đến một MTU 1280 octet, nó nói: Các nút phải có khả năng chấp nhận một gói bị phân mảnh, khi được lắp lại lên tới 1500 octet. Xử lý các gói lớn hơn 1500 là tùy chọn.
Astara

6

Tôi đã đọc một số câu trả lời tốt ở đây; Tuy nhiên, có một số sai lầm nhỏ. Một số người đã trả lời rằng trường Độ dài tin nhắn trong tiêu đề UDP tối đa là 65535 (0xFFFF); Điều này đúng về mặt kỹ thuật. Một số người đã trả lời rằng mức tối đa thực tế là (65535 - IPHL - UDPHL = 65507). Sai lầm là trường Độ dài thư trong Tiêu đề UDP bao gồm tất cả tải trọng (Lớp 5-7), cộng với độ dài của Tiêu đề UDP (8 byte). Điều này có nghĩa là nếu trường độ dài tin nhắn là 200 Byte (0x00C8), thì tải trọng thực sự là 192 Byte (0x00C0).

Điều khó và nhanh là kích thước tối đa của một datagram IP là 65535 Byte. Con số này được tính đến tổng cộng của các tiêu đề L3 và L4, cộng với tải trọng Lớp 5-7. Tiêu đề IP + Tiêu đề UDP + Lớp 5-7 = 65535 (Tối đa).

Câu trả lời đúng nhất cho kích thước tối đa của một datagam UDP là 65515 Byte (0xFFEB), vì một datagram UDP bao gồm tiêu đề UDP. Câu trả lời đúng nhất cho kích thước tối đa của tải trọng UDP là 65507 Byte, vì Tải trọng UDP không bao gồm tiêu đề UDP.


1
Bạn đã không trả lời câu hỏi. Người hỏi muốn biết kích thước lớn nhất họ có thể sử dụng để tránh phân mảnh gói là gì.
Astara

0

Tôi sợ tôi phải chịu những phản ứng khó chịu nhưng tuy nhiên, để làm rõ cho tôi nếu tôi sai hoặc những người nhìn thấy câu hỏi này và quan tâm đến một câu trả lời:

sự hiểu biết của tôi về https://tools.ietf.org/html/rfc1122 có trạng thái là "một đặc điểm kỹ thuật chính thức" và như vậy là tài liệu tham khảo cho thuật ngữ được sử dụng trong câu hỏi này và không được thay thế bởi một RFC khác cũng như không có mâu thuẫn với tiếp theo:

về mặt lý thuyết, tức là. dựa trên thông số kỹ thuật bằng văn bản, UDP như được đưa ra bởi https://tools.ietf.org/html/rfc1122#section-4 không có "kích thước gói". Do đó, câu trả lời có thể là "không xác định"

Trong thực tế, đó là những gì câu hỏi này có thể tìm kiếm (và có thể được cập nhật cho công nghệ hiện tại đang hoạt động), điều này có thể khác và tôi không biết.

Tôi xin lỗi nếu tôi gây khó chịu. https://tools.ietf.org/html/rfc1122#page-8 "Bộ giao thức Internet" và "Giả định kiến ​​trúc" không làm rõ cho tôi "giả định" mà tôi đã dựa vào, dựa trên những gì tôi nghe được, rằng các lớp là riêng biệt . I E. lớp UDP không phải liên quan đến lớp IP nằm trong (và lớp IP có những thứ như Tái cấu trúc, EMTU_R, Phân mảnh và MMS_R ( https://tools.ietf.org/html/rfc1122#page- 56 )


1
Tiêu đề UDP có trường độ dài datagram là 16 bit, nghĩa là datagram UDP lý thuyết lớn nhất là 65,535, nhưng không bao giờ có thể đạt được vì UDP được gói gọn trong gói IP, có độ dài tối đa theo lý thuyết là 65.535 ( giống nhau) nhưng bạn phải trừ các tiêu đề IP và UDP khỏi kích thước đó để tính kích thước dữ liệu tối đa theo lý thuyết.
Ron Maupin

Tôi đã hỏi điều này từ lâu nhưng nó đang tìm kiếm một câu trả lời thực dụng (những gì hoạt động trong cuộc sống thực) hơn là những gì nó nói trong thông số kỹ thuật / hoặc trong lý thuyết. Tôi muốn có được các gói từ a đến b mà không bị phân mảnh, đó là vấn đề mạng trò chơi thời gian thực - Tôi nghĩ có nhiều giải pháp được phát triển bởi những người thông minh hơn bây giờ :)
KM
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.