1. 程式人生 > >應用層層面面試題匯總

應用層層面面試題匯總

規則 理解 control 可靠的 ssl協議 文件 定向 信息 orien

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個字符

應用層層面面試題匯總