1. 程式人生 > 實用技巧 >前端面試攻略2------計算機網路部分

前端面試攻略2------計算機網路部分

計算機網路


1.http協議

http報文解構都包含什麼(大致就是那個三部分,請求實體、請求頭、請求行這些)

http頭部資訊

從上圖可以看到,頭部資訊包括三部分:

1、通用頭部
1 Request URL:請求的URL地址
2 Request Method: 請求方法,get/post/put/……
3 Status Code:狀態碼,200 為請求成功
4 Remote Address:路由地址

2、請求頭部
 1) Accept:  告訴WEB伺服器自己接受什麼介質型別,*/* 表示任何型別,type/* 表示該型別下的所有子型別;
     2)Accept-Charset:  瀏覽器申明自己接收的字符集
     Accept-Encoding:瀏覽器申明自己接收的編碼方法,通常指定壓縮方法,是否支援壓縮,支援什麼壓縮方法  (gzip,deflate)
     3)Accept-Language:  瀏覽器申明自己接收的語言。語言跟字符集的區別:中文是語言,中文有多種字符集,比如big5,gb2312,gbk等等。
     4)Authorization:  當客戶端接收到來自WEB伺服器的 WWW-Authenticate 響應時,該頭部來回應自己的身份驗證資訊給WEB伺服器。
     5)Connection:表示是否需要持久連線。close(告訴WEB伺服器或者代理伺服器,在完成本次請求的響應後,斷開連線,
     不要等待本次連線的後續請求了)。keep-alive(告訴WEB伺服器或者代理伺服器,在完成本次請求的響應後,保持連線,等待本次連線的後續請求)。
     6)Referer:傳送請求頁面URL。瀏覽器向 WEB 伺服器表明自己是從哪個 網頁/URL 獲得/點選 當前請求中的網址/URL。
     7)User-Agent: 瀏覽器表明自己的身份(是哪種瀏覽器)。
     8)Host: 傳送請求頁面所在域。
     9)Cache-Control:瀏覽器應遵循的快取機制。
            no-cache(不要快取的實體,要求現在從WEB伺服器去取)
            max-age:(只接受 Age 值小於 max-age 值,並且沒有過期的物件) 
            max-stale:(可以接受過去的物件,但是過期時間必須小於 max-stale 值)  
            min-fresh:(接受其新鮮生命期大於其當前 Age 跟 min-fresh 值之和的快取物件)
     10)Pramga:主要使用 Pramga: no-cache,相當於 Cache-Control: no-cache。
     11)Range:瀏覽器(比如 Flashget 多執行緒下載時)告訴 WEB 伺服器自己想取物件的哪部分。
     12)Form:一種請求頭標,給定控制使用者代理的人工使用者的電子郵件地址。
     13)Cookie:這是最重要的請求頭資訊之一

3、響應頭部
1)Age:當代理伺服器用自己快取的實體去響應請求時,用該頭部表明該實體從產生到現在經過多長時間了。
      2)Accept-Ranges:WEB伺服器表明自己是否接受獲取其某個實體的一部分(比如檔案的一部分)的請求。bytes:表示接受,none:表示不接受。
      3) Cache-Control:伺服器應遵循的快取機制。
              public(可以用 Cached 內容迴應任何使用者)
              private(只能用快取內容迴應先前請求該內容的那個使用者)
              no-cache(可以快取,但是隻有在跟WEB伺服器驗證了其有效後,才能返回給客戶端) 
              max-age:(本響應包含的物件的過期時間)  
              ALL:  no-store(不允許快取)  
      4) Connection: 是否需要持久連線
              close(連線已經關閉)。
              keepalive(連線保持著,在等待本次連線的後續請求)。
              Keep-Alive:如果瀏覽器請求保持連線,則該頭部表明希望 WEB 伺服器保持連線多長時間(秒)。例如:Keep-Alive:300
      5)Content-Encoding:WEB伺服器表明自己使用了什麼壓縮方法(gzip,deflate)壓縮響應中的物件。 例如:Content-Encoding:gzip 
      6)Content-Language:WEB 伺服器告訴瀏覽器自己響應的物件的語言。
      7)Content-Length:WEB 伺服器告訴瀏覽器自己響應的物件的長度。例如:Content-Length: 26012
      8)Content-Range:WEB 伺服器表明該響應包含的部分物件為整個物件的哪個部分。例如:Content-Range: bytes 21010-47021/47022
      9)Content-Type:WEB 伺服器告訴瀏覽器自己響應的物件的型別。例如:Content-Type:application/xml
     10)Expired:WEB伺服器表明該實體將在什麼時候過期,對於過期了的物件,只有在跟WEB伺服器驗證了其有效性後,才能用來響應客戶請求。
     11) Last-Modified:WEB 伺服器認為物件的最後修改時間,比如檔案的最後修改時間,動態頁面的最後產生時間等等。
     12) Location:WEB 伺服器告訴瀏覽器,試圖訪問的物件已經被移到別的位置了,到該頭部指定的位置去取。
     13)Proxy-Authenticate: 代理伺服器響應瀏覽器,要求其提供代理身份驗證資訊。
     14)Server: WEB 伺服器表明自己是什麼軟體及版本等資訊。
     15)Refresh:表示瀏覽器應該在多少時間之後重新整理文件,以秒計。
4、查詢字串引數

當在瀏覽器輸入一個網址後,實際會發生什麼?

1、輸入網址。
2、瀏覽器查詢域名的IP地址。
導航的第一步是通過訪問的域名找出其IP地址。DNS查詢過程如下:

1)瀏覽器快取 – 瀏覽器會快取DNS記錄一段時間。 有趣的是,作業系統沒有告訴瀏覽器儲存DNS記錄的時間,這樣不同瀏覽器會儲存個自固定的一個時間(2分鐘到30分鐘不等)。
2)系統快取 – 如果在瀏覽器快取裡沒有找到需要的記錄,瀏覽器會做一個系統呼叫(windows裡是gethostbyname)。這樣便可獲得系統快取中的記錄。
3)路由器快取 – 接著,前面的查詢請求發向路由器,它一般會有自己的DNS快取。
4)ISP DNS 快取 – 接下來要check的就是ISP快取DNS的伺服器。在這一般都能找到相應的快取記錄。

3. 瀏覽器給web伺服器傳送一個HTTP請求

4. 網站服務的永久重定向響應

伺服器給瀏覽器響應一個301永久重定向響應,為什麼伺服器一定要重定向而不是直接發會使用者想看的網頁內容呢?其中一個原因跟搜尋引擎排名有關。如果一個頁面有兩個地址,就像http://www.igoro.com/ 
和http://igoro.com/,搜尋引擎會認為它們是兩個網站,結果造成每一個的搜尋連結都減少從而降低排名。而搜尋引擎知道301永久重定向是什麼意思,這樣就會把訪問帶www的和不帶www的地址歸到同一個網站排名下。還有一個是用不同的地址會造成快取友好性變差。當一個頁面有好幾個名字時,它可能會在快取裡出現好幾次。

5. 瀏覽器跟蹤重定向地址

現在,瀏覽器知道了要訪問的正確地址,所以它會發送另一個獲取請求。請求頭部一般包括:
   Accept
   Accept-language
   Accept-Encoding
   Connection
   User-Agent
   Cookie
   Host

6. 伺服器“處理”請求

伺服器接收到獲取請求,然後處理並返回一個響應。
7. 伺服器發回一個HTML響應
8. 瀏覽器開始顯示HTML
9. 瀏覽器傳送請求,以獲取嵌入在HTML中的物件

在瀏覽器顯示HTML時,它會注意到需要獲取其他地址內容的標籤。這時,瀏覽器會發送一個獲取請求來重新獲得這些檔案。這些檔案就包括CSS/JS/圖片等資源,這些資源的地址都要經歷一個和HTML讀取類似的過程。所以瀏覽器會在DNS中查詢這些域名,傳送請求,重定向等等…

10. 瀏覽器傳送非同步(AJAX)請求

http協議常用的狀態碼

HTTP響應碼響應碼由三位十進位制數字組成,它們出現在由HTTP伺服器傳送的響應的第一行。
響應碼分五種型別,由它們的第一位數字表示:
1xx:資訊,請求收到,繼續處理
2xx:成功,行為被成功地接受、理解和採納
3xx:重定向,為了完成請求,必須進一步執行的動作
4xx:客戶端錯誤,請求包含語法錯誤或者請求無法實現
5xx:伺服器錯誤,伺服器不能實現一種明顯無效的請求

快取欄位和200、404、304之類非常常用的狀態碼一定要記住。

GET和POST的區別

1、GET提交的資料會放在URL之後,以?分割URL和傳輸資料,引數之間以&相連,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的資料放在HTTP包的Body中。
2、GET提交的資料大小有限制,最多隻能有1024位元組(因為瀏覽器對URL的長度有限制),而POST方法提交的資料沒有限制。
3、GET方式需要使用Request.QueryString來取得變數的值,而POST方式通過Request.Form來獲取變數的值。
4、GET方式提交資料,會帶來安全問題,比如一個登入頁面,通過GET方式提交資料時,使用者名稱和密碼將出現在URL上,如果頁面可以被快取或者其他人可以訪問這臺機器,就可以從歷史記錄獲得該使用者的賬號和密碼。

GET- 向特定的資源發出請求。注意:GET方法不應當被用於產生“副作用”的操作中,例如在web app.中。其中一個原因是GET可能會被網路蜘蛛等隨意訪問。
POST- 向指定資源提交資料進行處理請求(例如提交表單或者上傳檔案)。資料被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。
PUT- 向指定資源位置上傳其最新內容。
DELETE- 請求伺服器刪除Request-URI所標識的資源。

Cookie和Session有以下明顯的不同點

1)Cookie將狀態儲存在客戶端,Session將狀態儲存在伺服器端;
2)Cookies是伺服器在本地機器上儲存的小段文字並隨每一個請求傳送至同一個伺服器。Cookie最早在RFC2109中實現,後續RFC2965做了增強。網路伺服器用HTTP頭向客戶端傳送cookies,在客戶終端,瀏覽器解析這些cookies並將它們儲存為一個本地檔案,它會自動將同一伺服器的任何請求縛上這些cookies。Session並沒有在HTTP的協議中定義;
3)Session是針對每一個使用者的,變數的值儲存在伺服器上,用一個sessionID來區分是哪個使用者session變數,這個值是通過使用者的瀏覽器在訪問的時候返回給伺服器,當客戶禁用cookie時,這個值也可能設定為由get來返回給伺服器;
4)就安全性來說:當你訪問一個使用session 的站點,同時在自己機子上建立一個cookie,建議在伺服器端的SESSION機制更安全些。因為它不會任意讀取客戶儲存的資訊。

http頭部關於快取的欄位

http和https的區別

超文字傳輸協議HTTP協議被用於在Web瀏覽器和網站伺服器之間傳遞資訊,HTTP協議以明文方式傳送內容,不提供任何方式的資料加密,如果攻擊者截取了Web瀏覽器和網站伺服器之間的傳輸報文,就可以直接讀懂其中的資訊,因此,HTTP協議不適合傳輸一些敏感資訊,比如:信用卡號、密碼等支付資訊。

  為了解決HTTP協議的這一缺陷,需要使用另一種協議:安全套接字層超文字傳輸協議HTTPS,為了資料傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證伺服器的身份,併為瀏覽器和伺服器之間的通訊加密。

一、HTTP和HTTPS的基本概念

  HTTP:是網際網路上應用最為廣泛的一種網路協議,是一個客戶端和伺服器端請求和應答的標準(TCP),用於從WWW伺服器傳輸超文字到本地瀏覽器的傳輸協議,它可以使瀏覽器更加高效,使網路傳輸減少。

  HTTPS:是以安全為目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。

  HTTPS協議的主要作用可以分為兩種:一種是建立一個資訊保安通道,來保證資料傳輸的安全;另一種就是確認網站的真實性。

二、HTTP與HTTPS有什麼區別?

  HTTP協議傳輸的資料都是未加密的,也就是明文的,因此使用HTTP協議傳輸隱私資訊非常不安全,為了保證這些隱私資料能加密傳輸,於是網景公司設計了SSL(Secure Sockets Layer)協議用於對HTTP協議傳輸的資料進行加密,從而就誕生了HTTPS。簡單來說,HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,要比http協議安全。

  HTTPS和HTTP的區別主要如下:

  1、https協議需要到ca申請證書,一般免費證書較少,因而需要一定費用。

  2、http是超文字傳輸協議,資訊是明文傳輸,https則是具有安全性的ssl加密傳輸協議。

  3、http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443。

  4、http的連線很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比http協議安全。

三、HTTPS的工作原理

  我們都知道HTTPS能夠加密資訊,以免敏感資訊被第三方獲取,所以很多銀行網站或電子郵箱等等安全級別較高的服務都會採用HTTPS協議。

 客戶端在使用HTTPS方式與Web伺服器通訊時有以下幾個步驟,如圖所示。

  (1)客戶使用https的URL訪問Web伺服器,要求與Web伺服器建立SSL連線。

  (2)Web伺服器收到客戶端請求後,會將網站的證書資訊(證書中包含公鑰)傳送一份給客戶端。

  (3)客戶端的瀏覽器與Web伺服器開始協商SSL連線的安全等級,也就是資訊加密的等級。

  (4)客戶端的瀏覽器根據雙方同意的安全等級,建立會話金鑰,然後利用網站的公鑰將會話金鑰加密,並傳送給網站。

  (5)Web伺服器利用自己的私鑰解密出會話金鑰。

  (6)Web伺服器利用會話金鑰加密與客戶端之間的通訊。

四、HTTPS的優點

  儘管HTTPS並非絕對安全,掌握根證書的機構、掌握加密演算法的組織同樣可以進行中間人形式的攻擊,但HTTPS仍是現行架構下最安全的解決方案,主要有以下幾個好處:

  (1)使用HTTPS協議可認證使用者和伺服器,確保資料傳送到正確的客戶機和伺服器;

  (2)HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,要比http協議安全,可防止資料在傳輸過程中不被竊取、改變,確保資料的完整性。

  (3)HTTPS是現行架構下最安全的解決方案,雖然不是絕對安全,但它大幅增加了中間人攻擊的成本。

  (4)谷歌曾在2014年8月份調整搜尋引擎演算法,並稱“比起同等HTTP網站,採用HTTPS加密的網站在搜尋結果中的排名將會更高”。

五、HTTPS的缺點

  雖然說HTTPS有很大的優勢,但其相對來說,還是存在不足之處的:

  (1)HTTPS協議握手階段比較費時,會使頁面的載入時間延長近50%,增加10%到20%的耗電;

  (2)HTTPS連線快取不如HTTP高效,會增加資料開銷和功耗,甚至已有的安全措施也會因此而受到影響;

  (3)SSL證書需要錢,功能越強大的證書費用越高,個人網站、小網站沒有必要一般不會用。

  (4)SSL證書通常需要繫結IP,不能在同一IP上繫結多個域名,IPv4資源不可能支撐這個消耗。

  (5)HTTPS協議的加密範圍也比較有限,在黑客攻擊、拒絕服務攻擊、伺服器劫持等方面幾乎起不到什麼作用。最關鍵的,SSL證書的信用鏈體系並不安全,特別是在某些國家可以控制CA根證書的情況下,中間人攻擊一樣可行。

六、http切換到HTTPS

  如果需要將網站從http切換到https到底該如何實現呢?

這裡需要將頁面中所有的連結,例如js,css,圖片等等連結都由http改為https。例如:http://www.baidu.com改為https://www.baidu.com

  BTW,這裡雖然將http切換為了https,還是建議保留http。所以我們在切換的時候可以做http和https的相容,具體實現方式是,去掉頁面連結中的http頭部,這樣可以自動匹配http頭和https頭。例如:將http://www.baidu.com改為//www.baidu.com。然後當用戶從http的入口進入訪問頁面時,頁面就是http,如果使用者是從https的入口進入訪問頁面,頁面即使https的。

http1.0和http1.1和http 2.0 大致的區別

HTTP1.0和HTTP1.1的一些區別

HTTP1.0最早在網頁中使用是在1996年,那個時候只是使用一些較為簡單的網頁上和網路請求上,而HTTP1.1則在1999年才開始廣泛應用於現在的各大瀏覽器網路請求中,同時HTTP1.1也是當前使用最為廣泛的HTTP協議。 主要區別主要體現在:

  1. 快取處理,在HTTP1.0中主要使用header裡的If-Modified-Since,Expires來做為快取判斷的標準,HTTP1.1則引入了更多的快取控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供選擇的快取頭來控制快取策略。

  2. 頻寬優化及網路連線的使用,HTTP1.0中,存在一些浪費頻寬的現象,例如客戶端只是需要某個物件的一部分,而伺服器卻將整個物件送過來了,並且不支援斷點續傳功能,HTTP1.1則在請求頭引入了range頭域,它允許只請求資源的某個部分,即返回碼是206(Partial Content),這樣就方便了開發者自由的選擇以便於充分利用頻寬和連線。

  3. 錯誤通知的管理,在HTTP1.1中新增了24個錯誤狀態響應碼,如409(Conflict)表示請求的資源與資源的當前狀態發生衝突;410(Gone)表示伺服器上的某個資源被永久性的刪除。

  4. Host頭處理,在HTTP1.0中認為每臺伺服器都繫結一個唯一的IP地址,因此,請求訊息中的URL並沒有傳遞主機名(hostname)。但隨著虛擬主機技術的發展,在一臺物理伺服器上可以存在多個虛擬主機(Multi-homed Web Servers),並且它們共享一個IP地址。HTTP1.1的請求訊息和響應訊息都應支援Host頭域,且請求訊息中如果沒有Host頭域會報告一個錯誤(400 Bad Request)。

  5. 長連線,HTTP 1.1支援長連線(PersistentConnection)和請求的流水線(Pipelining)處理,在一個TCP連線上可以傳送多個HTTP請求和響應,減少了建立和關閉連線的消耗和延遲,在HTTP1.1中預設開啟Connection: keep-alive,一定程度上彌補了HTTP1.0每次請求都要建立連線的缺點。

HTTP2.0和HTTP1.X相比的新特性

  • 新的二進位制格式(Binary Format),HTTP1.x的解析是基於文字。基於文字協議的格式解析存在天然缺陷,文字的表現形式有多樣性,要做到健壯性考慮的場景必然很多,二進位制則不同,只認0和1的組合。基於這種考慮HTTP2.0的協議解析決定採用二進位制格式,實現方便且健壯。

  • 多路複用(MultiPlexing),即連線共享,即每一個request都是是用作連線共享機制的。一個request對應一個id,這樣一個連線上可以有多個request,每個連線的request可以隨機的混雜在一起,接收方可以根據request的 id將request再歸屬到各自不同的服務端請求裡面。

  • header壓縮,如上文中所言,對前面提到過HTTP1.x的header帶有大量資訊,而且每次都要重複傳送,HTTP2.0使用encoder來減少需要傳輸的header大小,通訊雙方各自cache一份header fields表,既避免了重複header的傳輸,又減小了需要傳輸的大小。

  • 服務端推送(server push),同SPDY一樣,HTTP2.0也具有server push功能。

2.tcp的三次握手和四次揮手

建立連線要三次握手,釋放連線要四次握手

ACK : TCP協議規定,只有ACK=1時有效,也規定連線建立後所有傳送的報文的ACK必須為1
SYN(SYNchronization) : 在連線建立時用來同步序號。當SYN=1而ACK=0時,表明這是一個連線請求報文。對方若同意建立連線,則應在響應報文中使SYN=1和ACK=1. 因此, SYN置1就表示這是一個連線請求或連線接受報文。
FIN (finis):完,終結的意思, 用來釋放一個連線。當 FIN = 1 時,表明此報文段的傳送方的資料已經發送完畢,並要求釋放連線。

三次握手,兩次確認。
首先由Client發出請求連線,即 SYN=1 ACK=0, TCP規定SYN=1時不能攜帶資料,但要消耗一個序號,因此宣告自己的序號是 seq=x
然後 Server 進行回覆確認,即 SYN=1 ACK=1 seq=y, ack=x+1,
再然後 Client 再進行一次確認,但不用SYN 了,這時即為 ACK=1, seq=x+1, ack=y+1.然後連線建立。

3.udp和tcp的比較

TCP與UDP區別總結:

1、TCP面向連線(如打電話要先撥號建立連線);UDP是無連線的,即傳送資料之前不需要建立連線

2、TCP提供可靠的服務。也就是說,通過TCP連線傳送的資料,無差錯,不丟失,不重複,且按序到達;UDP盡最大努力交付,即不保證可靠交付

3、TCP面向位元組流,實際上是TCP把資料看成一連串無結構的位元組流;UDP是面向報文的。UDP沒有擁塞控制,因此網路出現擁塞不會使源主機的傳送速率降低(對實時應用很有用,如IP電話,實時視訊會議等)

4、每一條TCP連線只能是點到點的;UDP支援一對一,一對多,多對一和多對多的互動通訊

5、TCP首部開銷20位元組;UDP的首部開銷小,只有8個位元組
6、TCP的邏輯通訊通道是全雙工的可靠通道,UDP則是不可靠通道