HTTP協議是構建在TCP/IP協議之上的,是TCP/IP協議的一個子集,因此要理解HTTP協議,有必要先了解下TCP/IP協議相關的知識。 因爲TCP/IP協議族包含衆多的協議,在這裏咱們沒法一一討論。接下來,咱們僅介紹理解HTTP協議須要掌握的TCP/IP協議族的一些相關知識點。若是想深刻理解TCP/IP協議,能夠參考經典書籍《TCP/IP詳解》。css
- 客戶端和服務端都須要直到各自可收發,所以須要TCP的三次握手。
從圖片能夠獲得三次握手能夠簡化爲:A發起請求鏈接B確認,也發起鏈接A確認咱們再看看每次握手的做用: ![]()
第一次握手:B只能夠確認本身能夠接受A發送的報文段、:SYN=1的報文段不能攜帶數據,但消耗一個序號
第二次握手:A能夠確認 B收到了本身發送的報文段,而且能夠確認 本身能夠接受B發送的報文段、:二次握手時分配服務器端的資源
第三次握手:B能夠確認A收到了本身發送的報文段:ACK報文段能夠攜帶數據,不攜帶數據則不消耗序號。三次握手時分配客戶端的資源
SYN洪泛攻擊: SYN攻擊就是Client在短期內僞造大量不存在的IP地址,並向Server不斷地發送SYN包,Server則回覆確認包,並等待Client確認,因爲源地址不存在,所以Server須要不斷重發直至超時,這些僞造的SYN包將長時間佔用未鏈接隊列,致使正常的SYN請求由於隊列滿而被丟棄,從而引發網絡擁塞甚至系統癱瘓。
防範SYN攻擊措施:下降主機的等待時間使主機儘快的釋放半鏈接的佔用,短期受到某IP的重複SYN則丟棄後續請求。
- 客戶端主動要求斷開鏈接,服務端把要發送的數據發送完,被動關閉鏈接,因此須要四次揮手
第一次揮手:A的應用進程先向其TCP發出鏈接釋放報文段(FIN=1,序號seq=u) ![]()
第二次揮手:B收到鏈接釋放報文段後即發出確認報文段,(ACK=1,確認號ack=u+1,序號seq=v)
第三次揮手:B沒有要向A發出的數據,B發出鏈接釋放報文段(FIN=1,ACK=1,序號seq=w,確認號ack=u+1)
第四次揮手A收到B的鏈接釋放報文段後,對此發出確認報文段(ACK=1,seq=u+1,ack=w+1)
- TCP是面向鏈接的,UDP是無鏈接的即發送數據前不須要先創建連接。
- TCP提供可靠的服務。也就是說,經過TCP鏈接傳送的數據,無差錯,不丟失,不重複,且按序到達;而且由於tcp可靠,面向鏈接,不會丟失數據所以適合大數據量的交換。UDP盡最大努力交付,即不保證可靠交付。
- TCP是面向字節流,UDP面向報文,而且網絡出現擁塞不會使得發送速率下降(所以會出現丟包,對實時的應用好比IP電話和視頻會議等)。
- TCP只能是1對1的,UDP支持1對1,1對多。
- TCP的首部較大爲20字節,而UDP只有8字節。
- TCP是面向鏈接的可靠性傳輸,而UDP是不可靠的。
TCP是面向鏈接的,TCP經過三次握手的方式創建鏈接,而且有ACK機制保證傳輸的可靠性。html
因爲通訊過程的不可靠性,傳輸的數據不可避免的會出現丟失、延遲、錯誤、重複等各類情況,TCP協議爲解決這些問題設計了一系列機制。 這個機制的核心,就是發送方向接收方發送數據後,接收方要向發送方發送ACK(回執)。若是發送方沒接收到正確的ACK,就會從新發送數據直到接收到ACK爲止。前端
數據的傳送過程當中極可能出現接收方來不及接收的狀況,這時就須要對發送方進行控制以避免數據丟失。
利用滑動窗口機制能夠很方便地在TCP鏈接上對發送方的流量進行控制。TCP的窗口單位是字節,不是報文段,發送方的發送窗口不能超過接收方給出的接收窗口的數值。web
擁塞控制是防止過多的數據注入到網絡中,可使網絡中的路由器或鏈路不致過載,是一個全局性的過程。
流量控制是點對點通訊量的控制,是一個端到端的問題,主要就是抑制發送端發送數據的速率,以便接收端來得及接收面試
咱們假定: 數據單方向傳送,而另一個方向只傳送確認。
接收方老是有足夠大的緩存空間,由於發送窗口的大小由網絡的擁塞程度來決定。
算法
發送方的發送窗口的上限值應當取爲接收方窗口rwnd和擁塞窗口cwnd這兩個變量中較小的一個,即發送窗口的上限值爲Min[rwnd, cwnd]瀏覽器
當rwnd < cwnd時,是接收方的接收能力限制發送窗口的最大值
當cwnd < rwnd時,則是網絡的擁塞限制發送窗口的最大值緩存
擁塞控制的過程一共涉及了4種算法: 慢啓動 擁塞避免 快重傳 快恢復 本文只介紹其中一種算法慢啓動算法,其餘算法各位看官可自行百度。安全
發送方維護一個擁塞窗口cwnd的狀態變量,擁塞窗口的大小取決於網絡的擁塞程度,動態變化。經過逐漸增長cwnd的大小來探測可用的網絡容量,防止鏈接開始時採用不合適的發送量致使網絡擁塞。
當主機開始發送數據時,若是經過較大的發送窗口當即將所有數據字節都注入到網絡中,因爲不清楚網絡情況,有可能引發網絡擁塞。較好的方法是試探,從小到大逐漸增大發送端擁塞窗口的cwnd數值。服務器
例如:開始發送方先設置cwnd=1,發送第一個報文段M1,接收方接收到M1後,ACK返回給發送端,發送端將cwnd增長到2,接着發送方發送M2,再次接受到ACK後將cwnd增長到4...慢啓動算法每通過一個傳輸輪次,擁塞窗口cwnd就加倍。
- 客戶使用https url訪問服務器,則要求web 服務器創建ssl連接。
- web服務器接收到客戶端的請求以後,會將網站的證書(證書中包含了公鑰),返回或者說傳輸給客戶端。
- 客戶端和web服務器端開始協商SSL連接的安全等級,也就是加密等級。
- 客戶端瀏覽器經過雙方協商一致的安全等級,創建會話密鑰,而後經過網站的公鑰來加密會話密鑰,並傳送給網站。
- web服務器經過本身的私鑰解密出會話密鑰。
- web服務器經過會話密鑰加密與客戶端之間的通訊。
發送方和接收方須要持有同一把密鑰,發送消息和接收消息均使用該密鑰。
相對於非對稱加密,對稱加密具備更高的加解密速度,但雙方都須要事先知道密鑰,密鑰在傳輸過程當中可能會被竊取,所以安全性沒有非對稱加密高。![]()
接收方在發送消息前須要事先生成公鑰和私鑰,而後將公鑰發送給發送方。發送方收到公鑰後,將待發送數據用公鑰加密,發送給接收方。接收方收到數據後,用私鑰解密。
在這個過程當中,公鑰負責加密,私鑰負責解密,數據在傳輸過程當中即便被截獲,攻擊者因爲沒有私鑰,所以也沒法破解。
非對稱加密算法的加解密速度低於對稱加密算法,可是安全性更高。![]()
1.在http1.0h協議中,一個Request一個Response,此次http請求就結束了
2.在http1.1中進行了改進,WebSocket有一個connection:Keep-alive,也就是說,在一個http鏈接中,能夠發送多個Request,接收多個Response。WebSocket是HTML5中的協議,支持持久連續,http協議不支持持久性鏈接。Http1.0和HTTP1.1都不支持持久性的連接,HTTP1.1中的keep-alive,將多個http請求合併爲1個。 3.http2.0中: 3.1.容許多路複用:多路複用容許同時經過單一的HTTP/2鏈接發送多重請求-響應信息。
改善了:在http1.1中,瀏覽器客戶端在同一時間,針對同一域名下的請求有必定數量限制(鏈接數量),超過限制會被阻塞。
3.2.二進制分幀:HTTP2.0會將全部的傳輸信息分割爲更小的信息或者幀,並對他們進行二進制編碼
3.3.首部壓縮
3.4.服務器端推送
可是必須記住,在http1.0和http1.1中一個Request只能對應有一個Response,並且這個Response是被動的,不能主動發起。
若是要說清楚HTTP與TCP/IP、DNS的關係,那就要清楚一次完整的HTTP事務(在瀏覽器輸入地址(url),按下回車後,到看到完整頁面以前,發生了什麼?)
第一步:DNS域名解析(找到域名對應的IP地址)。
第二步:創建TCP鏈接(包含三次握手和四次揮手)。
第三步:瀏覽器發起HTTP請求。
第四步:服務器端解析HTTP請求,處理並響應HTTP請求。瀏覽器獲得html代碼。
第五步:瀏覽器解析html代碼,請求資源(如js、css、圖片等)。
第六步:瀏覽器對頁面進行渲染,呈現給用戶。
附上:網上能找到的最完整也是最直觀的一次完整的HTTP事務圖!
至此有關與http和https的一些基本面試問題算是都列出來了,可是有關於http的一些緩存字段尚未解釋,打算再寫一篇有關於瀏覽器緩存和瀏覽器存儲的文章單獨拎出來說。我會盡快把另一篇文章寫出來的,這樣兩篇文章纔算是把面試的有關於http的知識點都覆蓋到了,才能把知識串聯起來加深記憶。(各位看官若是喜歡本文的歡迎點贊收藏!大家的鼓勵會使我更有動力,固然,若是發現個人總結還有不足之處,歡迎評論指正!)