OSI七層模型
Open System Interconnection
適用于所有網(wǎng)絡(luò)
- 分工帶來效能
- 將復(fù)雜的流程分解為幾個功能相對單一的子進(jìn)程
- 整個流程更加清晰慈俯,復(fù)雜問題簡單化
- 更容易發(fā)現(xiàn)問題并針對性的解決問題
- 應(yīng)用層(Application)提供網(wǎng)絡(luò)與用戶應(yīng)用軟件之間的接口服務(wù)(HTTP)
- 表示層(Presentation)提供格式化的表示和轉(zhuǎn)換數(shù)據(jù)服務(wù)归苍,如加密和壓縮
- 會話層(Session)提供包括訪問驗(yàn)證和會話管理在內(nèi)的建立和維護(hù)應(yīng)用之間通信的機(jī)制;這三層也可歸為
應(yīng)用層
- 傳輸層(Transimission)提供建立、維護(hù)和取消傳輸連接功能麸恍,負(fù)責(zé)可靠的傳輸數(shù)據(jù)(TCP)
- 網(wǎng)絡(luò)層(NetWork)處理網(wǎng)絡(luò)間路由灵巧,確保數(shù)據(jù)及時傳送(路由器)
- 數(shù)據(jù)鏈路層(DataLink)負(fù)責(zé)無錯傳輸數(shù)據(jù),確認(rèn)幀抹沪,發(fā)錯重傳等(交換機(jī))
- 物理層(Physics)提供機(jī)械刻肄、電氣、功能和過程特性(網(wǎng)卡融欧,網(wǎng)線敏弃,雙絞線,同軸電纜噪馏,中繼器)
封裝過程
TCP/IP參考網(wǎng)絡(luò)模型
- TCP/IP是傳輸控制協(xié)議/網(wǎng)絡(luò)互聯(lián)協(xié)議的簡稱
- 早期的TCP/IP模型是一個四層結(jié)構(gòu)麦到,從下往上依次是網(wǎng)絡(luò)接口層绿饵,互聯(lián)網(wǎng)層;傳輸層和應(yīng)用層
- 后來在使用過程中瓶颠,借鑒OSI七層參考模型拟赊,將網(wǎng)絡(luò)接口層劃分為物理層和數(shù)據(jù)鏈路層,形成五層結(jié)構(gòu)
協(xié)議的概念和作用
- 為了讓計(jì)算機(jī)能夠通信粹淋,計(jì)算機(jī)需要定義通信規(guī)則吸祟,這些規(guī)則就是協(xié)議
- 規(guī)則是多種,協(xié)議也有多種
- 協(xié)議就是數(shù)據(jù)封裝格式+傳輸
常用協(xié)議
- TCP/IP協(xié)議被稱為傳輸控制協(xié)議/互聯(lián)網(wǎng)協(xié)議桃移,又稱為網(wǎng)絡(luò)通訊協(xié)議
- 是由網(wǎng)絡(luò)層的IP協(xié)議和傳輸層的TCP協(xié)議組成屋匕,是一個很大的協(xié)議集合
- 物理層和數(shù)據(jù)鏈路層沒有定義任何特定協(xié)議,支持所有的標(biāo)準(zhǔn)和專用的協(xié)議
網(wǎng)絡(luò)接口層
網(wǎng)絡(luò)接口層是TCP/IP模型的最底層借杰,負(fù)責(zé)接收從上一層交來的數(shù)據(jù)報(bào)并將數(shù)據(jù)報(bào)通過底層的物理網(wǎng)絡(luò)發(fā)送出去过吻,比較常見的就是設(shè)備的驅(qū)動程序,此層沒有特定的協(xié)議
網(wǎng)絡(luò)接口層又分為物理層和數(shù)據(jù)鏈路層
-
物理層
- 計(jì)算機(jī)在傳輸數(shù)據(jù)的時候傳遞的都是0和1的數(shù)字第步,而物理層關(guān)心的是用什么信號來表示0和1疮装,是否可以雙向通信,最初的連接如何建立以及完成連接如何終止粘都,物理層是為數(shù)據(jù)傳輸提供可靠的環(huán)境
- 盡可能的屏蔽掉物理設(shè)備和傳輸媒介,使數(shù)據(jù)鏈路層不考慮這些差異刷袍,只考慮本層的協(xié)議和服務(wù)
- 為用戶提供在一條物理傳輸媒體上提供傳送和接收比特流的能力
-
需要解決物理連接翩隧,維護(hù)和釋放的問題
5.png
-
數(shù)字信號的編碼
- 數(shù)字新的編碼:用何種物理信號來表示0和1
-
非歸零編碼
6.png 優(yōu)點(diǎn):編/譯碼簡單
缺點(diǎn):內(nèi)部不含時鐘信號,收發(fā)端同步困難
用途:計(jì)算機(jī)內(nèi)部呻纹,或低速數(shù)據(jù)通信
因?yàn)闀r鐘信號無法確定堆生,即時鐘頻率無法確定,例如一直發(fā)的都是1/0雷酪,是一條直線淑仆,怎么分割信號呢?無解
- 曼徹斯特編碼
- 優(yōu)點(diǎn)
- 內(nèi)部自含時鐘哥力,收發(fā)端同步容易
- 抗干擾能力強(qiáng)
- 缺點(diǎn)
- 編譯碼較復(fù)雜
- 占用更多的信道帶寬蔗怠,在同樣的比特率的情況下,要比非歸零編碼多占用一倍信道帶寬
- 用途:802.3局域網(wǎng)(以太網(wǎng))
數(shù)據(jù)鏈路層
- 數(shù)據(jù)鏈路層是OSI參考模型的第二層吩跋,介乎于物理層和網(wǎng)絡(luò)層之間
- 數(shù)據(jù)鏈路層在物理層提供的服務(wù)的基礎(chǔ)上向網(wǎng)絡(luò)層提供服務(wù)寞射,其最基本的服務(wù)是將源自網(wǎng)絡(luò)層來的數(shù)據(jù)可靠的傳輸?shù)较噜徆?jié)點(diǎn)的目標(biāo)機(jī)網(wǎng)絡(luò)層
- 如何將數(shù)據(jù)組合成數(shù)據(jù)塊,在數(shù)據(jù)鏈路層中稱這種數(shù)據(jù)塊為幀锌钮,幀是數(shù)據(jù)鏈路層的傳輸單位
- 如何控制幀在物理信道上的傳輸桥温,包括如何處理傳輸差錯,如何調(diào)節(jié)發(fā)送速率以使與接收方相匹配
- 以及在兩個網(wǎng)絡(luò)實(shí)體之間提供數(shù)據(jù)鏈路通路的建立梁丘,維持和釋放的管理
以太網(wǎng)
- 以太網(wǎng)是一種計(jì)算機(jī)局域網(wǎng)技術(shù)侵浸。IEEE組織的IEEE 802.3標(biāo)準(zhǔn)制定了以太網(wǎng)的技術(shù)標(biāo)準(zhǔn)旺韭,它規(guī)定了包含物理層的連線,電子信號和介質(zhì)訪問層協(xié)議的內(nèi)容
- 以太網(wǎng)的標(biāo)準(zhǔn)拓?fù)浣Y(jié)構(gòu)為總線型拓?fù)?/li>
- 以太網(wǎng)仍然使用總現(xiàn)拓?fù)浜虲SMA/CD的總線技術(shù)
- 以太網(wǎng)實(shí)現(xiàn)了網(wǎng)絡(luò)上無線電系統(tǒng)多個節(jié)點(diǎn)發(fā)送信息的想法掏觉,每個節(jié)點(diǎn)必須獲取電纜或者信道才能傳輸信息
- 每個節(jié)點(diǎn)都有全球唯一的48位地址也就是制造商分配給網(wǎng)卡的MAC地址区端,以保證以太網(wǎng)上所有節(jié)點(diǎn)能互相鑒別
總線拓?fù)?/h5>
- 總線型拓?fù)涫遣捎脝胃鶄鬏斪饔霉灿玫膫鬏斀橘|(zhì),將網(wǎng)絡(luò)中的所有計(jì)算機(jī)通過相應(yīng)的硬件接口和電纜直接連接到這根共享的總線上
- 使用總線型拓?fù)浣Y(jié)構(gòu)需解決的是確保端用戶使用媒體發(fā)送數(shù)據(jù)時不同出現(xiàn)沖突
- 總線型網(wǎng)絡(luò)采用
載波監(jiān)聽多路訪問/沖突檢測協(xié)議
(CSMA/CD)作為控制策略
8.png
載波監(jiān)聽多路訪問/沖突檢測協(xié)議
(CSMA/CD)作為控制策略載波監(jiān)聽多路訪問
- 是一種允許多個設(shè)備在同一信道發(fā)送信號的協(xié)議履腋,其中的設(shè)備監(jiān)聽其他設(shè)備是否忙碌珊燎,只有在線路空閑時候才發(fā)送
- 在這種訪問方式下,網(wǎng)絡(luò)中的所有用戶共享傳輸介質(zhì)遵湖,信息通過廣播傳送到所有端口悔政,網(wǎng)絡(luò)中的工作站對接收到的信息進(jìn)行確認(rèn),若是發(fā)給自己的就接收否則不理
- 從發(fā)送端情況看延旧,當(dāng)一個工作站有數(shù)據(jù)要發(fā)送時候谋国,它首先監(jiān)聽信道并檢測網(wǎng)絡(luò)上是否有其他的工作站正在發(fā)送DATA,如果檢測到信道忙迁沫,工作站將繼續(xù)WAIT若發(fā)現(xiàn)信道空閑芦瘾,則開始發(fā)送數(shù)據(jù),信息發(fā)送出去后集畅,發(fā)送端還要繼續(xù)對發(fā)送的消息進(jìn)行確認(rèn)近弟,以了解接收端是否已經(jīng)正確的接收到數(shù)據(jù),如果收到則發(fā)送結(jié)束挺智,否則再此發(fā)送
- 核心思想
- 先聽后講祷愉,信道空閑則發(fā)送,信道忙則等待
- 邊聽邊講 發(fā)送信息時不斷檢測信道是否碰撞
- 碰撞即停
- 退避重傳 二進(jìn)制指數(shù)退避重傳
- 多次碰撞 放棄發(fā)送赦颇,最多16次
沖突檢測
- 沖突檢測即發(fā)送站點(diǎn)在發(fā)送數(shù)據(jù)時要邊發(fā)送邊監(jiān)聽信道二鳄,若監(jiān)聽到信道有干擾信號,則表示產(chǎn)生了沖突媒怯,于是就要立刻停止發(fā)送消息订讼,計(jì)算出退避等待時間,然后使用CSMA方法繼續(xù)嘗試發(fā)送
- 計(jì)算退避等待時間采用的時
二進(jìn)制指數(shù)退避算法
演化
上面總線形式數(shù)據(jù)傳輸有很多弊端扇苞,后期演化成交換機(jī)交換數(shù)據(jù)欺殿,交換機(jī)是二層設(shè)備在物理鏈路層上面工作,工作方式是通過MAC地址定向傳輸數(shù)據(jù)杨拐,避免了總線形式的時候所有機(jī)器都可以接收到數(shù)據(jù)的問題祈餐。
MAC地址
- 在通信過程中是用內(nèi)置的網(wǎng)卡內(nèi)的地址來標(biāo)識計(jì)算機(jī)身份的
- 每個網(wǎng)卡都有一個全球唯一的地址來標(biāo)識自己,不會重復(fù)
-
MAC地址48位的二進(jìn)制組成哄陶,通常分為6段帆阳,用16進(jìn)制表示
9.png
以太網(wǎng)幀格式
- 在以太網(wǎng)鏈路上的數(shù)據(jù)包稱為以太幀,以太幀起始部分由前導(dǎo)碼和幀開始符z盛
- 后面緊跟著一個以太網(wǎng)報(bào)頭,以MAC地址說明目的地址和源地址
- 幀的中部是該幀負(fù)載的包含其他協(xié)議報(bào)頭的數(shù)據(jù)包(例如IP協(xié)議)
- 以太幀由一個32位冗余校驗(yàn)碼結(jié)尾蜒谤。它用于檢驗(yàn)數(shù)據(jù)傳輸是否出現(xiàn)損壞
路由器IP尋址網(wǎng)絡(luò)層山宾,交換機(jī)mac尋址數(shù)據(jù)鏈路層
ARP協(xié)議
- 地址解析協(xié)議,即ARP鳍徽,是根據(jù)IP地址獲取物理地址(MAC)的一個TCP/IP協(xié)議
- 主機(jī)發(fā)送信息時將包含目標(biāo)IP地址的ARP請求廣播到網(wǎng)絡(luò)上的所有主機(jī)资锰,并接收返回消息,以此確定目標(biāo)的物理地址阶祭;收到返回消息后將該IP地址和物理地址存入本機(jī)ARP緩存中并保留一定時間绷杜,下次請求時直接查詢ARP緩存以節(jié)約資源
- 地址解析協(xié)議是建立在網(wǎng)絡(luò)中各個主機(jī)互相信任的基礎(chǔ)上的,網(wǎng)絡(luò)上的主機(jī)可以自主發(fā)送ARP應(yīng)答消息濒募,其他主機(jī)收到應(yīng)答報(bào)文時不會檢測該報(bào)文的真實(shí)性就會將其記入本機(jī)ARP緩存
- 由此攻擊者就可以向某一主機(jī)發(fā)送偽ARP應(yīng)答報(bào)文鞭盟,使其發(fā)送的信息無法達(dá)到預(yù)期的主機(jī)或到達(dá)錯誤的主機(jī),構(gòu)成ARP欺騙
ARP協(xié)議報(bào)文
ARP地址解析過程
主機(jī)A和B在同一個網(wǎng)段瑰剃,主機(jī)A要向主機(jī)B發(fā)送信息
- 主機(jī)A首先查看自己的ARP表齿诉,確定其中是否包含有主機(jī)B對應(yīng)的ARP表項(xiàng)。如果找到了對應(yīng)的MAC地址晌姚,則主機(jī)A直接利用ARP表中的MAC地址粤剧,對IP數(shù)據(jù)包進(jìn)行幀封裝,并將數(shù)據(jù)包發(fā)送給主機(jī)B挥唠。
- 如果主機(jī)A在ARP表中找不到對應(yīng)的MAC地址抵恋,則將該緩存該數(shù)據(jù)報(bào)文,然后以廣播方式發(fā)送一個ARP請求報(bào)文宝磨。ARP請求報(bào)文中的發(fā)送端IP地址和發(fā)送端MAC地址為主機(jī)A的IP地址和MAC地址馋记,目標(biāo)IP地址和目標(biāo)MAC地址為主機(jī)B的IP地址和全0的MAC地址。由于ARP請求報(bào)文以廣播方式發(fā)送懊烤,該網(wǎng)段上的所有主機(jī)都可以接收到該請求,但只有被請求的主機(jī)(即主機(jī)B)會對該請求進(jìn)行處理宽堆。
- 主機(jī)B比較自己的IP地址和ARP請求報(bào)文中的目標(biāo)IP地址腌紧,當(dāng)兩者相同時進(jìn)行如下處理:將ARP請求報(bào)文中的發(fā)送端(即主機(jī)A)的IP地址和MAC地址存入自己的ARP表中。之后以單播的方式發(fā)送ARP響應(yīng)報(bào)文給主機(jī)A畜隶,其中包含自己的MAC地址壁肋。
- 主機(jī)A收到ARP響應(yīng)報(bào)文后,將主機(jī)B的MAC地址加入到自己的ARP表中以用于后續(xù)報(bào)文的轉(zhuǎn)發(fā)籽慢,同時將IP數(shù)據(jù)包進(jìn)行封裝后發(fā)送出去
互聯(lián)網(wǎng)層(網(wǎng)絡(luò)層)
位于傳輸層和網(wǎng)絡(luò)接口層之間浸遗,用于把數(shù)據(jù)從源主機(jī)經(jīng)過若干個中間節(jié)點(diǎn)傳送到目標(biāo)主機(jī),并向傳輸層提供最基礎(chǔ)的數(shù)據(jù)傳輸服務(wù)箱亿,主要提供路由和選址的工作
選址
交換機(jī)是靠MAC來尋址的跛锌,而因?yàn)镸AC地址是無層次的,所以要靠IP地址來確認(rèn)計(jì)算機(jī)的位置届惋,這就是選址
路由
在能夠選擇的多條道路之間選擇一條最短的路勁就是路由的工作
在大網(wǎng)絡(luò)情況下髓帽,起始是多個路由器跳轉(zhuǎn)菠赚,路由器之間有路由算法,即其實(shí)也不知道真實(shí)IP主機(jī)在哪里郑藏,但是可以知道轉(zhuǎn)發(fā)給哪個路由可以到達(dá)目標(biāo)IP
IP
在網(wǎng)絡(luò)中衡查,每臺計(jì)算機(jī)都有一個唯一的地址,方便別人找到它必盖,這個地址稱為IP地址
-
IP頭部
7.png
-
IP地址格式
- IP地址是一個網(wǎng)絡(luò)編碼渊啰,用來確定網(wǎng)絡(luò)中的一個節(jié)點(diǎn)
-
IP地址是由32位二進(jìn)制(32bit)組成
10.png
-
IP地址組成
- 網(wǎng)絡(luò)部分(NETWORK)
- 主機(jī)部分(HOST)
- IP地址的分類
- IP地址的網(wǎng)絡(luò)部分是由Internet地址分配機(jī)構(gòu)來統(tǒng)一分配的塌计,這樣可以保證IP的唯一性
- IP地址中全為1的IP即255.255.255.255,它稱為限制廣播地址,如果將其作為數(shù)據(jù)包的目標(biāo)地址可以理解為發(fā)送到所有網(wǎng)絡(luò)的所有主機(jī)
- IP地址中全為0的IP即0.0.0.0腐泻,它表示啟動時的IP地址,其含義就是尚未分配時的IP地址
- 127是用來進(jìn)行本機(jī)測試的崔赌,除了127.255.255.255外绷柒,其他的127開頭的地址都代表本機(jī)
- 如果只有最后一位是255則表明是某網(wǎng)段的廣播地址(不能作用主機(jī)地址),此處區(qū)別于255.255.255.255
- 如果只有最后一位是0也代表未分配地址突勇,該IP不能作為主機(jī)地址
- 公有地址和私有地址
分類 | 范圍 |
---|---|
A類私有IP | 10.0.0.0 ~10.255.255.255 |
B類私有IP | 172.16.0.0~172.31.255.255 |
C類私有IP | 192.168.0.0~192.168.255.255 |
其他范圍的IP均為公有IP地址
- 子網(wǎng)掩碼
- 子網(wǎng)掩碼又叫子網(wǎng)絡(luò)遮罩装盯,它是一種用來指明一個IP地址的那些位標(biāo)識的是主機(jī)所在的子網(wǎng),以及哪些位標(biāo)識的是主機(jī)位的掩碼
- 子網(wǎng)掩碼不能單獨(dú)存在甲馋,它必須結(jié)合IP地址一起使用
- 子網(wǎng)掩碼只有一個作用埂奈,就是將某個IP地址劃分成網(wǎng)絡(luò)地址和主機(jī)地址部分
- 子網(wǎng)掩碼也是32個二進(jìn)制
- 對應(yīng)IP的網(wǎng)絡(luò)部分用1表示
- 對應(yīng)IP的主機(jī)部分用0表示
- IP地址和子網(wǎng)掩碼做邏輯與運(yùn)算的到網(wǎng)絡(luò)地址
- 0和任何數(shù)相與都是0
- 1和任何樹相與都等于任何數(shù)本身
- A B C三類地址都有自己默認(rèn)的子網(wǎng)掩碼
- A類255.0.0.0
- B類255.255.0.0
- C類255.255.255.0
說白了,網(wǎng)絡(luò)地址相同才是同一個網(wǎng)段才能通信定躏,否則即使IP地址很像也不行
傳輸層
- 位于應(yīng)用層和網(wǎng)絡(luò)接口層之間
- 是面向連接的账磺,可靠的進(jìn)程到進(jìn)程通信的協(xié)議
- TCP提供全雙工通信,即數(shù)據(jù)可在同一時間雙向傳播
- TCP將若干個字節(jié)構(gòu)成一個分組痊远,此分組稱為報(bào)文段
- 對可靠性要求高的上層協(xié)議垮抗,實(shí)現(xiàn)可靠性的保證,如果數(shù)據(jù)丟失碧聪、損壞的情況下如何保證可靠性冒版,網(wǎng)絡(luò)層只管傳遞數(shù)據(jù),成功與否并不關(guān)心
- TCP是在不可靠協(xié)議(互聯(lián)網(wǎng)層)基礎(chǔ)上維護(hù)可靠傳輸
- 提供一種端到端的連接
單工
單向傳輸逞姿,廣播辞嗡,電視
半雙工
在同一個時間點(diǎn)內(nèi),只能單向通信
全雙工
在任意時間點(diǎn)雙方都可以收發(fā)數(shù)據(jù) 例如:電話
協(xié)議分類
- TCP
- 傳輸控制協(xié)議
- 可靠的‘面向連接的協(xié)議
- 傳輸效率低
- UDP
- 用戶數(shù)據(jù)報(bào)協(xié)議
- 不可靠的滞造,無連接的服務(wù)
- 傳輸效率高
TCP
- 將數(shù)據(jù)進(jìn)行分段打包傳輸
- 對每個數(shù)據(jù)包編號進(jìn)行控制順序
- 運(yùn)輸中丟失续室、重發(fā)和丟棄處理
- 流量控制避免擁塞
TCP數(shù)據(jù)包封裝
-
源端口號和目標(biāo)端口號,計(jì)算機(jī)通過端口號識別訪問哪個服務(wù)谒养,比如HTTP服務(wù)或FTP服務(wù)挺狰,發(fā)送方端口號是進(jìn)行隨機(jī)端口,目標(biāo)端口號決定了接收方是哪個程序
2.png
32位序列號
TCP用序列號對數(shù)據(jù)包進(jìn)行標(biāo)記,以便達(dá)到目的地后重新重裝她渴,假設(shè)當(dāng)前的序列號為s,發(fā)送數(shù)據(jù)長度為l达址,則下次發(fā)送數(shù)據(jù)時的序列號為S+l。在建立連接時通常由計(jì)算機(jī)生成一個隨機(jī)數(shù)作為序列號的初始值
確認(rèn)應(yīng)答號
它等于下一次應(yīng)該接收到的數(shù)據(jù)的序列號趁耗,假設(shè)發(fā)送端的序列號為s沉唠,發(fā)送數(shù)據(jù)的長度為l,那么接收端返回的確認(rèn)應(yīng)答號也是s+l.發(fā)送端接收到這個確認(rèn)應(yīng)答后,可以認(rèn)為這個位置以前所有的數(shù)據(jù)都已被正常接收苛败,也就代表著满葛,隨機(jī)數(shù)據(jù)包前后順序不一定,但是后面包的確認(rèn)信息肯定是全面包都收到后才發(fā)送給發(fā)送端的
首部長度
TCP首部的長度罢屈,單位為4字節(jié)嘀韧。如果沒有可選字段,那么這里的值就是5缠捌。表示TCP首部的長度為20字節(jié)锄贷。
控制位
- 控制位TCP的連接、傳輸和斷開都受這六個控制位的指揮
- PSH緩存區(qū)將滿曼月,立刻傳輸數(shù)據(jù)
- REST 連接斷了重新連接
- URG 緊急信號
- 緊急指針
盡在URG控制位為1時有效谊却。表示緊急數(shù)據(jù)的末尾在TCP數(shù)據(jù)部分中的位置。通常在暫時中斷通信時候使用(例如Crtl+C)
5.png
- SYN
同步序號位TCP建立連接時候要將這個值設(shè)置為1
6.png
- ACK
為1表示確認(rèn)號
7.png
- FIN
發(fā)送端完成位哑芹,提出斷開連接的乙方把FIN置為1表示要斷開連接
8.png
窗口值
- 窗口值:說明本地可接收數(shù)據(jù)段的數(shù)目炎辨,這個值的大小是可變的。當(dāng)網(wǎng)絡(luò)通常時將這個窗口值變大加快傳輸速度聪姿,當(dāng)網(wǎng)絡(luò)不穩(wěn)定時候減少這個值可以保證網(wǎng)絡(luò)數(shù)據(jù)的可靠傳輸碴萧。它是在TCP傳輸中進(jìn)行流量控制的
- 窗口大小:用于表示從應(yīng)答號開始能夠接受多少個8位字節(jié)末购。如果窗口大小為0破喻,可以發(fā)送窗口探測
-
窗口探測:例如接收方窗口已經(jīng)堆滿了數(shù)據(jù),沒來的及處理盟榴,則接收方通過ACK返回窗口大小為0低缩,則發(fā)送方知道0了則不發(fā)送了,但是可能后期接收方處理了曹货,窗口有了,需要發(fā)送方每隔一段時間去接收方問窗口空了沒讳推,這就是窗口探測
9.png
差錯控制
- 校驗(yàn)和用來做差錯控制顶籽,TCP校驗(yàn)和的計(jì)算包括TCP首部,數(shù)據(jù)和其他填充字節(jié)银觅,在發(fā)送TCP數(shù)據(jù)段時候礼饱,由發(fā)送端計(jì)算校驗(yàn)和,當(dāng)?shù)竭_(dá)目的地時候又進(jìn)行一次校驗(yàn)和計(jì)算。如果兩次校驗(yàn)和一致說明數(shù)據(jù)是正確的镊绪,否則將認(rèn)為數(shù)據(jù)被破壞匀伏,接收端將丟棄數(shù)據(jù)
10.png
握手和斷開 - TCP是面向連接的協(xié)議,它在源點(diǎn)和終點(diǎn)之間建立虛擬連接蝴韭,而不是物理連接
- 在數(shù)據(jù)通信之前够颠,發(fā)送端與接收端要先建立連接,等數(shù)據(jù)發(fā)送結(jié)束后榄鉴,雙方在斷開連接
-
TCP連接的每一方都是由一個IP地址和一個端口組成
11.png
之所以四次揮手中間兩次不能合并是因?yàn)槁哪ィ?wù)端響應(yīng)必須立刻給客戶端,否則客戶端會重新傳消息庆尘。之后確定不確定斷開在專門發(fā)FIN消息
滑動窗口
- 滑動窗口是一種流量控制技術(shù)
- 早期的網(wǎng)絡(luò)通信中剃诅,通信雙方不會考慮網(wǎng)絡(luò)的擁擠情況直接發(fā)送數(shù)據(jù)。由于大家不知道網(wǎng)絡(luò)擁塞狀況驶忌,同時發(fā)送數(shù)據(jù)矛辕,導(dǎo)致中間節(jié)點(diǎn)阻塞掉包,誰也發(fā)不了數(shù)據(jù)付魔,所以就有了滑動窗口機(jī)制來解決這個問題
- TCP中采用滑動窗口來進(jìn)行傳輸控制聊品,滑動窗口的大小意味著接收方還有多大的緩沖區(qū)可以用于接收數(shù)據(jù),發(fā)送方可以通過滑動窗口的大小來確定應(yīng)該發(fā)送多少字節(jié)的數(shù)據(jù)
- 當(dāng)滑動窗口為0時抒抬,發(fā)送方一般不能再發(fā)送數(shù)據(jù)報(bào)杨刨,但有兩種情況除外,一種情況是可以發(fā)送緊急數(shù)據(jù)擦剑,例如:允許用戶終止再遠(yuǎn)端機(jī)上的運(yùn)行進(jìn)程妖胀。另一種情況是發(fā)送方可以發(fā)送一個1字節(jié)的數(shù)據(jù)報(bào)來通知接收方重新聲明它希望接收的下一字節(jié)及發(fā)送方的滑動窗口大小。
窗口機(jī)制
- 滑動窗口協(xié)議的基本原理就是在任意時刻惠勒,發(fā)送方都維持了一個連續(xù)的允許發(fā)送的幀的序號赚抡,稱為發(fā)送窗口;同時纠屋,接收方也維持一個連續(xù)的允許接收的幀的序號涂臣,稱為接收窗口
- 發(fā)送窗口和接收窗口的序號的上下界不一定要一樣,甚至大小也可以不同
- 不同的滑動窗口協(xié)議窗口大小一般不同
- 發(fā)送窗口內(nèi)的序列號代表了那些已經(jīng)被發(fā)送售担,但是還沒有被確認(rèn)的幀赁遗,或者是哪些可以被發(fā)送的幀
擁塞控制
- TCP擁塞控制是傳輸控制協(xié)議,避免網(wǎng)絡(luò)擁塞的算法族铆,是互聯(lián)網(wǎng)上主要的一個擁塞控制措施
- TCP使用多種擁塞控制策略來避免雪崩式擁塞岩四,TCP會為每條連接維護(hù)一個"擁塞窗口"來限制端對端間傳輸?shù)奈创_認(rèn)分組總數(shù)量
- 這類似TCP流量控制機(jī)制中使用的滑動窗口,是由發(fā)送方控制的
- TCP在一個連接初始化或超時后使用一種"慢啟動"機(jī)制來增加擁塞窗口的大小哥攘。它的起始值一般為最大分段大小的兩倍剖煌,雖然命名為慢啟動材鹦,初始值也向當(dāng)?shù)兀湓鲩L極快耕姊;當(dāng)每個分段的到確認(rèn)時桶唐,擁塞窗口會增加一個MSS,使的再每次往返內(nèi)擁塞窗口能高效的雙倍增長
- 再流量控制中茉兰,接收方通過TCP的"窗口"值來告知發(fā)送方尤泽,由發(fā)送方通過對擁塞窗口和接收窗口的大小比較,來確定任何時刻內(nèi)需要傳輸?shù)臄?shù)據(jù)量
- 和式增加邦邦,積式減少是一種反饋控制算法安吁,其包含了對擁塞窗口線性增加,和當(dāng)發(fā)生擁塞時對窗口積式減少燃辖。多個使用AIMD控制的TCP流量最終會收斂到對線路的等量競爭使用
- 未確認(rèn)的數(shù)據(jù)包剛好等于帶寬等于延遲
-
當(dāng)發(fā)現(xiàn)丟包的時候立刻減半
2.png
UDP
- UDP是一個面向無連接鬼店,不保證可靠性的傳輸層協(xié)議,也就是說發(fā)送端不關(guān)心發(fā)送的數(shù)據(jù)是否達(dá)到目標(biāo)主機(jī)黔龟,數(shù)據(jù)是否出錯等妇智,收到的數(shù)據(jù)的主機(jī)也不會告訴發(fā)送方是否收到了數(shù)據(jù),它的可靠性由上層協(xié)議來保障
- 首部結(jié)構(gòu)簡單氏身,再數(shù)據(jù)傳輸時能實(shí)現(xiàn)最小的開銷巍棱,如果進(jìn)程想發(fā)送很短的報(bào)文而對可靠性要求不高可以使用
DNS
DNS服務(wù)器進(jìn)行域名與之對應(yīng)的IP地址轉(zhuǎn)換的服務(wù)器
- IP地址不易記憶
- 早期使用Hosts文件解析域名
- 主要名稱重復(fù)
- 主機(jī)維護(hù)困難
- DNS(域名系統(tǒng))
- 分布式
-
層次性
7.png
其中本地DNS服務(wù)器可能是路由器等
DHCP(應(yīng)用層)
- 保證任何IP地址在同一時刻只能由一臺DHCP客戶機(jī)所使用(DHCP服務(wù)器再小網(wǎng)絡(luò)環(huán)境一般集成再路由器中)
- DHCP應(yīng)當(dāng)可以給用戶分配永久固定的IP地址
- DHCP應(yīng)當(dāng)可以同用其他方法獲的IP地址的主機(jī)共存(如手工設(shè)置IP地址的主機(jī))
- DHCP服務(wù)器應(yīng)當(dāng)向現(xiàn)有的BOOTP客戶端提供服務(wù)
工作流程
- 主機(jī)發(fā)送DHCPDISCOVER廣播包再網(wǎng)絡(luò)上尋找DHCP服務(wù)器
- DHCP服務(wù)器向主機(jī)發(fā)送DHCPOFFER單播數(shù)據(jù)包,包含IP地址蛋欣、MAC地址航徙、域名信息以及地址租期
- 主機(jī)發(fā)送DHCPREQUEST廣播包,正式向服務(wù)器請求分配已提供的IP地址
- DHCP服務(wù)器向主機(jī)發(fā)送DHCPPACK單播包陷虎,確認(rèn)主機(jī)的請求
應(yīng)用層
應(yīng)用層常見協(xié)議
- HTTP超文本傳輸協(xié)議
- FTP文件傳輸協(xié)議
- SMTP(發(fā)送郵件)和POP3(接收郵件)
案例
數(shù)據(jù)->傳輸層(包)->網(wǎng)絡(luò)層(段Segment)->數(shù)據(jù)鏈路層(幀)
- 在應(yīng)用層要把各式各樣的數(shù)據(jù)如字母到踏、數(shù)字、漢字尚猿、圖片等轉(zhuǎn)換成二進(jìn)制
- 再TCP傳輸層中窝稿,上層的數(shù)據(jù)被分割成小的數(shù)據(jù)段,并為每個分段后的數(shù)據(jù)封裝TCP報(bào)文頭部
- 再TCP頭部有一個關(guān)鍵的字段信息端口號凿掂,它用于標(biāo)識上層的協(xié)議或應(yīng)用程序伴榔,確保上層數(shù)據(jù)的正常通信
- 計(jì)算機(jī)可以多進(jìn)程并發(fā)運(yùn)行,例如在發(fā)郵件的同時也可以通過瀏覽器瀏覽網(wǎng)頁庄萎,這兩種應(yīng)用通過端口號進(jìn)行區(qū)分
- 在網(wǎng)絡(luò)層踪少,上層數(shù)據(jù)被封裝上層的報(bào)文頭部(IP頭部),上層的數(shù)據(jù)是包括TCO頭部的糠涛。IP地址包括的最關(guān)鍵字段信息就是IP地址秉馏,用于標(biāo)識網(wǎng)絡(luò)的邏輯地址
- 數(shù)據(jù)鏈路層,上層數(shù)據(jù)包裝成一個MAC頭部脱羡,內(nèi)部有最關(guān)鍵的是MAC地址萝究。MAC地址就是固化在硬件設(shè)備內(nèi)部的全球唯一的物理地址
-
在物理層,無論在之前哪一層封裝的報(bào)文頭和還是上層數(shù)據(jù)都是由二進(jìn)制組成锉罐,物理層將這些二進(jìn)制數(shù)據(jù)比特流轉(zhuǎn)換成電信號在網(wǎng)絡(luò)中傳輸
11.png
接收數(shù)據(jù)的過程是逆向的解包操作
真實(shí)網(wǎng)絡(luò)環(huán)境
- 發(fā)送方和接收方可能會有多個硬件中轉(zhuǎn)設(shè)備
- 中間可能會增加交換機(jī)和路由器
- 數(shù)據(jù)在傳輸過程中不斷的進(jìn)行封裝和解封裝的過程帆竹,每層設(shè)備只能處理那一層的數(shù)據(jù)
- 交換機(jī)數(shù)據(jù)數(shù)據(jù)鏈路層
-
路由器屬于網(wǎng)絡(luò)層
12.png
HTTP緩存
該部分完全復(fù)制公眾號,連接
瀏覽器緩存幾個階段
- 強(qiáng)緩存策略
瀏覽器端發(fā)起請求之后不會直接向服務(wù)器請求數(shù)據(jù)脓规,直接先到達(dá)強(qiáng)緩存階段栽连,如果強(qiáng)緩存命中直接返回,如果沒有命中進(jìn)入下一階段協(xié)商緩存策略侨舆。
- 協(xié)商緩存策略
協(xié)商緩存是當(dāng)強(qiáng)緩存沒有命中的情況或者按下 F5 鍵刷新頁面會觸發(fā)秒紧,它每次都會攜帶標(biāo)識與服務(wù)器進(jìn)行校驗(yàn),符合則返回 304 標(biāo)識挨下,表示資源沒有更新熔恢,如果協(xié)商緩存也失效了,進(jìn)入下一個階段獲取最新數(shù)據(jù)臭笆,并返回且狀態(tài)碼為 200叙淌。
- 存儲策略
當(dāng)強(qiáng)緩存->協(xié)商緩存都未命中,請求會直接到達(dá)服務(wù)器愁铺,獲取最新資源設(shè)置緩存策略鹰霍,進(jìn)行返回。
強(qiáng)緩存
強(qiáng)緩存的實(shí)現(xiàn)分為 Expires茵乱、Cache-Control 兩個茂洒。
- Expires
Expires 屬于 HTTP 1.0 時期的產(chǎn)物,在響應(yīng)中進(jìn)行設(shè)置瓶竭,示例如下:
response.writeHead(200, {
'Content-Type': 'text/javascript',
'Expires': new Date('2020-03-25 11:19:00'),
});
設(shè)置成功運(yùn)行 node expires.js 在 Response Headers 里可以看到如下信息:
Expires: Wed Mar 25 2020 11:19:00 GMT+0800 (GMT+08:00)
刷新兩次頁面督勺,可以看到第二次 size 一欄返回了 memory cache 此時 Expires 緩存命中。
Expires 是參考的本地時間在验,如果修改本地時間玷氏,可能就會造成緩存失效。
- Cache-Control
Cache-Control 屬于 HTTP 1.1 時代的產(chǎn)物腋舌,可以再請求頭或者響應(yīng)頭中設(shè)置盏触,它的取值包含如下選項(xiàng):
- 可緩存性
- public:http 經(jīng)過的任何地方都可以進(jìn)行緩存(代理服務(wù)器也可緩存)
- private:只有發(fā)起請求的這個瀏覽器才可以進(jìn)行緩存,如果設(shè)置了代理緩存块饺,那么代理緩存是不會生效的
- no-cache:任何一個節(jié)點(diǎn)都不可以緩存(繞過強(qiáng)緩存赞辩,但是還會經(jīng)過協(xié)商緩存)
- 到期
- max-age=:設(shè)置緩存到多少秒過期
- s-maxage=:會代替 max-age,只有在代理服務(wù)器(nginx 代理服務(wù)器)才會生效
- max-stale=:是發(fā)起請求方主動帶起的一個頭授艰,是代表即便緩存過期辨嗽,但是在 max-stale 這個時間內(nèi)還可以使用過期的緩存,而不需要向服務(wù)器請求新的內(nèi)容
- 重新驗(yàn)證
- must-revalidate:如果 max-age 設(shè)置的內(nèi)容過期淮腾,必須要向服務(wù)器請求重新獲取數(shù)據(jù)驗(yàn)證內(nèi)容是否過期
- proxy-revalidate:主要用在緩存服務(wù)器糟需,指定緩存服務(wù)器在過期后重新從原服務(wù)器獲取屉佳,不能從本地獲取
- 其它
- no-store:本地和代理服務(wù)器都不可以存儲這個緩存,永遠(yuǎn)都要從服務(wù)器拿 body 新的內(nèi)容使用(強(qiáng)緩存洲押、協(xié)商緩存都不會經(jīng)過)
- no-transform:主要用于 proxy 服務(wù)器武花,告訴代理服務(wù)器不要隨意改動返回的內(nèi)容
Cache-Control 示例
先思考兩個問題?
1. 在頁面中引入靜態(tài)資源文件,為什么靜態(tài)資源文件改變后杈帐,再次發(fā)起請求還是之前的內(nèi)容体箕,沒有變化呢?
2. 在使用webpack等一些打包工具時挑童,為什么要加上一串hash碼累铅?
- cache-control.html
<html>
<head>
<meta charset="utf-8" />
<title>cache-control</title>
</head>
<body>
<script src="/script.js"></script>
</body>
</html>
- cache-control.js
瀏覽器輸入 http://localhost:3010/ 加載 cache-control.html 文件,該文件會請求 http://localhost:3010/script.js 如果 url 等于 /script.js 設(shè)置 cache-control 的 max-age 進(jìn)行瀏覽器緩存站叼。
const http = require('http');
const fs = require('fs');
const port = 3010;
http.createServer((request, response) => {
console.log('request url: ', request.url);
if (request.url === '/') {
const html = fs.readFileSync('./example/cache/cache-control.html', 'utf-8');
response.writeHead(200, {
'Content-Type': 'text/html',
});
response.end(html);
} else if (request.url === '/script.js') {
response.writeHead(200, {
'Content-Type': 'text/javascript',
'Cache-Control': 'max-age=200'
});
response.end("console.log('script load')");
}
}).listen(port);
console.log('server listening on port ', port);
- 第一次運(yùn)行
瀏覽器運(yùn)行結(jié)果,沒有什么問題娃兽,正常響應(yīng)
- 修改 cache-control.js 返回值
response.writeHead(200, {
'Content-Type': 'text/javascript',
'Cache-Control': 'max-age=200'
});
response.end("console.log('script load !4竽辍换薄!')");
- 中斷上次程序,第二次運(yùn)行
瀏覽器運(yùn)行結(jié)果
第二次運(yùn)行翔试,從 memory cahce 讀取轻要,瀏覽器控制臺并沒有打印修改過的內(nèi)容
控制臺運(yùn)營結(jié)果
只請求了 / 并沒有請求 /script.js
源碼參考:github.com/Q-Angelo/http-protocol/blob/master/example/cache/cache-control.js
以上結(jié)果瀏覽器并沒有返回給我們服務(wù)端修改的結(jié)果,這是為什么呢垦缅?
先回答第一個問題
在頁面中引入靜態(tài)資源文件冲泥,為什么靜態(tài)資源文件改變后,再次發(fā)起請求還是之前的內(nèi)容壁涎,沒有變化呢凡恍?
是因?yàn)槲覀冋埱蟮?url /script.js
沒有變,那么瀏覽器就不會經(jīng)過服務(wù)端的驗(yàn)證怔球,會直接從客戶端緩存去讀嚼酝,就會導(dǎo)致一個問題,我們的js靜態(tài)資源更新之后竟坛,不會立即更新到我們的客戶端闽巩,這也是前端開發(fā)中常見的一個問題,我們是希望瀏覽器去緩存我們的靜態(tài)資源文件(js担汤、css涎跨、img等)我們也不希望服務(wù)端內(nèi)容更新了之后客戶端還是請求的緩存的資源,
回答第二個問題
在使用webpack等一些打包工具時崭歧,為什么要加上一串hash碼隅很?
解決辦法也就是我們在做 js 構(gòu)建流程時,把打包完成的 js 文件名上根據(jù)它內(nèi)容 hash 值加上一串 hash 碼率碾,這樣你的 js 文件或者 css 文件等內(nèi)容不變叔营,這樣生成的 hash 碼就不會變屋彪,反映到頁面上就是你的 url 沒有變,如果你的文件內(nèi)容有變化那么嵌入到頁面的文件 url 就會發(fā)生變化绒尊,這樣就可以達(dá)到一個更新緩存的目的撼班,這也是目前前端來說比較常見的一個靜態(tài)資源方案。
Expires 與 Cache-Control 對比
- HTTP 協(xié)議對比:Expires 屬于 HTTP 1.0 時代的產(chǎn)物垒酬,Cache-Control 屬于 HTTP 1.1 時代的產(chǎn)物
- 優(yōu)先級對比:如果同時使用 Cache-Control 的 max-age 與 Expires,則 max-age 優(yōu)先級會更高件炉,會忽略掉 Expires
- 緩存單位:Expires 與 Cache-Control 兩者的緩存單位都是以時間為維度勘究,如果我要根據(jù)文件的內(nèi)容變化來判斷緩存是否失效怎么辦呢?就需要用到下面的協(xié)商緩存了斟冕。
協(xié)商緩存
如果強(qiáng)緩存未命中或用戶按下 F5 強(qiáng)制刷新后進(jìn)入?yún)f(xié)商緩存口糕,服務(wù)器則根據(jù)瀏覽器請求時的標(biāo)識進(jìn)行判斷,如果協(xié)商緩存生效返回 304 否則返回 200磕蛇。協(xié)商緩存的實(shí)現(xiàn)也是基于兩點(diǎn) Last-Modified景描、ETag 這個需要在 HTTP Headers 中設(shè)置。
Last-Modified/If-Modified-Since
Last-Modified 是在服務(wù)端設(shè)置進(jìn)行響應(yīng)秀撇,If-Modified-Since 是在瀏覽器端根據(jù)服務(wù)端上次在 Response Headers 中設(shè)置的 Last-Modified 取其值超棺,如果存在請求時設(shè)置其 Request Headers 值 If-Modified-Since 傳到服務(wù)器,服務(wù)器也是拿到這個值進(jìn)行比對呵燕,下面為核心實(shí)現(xiàn)棠绘。
if (request.url === '/script.js') {
const filePath = path.join(__dirname, request.url); // 拼接當(dāng)前腳本文件地址
const stat = fs.statSync(filePath); // 獲取當(dāng)前腳本狀態(tài)
const mtime = stat.mtime.toGMTString() // 文件的最后修改時間
const requestMtime = request.headers['if-modified-since']; // 來自瀏覽器傳遞的值
console.log(stat);
console.log(mtime, requestMtime);
// 走協(xié)商緩存
if (mtime === requestMtime) {
response.statusCode = 304;
response.end();
return;
}
// 協(xié)商緩存失效,重新讀取數(shù)據(jù)設(shè)置 Last-Modified 響應(yīng)頭
console.log('協(xié)商緩存 Last-Modified 失效');
response.writeHead(200, {
'Content-Type': 'text/javascript',
'Last-Modified': mtime,
});
const readStream = fs.createReadStream(filePath);
readStream.pipe(response);
}
執(zhí)行 node last-modified.js 啟動程序再扭,瀏覽器執(zhí)行 http://localhost:3010/打開頁面氧苍,我多次調(diào)用發(fā)現(xiàn)第一次是從服務(wù)器拿的數(shù)據(jù)且狀態(tài)為 200,之后每次都是 memory cache 為什么不是 304 呢泛范?
顯然是強(qiáng)緩存生效了让虐,你可能會想我沒有設(shè)置強(qiáng)緩存哦??
這是因?yàn)闉g覽器默認(rèn)啟用了一個啟發(fā)式緩存,這在設(shè)置了 Last-Modified 響應(yīng)頭且沒有設(shè)置 Cache-Control: max-age/s-maxage 或 Expires時會觸發(fā)罢荡,它的一個緩存時間是用 Date - Last-Modified 的值的 10% 作為緩存時間赡突。
現(xiàn)在我們要達(dá)到 304的效果,不走強(qiáng)緩存直接走協(xié)商緩存柠傍,修改我們的響應(yīng)麸俘,設(shè)置 Cache-Control=max-age=0 修改如下:
response.writeHead(200, {
'Content-Type': 'text/javascript',
'Last-Modified': mtime,
'Cache-Control': 'max-age=0', // 修改地方
});
再次運(yùn)行我們的程序,控制臺執(zhí)行 node last-modified-max-age.js 再次重新打開頁面查看效果惧笛,第二次直接走的協(xié)商緩存且 Request Headers 攜帶了 If-Modified-Since: Wed, 25 Mar 2020 12:31:58 GMT
ETag 和 If-None-Match
Last-Modified 是以文件的修改時間來判斷从媚,Etag 是根據(jù)文件的內(nèi)容是否修改來判斷,如果 Etag 有修改重新獲取新的資源返回患整,如果未修改返回 304 通知客戶端使用本地緩存拜效。
Etag 的判斷主要也是在服務(wù)端通過一種 Hash 算法實(shí)現(xiàn)喷众,核心實(shí)現(xiàn)如下:
if (request.url === '/script.js') {
const filePath = path.join(__dirname, request.url); // 拼接當(dāng)前腳本文件地址
const buffer = fs.readFileSync(filePath); // 獲取當(dāng)前腳本狀態(tài)
const fileMd5 = md5(buffer); // 文件的 md5 值
const noneMatch = request.headers['if-none-match']; // 來自瀏覽器端傳遞的值
if (noneMatch === fileMd5) {
response.statusCode = 304;
response.end();
return;
}
console.log('Etag 緩存失效');
response.writeHead(200, {
'Content-Type': 'text/javascript',
'Cache-Control': 'max-age=0',
'ETag': fileMd5,
});
const readStream = fs.createReadStream(filePath);
readStream.pipe(response);
}
node etag.js 運(yùn)行我們程序,打開我們的頁面多次訪問紧憾,第二次會看到瀏覽器會攜帶一個 If-None-Match 的 Header 頭傳遞到服務(wù)端進(jìn)行校驗(yàn)到千,當(dāng)前協(xié)商緩存命中了所以響應(yīng)狀態(tài)為 304.
Last-Modified 與 Etag 對比
- 精確度:Last-Modified 以時間(秒)為單位,如果出現(xiàn) 1 秒內(nèi)文件多次修改赴穗,在 Last-Modified 緩存策略下也不會失效憔四,Etag 是對內(nèi)容進(jìn)行 Hash 比較,只要內(nèi)容變動 Etag 就會發(fā)生變化般眉,精確度更高了赵。
- 分布式部署問題:分布式部署必然涉及到負(fù)載均衡,造成的一種現(xiàn)象是 Last-Modified 的時間可能還不太一致甸赃,而 Etag 只要保證每臺機(jī)器的 Hash 算法是一致的就可保證一致性柿汛。
- 性能消耗:Etag 需要讀取文件做 Hash 計(jì)算,相比 Last-Modified 性能上是有損耗的埠对。
- 優(yōu)先級:如果 Last-Modified/Etag 同時設(shè)置络断,Etag 的優(yōu)先級會更高些。
- 相同點(diǎn):校驗(yàn)通過返回 304 通知客戶端使用本地緩存项玛,校驗(yàn)不通過重新獲取最新資源貌笨,設(shè)置 Last-Modified/Etag 響應(yīng)頭,返回狀態(tài)碼 200 稍计。
疑問躁绸?
POST 可以緩存嗎?
GET 是一個冪等操作臣嚣,通常用于緩存净刮,POST 是一個非冪等的操作,每次創(chuàng)建新的資源硅则,也不會自動處理 POST 請求進(jìn)行緩存淹父,參考 rfc2616-sec9.html#sec9.1
附錄
- 不同層中的稱謂:
- 數(shù)據(jù)幀(Frame):是一種信息單位,它的起始點(diǎn)和目的點(diǎn)都是數(shù)據(jù)鏈路層
- 數(shù)據(jù)包(Packet):也是一種信息單位怎虫,它的起始和目的地都是網(wǎng)絡(luò)層
- 段(Segment): 通常是指起始點(diǎn)和目的地都是傳輸層的信息單元
- 消息(message): 是指起始點(diǎn)和目的地都在網(wǎng)絡(luò)層以上(經(jīng)常在應(yīng)用層)的信息單元