OSI的七層體系結構概念清楚,理論也很完整,可是它比較複雜並且不實用。在這裏順帶提一下以前一直被一些大公司甚至一些國家政府支持的OSI失敗的緣由:html
學習計算機網絡時咱們通常採用折中的辦法,也就是中和OSI和TCP/IP的有點,採用一種只有五層協議的體系結構,這樣既簡潔又能將概念闡述清楚。git
結合互聯網的狀況,自上而下地,很是簡要的介紹一下各層的做用。github
應用層的任務是經過應用進程間的交互來完成特定網絡應用。應用層協議定義的是應用進程(進程:主機中正在運行的程序)間的通訊和交互的規則。對於不一樣的網絡應用須要不一樣的應用層協議。在互聯網中應用層協議不少,如域名系統DNS,支持萬維網應用的HTTP協議,支持電子郵件的SMTP協議等等。咱們把應用層交互的數據單元稱爲報文。面試
域名系統是因特網的一項核心服務,它做爲能夠將域名和IP地址相互映射的一個分佈式數據庫,可以令人更方便的訪問互聯網,而不用去記住可以被機器直接讀取的IP數串。(百度百科)例如:一個公司的Web網站可看做是它在網上的門戶,而域名就至關於其門牌地址,一般域名都使用該公司的名稱或簡稱。例如上面提到的微軟公司的域名,相似的還有:IBM公司的域名是www.ibm.com、Oracle公司的域名是www.oracle.com、Cisco公司的域名是www.cisco.com等。
超文本傳輸協議(HTTP,HyperText Transfer Protocol)是互聯網上應用最爲普遍的一種網絡協議。全部的WWW文件都必須遵照這個標準。設計HTTP最初的目的是爲了提供一種發佈和接收HTML頁面的方法。(百度百科)
運輸層的主要任務就是負責向兩臺主機進程之間的通訊提供通用的數據傳輸服務。應用進程利用該服務傳送應用層報文。「通用的」是指並不針對某一個特定的網絡應用,而是多種應用可使用同一個運輸層服務。因爲一臺主機可同時運行多個線程,所以運輸層有複用和分用的功能。所謂複用就是指多個應用層進程可同時使用下面運輸層的服務,分用和複用相反,是運輸層把收到的信息分別交付上面應用層中的相應進程。數據庫
網絡層負責爲分組交換網上的不一樣主機提供通訊服務。在發送數據時,網絡層把運輸層產生的報文段或用戶數據報封裝成分組和包進行傳送。在TCP/IP體系結構中,因爲網絡層使用IP協議,所以分組也叫IP數據報,簡稱數據報。後端
這裏要注意:不要把運輸層的「用戶數據報UDP」和網絡層的「IP數據報」弄混。另外,不管是哪一層的數據單元,均可籠統地用「分組」來表示。瀏覽器
網絡層的另外一個任務就是選擇合適的路由,使源主機運輸層所傳下來的分株,能經過網絡層中的路由器找到目的主機。緩存
這裏強調指出,網絡層中的「網絡」二字已經不是咱們一般談到的具體網絡,而是指計算機網絡體系結構模型中第三層的名稱.服務器
互聯網是由大量的異構(heterogeneous)網絡經過路由器(router)相互鏈接起來的。互聯網使用的網絡層協議是無鏈接的網際協議(Intert Prococol)和許多路由選擇協議,所以互聯網的網絡層也叫作網際層或IP層。微信
數據鏈路層一般簡稱爲鏈路層。兩臺主機之間的數據傳輸,老是在一段一段的鏈路上傳送的,這就須要使用專門的鏈路層的協議。 在兩個相鄰節點之間傳送數據時,數據鏈路層將網絡層交下來的IP數據報組裝程幀,在兩個相鄰節點間的鏈路上傳送幀。每一幀包括數據和必要的控制信息(如同步信息,地址信息,差錯控制等)。
在接收數據時,控制信息使接收端可以知道一個幀從哪一個比特開始和到哪一個比特結束。這樣,數據鏈路層在收到一個幀後,就可從中提出數據部分,上交給網絡層。
控制信息還使接收端可以檢測到所收到的幀中有偏差錯。若是發現差錯,數據鏈路層就簡單地丟棄這個出了差錯的幀,以免繼續在網絡中傳送下去白白浪費網絡資源。若是須要改正數據在鏈路層傳輸時出現差錯(這就是說,數據鏈路層不只要檢錯,並且還要糾錯),那麼就要採用可靠性傳輸協議來糾正出現的差錯。這種方法會使鏈路層的協議複雜些。
在物理層上所傳送的數據單位是比特。
物理層的做用是實現相鄰計算機節點之間比特流的透明傳送,儘量屏蔽掉具體傳輸介質和物理設備的差別。使其上面的數據鏈路層沒必要考慮網絡的具體傳輸介質是什麼。「透明傳送比特流」表示經實際電路傳送後的比特流沒有發生變化,對傳送的比特流來講,這個電路好像是看不見的。
在互聯網使用的各類協中最重要和最著名的就是TCP/IP兩個協議。如今人們常常提到的TCP/IP並不必定單指TCP和IP這兩個具體的協議,而每每表示互聯網所使用的整個TCP/IP協議族。
上面咱們對計算機網絡的五層體系結構有了初步的瞭解,下面附送一張七層體系結構圖總結一下。圖片來源:https://blog.csdn.net/yaopeng...
爲了準確無誤地把數據送達目標處,TCP協議採用了三次握手策略。
漫畫圖解:
圖片來源:《圖解HTTP》
簡單示意圖:
爲何要傳回SYN(發起一個新連接)?
接收端傳回發送端所發送的SYN是爲了告訴發送端,我接收到的信息確實就是你所發送的信號了。
傳了SYN,爲啥還要傳ACK(確認序號有效)?
雙方通訊無誤必須是二者互相發送信息都無誤。傳了SYN,證實發送方到接收方的通道沒有問題,可是接收方到發送方的通道還須要ACK信號來進行驗證。
斷開一個TCP鏈接則須要「四次揮手」:
UDP在傳送數據以前不須要先創建鏈接,遠地主機在收到UDP報文後,不須要給出任何確認。雖然UDP不提供可靠交付,但在某些狀況下UDP確是一種最有效的工做方式(通常用於即時通訊),好比: QQ語音 QQ視頻 、直播等等
TCP提供面向鏈接的服務。在傳送數據以前必須先創建鏈接,數據傳送結束後要釋放鏈接。TCP不提供廣播或多播服務。因爲TCP要提供可靠的,面向鏈接的運輸服務(TCP的可靠體如今TCP在傳遞數據以前,會有三次握手來創建鏈接,並且在數據傳遞時,有確認、窗口、重傳、擁塞控制機制,在數據傳完後,還會斷開鏈接用來節約系統資源),這一難以免增長了許多開銷,如確認,流量控制,計時器以及鏈接管理等。這不只使協議數據單元的首部增大不少,還要佔用許多處理機資源。TCP通常用於文件傳輸、發送和接收郵件、遠程登陸等場景。
百度好像最喜歡問這個問題。
打開一個網頁,整個過程會使用哪些協議
圖片來源:《圖解HTTP》
通常面試官會經過這樣的問題來考察你對計算機網絡知識體系的理解。
圖片來源:《圖解HTTP》
在HTTP/1.0中默認使用短鏈接。也就是說,客戶端和服務器每進行一次HTTP操做,就創建一次鏈接,任務結束就中斷鏈接。當客戶端瀏覽器訪問的某個HTML或其餘類型的Web頁中包含有其餘的Web資源(如JavaScript文件、圖像文件、CSS文件等),每遇到這樣一個Web資源,瀏覽器就會從新創建一個HTTP會話。
而從HTTP/1.1起,默認使用長鏈接,用以保持鏈接特性。使用長鏈接的HTTP協議,會在響應頭加入這行代碼:
Connection:keep-alive
在使用長鏈接的狀況下,當一個網頁打開完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP鏈接不會關閉,客戶端再次訪問這個服務器時,會繼續使用這一條已經創建的鏈接。Keep-Alive不會永久保持鏈接,它有一個保持時間,能夠在不一樣的服務器軟件(如Apache)中設定這個時間。實現長鏈接須要客戶端和服務端都支持長鏈接。
HTTP協議的長鏈接和短鏈接,實質上是TCP協議的長鏈接和短鏈接。
Java-Guide: Java面試通關手冊(Java學習指南)Java Interview Customs Manual (Java Study Guide)。
👉Github地址:https://github.com/Snailclimb/Java-Guide
👊文檔定位:一個專門爲Java後端工程師準備的開源文檔,相信不論你是Java新手仍是已經成爲一名Java工程師都能從這份文檔中收穫到一些東西。
關於計算機網絡基礎知識你們能夠查看(第一篇基礎知識,第二篇偏總結,都很不錯):
計算機網絡最多見的問題我以爲應該是這5個了:
很是推薦你們看一下 《圖解HTTP》 這本書,這本書頁數很少,可是內容非常充實,無論是用來系統的掌握網絡方面的一些知識仍是說純粹爲了應付面試都有很大幫助。下面的一些文章只是參考。大二學習這門課程的時候,咱們使用的教材是 《計算機網絡第七版》(謝希仁編著),不推薦你們看這本教材,書很是厚並且知識偏理論,不肯定你們能不能心平氣和的讀完。
若是想要獲取更多個人原創文章,歡迎關注個人微信公衆號:" Java面試通關手冊" 。無套路,但願能與您共同進步,互相學習。