什么是IP
IP是Internet Protocol(網(wǎng)際互連協(xié)議)的縮寫,是TCP/IP體系中的網(wǎng)絡層協(xié)議。對上可載送傳輸層各種協(xié)議的信息紊搪,例如TCP、UDP等全景;對下可將IP信息包放到鏈路層耀石,通過以太網(wǎng)、令牌環(huán)網(wǎng)絡等各種技術來傳送
IP地址是IP協(xié)議提供的一種統(tǒng)一的地址格式蚪燕,它為互聯(lián)網(wǎng)上的每一個網(wǎng)絡和每一臺主機分配一個邏輯地址娶牌,以此來屏蔽物理地址的差異奔浅。
IP規(guī)定網(wǎng)絡上所有的設備都必須有一個獨一無二的IP地址馆纳,就好比是郵件上都必須注明收件人地址。但是一臺設備理論上可以有多個IP地址汹桦。
IP地址:IP地址是一個32位的二進制數(shù)鲁驶,通常被分割為4個“8位二進制數(shù)”(也就是4個字節(jié))。IP地址通常用“點分十進制”表示成(a.b.c.d)的形式舞骆,其中钥弯,a,b,c,d都是0~255之間的十進制整數(shù)。
獲取IP的幾種方式
一督禽、請求第三方獲取
如 http://119.29.29.29/d?dn=www.baidu.com&ttl=1脆霎,講www.baidu.com換成其他域名,即可請求獲取到該域名的ip地址狈惫。
我們可以看到睛蛛,百度不只有一個ip,這是CDN的關系(自己下去查)
二胧谈、根據(jù)私有API獲取
(筆者只考慮了iOS11以上的版本)
_timingData私有屬性忆肾,分別可以從NSURLConnection和NSURLSessionTask對象中獲取,(NSURLConnection 需要iOS12的版本支持)
需要注意的是菱肖,私有API有被拒審的風險客冈,慎用~要做一些特殊處理,比如通過runtime的方式執(zhí)行獲取稳强,或者對_timingData進行encode處理過機審场仲。
iOS 13以上和悦,NSURLSessionTask可以通過task的代理直接獲取,光明正大的拿到ip地址渠缕。
NSURLSessionTaskTransactionMetrics.remoteAddress
優(yōu)勢:這種方式有一個極大的好處摹闽,就是和本次請求綁定在一次,不需要增加請求的次數(shù)褐健,給APP增加流量上的負擔付鹿。
劣勢:如果用戶有連接代理,則會拿到代理的ip蚜迅,這對我們統(tǒng)計來說是沒有意義的蛤肌。
三顶伞、ping值獲取
(需要一次極小的請求,直接獲取到當前請求遠端ip,但是可能會有一些偏差旅挤,因為ping相當于一次請求,和真實的請求IP可能會存在偏差)
獲取時長約為35ms(和網(wǎng)絡環(huán)境正相關闯狱,very bad的網(wǎng)絡可能會達到1秒以上)
具體方案參考如下:
https://kangzubin.com/apple-sample-code-simpleping/
https://learnku.com/articles/23788
最終方案:
先判斷是否有代理票堵,https://blog.csdn.net/potato512/article/details/88692127
判斷是否有代理,第一次約為5ms偷溺,之后為0.02ms蹋辅。切換代理狀態(tài)時,也會增加時長為毫米級(2ms左右)
如果存在代理挫掏,使用ping工具獲日炝怼;如果不存在尉共,使用私有API
IP存在獲取不到的情況褒傅,注意判空