應用層層面面試題匯總
1.什麽是http協議?
http協議是超文本傳送協議,是客戶端與服務器端間請求與響應的一套標準,即規則與格式。
http協議是無連接的,無狀態的,所謂無連接,是指客戶端和服務器端之間的通信不需要事先建立連接,所謂無狀態,是指服務器不會保存訪問服務器的客戶信息,同一個客戶兩次訪問同一個頁面,服務器的響應與第一次響應相同,一旦數據交換完畢,客戶端與服務器端連接就會關閉,再次交換數據需要建立新的連接,這意味著服務器無法從連接上跟蹤會話
2.http協議與https協議的區別?
https協議就是安全版的http協議,是在http協議的基礎上添加上了ssl協議來對傳輸內容進行加密,因此https=http+ssl
3.https協議的工作原理?
https的工作步驟如下
*url訪問頁面,要求與服務器建立ssl連接
*服務器接收請求,返回公鑰給客戶端
*客戶端與服務器協商安全等級,即加密等級
*客戶端與服務器建立會話密鑰,通過公鑰來加密會話密鑰
*服務器根據自己的私鑰來解密出會話密鑰
*服務器就使用會話密鑰來加密客戶端之間的通信
這裏,會話密鑰是客戶端和服務器之間通信的真正鑰匙。生成會話密鑰需要服務器生成的公鑰與私鑰,公鑰是用來裝會話密鑰的盒子,私鑰用來打開這個盒子。
4.TCP三次握手的過程
(1)第一次握手:客戶端首先向服務器端發出數據包,並將syn置為1,生成一個隨機值seq=j,然後客戶端等待服務器端的確認
(2)第二次握手:服務器端得到數據包後,根據syn=1得知客戶端請求建立TCP連接。將syn置1,ack=j+1(用來確認已經收到數據包,並表示希望接下來收到的數據包序列號為j+1),ACK=1,再隨機生成一個值seq=k,並將該數據包發送給客戶端
(3)第三次握手:客戶端得到服務器端的數據包後,檢查數據包數據後再次向服務器端發送數據包,將syn置1,ack=k+1,ACK=1,隨機生成一個值seq,發送給服務器端,服務器端接收數據包後,再次檢查數據,檢查完後,三次握手完成,雙方建立連接
三次握手的過程
三次握手每一次握手可以確認的信息:
(1)第一次握手:服務器端只可以知道自己能夠接收客戶端的消息
(2)第二次握手:客戶端知道自己發送的消息可以被服務器端接收到,以及自己可以接收到服務器端的信息
(3)第三次握手:服務器確認客戶端接收到了自己的信息
5.UDP與TCP的區別
(1)TCP是面向連接的,UDP是無連接的,也就是說在發送數據前,客戶端與服務器端不需要先建立連接
(2)TCP提供可靠的服務,UDP提供盡最大努力交付的服務。因此TCP傳輸的數據不會出現丟失,重復等情況,但是UDP則可能會導致數據丟失,失序
(3)TCP是面向字節流的,UDP面向報文,網絡出現擁堵時不會使得發送速率降低(對實時的應用比如視頻會議等會出現丟包的情況)
(4)TCP連接是1對1,而UDP支持1對1,1對多
(5)TCP的首部較大為20字節,UDP為8字節
6.Cookie與Session的基本概念
(1)Cookie:HTTP協議是無狀態的,不會記錄用戶的信息,因此在用戶登錄,以及用戶登錄之後的請求都需要使用一定的方式來標記用戶的身份,這個方式就是Cookie,Cookie由客戶端第一次請求服務器時,由服務器生成,並放在響應中返回給客戶端,客戶端的瀏覽器會保存這個響應中的Cookie作為用戶的身份識別,在以後的客戶端請求中,請求都會在響應頭中放上這個Cookie值,發送到服務器與服務器持有的數據進行比對,就可以判斷這個用戶是誰了。Cookie的存儲大小有限,最多只有4KB,且因為存儲在本地,所以容易被攻擊
(2)Session與Cookie作用相近,也是用於存儲用戶的信息,但是Session一般是用於記錄用戶的行為,而不是用戶的身份認證,比如說記錄用戶的購物車中添加了幾件商品。Session是一種存放在服務器中的一種用來存放用戶數據的類HashTable結構。瀏覽器第一次發送請求的時候,服務器自動生成了HashTable和session_id來唯一標識這個HashTable,並將其通過響應發送到瀏覽器中。第二次發送請求,則會將前一次服務器響應中的session_id一並發送到服務器上,服務器再從請求中提取出session_id,與所有的session_id進行比較
可以看到Session和Cookie的工作原理是相當相似的,這是因為我們經常是將兩者結合起來來使用。
Session是在服務器保存的一個數據結構,用來跟蹤用戶的狀態,這個數據可以保存在集群、數據庫、文件中;而Cookie是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息,也是實現Session的一種方式。
Cookie通常用來存儲session_id,然後具體的數據保存在session的數據結構中,如果用戶已經登錄,服務器會在cookie中保存一個session_id,等到下次再次請求的時候,會把該session_id攜帶上來,服務器根據session_id在session庫中獲取用戶的session數據。就能知道該用戶到底是誰,以及之前保存的一些狀態信息。Cookie具有不可跨域性
7.什麽是RESTFUL
簡單講就是用URL定位資源,用HTTP描述操作。Rest即representational state transfer(表象性狀態轉變)。Rest是一種架構風格,其主要原則是:
(1)網絡上的所有事物都被抽象為資源
(2)每個資源都有一個唯一的資源標識符
(3)同一個資源具有多種表現形式(xml,json等)
(4)所有的操作都是無狀態的
(5)符合REST原則的架構方式則可稱為RESTFUL。RESTFUL中文就是REST式的
RESTFUL接口常用的方式是get和post,調用RESTFUL接口是通過url的方式來訪問後端的代碼
8.Cookie是否會被覆蓋,localStorage是否會被覆蓋?
Cookie是可以覆蓋的,只要把同名Cookie寫入,就會覆蓋原先的Cookie。如果要刪除某個Cookie,只需要新建一個同名的Cookie,並將maxAge設置為0,並添加到response中覆蓋原先的Cookie,註意maxAge要設置為0而不是負數,負數代表其他意思,如果設置為負值,則為瀏覽器進程Cookie(在內存中保存),關閉瀏覽器才會失效,設置為0,立即刪除
9.如何保持登錄狀態?
把登錄信息如賬號、密碼等保存在Cookie中,並控制Cookie的有效期,下次訪問時再驗證Cookie中的登錄信息即可。
保存登錄信息的方案有多種,最直接的是把用戶名和密碼都保持在Cookie中,下次 訪問時檢查Cookie中的用戶名與密碼,與數據庫直接比較,但是這種方式非常危險,一般不把密碼等重要信息保存到Cookie中,而且,也有一些用戶會關閉Cookie的使用。另一種比較安全的方法是把加密後的密碼保存到Cookie,解密後在與數據庫比較
10.304是什麽意思?
304是指請求資源沒有修改,可以直接使用瀏覽器緩存
11.強緩存與協商緩存的命中和管理
(1)瀏覽器加載資源,首先根據資源內的http header來判斷是否命中強緩存,如果命中強緩存,則直接從瀏覽器緩存中讀取資源,不會發請求到服務器
(2)加入強緩存沒有命中,瀏覽器就會發送一個請求到服務器,通過服務器來判斷資源是否命中協商緩存,如果命中協商緩存,這個請求就會返回,但服務器不會返回資源,它會告知瀏覽器,資源沒有改變,直接從瀏覽器緩存中讀取資源
(3)強緩存和協商緩存的共同之處在於,兩者都從自己瀏覽器緩存中去加載資源,但是強緩存不發送請求到服務器,而協商緩存則發送請求到服務器
(4)當強緩存,協商緩存都沒有命中,直接從服務器加載資源數據
*當ctrl+f5強制刷新網頁時,直接從服務器中加載,跳過強緩存和協商緩存
而按f5刷新網頁時,則跳過強緩存,但是會檢查協商緩存
1.強緩存:如何判斷命中強緩存?以及強緩存的原理
當查看返回http狀態為200,並且chrome開發者工具中的network中size顯示from cache,即為命中強緩存
強緩存是利用http中的兩個header來實現的:Expires或Cache-Control,前者使用的是絕對時間,後者是相對時間
Expires:表示資源過期時間的header,由服務器返回,時間格式為GMT,如:Sat,4 Aug 2018 16:32:33 GMT
當瀏覽器第一次請求資源,服務器再返回資源的同時,在response header中加上Expires header。
瀏覽器接受該資源後,將資源連同所有header一起緩存下來,因此強緩存中的header不是服務器返回的,而是從緩存中讀取來的,所以返回的status狀態自然為200成功
瀏覽器第二次請求資源時,則從緩存中尋找這個資源,找到後,將它的Expires跟當前的請求時間比較,如果Expires還沒過期,則直接讀取這個資源,命中緩存,否則不行
Cache-Control:由於Expires使用的是GMT這種絕對時間,因此在客戶端和服務器端時間相差較大時,緩存就容易出問題,Cache-Control是相對時間,如:Cache-Control:max-age=315360000
Cache-Control的原理和Expires相似,只是在判斷有效期是否過期的時候,會將Cache-Control設定的有效期拿出算得資源過期時間,再將資源過期時間與請求時間進行比較
2.協商緩存的原理
假如協商緩存命中,請求響應返回的http狀態為304並且會顯示一個Not Modified的字符串,這就表明,命中了協商緩存。
協商緩存利用的Last-Modified,If-Modified-Since以及ETag、If-None-Match這兩對Header來管理的
瀏覽器首次請求資源時,服務器返回資源同時會返回加有Last-Modified的header的response,Last-Modified表示這個資源最後一次修改的時間
再次請求資源時,瀏覽器則在請求的header中添加If-Modified-Since,它的值是上一次請求中Last-Modified的值。當服務器收到資源請求時,根據瀏覽器傳過來的If-Modified-Since和服務器上的最後修改時間來判斷資源是否有變化,沒有則返回304,有則正常返回資源內容。
ETag、If-None-Match與Last-Modified,If-Modified-Since的原理類似,只是ETag是一個隨機的唯一標識,而不是時間,只要資源有變化這個標識就不同
12.HTTP請求和響應的消息結構?
請求消息結構:
包括一個請求行,若幹消息頭,以及實體內容。其中的消息頭和實體內容部分可選,消息頭和實體內容之間用空行隔開
響應消息結構:
包括狀態行,若幹消息頭,以及實體內容。其中的消息頭和實體內容可選,消息頭和實體內容用空行隔開
13.http響應常見狀態碼:
1XX:表示成功接收請求,要求客戶端繼續提交下一次請求才能完成整個處理過程
2XX:表示成果接收請求並已完成整個處理過程.常見的狀態有200
3XX:為完成請求,客戶需進一步細化需求:例如:請求的資源已經移動一個新地址,常用302(重定向),307和304(拿緩存)
4XX:客戶端的請求有錯誤,包括語法錯誤或者不能正確執行.常用404(請求的資源在web服務器中沒有)403(服務器拒絕訪問,權限不夠)
5XX:服務器出現錯誤
常用狀態碼具體含義:
200:正常
302/307:臨時重定向,請求的文檔已被臨時移動到別處,此文檔的新的url在location響應頭中給出
304:未修改,表示客戶機緩存的版本是最新的,客戶機應該繼續使用它
403:禁止,服務器理解客戶端請求,但拒絕處理它,通常用於服務器上文件或目錄的權限設置所致
404:找不到
500:服務器錯誤
14.請列舉三種禁止瀏覽器緩存的頭字段,並寫出相應的設置值
1.Expires:告訴瀏覽器 把回送的資源保存多長時間,設置為-1或是0是不緩存
2.Cache-Control:no-cache
3.pragma:no-cache
15.簡述http1.0與http1.1的區別
http1.0對於每個鏈接都得建立一次連接,一次只能傳送一個請求和響應,之後請求就會關閉。而http1.1在一次連接中,可以多次請求和響應,多個請求重疊和同時進行。http1.1比http1.0要有更多狀態碼以及請求頭,比如ETag或者Cache-Control
16.js異步的方法(promise,generator,async)
js語言的執行環境是單線程,一次只能完成一個任務,如果有多個任務則需要排隊,於是,js將任務的執行模式分為兩種:同步和異步,同步就是後一段等前一個任務執行結束後再執行,異步模式則是:每一個任務都有一個回調函數,前一個任務結束後,不是執行後一個任務,而是執行回調函數,後一個任務則是不等前一個任務執行完畢就執行,所以程序的執行順序與任務的排序順序是不一致的,異步的
異步的方法:
1.回調函數
2.事件監聽:采用事件驅動模式,任務的執行不取決於代碼的順序,而取決於某個事件是否發生
3.觀察者模式
4.promise對象:每一個異步任務返回一個promise對象,該對象有一個then方法,允許指定回調函數
17.get和post的區別
1.get向服務器獲取資源,post向服務器發送數據
2.get會把查詢字符串的參數追加到url的末尾,post請求則把數據作為請求的主體來提交,可以包含非常多的數據,因此客戶可以看到get提交的
參數,post則不可以
3.因為get請求提交的數據直接加載url末尾,所以有大小限制,而post則沒有
4.post比get安全性高
5.對於get方式,服務器端有Request.QueryString來獲取變量的值,對於post方式,服務器用Request.Form來獲取提交的數據
6.get形式的url對搜索引擎更加友好,可以提高搜索引擎排名。而post甚至會阻止爬蟲和搜索引擎的訪問。
18.使用get和post的情況
若符合下列任一情況則用post方法:
1.請求的結果有持續性的影響改變,比如向數據庫內添加新的數據行
2.表單收集的數據過多,若使用get方式會使url過長
3.要傳送的數據不是采用7位的ASCII編碼
若符合下列任一情況,則用get方法:
1.請求是為了查找資源,表單的數據只是用來幫助搜索
2.請求結果無持續性的影響改變
3.收集的數據及HTML表單內的輸入字段名稱的總長不超過1024個字符
應用層層面面試題匯總