自從我在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的文檔需要更新?
我知道路由器沒有*接收超過特定點的碎片,並且任何沿着「nu-uh」的節點都可以設想停止發送。文檔引用可能只是一個更強烈的措辭版本...? – cHao
這個地方應該有實際的測量,對吧?就像我們可以測量大陸之間的延遲,各種主幹的質量,IPv6的滲透等等。 –
UDP的一部分是它不基於連接,確認等等。這使得它更適合一些用例,但也導致這樣的情況。您可以使用[路徑MTU發現](http://tools.ietf.org/html/rfc1191)找出您可以發送的最大數據報,而無需分片。或者,只需堅持576字節的IPv4最小值。 (如果下一跳需要它,那麼小於這個的數據報將僅被分段,並且路由器應該能夠重新組裝它們。) – cHao