網際網路應用是通過ip標識通訊雙方的主機位址的。常用的ipv4是32位的整數,而這個數字不好記憶,所以引入了更加適合人類閱讀和記憶的點分十進位制表示法,如環回位址對應「127.0.0.1「。即使這樣,本質上還是數字,仍然不利於溝通和記憶,試想以下,每次訪問**都要輸入這樣的位址,我們要記憶一大推這樣的無意義的數字,抑或是隨身帶著乙個筆記本,專門用來ip位址,這是多麼不方便。
為了解決上面的問題,引入了網域名稱(domain name)。網域名稱可以看作是乙個有意義的字串和ip列表的對映。在通訊過程中,先根據網域名稱找到ip位址,之後的通訊使用ip位址進行。將網域名稱解析為ip位址的過程,就是網域名稱解析。要實現網域名稱解析,需要還需要兩方面的支援:
對映存在何處
難不成每台電腦都儲存千千萬萬的對映?當然不是。這些對映儲存在dns(domain name system)。全世界部署著很多dns伺服器節點,每次網域名稱解析會根據規則請求這些dns節點得到對應的ip位址。
解析函式
通常每個作業系統都提供相應的介面用於網域名稱解析,如在linux下是gethostbyname
函式,asio底層使用該函式進行網域名稱解析。
除了上面可讀性的差異外,網域名稱還提供了高可用的保障:乙個網域名稱可以對應多個ip位址,如果某個ip位址上的主機宕了,可以使用另外的ip進行通訊。而且,也利於系統的平滑公升級:若客戶端和服務端通過通訊,服務端公升級到新機器,只要網域名稱指向新機器,客戶端不需要做改動。
由於ipv6的逐漸流行,實際解析的位址可能既包含老的ipv4位址,又包含ipv6位址,這點需要注意。下面給出網域名稱解析的示例。
#include #include using namespace boost;int main() // 列印ip位址 for (auto it = results.cbegin(); it != results.cend(); ++it) return 0;}
上面的示例呼叫asio::ip::udp::resolver
的resolve
方法,得到asio::ip::udp::resolver::results_type
型別的結果。asio::ip::udp::resolver::results_type
本質上是個迭代器,可以通過迭代器的操作遍歷。後面的迴圈列印每個endpoint。
這是程式呼叫的結果,包含ipv4和ipv6型別。
220.181.38.149:80
220.181.38.150:80
[240e:83:205:59:0:ff:b09b:159e]:80
[240e:83:205:58:0:ff:b09f:36bf]:80
上面的例子中有些型別是可以讓編譯器推斷出的,之所以寫出來是為了讓型別明確出來。下面的tcp解析示例會使用auto
替代一些冗長的型別。
跟udp
版本完全一致,我們唯一要做的就是將asio::ip::udp::resolver
改為asio::ip::tcp::resolver
型別。
nginx配置網域名稱訪問 禁止ip訪問
為什麼要禁止ip訪問?為了避免其他人把未備案的網域名稱解析到自己的伺服器ip,而導致伺服器被斷網,我們可以通過禁止使用ip訪問的方法,防止此類事情的發生。修改配置檔案nginx.conf,其中2.2的方法可以參考 這篇博文中的your project nginx.conf檔案配置,是一樣的道理。新加...
簡單Tomcat使用網域名稱訪問IP
上次軟工做了有登入註冊和簡單首頁展示的介面。因為來不及了,當時展示的時候就用ip 8080甚麼的展示了,這學期空閒時間比較多,順便稍微弄弄看。說不定以後會用到 一jdk,就是那些環境配置啥啥的 ps 同學說也可以用jvm 我沒有試過 三 在elipse專案上右鍵 export 再重啟tomcat就好...
Tomcat修改IP訪問為繫結網域名稱訪問
在專案中,我們可能會將我們的專案發布到網際網路,下面就是將tomcat ip訪問修改為網域名稱訪問 首先我們要修改tomcat的預設8080埠為80埠,tomcat home conf server.xml的修改方式如下 修改完以後,停掉tomcat,netstat an grep 80 檢視一下是...