2009-08-10

IP 判斷方式

一般我們知道的 IP 都是長得像:

192.168.0.1

不過對電腦來說,IP 是用 2 進位來表示,一個 IP 由四組數字組成,每組大小為 8 bit (每個 bit 可以代表二進位的 0 或是 1 ),所以上面的 IP 其實是長這樣:



11010000.10101000.00000000.00000001

然後 2 進位就可以和我們的子網路遮罩做運算了,分別可以算出 Network 和 Boadcast 分別是多少 (好,梗鋪完了)。

在網路上大家都是用 IP 表示自己的位置,由於我們會想知道對方是哪來的,所以就有某些人把 IP 分配給哪些國家這檔事情記錄下來再拿這個資訊賣錢,像是 MaxMind 這間公司。這個公司提供的 IP 資料庫格式會像是下面這樣:

"222.250.0.0","222.251.255.255","3740925952","3741057023","TW","Taiwan"

通常這些資料都會被匯入資料庫中,在查詢的時候,我們會轉換成十進位再用 SQL 的 BETWEEN 敘述來查詢(上面資料的第三、四欄位),二進位轉換成十進位的方法如下:

第一組數字 * 2 的 24 次方 + 第二組數字 * 2 的 16 次方 + 第三組數字 * 2 的 8 次方 + 第四組數字 * 2 的 0 次方。

為了方便程式計算,可以速記如下:

sum = 16777216 * ip[0] + 65536 * ip[1] + 256 * ip[2] + ip[3]

寫成程式大概可以像這樣:
view source
print?
1.$ip ='192.168.0.1';
2.$array = explode('.', $ip);
3.$sum = $array[0] * 16777216 + $array[1] * 65536 + $array[2] * 256 + $array[3];
4.
5./* 然後取出的 SQL 語法: */
6."SELECT `country`, `name` FROM `ip_country` WHERE $sum BETWEEN `begin_num` AND `end_num` LIMIT 1

用這個方法這樣就可以解出來國家名稱了!

from:http://blog.roga.tw/2009/06/11/2226

沒有留言: