操作系統接駁網路連接設備後,都是怎樣判斷已經成功連入Interent?
例如 Windows ,未聯網托盤網路圖標有感嘆號。
請分別測試,如果是通過訪問一定http伺服器來判斷,請給出地址。
個人記憶和實際經驗中,主要有以下幾個階段來判斷——
//附圖是臨時專門抓的包,並不連續
- DHCP
如果是使用 DHCP 獲得的IP,那麼就是先發送 DHCP 請求,網關回應 IP地址:
如果 DHCP 無回應,獲取 IP 失敗,感嘆號。
- 尋找網關
不論是否是 DHCP ,Windows 都會先發送一個尋找網關的 ARP 廣播,請求網關的 MAC 地址:
如果收不到網關回應的 MAC 地址,與網關通訊失敗,感嘆號。
- 驗證 IP 地址可用性
不論是否是 DHCP,Windows 都會發送神奇的 「免費ARP」 來驗證當前的 IP 地址是否已經被使用:
一旦發現衝突(即 免費ARP 有人回應),Windows 會自動關閉數據連接,IP置為 169.254.*.* ,彈出IP衝突提示窗,感嘆號。
- 查找測試伺服器地址
IP可用,網關聯通,這時內網已經可以通信,該開始測試外網了,首先查詢測試伺服器的 IP :
可見,針對 IPv4 和 IPv6 的測試伺服器域名分別為:http://dns.msftncsi.com 和 http://ipv6.msftncsi.com
如果查詢失敗,感嘆號,在運行網路診斷時會提示:DNS無響應。
我將 DNS 修改為 24.24.24.24 和 42.42.42.42 之後:
- NCSI 檢測
NCSI 是Windows Vista 之後內置的網路狀態檢測服務,略為複雜一些。
首先是 NCSI 檢測的觸發條件,有以下幾種情況:
- 電腦啟動後首次登錄使用
- 電腦連接到了另一個新網路
- 電腦連接到了一個需要登錄的熱點
觸發 NCSI 檢測的條件後,Windows 會進行兩個操作:
- 請求下載 http://www.msftncsi.com/ncsi.txt
- 內容為 Microsoft NCSI
- HTTP 返回狀態為 200 OK
- 解析結果為 131.107.255.255 / fd3e:4f5a:5b81::1
也就是這個操作檢測到了 302 重定向,之後就會彈出我們常見的登錄提示。
需要注意的是:我剛才專門測試了一下,無法解析 http://dns.msftncsi.com 和訪問 ncsi.txt 時被重定向,系統托盤的網路連接圖標都是不會有感嘆號的。
它先連接網關,再連接dns,如果有反應,基本可以判定連上了,然後應該是連接一個外網地址,但是我還從來沒有考慮過,今天試一下
試了但是沒查出來,短暫地連接過北京某個adsl的ip地址,因為不確定所以沒繼續查Windows 的話用的是 Microsoft NCSI :http://www.msftncsi.com/ncsi.txt
在得知這個事實之後,我第一反應是這個網址後邊的伺服器每天得承受多大的訪問量啊。另外就想到,以後自己的程序驗證連通性可以直接使用這個地址了。
參考:
Win7如何檢測網路連通性
Appendix K: Network Connectivity Status Indicator and Resulting Internet Communication in Windows Vista
What do Microsoft and NCSI have in common?
Windows 7 Network Awareness: How Windows knows it has an internet connection
判斷是否連接到Internet這個功能由NCSI(Network Connectivity Status Indicator)完成。
Appendix H: Network Connectivity Status Indicator and Resulting Internet Communication in Windows 7 and Windows Server 2008 R2
這個服務從Vista開始就引進到Windows了,Vista的NCSI的大致過程就是系統會查詢:http://www.msftncsi.com/ncsi.txt,結果是Microsoft NCSI,之後查詢dns.msftncsi.com,響應地址為131.107.255.255,如果這兩項匹配,則認為是接入了Internet。在Windows 7/Server 2008 R2及以後的版本中,查詢還加入了IPv6的地址的確認。
以下三種情況會觸發NCSI的以上過程:- 重啟計算機後第一個用戶登錄時;
- 計算機接入新網路時;
- 計算機接入需要登錄操作的無線熱點時。
推薦閱讀:
※tcp詳解v1 真的適合初學tcp/udp編程嗎?
※TCP/IP 協議到底在講什麼?
※tcp中的mss是536?
※為什麼區域網要用mac地址而不直接使用IP地址,統一用IP地址不是更好嗎?
※高帶寬往低帶寬傳送數據的處理機制是怎樣的?