2014-01-11 20 views
-2

自從我在PDP/11上進行套接字編程以來,IP分段將處理IP數據報(例如UDP數據報)大於分段允許的MTU的情況。因此,我可以發送一個大小爲30kB的UDP數據報,並且它可能在以太網上被分成20個1.5kB的段,然後在某些特定的無線鏈路上將每個段分成三段,只要所有的片段都到達另一端,UDP數據報就會將其轉到另一端。IP碎片化:這仍然是常態,對吧?

然後,我遇到了node.js中UDP套接字的文檔,它聲稱路由器會丟棄不適合下一個段的MTU的數據報。我認爲這只是數據報的情況下,頭文件中設置了「不分片」位,但鑑於node.js應該是一個高質量的產品,在網絡圈中有一定的可信度,所以我想知道我錯過了一些東西,許多路由器現在將所有數據報視爲「不分片段」?

這裏的鏈接: http://nodejs.org/api/dgram.html#dgram_socket_send_buf_offset_length_port_address_callback

這裏的報價:

generally sending a datagram greater than the (receiver) MTU 
won't work (the packet gets silently dropped, without informing 
the source that the data did not reach its intended recipient). 

所以,我錯過了什麼,或者做Node.js的文檔需要更新?

+0

我知道路由器沒有*接收超過特定點的碎片,並且任何沿着「nu-uh」的節點都可以設想停止發送。文檔引用可能只是一個更強烈的措辭版本...? – cHao

+0

這個地方應該有實際的測量,對吧?就像我們可以測量大陸之間的延遲,各種主幹的質量,IPv6的滲透等等。 –

+0

UDP的一部分是它不基於連接,確認等等。這使得它更適合一些用例,但也導致這樣的情況。您可以使用[路徑MTU發現](http://tools.ietf.org/html/rfc1191)找出您可以發送的最大數據報,而無需分片。或者,只需堅持576字節的IPv4最小值。 (如果下一跳需要它,那麼小於這個的數據報將僅被分段,並且路由器應該能夠重新組裝它們。) – cHao

回答

0

所以,事實證明,答案有點微妙。分片仍然是IPv4的一部分,主要由互聯網提供支持。 IPv6刪除碎片,而是推遲到應用程序進行MTU發現。 因此,使我質疑我的假設的文檔說明沒有太多「錯誤」,因爲它「以某種方式生活在未來,大多數人已轉向IPv6」。

4

您對IPv4的理解是正確的。在這裏他們可能會談論接收機MTU即。鏈路接收端的MTU。 MTU可以配置爲每個端口。鏈接是兩個端口之間的連接。例如。在以太網你可以有一個錯誤配置LAN這樣

PORT-A(MTU 1000)< ----------> PORT-B(MTU 800)

在這種情況下發送者(端口A)會認爲鏈路的MTU必須與其上配置的MTU相匹配,因此會發送大小爲1000字節的數據包。當端口B收到數據包時,它很可能會丟棄數據包,因爲它大於該端口上配置的MTU。

+0

是的,這是一個錯誤配置的網絡。我不太擔心這些 - 我擔心互聯網骨幹運營商和主要ISP的標準做法。 –