2016-04-24 18 views
0

當我使用原始套接字僞造一個IP數據包時,似乎我可以爲其總長設置一個任意值,而不考慮IP數據包的真實大小。我可以爲IP數據包的總長設置一個任意值嗎?

但是,當我使用Wireshark捕捉數據包時,我發現總長度已被修正爲真正的大小。這真讓我困惑。

有人可以解釋這個問題嗎?我會非常感謝你的幫助。

謝謝。

+0

它可能已被操作系統或網絡接口驅動程序覆蓋。你在哪裏捕捉它? – Malt

+0

我在eth0上捕獲它,它是我發送數據包的源設備。迭戈皮諾指出,這個問題是由'sendto'函數引起的,我設置的總長度被它覆蓋。非常感謝你幫助我解決問題。 –

回答

0

發送大於其實際大小的數據包時,有效負載中的附加數據是一大塊零。這就是理論上你應該在Wireshark(或tcpdump)檢查時看到這種捕獲的數據包。例如:

IP 192.168.0.3.17664 > 178.60.128.48.1: tcp 32 
     0x0000: 4500 0064 f0d0 4000 4006 56ab c0a8 0003 [email protected]@.V..... 
     0x0010: b23c 8030 4500 0001 0000 0000 ff06 dbe4 .<.0E........... 
     0x0020: c0a8 0003 b23c 8030 04d2 0050 0000 0000 .....<.0...P.... 
     0x0030: 0000 0000 5002 16d0 b3c4 0000 4142 4344 ....P.......ABCD 
     0x0040: 4546 4748 494a 4b4c 4d4e 4f50 5152 5354 EFGHIJKLMNOPQRST 
     0x0050: 5556 5758 595a 0000 0000 0000 0000 0000 UVWXYZ.......... 
     0x0060: 0000 0000        .... 

這是TCP數據包到google.com(178.60.128.48)。有效載荷是「ABC ... XYZ」,但IP的total_length已被手動增加。結果是在有效負載中填充零,直到完成數據包的總長度。

這就是說,我敢打賭,問題出在sendto系統調用中。這是實際在套接字上發送數據包的調用。但是這個調用也設置了數據包的total_length

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, 
       const struct sockaddr *dest_addr, socklen_t addrlen); 

我懷疑你已經在IPv4報頭調整了數據包的total_length場,但對sendto呼叫len參數沒有被修改,所以發送當數據包的總長度將被覆蓋到原來的大小。

這是我的懷疑,但很難說沒有檢查代碼。

+0

這就是問題所在!非常感謝!!我還發現,如果我將總長度設置爲1500字節(以太網幀的最長長度),則sendto函數將返回錯誤消息「消息太長」。 –

+1

@志鴻登我很高興聽到它現在正在工作。你能否將我的答案標記爲已接受? http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work –

相關問題