-
超文本傳輸協議HTTP的主要特點
- 應用層協議
- 常基於TCP的連接方式
- 支持server/client模式
- 簡單快速
- 客戶端向服務端發送請求的時候,只需傳輸請求的方法(常用方法:get、post)與路徑
- 每種方法規定了客戶與服務器聯繫的類型不同
- 由於http簡單,使得http程序規模小,因而通信速度很快
- 靈活
- http允許傳輸任意類型的數據,以content-type加以標記
- 無連接
- 每次連接只處理一個請求,服務器收到客戶的請求並收到客戶的應答之後就斷開連接。
- 無狀態
- HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果後續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。
-
HTTP報文結構
- 開始行:用於區分是請求報文還是響應報文。在請求報文中,開始行叫做請求行,而在響應報文中叫做狀態行。開始行的三個字段之間都以空格間隔開、最後的"CR"和"LF"分別代表“回車”和“換行”。
- 首部行: 用來說明瀏覽器、服務器或者報文主體的一些信息。首部可以有好幾行,但也可以不使用。在每一個首部行中都有首部字段和它的值,每一行在結束的地方都要有“回車”和“換行”。整個首部行結束時,還有一空行將首部行和後邊的實體主體分開。
- 請求報文
- 請求行中方法,請求資源的URL,HTTP的版本號
- 方法 就是對所請求的對象進行的操作,實際上也是一些命令,因此,請求報文的類型是由他所採用的方法決定的
- 方法 就是對所請求的對象進行的操作,實際上也是一些命令,因此,請求報文的類型是由他所採用的方法決定的
- 請求行中方法,請求資源的URL,HTTP的版本號
Http請求行
GET後邊有一個空格,接着是完整的URL,其後邊又有一個空格,最後是HTTP/1.1
GET http://www.xyz.edu.cn/dir/index.htm HTTP/1.1
GET /dir/index.htm HTTP/1.1 請求行使用了相對URL
Host: www.xyz.edu.cn 此行是首部行的開始,這行給出了主機的域名
Connection: close 告訴服務器發送完請求的文檔後就可以釋放連接
User-Agent: Mozilla/5.0 表明用戶代理是使用火狐瀏覽器
Accept-Languag: cn 表明用戶優先得到中文版本的文檔
請求報文的最後還有一個空行
-
響應報文
響應報文的第一行就是狀態行
- 狀態行包括三項內容,Http的版本,狀態碼,以及解釋狀態碼的簡單短語
-
狀態碼
- 1xx 表示通知消息,如請求受到了或正在處理
- 2xx 表示請求已被成功接收、理解、接受
- 3xx 表示重定向,如要完成請求還必須採取進一步的行動
- 4xx 表示客戶端的差錯,如請求中有錯誤的語法不能完成或者請求無法完成
- 5xx 表示服務器的差錯,如服務器失效無法完成請求或服務器未能實現合法的請求 -
常見的狀態碼
200 成功
400 錯誤請求(請求中有語法錯誤)
401 請求需要身份驗證、狀態碼必須和WWW-Authenticate報頭域一起使用
403 服務器收到請求,但是拒絕提供服務
404 請求資源不存在,如輸入了錯誤的URL
408 請求超時
415 不支持的媒體類型
500 服務器內部錯誤
503 服務器目前無法使用,一段時間後可能恢復正常
505 HTTP版本不受支持
-
- 狀態行包括三項內容,Http的版本,狀態碼,以及解釋狀態碼的簡單短語
請求響應的步驟
- 客戶端連接web服務器
- 發送HTTP請求
- 服務器接收請求並返回HTTP響應
- 釋放TCP連接
- 客戶端瀏覽器解析HTML內容
在瀏覽器地址欄鍵入URL,按下回車之後經歷的流程
- 瀏覽器向DNS服務器請求解析該URL中的域名所對應的IP地址。
- 查找瀏覽器緩存,因爲瀏覽器一般會緩存DNS記錄一段時間,不同瀏覽器的時間可能不一樣,一般2-30分鐘不等,瀏覽器去查找這些緩存,如果有緩存,直接返回IP,否則下一步。
- 查找系統緩存:瀏覽器緩存中找不到IP之後,瀏覽器會進行系統調用(windows中是gethostbyname),查找本機的hosts文件,如果找到,直接返回IP,否則下一步。
- 查找路由器緩存:如果1,2步都查詢無果,則需要藉助網絡,路由器一般都有自己的DNS緩存,將前面的請求發給路由器,查找ISP 服務商緩存 DNS的服務器,如果查找到IP則直接返回,沒有的話繼續查找。
- 查找IPS服務器緩存:如果以上步驟還找不到,則IPS的DNS服務器就會進行遞歸查詢,所謂遞歸查詢就是如果主機所詢問的本地域名服務器不知道被查詢域名的IP地址,那麼本地域名服務器就以DNS客戶的身份,向其他根域名服務器繼續發出查詢請求報文,而不是讓該主機自己進行下一步查詢。(本地域名服務器地址是通過DHPC協議獲取地址,DHPC是負責分配IP地址的)
- 查找域名服務器緩存和頂級域名服務器緩存:本地域名服務器採用迭代查詢,它先向一個根域名服務器查詢。本地域名服務器向根域名服務器的查詢一般都是採用迭代查詢。所謂迭代查詢就是當根域名服務器收到本地域名服務器發出的查詢請求報文後,要麼告訴本地域名服務器下一步應該查詢哪一個域名服務器,然後本地域名服務器自己進行後續的查詢。(而不是替代本地域名服務器進行後續查詢)。
-
瀏覽器與目標服務器建立TCP連接
TCP的三次握手(計算機網絡(一)TCP的三次握手以及四次揮手)
-
發送HTTP請求
瀏覽器向主機發起一個HTTP-GET方法報文請求。請求中包含訪問的URL,長連接,還有User-Agent用戶瀏覽器操作系統信息,編碼等。值得一提的是Accep-Encoding和Cookies項。Accept-Encoding一般採用gzip,壓縮之後傳輸html文件。Cookies如果是首次訪問,會提示服務器建立用戶緩存信息,如果不是,可以利用Cookies對應鍵值,找到相應緩存,緩存裏面存放着用戶名,密碼和一些用戶設置項。
-
服務器處理請求並返回HTTP報文
-
瀏覽器解析響應報文並渲染界面
-
瀏覽器釋放TCP鏈接
TCP的四次揮手(計算機網絡(一)TCP的三次握手以及四次揮手)
可認爲第五步和第六步同時發生
GET和POST的區別:
- HTTP報文層面:GET將請求信息放在URL之後,以"?“分割URL和傳輸數據,參數之間以”&"相連,POST放在報文體中,想獲取信息必須解析報文。
- GET提交的數據大小有限制,最多隻能有1024字節(因爲瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限
制。- GET方式提交數據,會帶來安全問題,比如一個登錄頁面,通過GET方式提交數據時,用戶名和密碼將出現在URL上,如果頁面可以被緩存或者其他人可以訪問這臺機器,就可以從歷史記錄獲得該用戶的賬號和密碼。
- 數據庫層面:GET符合冪等性和安全性,POST不符合
- 冪等性:對數據庫的一次操作和多次操作獲得的結果是一致的則說明具有冪等性
- 安全性:對數據庫的操作沒有改變數據庫中的數據,這說明具有安全性
- GET一般用於查詢操作,一般不會改變數據庫中的值
- 其他層面:GET請求獲得的數據可以被瀏覽器緩存、被儲存、而POST不行
- 如GET請求的URL可以作爲書籤、POST不具備這個功能,緩存也是GET請求被廣泛應用的根本
Cookie和Session的區別
-
Cookie
- Cookie是由服務器發給客戶端的特殊信息,以文本的形式存放在客戶端
- 客戶端再次請求的時候,會把Cookie回發
- 服務器接收到後,會解析Cookie並動態生成與客戶端相對應的內容
-Cookie的設置以及發送過程
- 客戶端發送HTTP請求到服務端
- 服務端做出響應,其中包括Set-Cookie的頭部
- 客戶端第二次向服務端發送HTTP請求時,將帶有Cookie的頭部一併發送
- 服務端發送一個HTTP響應到客戶端
-
Session
- 服務器端的機制,在服務器上保存的信息
- 解析客戶端請求並操作session id,按需求保存狀態信息,如果此客戶端沒有session信息,則爲此客戶端創建一個與session相關的Session id
-
Cookie和Session的使用
用戶第一次請求服務器的時候,
服務器根據用戶提交的相關信息,
創建對應的Session,
請求返回時將此Session的唯一標識信息SessionID 返回給瀏覽器瀏覽器接收到服務器返回的SessionID信息後
會將此信息存入到Cookie中
同時Cookie記錄此SessionID屬於哪個域名。當用戶第二次訪問服務器的時候
請求會自動判斷此域名下是否存在Cookie信息
如果存在自動將Cookie信息也發送給服務端
服務端會從Cookie中獲取SessionID
再根據SessionID查找對應的Session信息
如果沒有找到
說明用戶沒有登錄或者登錄失效
如果找到Session
證明用戶已經登錄可執行後面的操作。 -
Cookie和Session的區別
- Cookie存放在客戶端的瀏覽器上,Session數據存放在服務器上
- Session相對於Cookie更安全
- 若考慮減輕服務器負擔,應當使用Cookie
-
HTTP和HTTPS的區別
- SSL(Security Socket Layer,安全嵌套層)
- 爲網絡通信提供安全及數據完整性的一種安全協議
- 是操作系統對外的API,SSL3.0後更名爲TLS
- 採用身份驗證和數據加密保證網絡通信的安全和數據的完整性
加密的方式
- 對稱加密:加密和解密都使用同一個密鑰
- 非對稱加密:加密使用的密鑰和解密使用的密鑰是不同的
- 哈希加密:將任意長度的信息轉換爲固定長度的值,算法不可逆(MD5)
- 數字簽名:證明某個消息或者文件是某人發出/認同的
-
HTTPS數據傳輸流程
- 瀏覽器將支持的加密算法信息發送給服務器
- 服務器選擇一套瀏覽器支持的加密算法,以證書的形式回發瀏覽器
- 瀏覽器驗證證書合法性,並結合證書公鑰加密信息發送給服務器
- 服務器使用私鑰解密信息,驗證哈希,加密響應信息回發瀏覽器
- 瀏覽器解密響應消息,並對消息進行驗真,之後進行加密交互數據
-
HTTP和HTTPS的區別
- HTTPS需要到CA申請證書,HTTP不需要
- HTTPS密文傳輸,HTTP明文傳輸
- 連接方式不同,HTTPS默認使用443端口,HTTP使用80端口
- HTTPS = HTTP + 加密 + 認證 + 完整性保護,較HTTP安全
-
HTTPS不是絕對安全
- 瀏覽器默認填充http://,請求需要跳轉,有被劫持的風險
- 可以使用HSTS優化
- SSL(Security Socket Layer,安全嵌套層)