前言,要完整的學計網看這,韓立剛老師的課,絕對有趣,而我這是參考慕課網:編程必備基礎中的網絡篇,都是軟件的,不是很全,但是對於搞軟件的我覺得夠了。有錯請指出,謝謝
文章目錄
應用層包括ISO中的表示層,會話層,應用層。應用層也是工作在終端設備的,包括手機,計算機。
傳輸層以及以下的層提供了完整的通信服務。應用層中常用的協議:HTTP:80,HTTPS:443,DNS:53,FTP:21,TELNET:23。
還可以面向傳輸層編程,即java中的網絡編程。
傳輸層中的UDP和TCP在應用層中有不同的服務。
應用層的功能是:定義應用間通信的規則。比如報文類型(請求報文,應答報文),報文的格式和語法,應用進程發送數據的時機、規則。
1. DNS協議
1.1 爲什麼要有DNS協議?
前面學了網絡進程,知道了一個IP地址和一個端口可以確認一個網絡進程。像我們平常訪問網站時,其實就是訪問一個網絡進程,但是以IP地址和一個端口號來訪問一個網站,比如47.112.195.208:442,47.12.78.197:8800等,一兩個我們還可以記得住,但是這些網站一多的話,要記住這麼多無規律的IP地址很難,所以這就需要DNS協議,把IP地址映射成一個名稱。像:taobao.com,baidu.com。這些就是使用了DNS協議。
當訪問 taobao.com時,會先使用DNS協議,去找到對應的IP地址,然後再去訪問網絡進程。
看看有了DNS協議,每個網站也有了自己的域名,而且很方便記住,現在能看到的網站都是有自己的域名的。因爲沒有域名的網絡可信度不高,所以可能會導致搜索引擎收錄你的網站慢的問題,即別人看不到你的網站,除法直接輸入你的ip地址和端口去訪問。
域名在國內需要備案,用國外的服務器就不需要,但可能網速慢。
當然你跟我說你有收藏夾,那要是在別人的電腦,可能還得去登錄,而如果我知道了域名,比如要訪問淘寶,直接訪問 taobao.com,快不快??
1.2 DNS協議
DNS(Domain Name System,域名系統):用於域名與 IP 地址的相互轉換。一個域名對應一個IP地址,當然通過CDN可以讓一個域名多多個IP地址,一個IP地址可以對應多個域名。
雖然DNS協議是屬於應用層的協議,但它是爲應用層的其他協議服務的,比如HTTP、HTTPS等。
域名由點、字母和數字組成;點分割不同的域;域名可以分爲頂級域,二級域,三級域。當然還可以繼續分割更多的域,但是沒有必要,因爲域名本就爲了方便記住。
比如 www.taobao.com 的解釋:com是屬於頂級域,taobao屬於二級域,www屬於三級域。
其中頂級域還可以繼續分:
二級域:二級域加上三級域名的話是全球唯一的。多個不同的二級域可對應一個頂級域。
三級域:三級域,常見的有www,也可以自定義,也可以不要三級域(默認)。
這些域其實可以形成一棵樹:
一般去阿里雲或騰訊雲申請域名或其他時,申請的都是帶有二級域加頂級域的域名。
這些域名和IP地址的映射其實是部署在服務器上面的,比如在阿里雲買的域名,那該映射就在阿里雲他們的服務器上,可稱爲域名服務器或DNS服務器。
1.3 DNS解析
首先放出一張圖。
- 根域名服務器即全球性的域名服務器,存儲所有的頂級域名服務器的域名和地址。全球共有13個不同IP地址的根域名服務器。由不同的國家管理。但是每分鐘要要解析的次數是非常多的,所以就出現了鏡像服務器,這些鏡像服務器和根服務器的IP是一樣的。當對根服務器發出請求時,都是會去訪問最近的。比如訪問 baidu.com時,先通過根服務器去查詢com的頂級域名服務器的ip地址,而不是去查找 baidu.com整個的ip地址,根服務器不存儲baidu.com與ip的映射關係。
- 頂級域名服務器管理在此服務器註冊的二級域名。比如查找 baidu.com,則通過根域名服務器解析找到com的ip地址,然後找到該頂級服務器,然後到該服務器中查詢baidu,如果該服務器有該域名與ip地址的映射關係,則解析完畢。
- 域名服務器:每個二級域名都會有一個域名服務器,負責添加子域名的映射。因爲還有二級域名下可能還有三級域名、四級域名等等,比如www.baidu.com。
比如查詢 www.baidu.com:
-
會先去訪問瀏覽器中的DNS緩存(即看看有沒有緩存該域名與IP地址的映射關係),如果有就直接拿出來訪問。
-
如果找不到就去本地計算機中的host文件(C:\Windows\System32\drivers\etc的host文件),如果有就直接拿出來訪問。
-
如果找不到就會去路由器的DNS緩存中查詢,如果有就直接訪問。
-
如果找不到,就會根據本地計算機設置的DNS服務器去找,我們把服務器稱爲本地DNS服務器(如圖,一般是由ISP提供的),該服務器會收到我們的DNS請求,它會去查詢它是否有緩存在記錄,如果有則將解析結果返回給客戶機。
(在CMD輸入ipconfig/all,即可看到。如果DNS代理模式開啓和DHCP模式開啓(待講),則主機自動獲取到的DNS一般也是路由器ip,路由器通過NAT技術獲得真實的DNS服務器的IP地址,該真實的DNS服務器IP地址是由ISP提供的。也可以自己指定真實的DNS服務器IP地址)
(或者這樣)
- 如果本地DNS服務器沒有,那就會從本地DNS服務器跳轉到根域名服務器查詢,根據域名所攜帶的頂級域名來從根域名服務器查詢對應的頂級域名服務器。找到com域名服務器的ip地址跳轉到該服務器,發出請求查詢baidu,如果就跳轉到該域名的服務器。
- 在baidu這臺DNS服務器中查找是否有該www的子域名服務器(三級域名服務器),如果三級域名服務器有映射關係,則把解析成功結果返回到頂級域名服務器,再從頂級域名服務器回到根域名服務器,最後把結果送回到本地DNS服務器,然後本地DNS服務器會把結果給我們客戶機;如果沒有則會告訴客戶機訪問不到該網站。那假設如果是這樣:aa.bb.cc.baidu.com,那就會從baidu這臺DNS服務器,先找到cc然後找到bb然後扎到aa,最後查看有沒有記錄映射關係。
額外:
- 對於對應到的IP,可能1個,也可能多個,最終的應用或系統j解析服務,從中隨機挑選一個。
- 域名還可以與另一個域名有映射關係,其實就是別名,稱爲CNAME。會找到別名後通過CNAME找到IP地址。
前面也說了這些域其實可以看出一棵樹,從我們計算機發出請求,到本地DNS服務器然後再跳轉到其他DNS服務器,最終把結果一層一層歸還回來,送到我們計算機,這屬於遞歸查詢。而服務器與服務器之間屬於迭代查詢,比如查詢com頂級域名服務器。
瀏覽器DNS緩存和計算機DNS緩存(host)和路由器DNS緩存的區別?
- 瀏覽器DNS緩存是有時間限制的。
- 計算機DNS緩存沒有時間限制,但是隻能在該計算機生效。
- 路由器DNS緩存,所有設備連入該路由器,DNS緩存就都會在這些設備生效。
1.4 CDN技術(瞭解)
CDN(Content Delivery Network,內容分發網絡)
CDN的基本原理是廣泛採用各種緩存服務器,將這些緩存服務器分佈到用戶訪問相對集中的地區或網絡中,在用戶訪問網站時,利用全局負載技術將用戶的訪問指向距離最近的工作正常的緩存服務器上,由緩存服務器直接響應用戶請求。
作用:加快服務器的訪問速度。
就比如我的網站部署在廣東的一臺服務器上,那麼我在廣東內訪問肯定很快,那我要是在新疆訪問,可能會比較慢(網線,距離)。如果使用了CDN技術,那麼就好像我在每個省都有一臺服務器,這時無論在國內哪個地區都可以很快的訪問。
所以DNS解析時可能可以解析出很多不同的IP地址,但實際上真實的IP地址只有一個,其他的IP地址可能是代理而已。
1.5 一些網站訪問慢的原因
這裏可以提一提,訪問國外網站,比如github,有時候非常慢,學了DNS解析就知道爲什麼慢了,其實就是DNS解析需要去跨很多很多服務器去找,這就非常慢。
這時可能腦子就有點子了,比如可以提前在本地計算機的host先緩存了github域名和對應的ip地址。但是隻是免了DNS解析(沒有訪問目的服務器),因爲我們對該域名發出請求時,該請求還得送到國外的服務器,這過程是很長的,加上國內對國外網絡的屏蔽,所以也是非常不穩定。
藉助:NDS查詢,輸入域名來查詢IP地址。可以自己在C:\Windows\System32\drivers\etc的host文件中添加映射的這種方法其實沒什麼用,因爲如果本身訪問國外服務器就有困難,那即使做了映射也沒上面用。而且做了映射後關係就是死的,一直只能訪問到那個IP地址。
衆所周知,網絡會通過路由器尋找最合適的路線訪問。所以有時可能正常訪問github。
我自己測試了很多次,映射完訪問github還是有難度。
2. DHCP協議
DHCP(Dynamic Host Configuration Protocol,動態主機設置協議):是一個局域網協議
,應用UDP協議的應用層協議。
比如我們的手機,筆記本經常需要移動,比如在家,在公司,在學校,但是聯網時並不需要進行IP地址配置。這就是DHCP的功能,它提供一種即插即用聯網機制。
那麼如何啓用DHCP?那計算機來做,只需如下操作:就啓動了DHCP。這樣就臨時地分配一個IP地址給計算機讓它聯網,一般是一個內網IP地址。如果要跟外部網絡通信就使用NAT技術。
DHCP服務器一般是指具備DHCP功能的網絡設備,一般路由器都具備DHCP功能的。DHCP服務器監聽默認端口:67。
2.1 DHCP協議獲取IP地址的過程
- 主機使用UDP協議廣播DHCP發現報文;
- DHCP服務器發出DHCP提供報文;
- 主機向DHCP服務器發出DHCP請求報文;
- DHCP服務器迴應並提供IP地址給主機。
2.2 作用
即爲臨時加入局域網的設備提供一個臨時的IP地址。
3. HTTP協議
HTTP(HyperText Transfer Protocol,超文本傳輸協議):簡單理解爲“帶有超鏈接的文本”,可以從網站的一個地方到另一個地方(服務器)。是一個簡單的請求-響應協議,它指定了客戶端可能發送給服務器什麼樣的消息以及得到什麼樣的響應。
HTTP協議是屬於可靠數據傳輸的協議,依賴於傳輸層的TCP協議。像圖片,視頻,文件等都是通過HTTP協議去傳輸的。
但是HTTP是一種不保存狀態,即無狀態(stateless)協議,比如每當有新的請求發送時,就會有對應的新響應產生(即使失敗),但是協議不會保留之前一切的請求或響應報文的信息。主要是爲了能夠更快處理大量事務,確保協議的可伸縮性。
當然可以藉助Cookie來保持狀態功能。
3.1 超鏈接URL
URL(Uniform Resource Locator,統一資源定位符),簡單地講就是網絡上的一個站點、網頁的完整路徑。
URL的一般格式爲:協議://[主機]:[端口]/[路徑]?[字段]=[字段值]
協議:
- 最常見的就是HTTP協議。
- file:資源是本地計算機上的文件
- ftp:文件傳輸訪問。
- 等等。
http協議的默認端口是80,而https屬於安全協議用的是443端口(待講)。所以在輸入URL時可以省略端口。
[路徑]和[字段]=[字段值]都是可選的。像直接輸入域名(主機)就默認訪問index.html。
比如:https://www.baidu.com/index.html
3.2 URI和URL(瞭解)
【摘選 《圖解HTTP》】
URI:(Uniform Resource Identifier,統一資源標識符):
- Uniform:規定統一的格式可方便處理多種不同類型的資源,而不用根據上下文環境來識別資源指定的訪問方式。(http、https、ftp等)
- Resource:資源的定義是“可標識的任何東西”。不僅是文檔文件,圖像或服務(天氣預報)等能夠區別於其他類型的,全都可作爲資源。資源不僅僅可以單一,也可以是多數的集合體。
- Identifier:標識可標識的對象,可稱爲標識符。
URI和URL的區別:URI用字符串標識某一互聯網資源,而URL表示資源的地址(互聯網上所處的位置),URL是URI的子集。
列舉幾種URI:轉自:URI和URL的區別(圖解HTTP也有但是沒標出有哪些可以用URL來表示)
ftp://ftp.is.co.za/rfc/rfc1808.txt (also a URL because of the protocol)
http://www.ietf.org/rfc/rfc2396.txt (also a URL because of the protocol)
ldap://[2001:db8::7]/c=GB?objectClass?one (also a URL because of the protocol)
mailto:[email protected] (also a URL because of the protocol)
news:comp.infosystems.www.servers.unix (also a URL because of the protocol)
tel:+1-816-555-1212
telnet://192.0.2.16:80/ (also a URL because of the protocol)
urn:oasis:names:specification:docbook:dtd:xml:4.1.2
可看到這些全是URI,其中一些URI也可以用URL來代替。所以瞭解一下。像http的URL叫URI或URL都可以。
3.2 服務器對客戶端請求報文的處理
3.3 HTTP的請求方法(method)
HTTP的請求方法有很多,但是最常見的就4個:GET,POST,DELETE,UPDATE。
- GET:獲取指定的服務端資源
- POST:提交數據到服務端
- DELETE:提交數據到服務端
- UPDATE:更新指定的服務端資源
如何指定資源?有兩種方式:
- 在URL地址請求,比如獲取圖片:https://coding.imooc.com/lesson/355.html
- 在請求報文中指定。看下面。
3.4 請求報文
例如:
對於請求頭:瞭解
3.5 應答報文
狀態碼和狀態解釋都是一對的:都需要看看。
- 1xx:信息性狀態碼,表示接收的請求正在處理。
- 2xx:成功狀態碼。
- 200 OK:表示客戶端發來的請求在服務器被正常處理了。
- 204 No Content:請求處理成功,但沒有資源可返回。一般在需要從客戶端往服務器發送信息,而對客戶端不需要發送新信息內容的情況下使用。
- 206 Partial Content:對資源某部分的請求,範圍請求。響應報文中包含由Content-Range指定範圍的實體內容(請求內容)。
- 3xx:重定向狀態碼。
- 301 Moved Permanently:永久性重定向,表示請求的資源已經被分配新的URL,以後要訪問應該使用新的URL。
- 302 Found:臨時重定向,表示請求的資源已經被分配新的URL,本次要訪問應該使用新的URL。
- 303 See Other:表示請求對應的資源存在另一個URL,應使用GET方法定向獲取請求的資源。(與302功能一樣,但303表明應該使用GET方法)
- 304 Not Modified:表示客戶端發送附帶條件的請求時,服務器允許請求訪問資源,但因發送請求未滿足條件後直接返回304。304雖然被劃分在3xx中,但跟重定向沒有關係。
- 307 Temporary Redirect:臨時重定向。在302中雖然標準禁止POST變成GET,但使用時不遵循該規則也可以使用。而307就是來明確禁止從POST變成GET。
- 4xx:客戶端錯誤狀態碼。
- 400 Bad Request:表示請求報文存在錯誤語法。當錯誤發送時,需要修改請求內容在重新發送。注意:瀏覽器會像200 OK對待該狀態。
- 401 Unauthorized:表示發送的請求需要有通過HTTP認證(BASIC認證、DIGEST認證)的認證信息。
- 403 Forbidden:表明對請求資源的訪問被服務器拒絕了,通常是因爲權限問題,特別是linux的服務器,注意文件的訪問權限,nginx或tomcat的權限等。
- 404 Not Found:表明服務器上無法找到請求的資源。檢查URL有沒有寫錯,不然就服務器真的沒有該URL的訪問資源。
- 5xx:服務端錯誤狀態碼。
- 500 Internal Server Error:服務器在執行請求時出現異常。可能是bug或臨時故障。
- 503 Service Unavailable:服務器正在忙。表明服務器暫時處於超負載或在進行停機維護,現在無法處理請求。
3.4 web緩存(瞭解)
二八原則:即一個網站會把百分之20的熱門內容先緩存起來,提高訪問速度。
存儲器層次結構:從上到下可以分爲:緩存,主存,輔存。Redis就是一種基礎主存的數據庫。可以把熱門數據先緩存到Redis中,然後很快取出來。
3.5 web代理(瞭解)
代理作用:可以把服務端部署的架構屏蔽掉。也可以保證服務端的安全,因爲在代理裏面可以設置一些規則,也就是常說的防護牆。
代理可以分爲正向代理和反向代理:
最常見的代理軟件:Nginx,HAProxy
3.6 爬蟲(瞭解)
網絡就好像一個大網,而有一隻蜘蛛在網上走來走去,然後可以採集相關的信息。像百度,谷歌等搜索引擎其實就是利用爬蟲,把網絡上的數據爬下來,做一定的索引,然後我們就可以搜索了。
當然爬蟲既然是去整個網絡上爬,那可能就會爬到一些不好的(不利的),會導致網絡擁塞,損耗服務器資源。
4. HTTPS協議
因爲HTTP是明文傳輸的(不加密的),很容易被黑客獲取數據。所以就有了HTTPS協議。
加的S,其實是Secure。HTTPS從原來的80端口變成現在的443端口。
4.1 加密模型
- 對稱加密
- 非對稱加密
A、B是擁有一定數學關係的一組祕鑰。密匙可分爲:
- 私鑰:自己使用,不對外公開。
- 公鑰:大家都可以使用的。
既然是加密,那信息肯定不對外公開,只有自己可以解密,所以私鑰是解密的,公鑰是加密的。
數字證書:是可信任組織頒發給特定對象的認證,即簽名,也就是讓那些可信的機構來證明你是本人,然後本人發送的信息別人就可以信任。就類似我們的身份證。
簽名也有加密和解密。既然不希望別人冒着我,那可以用私鑰來簽名,而公鑰就是來驗證是不是你本人。
- SSL(Secure Sockets Layer: 安全套接層):數據安全和數據完整,對傳輸層數據進行加密後傳輸。
而SSL是數字證書的一種,騰訊雲就可以免費申請。
4.2 HTTPS的請求過程
來看看第二步是怎麼構成安全傳輸的: