2013年2月10日 星期日

raw socket與socket

最近有人跟我提到這兩個名詞而且混用,讓我腦袋當機,因為在我思考內這兩者是不相等的
從wikipedia的解釋是這樣

In computer networking, a raw socket is an internet socket that allows direct sending and receiving of Internet Protocol packets without any protocol-specific transport layer formatting.

首先socket本身並不完全符合TCP/IP的layer分層,他是更精緻的包裝,比方說使用socket,一般人幾乎都沒有手動建立three way handshake的方式,大多只是使用connect()跟listen()/accept()就處理完畢client/server,從來注意這程序應該是規範在TCP layer,但是programmer自己從來沒處理過

在linux的raw socket允許使用這自行處理packet,包含TCP/UDP/IP layer的header,也就是必須自行建構以及解析,換句話說,programmer的code candy已經被拿掉,過去socket API會幫忙處理一些payload跟header細節,現在要自己來,但同時也拿到更多控制權。也因為如此同時程式在執行的時候,往往需要root權限。raw socket可以用來建立類似sniffer的程式

有趣的是,似乎還是無法干涉MAC layer的運行,也就是data diagram,某種程度因為MAC layer是跟phy相關,也就是說,有相當的機制必須是跟硬體相關,這個比較難以直接套用,與有無root權限比較沒有相關了

======個人經驗分隔線======
個人第一次對這問題有接觸反而是在大學時期,想使用java 2寫個ping程式,後來千方百計找不到方法與API,首次瞭解到ping應該是ICMP(雖然有同學跟我提過echo server/port #7,但這是TCP layer),所以應該不行,ICMP是屬於系統範疇,所以java並不support是很正常的。同時開始懷疑我怎麼沒處理過three way handshake!!@@a

跟著在研究所時代,有同學提出了,號稱可以在wireless AP換手的情況下,因為會有IP變換的問題(每個AP有自己的DHCP server),可以在不改寫程式的狀況下,也不改寫系統IP layer的情況下,完成透明化的動作,也就是可以一邊移動,一邊使用ftp client傳送檔案,但是不會有任何斷線的問題

雖然以我的印象這是不大可能的,根據詳談之後,終於得知,原來是M$開放了一些hook,讓使用者可以在AP level改變IP level以及TCP level的packet,同學透過如此的方式來達成他的目的。但是這已經打破layer的設計,也就是沒有移植性的能力,當時會讓人驚訝的是不需改寫系統任何layer,但事實上是透過作業系統的支援,所以這是一個cross layer design,cross layer design在使用上具備有較好的效能以及較差的移植性以及需要較高的系統相依性。

參考資料:
http://forums.hackthissite.org/viewtopic.php?f=30&t=6643
http://blog.yam.com/hn12303158/article/35207136
http://blog.yam.com/jackktop/article/2124823

沒有留言:

張貼留言