簡體   English   中英

UDP校驗和如何更改IP片段?

[英]How does the UDP checksum change for IP fragments?

我需要在c中編寫一個基本的網絡堆棧,但是對於正確的做法有一些疑問。 假設我只需要支持L4的UDP和L3的IP。

當我想發送一個需要分散的大消息時。 處理此問題的正確順序是什么?

1)初始化udp頭並計算整個數據字段(加上udp和偽頭)的校驗和,然后對數據字段進行分段,為每個分段構建IP頭,然后發出分段。

2)分段數據字段,然后構建一個udp頭,並在每個分段的前面加上不同的校驗和。 然后構建一個IP標頭,為每個片段添加該標頭。 然后發送我們的片段。

我的困惑源於udp校驗和應該包含整個組裝的數據報,還是僅包含單個片段。 我非常感謝您可以提供的任何幫助。

網絡層彼此獨立工作。 當IP層對數據包進行分段時,UDP層將不知道它。 到應用程序層UDP偵聽器收到數據包時,它將被重新組裝,並且不知道該數據包曾經被分割過。

有了這些知識,我們可以說UDP校驗和必須覆蓋完全組裝的數據包,並且在分段過程中不必更改。 實際上,UDP標頭中的任何內容都沒有變化。

要對分段的數據包進行錯誤檢查,請使用IPv4校驗和頭字段。 IPv6標頭沒有校驗和字段,因為期望較低的層具有無錯誤的數據包傳遞。

對IPv4數據包進行分段時,必須重新計算該分段的IPv4標頭。 IPv4 Wikipedia條目告訴我們在對數據包進行分段時必須更改的內容:

  • 總長度字段是段大小。
  • 除最后一個片段(設置為0)外,所有片段均設置了更多片段(MF)標志。
  • 基於原始數據有效載荷中段的偏移量設置片段偏移量字段。 以八字節塊為單位進行測量。
  • [IPv4]標頭校驗和字段將重新計算。

因此,總而言之,您將執行以下操作:

  1. 獲取應用程序級數據並將其包裝在UDP標頭中。
  2. 將帶有UDP標頭的數據包提供給IP層。
  3. 將數據分成碎片。
  4. 對於每個片段,在其上放置一個IPv4片段頭。
    • 將片段提供給第2層,並在其上放置第2層標頭。
    • 發送片段。

數字1和數據包之前的總校驗和應與重構回原始格式的校驗和相匹配

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM