互聯網協議按照功能不一樣分爲osi七層和tcp/ip五層或tcp/ip四層,以下圖:html
套接字是工做在傳輸層和應用層之間的一個接口,將複雜的tcp/udp協議隱藏在了socket接口後面前端
並無用過,作如下了解:java
WebSocket 是 HTML5 一種新的協議。它實現了瀏覽器與服務器全雙工通訊,能更好的節省服務器資源和帶寬並達到實時通信,它創建在 TCP 之上,同 HTTP 同樣經過 TCP 來傳輸數據,可是它和 HTTP 最大不一樣是:WebSocket 是一種雙向通訊協議.web
協議
其實是一種通訊雙方共同遵照
的規範
。好比我須要把性別
和年齡
傳遞給另一臺主機,那麼我能夠定義一個"A 協議"
,協議規定數據的前 4 個字節
表示性別
,後四個字節
表示年齡
。這樣對方主機
接收時就知道前 4 個字節
是性別
,而不會錯把它當成年齡
來處理。算法
協議
的規範和共同遵照,有利於各個分層之間的交流和處理,也有利於促進協議
的標準化過程
。數據庫
二層交換機
是一種在數據鏈路層
工做的網絡設備
,通常要求支持802.1q(就是劃VLAN)
、SNMP
、限速
、廣播風暴控制
、ACL
、組播
這些常見的功能;它有多個端口,能夠鏈接不一樣的設備。交換機
根據每一個幀中的目標 MAC 地址
決定向哪一個端口發送數據,此時它須要參考「轉發表」
轉發表
並不是手動設置,而是交換機自動學習獲得的。當某個設備向交換機發送幀時,交換機將幀的源 MAC 地址
和接口
對應起來,做爲一條記錄
添加到轉發表
中。 下圖描述了交換機自學過程
的原理: 後端
三層交換機
具備路由器功能
,工做在網絡層
,在二層的基礎上支持如靜態路由
、RIP(矢量路由選擇協議)
、OSPF(鏈路狀態路由選擇協議)
、BGP(邊界網關協議)
、ISIS(分級的連接狀態路由協議)
等路由協議,有時候會要求支持MPLS(多協議標籤交換)
、GRE(通用路由封裝協議)
、L2TP(工業標準的Internet隧道協議)
、IPSec(Internet 協議安全性)等隧道協議
。三層交換機上可以對分組報文根據IP地址
進行轉發。瀏覽器
負責處理OSI模型
中從傳輸層
至應用層
的數據。若是用TCP/IP分層模型
來表述,4-7層交換機
就是以傳輸層
及其上面的應用層
爲基礎,進行分析數據
,並對其進行特定的處理。緩存
例如:對於併發訪問量
很是大的一個企業級Web站點
,使用一臺服務器不足以知足前端的訪問須要,這時一般會經過多臺服務器
來分擔,這些服務器前端訪問的入口地址一般只有一個(企業爲了使用者的方便,只會向最終的用戶開放一個統一的訪問URL
)。爲了能經過同一個URL
將前端訪問分發到後臺多個服務器上,能夠在這些服務器的前端加一個負載均衡器
。這種負載均衡器
就是4-7層交換機
的一種。
此外,實際通訊當中,人們但願在網絡比較擁堵的時候,優先處理像語音這類對及時性要求較高的通訊請求,放緩處理像郵件或數據轉發等稍有延遲也並沒有大礙的通訊請求,這種處理被稱爲寬帶控制
,也是4-7層交換機
的重要功能,還有其餘不少功能,例如廣域網加速器
,特殊應用訪問加速
以及防火牆
等。
路由器
工做在網絡層
,完成經過路由控制
將分組數據
發送到目標地址
的功能。支持如靜態路由
、RIP(矢量路由選擇協議)
、OSPF(鏈路狀態路由選擇協議)
、BGP(邊界網關協議)
、EGP(外部網關協議)
、ISIS(分級的連接狀態路由協議)
等路由協議。 路由器中保存着路由控制表
,它在路由控制表
中查找目標IP地址
對應的下一個路由器地址
。下圖描述了這一過程:
主機A
的地址是10.1.1.30
,要把數據發往地址爲10.1.2.10
的主機。在主機A
的路由表中,保存了兩個字段,因爲目標地址10.1.2.10
與10.1.1.0/24
段不匹配,因此它被髮往默認路由10.1.1.1
也就是圖中路由器1的左側網卡的IP地址
。 路由器1
繼續在它本身的路由控制表
中查找目標地址10.1.2.10
,它發現目標地址屬於10.1.2.0/24
這一段,所以將數據轉發至下一個路由器10.1.0.2
,也就是路由器2
的左側網卡的地址。 路由器2
在本身的路由控制表
中查找目標地址10.1.2.10
,根據表中記錄將數據發往10.1.2.1接口
,也就是本身的右側網卡
的IP地址
。主機B
檢查目標IP地址
和本身相同,因而接收數據。
[網絡面試問題]](www.jianshu.com/p/5553ada4a…)
TCP 和 UDP 位於OSI 七層模型的第四層:傳輸層,區別以下:
一、鏈接性:
TCP 面向鏈接(如打電話要先撥號創建鏈接);
UDP 是面向無鏈接的,即發送數據以前不須要創建鏈接
二、可靠性:
TCP 提供可靠的服務。也就是說,經過TCP鏈接傳送的數據,無差錯,不丟失,不重複,且按序到達;
UDP盡最大努力交付,即不保證可靠交付
三、傳輸內容:
TCP面向字節流,其實是TCP把數據當作一連串無結構的字節流;
UDP是面向報文的,UDP沒有擁塞控制,所以網絡出現擁塞不會使源主機的發送速率下降(對實時應用頗有用,如IP電話,實時視頻會議等)
四、服務性質:
TCP鏈接只能是點到點的;
UDP支持一對一,一對多,多對一和多對多的交互通訊
五、開銷:
TCP首部開銷20字節;
UDP的首部開銷小,只有8個字節
六、信道
TCP的邏輯通訊信道是全雙工的可靠信道
UDP則是不可靠信道
複製代碼
第一次握手: 客戶端
將標誌位SYN
置爲1
,隨機產生一個序列值seq = x
,並將該數據包發送給服務端
,客戶端
進入SYN_SENT
狀態,等待服務端
確認。
第二次握手: 服務端·收到數據包後由
標誌位SYN=1
,知道客戶端
請求創建鏈接,服務端
將標誌位SYN
和ACK
都置爲1
,ack = x + 1
,隨機產生一個值seq = y
, 並將該數據包發送給客戶端
以確認鏈接請求,服務端
進入SYN_RCVD
狀態。
第三次握手:
客戶端
收到確認後,檢查ack
是否爲x+1
,ACK
是否爲1
,若是正確將標誌位ACK
置爲1
,ack = y + 1
, 並將該數據包發送給服務端
,服務端
檢查ack
是否爲y+1
,ACK
是否爲1
,若是都正確則鏈接創建成功,客戶端
和服務端
進入ESTABLISHED
狀態,完成三次握手,隨後客戶端
與服務端
之間開始進行數據傳輸。
客戶端
發出鏈接釋放報文
,而且中止發送數據。將釋放數據報文首部
的FIN
置爲1
,序列號seq
置爲u
(等於前面已經傳送過來的數據的最後一個字節的序號加1
),此時,客戶端
進入FIN-WAIT-1(終止等待1)
狀態。 TCP
規定,FIN
報文段即便不攜帶數據,也要消耗一個序號。服務端
收到報文後,檢查到首部的FIN
爲1
,知道客戶端
請求釋放鏈接
,服務端
發出確認報文
,並將報文首部的ACK
置爲1
,ack
置爲u + 1
,而且帶上本身的序列號v
,此時服務端進入CLOSE-WAIT(關閉等待狀態)
。客戶端
收到服務端
的確認報文
後,檢查ACK
是否爲1
,ack
是否爲u+1
,若是都正確,客戶端進入FIN-WAIT-2(終止等待2)
狀態。等待服務端
發送鏈接釋放報文
。服務端
將最後的數據發送完畢後,就向客戶端
發送鏈接釋放報文
,FIN=1
,ack = u+1
,序列號
爲seq = w
(由於在半關閉狀態,服務器極可能又發送了一些數據,假定此時的序列號
爲seq=w
),此時服務端
進入LASK-ACK(最後確認)
狀態,等待客戶端
確認。客戶端
接收服務器
的報文後,檢查FIN
爲1
,知道服務端
請求釋放鏈接
,發出確認報文
,ACK = 1
, ack = w + 1
, seq = u + 1
, 此時客戶端
進入TIME-WAIT(時間等待)
狀態。注意此時TCP鏈接尚未釋放,必須通過2∗MSL
(最長報文段壽命)的時間後,當客戶端撤銷相應的TCB
後,才進入CLOSED
狀態。服務端
只要收到客戶端
發出的確認報文
,檢查ACK
是否爲1
,ack
是否爲 w + 1
, 若是都正確,當即進入CLOSE
狀態。結合TCP報文結構來看會比較清晰:
一、TCP服務器進程先建立傳輸控制塊TCB,時刻準備接受客戶進程的鏈接請求,此時服務器就進入了LISTEN(監聽)狀態;
二、TCP客戶進程也是先建立傳輸控制塊TCB,而後向服務器發出鏈接請求報文,這是報文首部中的同部位SYN=1,同時選擇一個初始序列號 seq=x ,此時,TCP客戶端進程進入了SYN-SENT(同步已發送狀態)狀態。TCP規定,SYN報文段(SYN=1的報文段)不能攜帶數據,但須要消耗掉一個序號。
三、TCP服務器收到請求報文後,若是贊成鏈接,則發出確認報文。確認報文中應該 ACK=1,SYN=1,確認號是ack=x+1,同時也要爲本身初始化一個序列號 seq=y,此時,TCP服務器進程進入了SYN-RCVD(同步收到)狀態。這個報文也不能攜帶數據,可是一樣要消耗一個序號。
四、TCP客戶進程收到確認後,還要向服務器給出確認。確認報文的ACK=1,ack=y+1,本身的序列號seq=x+1,此時,TCP鏈接創建,客戶端進入ESTABLISHED(已創建鏈接)狀態。TCP規定,ACK報文段能夠攜帶數據,可是若是不攜帶數據則不消耗序號。
五、當服務器收到客戶端的確認後也進入ESTABLISHED狀態,此後雙方就能夠開始通訊了。
參考:
[網絡相關面試題](www.javazhiyin.com/35813.html)
一、客戶端進程發出鏈接釋放報文,而且中止發送數據。釋放數據報文首部,FIN=1,其序列號爲seq=u(等於前面已經傳送過來的數據的最後一個字節的序號加1),此時,客戶端進入FIN-WAIT-1(終止等待1)狀態。TCP規定,FIN報文段即便不攜帶數據,也要消耗一個序號。
二、服務器收到鏈接釋放報文,發出確認報文,ACK=1,ack=u+1,而且帶上本身的序列號seq=v,此時,服務端就進入了CLOSE-WAIT(關閉等待)狀態。TCP服務器通知高層的應用進程,客戶端向服務器的方向就釋放了,這時候處於半關閉狀態,即客戶端已經沒有數據要發送了,可是服務器若發送數據,客戶端依然要接受。這個狀態還要持續一段時間,也就是整個CLOSE-WAIT狀態持續的時間。
三、客戶端收到服務器的確認請求後,此時,客戶端就進入FIN-WAIT-2(終止等待2)狀態,等待服務器發送鏈接釋放報文(在這以前還須要接受服務器發送的最後的數據)。
四、服務器將最後的數據發送完畢後,就向客戶端發送鏈接釋放報文,FIN=1,ack=u+1,因爲在半關閉狀態,服務器極可能又發送了一些數據,假定此時的序列號爲seq=w,此時,服務器就進入了LAST-ACK(最後確認)狀態,等待客戶端的確認。
五、客戶端收到服務器的鏈接釋放報文後,必須發出確認,ACK=1,ack=w+1,而本身的序列號是seq=u+1,此時,客戶端就進入了TIME-WAIT(時間等待)狀態。注意此時TCP鏈接尚未釋放,必須通過2∗MSL(最長報文段壽命)的時間後,當客戶端撤銷相應的TCB後,才進入CLOSED狀態。
六、服務器只要收到了客戶端發出的確認,當即進入CLOSED狀態。一樣,撤銷TCB後,就結束了此次的TCP鏈接。能夠看到,服務器結束TCP鏈接的時間要比客戶端早一些。
參考:
採起一塊確認的機制
所謂全雙工,半雙工,單工是指面向鏈接時纔有的說法,若是不是面向鏈接的,沒有一個肯定的鏈接的話,怎麼會出現半雙工這種只准一個來或者一個去的說法呢? UDP支持一對一,一對多,多對一和多對多的交互通訊。若是必定要涉及到全雙工的話,大概理解爲不只提供全雙工,甚至提供全多工服務,只是UDP是不可靠的服務而已。
MSL(Maximum Segment Lifetime),TCP容許不一樣的實現能夠設置不一樣的MSL值。
1、保證客戶端發送的最後一個ACK報文可以到達服務器
由於這個ACK報文可能丟失,站在服務器的角度看來,我已經發送了FIN+ACK報文請求斷開了,客戶端尚未給我回應,應該是我發送的請求斷開報文它沒有收到,因而服務器又會從新發送一次,而客戶端就能在這個2MSL時間段內收到這個重傳的報文,接着給出迴應報文,而且會重啓2MSL計時器。
2、防止相似與「三次握手」中提到了的「已經失效的鏈接請求報文段」出如今本鏈接中。
客戶端發送完最後一個確認報文後,在這個2MSL時間中,就能夠使本鏈接持續的時間內所產生的全部報文段都從網絡中消失。這樣新的鏈接中不會出現舊鏈接的請求報文。
複製代碼
客戶端
向服務端
發送了SYN
,請求創建鏈接。因爲延遲,服務端沒有及時收到這個包。因而客戶端
從新發送一個 SYN
包。回憶一下介紹 TCP 首部
時提到的序列號
,這兩個包的序列號顯然是相同的。第二個 SYN 包
,創建了通訊,一段時間後通訊結束,鏈接被關閉。這時候最初被髮送的 SYN 包
剛剛抵達服務端
,服務端
又會發送一次 ACK
確認。因爲兩次握手就創建了鏈接,此時的服務端
就會創建一個新的鏈接,然而客戶端
以爲本身並無請求創建鏈接,因此就不會向服務端
發送數據。從而致使服務端
創建了一個空的鏈接,白白浪費資源。服務端
直到收到客戶端
的應答後纔會創建鏈接。所以在上述狀況下,客戶端
會接受到一個相同的ACK 包
,這時候它會拋棄這個數據包,不會和服務端
進行第三次握手,所以避免了服務端
創建空的鏈接
。TCP 協議
處理丟包的通常方法,服務端
會從新向客戶端
發送數據包
,直至收到ACK 確認
爲止。但實際上這種作法有可能遭到SYN 泛洪攻擊
。所謂的泛洪攻擊
,是指發送方
僞造多個 IP 地址
,模擬三次握手
的過程。當服務器
返回 ACK
後,攻擊方故意不確認,從而使得服務器不斷重發 ACK
。因爲服務器
長時間處於半鏈接狀態
,最後消耗過多的CPU
和內存資源
致使死機。服務端
發送RST 報文
,進入 CLOSE
狀態。這個 RST
數據包的 TCP
首部中,控制位中的 RST 位
被設置爲1
。這表示鏈接信息
所有被初始化,原有的 TCP
通訊不能繼續進行。客戶端若是還想從新創建TCP
鏈接,就必須從新開始第一次握手。實際上,在第三步
中,客戶端
收到FIN 包
時,它會設置一個計時器
,等待至關長的一段時間。若是客戶端
返回的ACK
丟失,那麼服務端
還會重發FIN
並重置計時器
。假設在計時器
失效前服務器
重發的 FIN 包
沒有到達客戶端
,客戶端
就會進入 CLOSE
狀態,從而致使服務端
永遠沒法收到 ACK 確認
,也就沒法關閉鏈接
。
示意圖以下:
在TCP
三次握手中,服務器端的SYN
和ACK
是放在一個TCP報文段
中向客戶端
發送的,而在斷開鏈接的過程當中,服務器端
向客戶端
發送的ACK
和FIN
是是分別在兩個不一樣的TCP
報文段中。這是由於在服務器端
接收到客戶端
的FIN
後,服務器端
可能還有數據要傳輸,因此先發送ACK
,服務器端
把數據發完以後就能夠發送FIN
斷開鏈接了。
《計算機網絡》第四版中講「三次握手」的目的是「爲了防止已失效的鏈接請求報文段忽然又傳送到了服務端,於是產生錯誤」
書中的例子是這樣的,「已失效的鏈接請求報文段」的產生在這樣一種狀況下:client發出的第一個鏈接請求報文段並無丟失,而是在某個網絡結點長時間的滯留了,以至延誤到鏈接釋放之後的某個時間纔到達server。原本這是一個早已失效的報文段。但server收到此失效的鏈接請求報文段後,就誤認爲是client再次發出的一個新的鏈接請求。因而就向client發出確認報文段,贊成創建鏈接。
假設不採用「三次握手」,那麼只要server發出確認,新的鏈接就創建了。因爲如今client並無發出創建鏈接的請求,所以不會理睬server的確認,也不會向server發送數據。但server卻覺得新的運輸鏈接已經創建,並一直等待client發來數據。這樣,server的不少資源就白白浪費掉了。採用「三次握手」的辦法能夠防止上述現象發生。例如剛纔那種狀況,client不會向server的確認發出確認。server因爲收不到確認,就知道client並無要求創建鏈接。」。主要目的防止server端一直等待,浪費資源。
參考:
○ 數據包校驗
○ 超時重傳機制
○ 應答機制
○ 對失序數據包重排序
○ TCP還能提供流量控制
複製代碼
流量控制
以動態調整發送空間大小(滑動窗口)
的形式來反映接收端
接收消息的能力,反饋給發送端
以調整發送速度
,避免發送速度
過快致使的丟包
或者過慢
下降總體性能。滑動窗口機制
,一是不用每次發送完成都須要等待收到確認消息才能繼續發送,二是參考接收端
的接收能力,限制發送數據段
大小,避免丟失現象。窗口
比較大,發送方
可能會忽然發送大量數據,致使網絡癱瘓。所以,在通訊一開始時,TCP
會經過慢啓動
算法得出窗口的大小,對發送數據量進行控制。流量控制
是由發送方
和接收方
共同控制的。剛剛咱們介紹了接收方
會把本身可以承受的最大窗口長度
寫在TCP 首部
中,實際上在發送方
這裏,也存在流量控制
,它叫擁塞窗口
。TCP 協議中的窗口是指發送方窗口
和接收方窗口
的較小值。 慢啓動過程以下:
發送方
的擁塞窗口
大小爲1
。每收到一個 ACK
確認後,擁塞窗口
翻倍。指數級增加
很是快,很快地,就會出現確認包
超時。(超時是由於數據量大致使網絡擁塞)「慢啓動閾值」
,它的值是當前擁塞窗口
大小的一半。擁塞窗口大小
設置爲1
,從新進入慢啓動過程
。「慢啓動閾值」
已經存在,當擁塞窗口
大小達到閾值
時,再也不翻倍,而是線性增長
。窗口
大小不斷增長,可能收到三次重複確認
應答,進入「快速重發」
階段。 (快速重發: 當發送端
連續收到三個重複的ack
時,表示該數據段
已經丟失,須要重發。當收到三個表示同一個數據段的ack
時,不須要等待計時器超時,即從新發送數據段(當時這三個ack要在超時以前到達發送端),由於可以收到接收端
的ack確認信息,因此數據段只是單純的丟失,而不是由於網絡擁塞
致使,)TCP
將「慢啓動閾值」
設置爲當前擁塞窗口大小
的一半,再將擁塞窗口大小
設置成閾值大小
(也有說加 3)。擁塞窗口
又會線性增長
,直至下一次出現三次重複確認
應答或超時
。以上過程能夠用下圖歸納:
**1xx :信息性狀態碼 ** 表示服務器已接收了客戶端請求,客戶端能夠繼續發送請求
- 100 Continue 初始的請求已經接受,客戶應當繼續發送請求的其他部分
- 101 Switching Protocols 服務器將聽從客戶的請求轉換到另一種協議
2xx :成功狀態碼 表示服務器已成功接收到請求並進行處理
- 200 OK 表示客戶端請求成功
- 204 No Content 成功,但不返回任何實體的主體部分
- 206 Partial Content 成功執行了一個範圍(Range)請求
3xx :重定向狀態碼 表示服務器要求客戶端重定向
- 301 Moved Permanently 永久性重定向,響應報文的Location首部應該有該資源的新URL
- 302 Found 臨時性重定向,響應報文的Location首部給出的URL用來臨時定位資源
- 303 See Other 請求的資源存在着另外一個URI,客戶端應使用GET方法定向獲取請求的資源
- 304 Not Modified 服務器內容沒有更新,能夠直接讀取瀏覽器緩存
- 307 Temporary Redirect 臨時重定向。與302 Found含義同樣。302禁止POST變換爲GET,但實際使用時並不必定,307則更多瀏覽器可能會遵循這一標準,但也依賴於瀏覽器具體實現
4xx :客戶端錯誤狀態碼 表示客戶端的請求有非法內容
- 400 Bad Request 表示客戶端請求有語法錯誤,不能被服務器所理解
- 401 表示請求未經受權,該狀態代碼必須與 WWW-Authenticate 報頭域一塊兒使用
- 403 表示服務器收到請求,可是拒絕提供服務,一般會在響應正文中給出不提供服務的緣由
- 404 Not Found 請求的資源不存在,例如,輸入了錯誤的URL
5xx :服務器錯誤狀態碼 表示服務器未能正常處理客戶端的請求而出現意外錯誤
- 500 Internel Server Error 表示服務器發生不可預期的錯誤,致使沒法完成客戶端的請求
- 503 表示服務器當前不可以處理客戶端的請求,在一段時間以後,服務器可能會恢復正常
參考:
常見的HTTP狀態碼(HTTP Status Code)說明
過程爲:
參考
另外一個答案:
• 查詢DNS,獲取域名對應的IP地址
○ 瀏覽器搜索自身的DNS緩存
○ 搜索操做系統的DNS緩存
○ 讀取本地的HOST文件
○ 發起一個DNS的系統調用
• 寬帶運營服務器查看自己緩存
• 運營商服務器發起一個迭代DNS解析請求
• 瀏覽器得到域名對應的IP地址後,發起HTTP三次握手
• TCP/IP鏈接創建起來後,瀏覽器就能夠向服務器發送HTTP請求了
• 服務器接受到這個請求,根據路徑參數,通過後端的一些處理生成HTML頁面代碼返回給瀏覽器
• 瀏覽器拿到完整的HTML頁面代碼開始解析和渲染,若是遇到引用的外部JS,CSS,圖片等靜態資源,它們一樣也是一個個的HTTP請求,都須要通過上面的步驟
• 瀏覽器根據拿到的資源對頁面進行渲染,最終把一個完整的頁面呈現給用戶
複製代碼
HTTP 協議對於發送的請求和響應不作持久化處理。這時候引入了 Cookie 技術用於狀態管理。Cookie 對用與登陸的狀態管理,沒有 Cookie 這個技術的話,由於 HTTP 不保存狀態,每次打開新網頁都必須再次登陸。
Cookie 會根據響應報文中的 Set-Cookie 字段來通知客戶端自動保存 Cookie。下次請求時會自動發送 Cookie,服務器會比對數據獲得狀態結果。
Cookie(複數形態:Cookies):是指某些網站爲了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據(一般通過加密)。
做用:由於HTTP協議是無狀態的,即服務器不知道用戶上一次作了什麼,這嚴重阻礙了交互式Web應用程序的實現。在典型的網上購物場景中,用戶瀏覽了幾個頁面,買了一盒餅乾和兩飲料。最後結賬時,因爲HTTP的無狀態性,不經過額外的手段,服務器並不知道用戶到底買了什麼。爲了作到這點,就須要使用到Cookie了。服務器能夠設置或讀取Cookies中包含信息,藉此維護用戶跟服務器會話中的狀態。
Cookie的根本做用就是在客戶端存儲用戶訪問網站的一些信息。典型的應用有
一、記住密碼,下次自動登陸
二、購物車功能
三、記錄用戶瀏覽數據,進行商品(廣告)推薦
工做原理:
1.建立 Cookie
當用戶第一次瀏覽某個使用Cookie的網站時,該網站的服務器就進行以下工做
1.1 該用戶生成一個惟一的識別碼(Cookie id),建立一個Cookie對象
1.2 默認狀況下它是一個會話級別的cookie,存儲在瀏覽器的內存中,用戶退出瀏覽器以後被刪除。若是網站但願瀏覽器將該Cookie存儲在磁盤上,則須要設置最大時效(maxAge),並給出一個以秒爲單位的時間(將最大時效設爲0則是命令瀏覽器刪除該Cookie)
1.3 將Cookie放入到HTTP響應報頭,將Cookie插入到一個 Set-Cookie HTTP請求報頭中
1.4 發送該HTTP響應報文
2.設置存儲 Cookie
瀏覽器收到該響應報文以後,根據報文頭裏的Set-Cookied特殊的指示,生成相應的Cookie,保存在客戶端。該Cookie裏面記錄着用戶當前的信息。
3.發送Cookie
當用戶再次訪問該網站時,瀏覽器首先檢查全部存儲的Cookies,若是某個存在該網站的Cookie(即該Cookie所聲明的做用範圍大於等於將要請求的資源),則把該cookie附在請求資源的HTTP請求頭上發送給服務器
4.讀取Cookie
服務器接收到用戶的HTTP請求報文以後,從報文頭獲取到該用戶的Cookie,從裏面找到所須要的東西
Session:表明服務器與瀏覽器的一次會話過程,這個過程是連續的,也能夠時斷時續的。Session是一種服務器端的機制,Session 對象用來存儲特定用戶會話所需的信息
工做原理:建立session、使用session,具體看參考url
做用:Session的根本做用就是在服務端存儲用戶和服務器會話的一些信息
一、判斷用戶是否登陸
二、購物車功能
參考:
簡單說,5G就是第五代通訊技術,主要特色是波長爲毫米級,超寬帶,超高速度,超低延時。
5G若是要實現端到端的高速率,重點是突破無線這部分的瓶頸。
光速 = 波長 * 頻率
爲了實現更高效的傳輸速率必須使用更短的波,5G採用毫米波(1~10 mm)
電磁波的顯著特色:頻率越高,波長越短,越趨近於直線傳播(繞射和穿牆能力越差)。****頻率越高,在傳播介質中的衰減也越大。
因此,5G須要很是多的微基站。對人體是有益的,減少了輻射。
TCP還設有一個保活計時器,顯然,客戶端若是出現故障,服務器不能一直等下去,白白浪費資源。服務器每收到一次客戶端的請求後都會從新復位這個計時器,時間一般是設置爲2小時,若兩小時尚未收到客戶端的任何數據,服務器就會發送一個探測報文段,之後每隔75分鐘發送一次。若一連發送10個探測報文仍然沒反應,服務器就認爲客戶端出了故障,接着就關閉鏈接。
1. 安全性:
http是HTTP協議運行在TCP之上。全部傳輸的內容都是明文,客戶端和服務器端都沒法驗證對方的身份。
https是HTTP運行在SSL/TLS之上,SSL/TLS運行在TCP之上。全部傳輸的內容都通過加密,加密採用對稱加密,但對稱加密的密鑰用服務器方的證書進行了非對稱加密。此外客戶端能夠驗證服務器端的身份,若是配置了客戶 端驗證,服務器方也能夠驗證客戶端的身份。
2. 證書
https協議須要到ca申請證書,通常免費證書不多,須要交費。
3. 傳輸協議
http是超文本傳輸協議,信息是明文傳輸,https則是具備安全性的ssl加密傳輸協議
4. 端口
http和https使用的是徹底不一樣的鏈接方式用的端口也不同,前者是80,後者是443。
複製代碼
HTTPS實際上是有兩部分組成:HTTP + SSL / TLS,也就是在HTTP上又加了一層處理加密信息的模塊。服務端和客戶端的信息傳輸都會經過TLS進行加密,因此傳輸的數據都是加密後的數據。
HTTPS 是 HTTP 創建在 SSL/TLS 安全協議上的。
在 iOS 中,客戶端本地會存放着 CA 證書,在HTTPS 請求時,會首先像服務器索要公鑰,得到公鑰後會使用本地 CA 證書驗證公鑰的正確性,而後經過正確的公鑰加密信息發送給服務器,服務器會使用私鑰解密信息。
HTTPS 相對於 HTTP 性能上差點,由於多了 SSL/TLS 的幾回握手和加密解密的運算處理,可是加密解密的運算處理已經能夠經過特有的硬件來加速處理。
1. 客戶端發起HTTPS請求
這個沒什麼好說的,就是用戶在瀏覽器裏輸入一個https網址,而後鏈接到server的443端口。
2. 服務端的配置
採用HTTPS協議的服務器必需要有一套數字證書,能夠本身製做,也能夠向組織申請。
區別就是本身頒發的證書須要客戶端驗證經過,才能夠繼續訪問,而使用受信任的公司申請的證書則不會彈出提示頁面(startssl就是個不錯的選擇,有1年的免費服務)。
這套證書其實就是一對公鑰和私鑰。若是對公鑰和私鑰不太理解,能夠想象成一把鑰匙和一個鎖頭,只是全世界只有你一我的有這把鑰匙,你能夠把鎖頭給別人,別人能夠用這個鎖把重要的東西鎖起來,而後發給你,由於只有你一我的有這把鑰匙,因此只有你才能看到被這把鎖鎖起來的東西。
3. 傳送證書
這個證書其實就是公鑰,只是包含了不少信息,如證書的頒發機構,過時時間等等。
4. 客戶端解析證書
這部分工做是有客戶端的TLS來完成的,首先會驗證公鑰是否有效,好比頒發機構,過時時間等等,若是發現異常,則會彈出一個警告框,提示證書存在問題。
若是證書沒有問題,那麼就生成一個隨即值。而後用證書對該隨機值進行加密。就好像上面說的,把隨機值用鎖頭鎖起來,這樣除非有鑰匙,否則看不到被鎖住的內容。
5. 傳送加密信息
這部分傳送的是用證書加密後的隨機值,目的就是讓服務端獲得這個隨機值,之後客戶端和服務端的通訊就能夠經過這個隨機值來進行加密解密了。
6. 服務段解密信息
服務端用私鑰解密後,獲得了客戶端傳過來的隨機值(私鑰),而後把內容經過該值進行對稱加密。
所謂對稱加密就是,將信息和私鑰經過某種算法混合在一塊兒,這樣除非知道私鑰,否則沒法獲取內容,而正好客戶端和服務端都知道這個私鑰,因此只要加密算法夠彪悍,私鑰夠複雜,數據就夠安全。
7. 傳輸加密後的信息
這部分信息是服務段用私鑰加密後的信息,能夠在客戶端被還原
8. 客戶端解密信息
客戶端用以前生成的私鑰解密服務段傳過來的信息,因而獲取瞭解密後的內容。整個過程第三方即便監聽到了數據,也一籌莫展。
複製代碼
- GET使用URL或Cookie傳參,而POST將數據放在BODY中,這個是由於HTTP協議用法的約定。並不是它們的自己區別。
- GET方式提交的數據有長度限制,則POST的數據則能夠很是大,這個是由於它們使用的操做系統和瀏覽器設置的不一樣引發的區別。也不是GET和POST自己的區別。
- POST比GET安全,由於數據在地址欄上不可見,這個說法沒毛病,但依然不是GET和POST自己的區別。
- 最大的區別主要是GET請求是冪等性的,POST請求不是
HTTP|GET 和 POST 區別?網上多數答案都是錯的!
另外一個答案:
• GET 被強制服務器支持
• 瀏覽器對URL的長度有限制,因此GET請求不能代替POST請求發送大量數據
• GET請求發送數據更小
• GET請求是不安全的
• GET請求是冪等的
• POST請求不能被緩存
• POST請求相對GET請求是「安全」的
• 在如下狀況中,請使用 POST 請求:
1. 沒法使用緩存文件(更新服務器上的文件或數據庫)
2. 向服務器發送大量數據(POST 沒有數據量限制)
3. 發送包含未知字符的用戶輸入時,POST 比 GET 更穩定也更可靠
4. post比Get安全性更高
複製代碼
HTTP
是一種無狀態
的鏈接,客戶端
每次讀取web 頁面
時,服務器
都會認爲這是一次新的會話
。但有時候咱們又須要持久保持
某些信息,好比登陸時的用戶名、密碼
,用戶上一次鏈接時的信息等。這些信息就由 Cookie
和Session
保存。 這二者的根本性區別在於,cookie
保存在客戶端
上,而 session
則保存在服務器
中。由此咱們還能夠拓展出如下結論:
cookie
相對來講不安全,瀏覽器能夠分析本地的 cookie
進行 cookie
欺騙。session
能夠設置超時時間,超過這個時間後就失效,以避免長期佔用服務端
內存。cookie
的大小有限制(4 Kb)
,每一個站點的 cookie
數量通常也有限制(20個)
。客戶端
每次都會把 cookie
發送到服務端
,所以服務端
能夠知道cookie
,可是客戶端
不知道 session
。當服務器
接收到cookie
後,會根據cookie
中的 SessionID
來找到這個客戶的 session
。若是沒有,則會生成一個新的 SessionID
發送給客戶端。
HTTP(超文本傳輸協議,HyperText Transfer Protocol)
是應用層
的協議,目前在互聯網中應用普遍。
它被設計用於Web瀏覽器
和Web服務器
之間的通訊,但它也能夠用於其餘目的。 HTTP
遵循經典的客戶端-服務端模型
,客戶端打開一個鏈接以發出請求,而後等待它收到服務器端
響應。HTTP
是 無狀態協議
,意味着服務器
不會在兩個請求之間保留任何數據(狀態)。
HTTP 1.0
規定瀏覽器
與服務器
只保持短暫的鏈接,瀏覽器
的每次請求都須要與服務器
創建一個TCP鏈接
,服務器
完成請求處理後當即斷開TCP鏈接
,服務器不跟蹤每一個客戶也不記錄過去的請求。
HTTP1.1
——標準化的協議HTTP/1.0
的多種不一樣的實現運用起來有些混亂,HTTP1.1
是第一個標準化版本,重點關注的是校訂HTTP1.0
設計中的結構性缺陷:
在http1.1
中,client
和server
都是默認對方支持長連接的, 若是不但願使用長連接,則須要在header中
指明connection:close
;
HTTP/2.0
在HTTP/1.1
有幾處基本的不一樣:
HTTP2
是二進制協議
而不是文本協議
。再也不可讀和無障礙的手動建立,改善的優化技術如今可被實施。咱們知道HTTP
協議直接使用了TCP
協議進行數據傳輸。因爲數據沒有加密,都是直接明文
傳輸,因此存在如下三個風險:
好比你在手機上打開應用內的網頁時,有時會看到網頁底部彈出了廣告,這實際上就說明你的HTTP
內容被竊聽、並篡改了。 HTTPS
協議旨在解決以上三個風險
,所以它能夠:
HTTPS
的結構如圖所示:
可見它僅僅是在 HTTP
和TCP
之間新增了一個TLS/SSL
加密層,這也印證了一句名言:「一切計算機問題均可以經過添加中間層解決」。 使用HTTPS
時,服務端
會將本身的證書發送給客戶端
,其中包含了服務端
的公鑰。基於非對稱加密
的傳輸過程以下:
這裏的證書
是服務器
證實本身身份的工具,它由權威的證書頒發機構(CA)
發給申請者。若是證書是虛假的,或者是本身給本身頒發的證書,服務器就會不承認這個證書併發出警告:
總結一下 HTTPS 協議
是如何避免前文所說的三大風險的:
非對稱加密
傳輸密碼,而後用這個密碼對稱加密數據
,使得第三方沒法得到通訊內容發送方
將數據的哈希結果
寫到數據中,接收方
解密後對比數據的哈希結果
,若是不一致則說明被修改。因爲傳輸數據加密,第三方沒法修改哈希結果。權威機構頒發
證書,再加上證書校驗
機制,避免第三方假裝
參與通訊.這是由於服務端在LISTEN狀態下,收到創建鏈接請求的SYN報文後,把ACK和SYN放在一個報文裏發送給客戶端。而關閉鏈接時,當收到對方的FIN報文時,僅僅表示對方再也不發送數據了可是還能接收數據,己方也未必所有數據都發送給對方了,因此己方能夠當即close,也能夠發送一些數據給對方後,再發送FIN報文給對方來表示贊成如今關閉鏈接,所以,己方ACK和FIN通常都會分開發送。
參考: