為什麼在UDP包中不能獲取發包方的位址

2021-09-22 11:03:10 字數 840 閱讀 6908

圖1 udp報文格式

從圖1,我們可以看出,從udp包中,我們可以獲取的資訊只有源埠和目的地埠。我們不能獲取到源ip因為報文中沒有源ip。真正包含ip位址的是ipv4偽報頭中。

圖2 udp包的ipv4偽報頭格式

可以看出,圖1中的udp包其實是包含在圖2中的,圖2中清楚地指出了包的源位址(source addresses)和目標位址(destination addresses)都在ipv4頭中。圖2的協議是udp專用的(詳見list of ip protocol numbers

):17(0x11)。udp length指的是udp頭(head)和資料(data)的長度。

再讓我們通過抓包工具直觀地看一下,見圖3。

圖3 抓包工具的截圖

方法1、檢視arp表是最簡單的方法。

方法2、使用libpcap是最可靠的。可以參考linux下網路監聽與傳送資料報的方法(即libpcap、libnet兩種類庫的使用方法)。

方法3、寫自己的網絡卡驅動,應該沒幾個人會這樣搞。

參考鏈結

getting the source hardware address of received udp packets?

kissazi2

在C 中,為什麼建構函式不能有返回值?

1 假設有乙個類c,有如下定義 class c c int i x i private int x 如果c的建構函式可以有返回值,比如int int c x 0 那麼下列 會發生什麼事呢?c c c 此時c.x 1!很明顯,c 呼叫了c的無引數建構函式。該建構函式返回int值1。恰好c有乙個但引數建...

Junit中為什麼不能啟動多執行緒

其實junit是將test作為引數傳遞給了testrunner的main函式。並通過main函式進行執行。test函式在main中執行。如果test執行結束,那麼main將會呼叫system.exit 0 即使還有其他的執行緒在執行,main也會呼叫system.exit 0 system.exit...

為什麼在中斷上下文中不能休眠

這個問題有很多人問過,我看了下linux得核心 原因如下 當然我不能保證一定對,如果有牛人理解得更好,歡迎指正 1.中斷處理的時候,不應該發生程序切換,因為在中斷context中,唯一能打斷當前中斷handler的只有更高優先順序的中斷,它不會被程序打斷 這點對 於softirq,tasklet也一...