主要講解TCP/IP體系結構:java
Transmission Control Protocol
,即 傳輸控制協議web
1.屬於 傳輸層通訊協議算法
2.基於
TCP
的應用層協議有HTTP
、SMTP
、FTP
、Telnet
和POP3
編程
首部前20個字符固定、後面有4n個字節是根據需而增長的選項跨域
故 TCP首部最小長度 = 20字節瀏覽器
三次握手的目的是創建可靠的通訊信道,說到通信,簡單來講就是數據的發送與接收,而三次握手最主要的目的就是雙方確認本身與對方的發送與接收是正常的。緩存
第一次握手:Client 什麼都不能確認;Server 確認了對方發送正常;安全
第二次握手:Client 確認了:本身發送、接收正常,對方發送、接收正常;Server 確認了:本身接收正常,對方發送正常服務器
第三次握手:Client 確認了:本身發送、接收正常,對方發送、接收正常;Server 確認了:本身發送、接收正常,對方發送接收正常cookie
因此三次握手就能確認雙發收發功能都正常,缺一不可。
SYN:同步序列編號(Synchronize Sequence Numbers)。是TCP/IP創建鏈接時使用的握手信號。
接收端傳回發送端所發送的 SYN 是爲了告訴發送端,我接收到的信息確實就是你所發送的信號了。
雙方通訊無誤必須是二者互相發送信息都無誤。傳了 SYN,證實發送方到接收方的通道沒有問題,可是接收方到發送方的通道還須要 ACK 信號來進行驗證。
SYN 同步序列編號(Synchronize Sequence Numbers) 是 TCP/IP 創建鏈接時使用的握手信號。
ACK(Acknowledgement) 確認字符 ,在數據通訊傳輸中,接收站發給發送站的一種傳輸控制字符。它表示確認發來的數據已經接受無誤。
SYN(synchronous創建聯機)
ACK(acknowledgement 確認)
PSH(push傳送) FIN(finish結束)
RST(reset重置)
URG(urgent緊急)
Sequence number(順序號碼)
Acknowledge number(確認號碼)
SYN表示創建鏈接,FIN表示關閉鏈接,ACK表示響應,PSH表示有 DATA數據傳輸,RST表示鏈接重置。
舉個例子:A 和 B 打電話,通話即將結束後:
1.A 說「我沒啥要說的了」,B回答「我知道了」,
2.可是 B 可能還會有要說的話,A 不能要求 B 跟着本身的節奏結束通話,
3.因而 B 可能又巴拉巴拉說了一通,最後 B 說「我說完了」,
4.A 回答「知道了」,這樣通話纔算結束。
MSL(Maximum Segement Lifetime)
由於若是不等待的話,若是服務端還有不少數據包要給客戶端發,且此時客戶端端口被新應用佔據,那麼就會接收到無用的數據包,形成數據包混亂,因此說最保險的方法就是等服務器發來的數據包都死翹翹了再啓動新應用。
User Datagram Protocol
,即 用戶數據報協議
屬於 傳輸層通訊協議
基於
UDP
的應用層協議有TFTP
、SNMP
與DNS
HTTP
協議 屬於 應用層HTTP
協議採用 請求 / 響應 的工做方式注:空格不能省
此處特地說明GET、PSOT方法的區別:
採用」header(字段名):value(值)「的方式
1. 請求和響應報文的通用Header
常見請求Header
做用:存放 需發送給服務器的數據信息
使用方式:共3種
其中,空格不能省
具體介紹
相似
相似
主要區別主要體如今:
緩存處理,
在HTTP1.0中主要使用header裏的If-Modified-Since,Expires來作爲緩存判斷的標準,
HTTP1.1則引入了更多的緩存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供選擇的緩存頭來控制緩存策略。
帶寬優化及網絡鏈接的使用,
HTTP1.0中,存在一些浪費帶寬的現象,
例如客戶端只是須要某個對象的一部分,而服務器卻將整個對象送過來了,而且不支持斷點續傳功能,
HTTP1.1則在請求頭引入了range頭域,它容許只請求資源的某個部分,即返回碼是206(Partial Content),這樣就方便了開發者自由的選擇以便於充分利用帶寬和鏈接。
錯誤通知的管理,在HTTP1.1中新增了24個錯誤狀態響應碼,
如409(Conflict)表示請求的資源與資源的當前狀態發生衝突;
410(Gone)表示服務器上的某個資源被永久性的刪除。
Host頭處理,在HTTP1.0中認爲每臺服務器都綁定一個惟一的IP地址,所以,請求消息中的URL並無傳遞主機名(hostname)。
但隨着虛擬主機技術的發展,在一臺物理服務器上能夠存在多個虛擬主機(Multi-homed Web Servers),而且它們共享一個IP地址。
HTTP1.1的請求消息和響應消息都應支持Host頭域,且請求消息中若是沒有Host頭域會報告一個錯誤(400 Bad Request)。
長鏈接,HTTP 1.1支持長鏈接(PersistentConnection)和請求的流水線(Pipelining)處理,
在一個TCP鏈接上能夠傳送多個HTTP請求和響應,減小了創建和關閉鏈接的消耗和延遲,
在HTTP1.1中默認開啓Connection: keep-alive,必定程度上彌補了HTTP1.0每次請求都要建立鏈接的缺點。
改進性能:
Connection: keep-alive
TCP/IP
協議族通訊的中間軟件抽象層,表現爲一個封裝了 TCP / IP協議族 的編程接口(API)
Socket
不是一種協議,而是一個編程調用接口(API
),屬於傳輸層(主要解決數據如何在網絡中傳輸)對用戶來講,只需調用Socket去組織數據,以符合指定的協議,便可通訊
Socket ={(IP地址1:PORT端口號),(IP地址2:PORT端口號)}
Socket
實例 惟一表明一個主機上的一個應用程序的通訊鏈路url
地址 ->> 顯示主頁的過程Internet
中的每一臺主機(或 路由器)的全球惟一的標識符其中:
- 網絡號:標誌主機(或路由器)所鏈接到的網絡。一個網絡號在整個因特網範圍內必須是惟一的。
- 主機號:標誌該主機(或路由器)。一個主機號在它面前的網絡號所指明的網絡範圍必須是惟一的。
不一樣類型的IP地址,其主機號 & 網絡號所佔字節數不一樣;故:一個IP地址在整個網絡範圍內是惟一的
區別在於網絡號 & 主機號佔的字節數不一樣
Internet Control Message Protocol
,即 網際控制報文協議
- 屬於IP層協議
- 注:ICMP報文不是高層協議,而是做爲IP層數據報的數據,加上數據報首部,組成IP數據報發出去
同時容許主機 / 路由器報告差錯 & 異常狀況
分類 ICMP
差錯報告報文 & ICMP
詢問報文
主要應用 PING(分組網間探測)、Traceroute(跟蹤1個分組從源點到終點的路徑,
原理 = 從源主機向目的主機發送一連串的IP數據報)
下面,將主要介紹Ping
的過程
Packet InterNet Groper
,即 分組網間探測是
ICMP
報文的一個重要應用:使用了IPCM回送請求 & 回送回答報文
Cookie
cookie 是一個很是具體的東西,指的就是瀏覽器裏面能永久存儲的一種數據,僅僅是瀏覽器實現的一種數據存儲功能。
cookie由服務器生成,發送給瀏覽器,瀏覽器把cookie以kv形式保存到某個目錄下的文本文件內,下一次請求同一網站時會把該cookie發送給服務器。
因爲cookie是存在客戶端上的,因此瀏覽器加入了一些限制確保cookie不會被惡意使用,同時不會佔據太多磁盤空間,因此每一個域的cookie數量是有限的。
Session
session 從字面上講,就是會話。
這個就相似於你和一我的交談,你怎麼知道當前和你交談的是張三而不是李四呢?對方確定有某種特徵(長相等)代表他就是張三。
session 也是相似的道理,服務器要知道當前發請求給本身的是誰。
爲了作這種區分,服務器就要給每一個客戶端分配不一樣的「身份標識」,而後客戶端每次向服務器發請求的時候,都帶上這個「身份標識」,服務器就知道這個請求來自於誰了。
至於客戶端怎麼保存這個「身份標識」,能夠有不少種方式,對於瀏覽器客戶端,你們都默認採用 cookie 的方式。
服務器使用session把用戶的信息臨時保存在了服務器上,用戶離開網站後session會被銷燬。這種用戶信息存儲方式相對cookie來講更安全。
但是session有一個缺陷:若是web服務器作了負載均衡,那麼下一個操做請求到了另外一臺服務器的時候session會丟失。
Token
在Web領域基於Token的身份驗證隨處可見。在大多數使用Web API的互聯網公司中,tokens 是多用戶下處理認證的最佳方式。
如下幾點特性會讓你在程序中使用基於Token的身份驗證
那些使用基於Token的身份驗證的大佬們
大部分你見到過的API和Web應用都使用tokens。例如Facebook, Twitter, Google+, GitHub等。
基於服務器驗證方式暴露的一些問題
NoSession意味着你的程序能夠根據須要去增減機器,而不用去擔憂用戶是否登陸。
基於Token的身份驗證的過程以下:
無狀態、可擴展
基於這種無狀態和不存儲Session信息,負載負載均衡器可以將用戶信息從一個服務傳到其餘服務器上。
若是咱們將已驗證的用戶的信息保存在Session中,則每次請求都須要用戶向已驗證的服務器發送驗證信息(稱爲Session親和性)。用戶量大時,可能會形成一些擁堵。
安全性
請求中發送token而再也不是發送cookie可以防止CSRF(跨站請求僞造)。
即便在客戶端使用cookie存儲token,cookie也僅僅是一個存儲機制而不是用於認證。不將信息存儲在Session中,讓咱們少了對session操做。
token是有時效的,一段時間以後用戶須要從新驗證。咱們也不必定須要等到token自動失效,token有撤回的操做,經過token revocataion可使一個特定的token或是一組有相同認證的token無效。
可擴展性
Tokens可以建立與其它程序共享權限的程序。例如,能將一個隨便的社交賬號和本身的大號(Fackbook或是Twitter)聯繫起來。當經過服務登陸Twitter(咱們將這個過程Buffer)時,咱們能夠將這些Buffer附到Twitter的數據流上(we are allowing Buffer to post to our Twitter stream)。
使用tokens時,能夠提供可選的權限給第三方應用程序。當用戶想讓另外一個應用程序訪問它們的數據,咱們能夠經過創建本身的API,得出特殊權限的tokens。
下面,將詳細講解TCP
協議的無差錯傳輸
對於發送端:
1.每收到一個確認幀,發送窗口就向前滑動一個幀的距離
2.當發送窗口內無可發送的幀時(即窗口內的幀所有是已發送但未收到確認的幀),發送方就會中止發送,直到收到接收方發送的確認幀使窗口移動,窗口內有能夠發送的幀,以後纔開始繼續發送。
對於接收端:
1.當收到數據幀後,將窗口向前移動一個位置,併發回確認幀,若收到的數據幀落在接收窗口以外,則一概丟棄。
類型1:停等式ARQ(Stop-and-Wait)
即 :發送窗口大小=一、接收窗口大小=1
- 發送方每發送一幀,要等到接收方的應答信號後才能發送下一幀
- 接收方每接收一幀,都要反饋一個應答信號,表示可接下一幀
- 若接收方不反饋應答信號,則發送方必須一直等待
類型2:後退N幀協議
也稱:連續ARQ協議
即 :發送窗口大小>一、接收窗口大小=1
本示例 = 源站 向 目的站 發送數據幀。具體示例以下:
類型3:選擇重傳ARQ(Selective Repeat)
即 :發送窗口大小>一、接收窗口大小>1
相似於類型2(後退N幀協議),此處僅僅是接收窗口大小的區別,故此處不做過多描述
因而可知,若信道傳輸質量不好,致使誤碼率較大時,後退N幀協議不必定優於中止-等待協議
流量控制
擁塞控制
擁塞:對網絡中的資源需求 > 該資源所能提供的部分
與 「流量控制」的區別
其中,涉及4種算法,即 慢開始 & 擁塞避免、快重傳 & 快恢復
預備知識:
擁塞窗口
慢開始算法
擁塞避免
慢開始 & 擁塞避免
(cwnd)
按線性規律 緩慢增加:每通過一個往返時間RTT
,發送方的擁塞窗口(cwnd)
加1
- 擁塞避免 並不可避免擁塞,只是將擁塞窗口按現行規律緩慢增加,使得網絡比較不容易出現擁塞
- 相比慢開始算法的加倍,擁塞窗口增加速率緩慢得多
(cwnd)
增加過大而引發網絡擁塞,採用慢開始 & 擁塞避免 2種算法,具體規則以下預備知識:
快重傳算法
原理
做用
因爲發送方儘早重傳未被確認的報文段,所以採用快重傳後可使整個網絡吞吐量提升約20%
示意圖
快恢復
當發送方連續收到3個重複確認後,就:
(ssthresh)
設置爲 出現擁塞時發送方窗口值的一半 = 擁塞窗口的1半(cwnd)
值設置爲 慢開始門限ssthresh
減半後的數值 = 擁塞窗口的1半注:
- 因爲跳過了擁塞窗口
(cwnd)
從1起始的慢開始過程,因此稱爲:快恢復- 此處網絡不會發生網絡擁塞,因若擁塞,則不會收到多個重複確認報文
快重傳 & 快恢復
圖片來源:《圖解HTTP》
https://juejin.cn/post/6844903592965439501
https://juejin.cn/post/6844903662838349838#heading-14