【Java面試】計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)-OSI一喘、TCP驱还、HTTP、Socket等

????????小猿的某同事不甘于現(xiàn)狀凸克,近期到處投簡歷面試议蟆。某天,小猿只見某灰頭土臉萎战、唉聲嘆氣咐容,于是小猿本著看熱鬧不嫌事兒大的心態(tài),一臉壞笑湊上去問:“大佬蚂维,最近面試咋樣戳粒,是不是都拿好幾個(gè)offer了~^_^”,某答道:“什么呀虫啥,面?zhèn)€試咋就這么難蔚约,一道面試題硬是讓面試官扯出了整個(gè)計(jì)算機(jī)網(wǎng)絡(luò)知識(shí)圖譜,也是沒誰了~”涂籽,小猿好奇問:“啥題炊琉,啥題~”,某答:“爛大街的一道題又活,面試前也準(zhǔn)備了,唉锰悼,你說為啥面試官就能從這道題目扯出一堆題目...”(此處省略一萬字)

????????接下來小猿就給大家說說某遇到的這道題柳骄,還有它牽扯出的整個(gè)計(jì)算機(jī)網(wǎng)絡(luò)的知識(shí)圖譜。廢話不多說箕般,直接上題目

????????題目描述一:請(qǐng)說說HTTP請(qǐng)求的整個(gè)過程

????????題目描述二:當(dāng)你在瀏覽器中輸出某個(gè)URL耐薯,按下回車后都經(jīng)歷了什么樣的流程

????????題目描述三:請(qǐng)簡單介紹一下HTTP是怎么工作的

????????相信各位猿對(duì)這道題應(yīng)該并不陌生,而且網(wǎng)上一搜一堆的講解與答案,但是某遇到的這個(gè)大牛面試官曲初,卻可以從某的回答中延伸出更多的問題体谒,如果想要過關(guān),還是要對(duì)整個(gè)計(jì)算機(jī)網(wǎng)絡(luò)的知識(shí)體系有比較深刻的理解才行臼婆。下面先貼出小猿對(duì)這個(gè)題目的理解和可能從這道題目引出的計(jì)算機(jī)網(wǎng)絡(luò)的知識(shí)點(diǎn)抒痒,然后小猿對(duì)這些知識(shí)點(diǎn)慢慢的給大家分析。

小猿對(duì)題 目的理解:

  1. DNS解析:如果URL中是網(wǎng)址颁褂,需要向?qū)@個(gè)網(wǎng)址進(jìn)行域名解析故响,得到相應(yīng)的IP地址,請(qǐng)求會(huì)逐層查詢DNS緩存得到目的IP地址(DNS緩存由近到遠(yuǎn)依次是:瀏覽器緩存颁独、系統(tǒng)緩存彩届、路由器緩存、IPS服務(wù)器緩存誓酒、根域名服務(wù)器緩存樟蠕、頂級(jí)域名服務(wù)器緩存)

  2. TCP連接:根據(jù)IP地址和斷開,找到對(duì)應(yīng)的服務(wù)器靠柑,通過TCP的三次握手建立連接

  3. 發(fā)送HTTP請(qǐng)求:建立TCP連接后發(fā)起HTTP請(qǐng)求

  4. 服務(wù)器處理請(qǐng)求并返回HTTP報(bào)文:服務(wù)器根據(jù)請(qǐng)求參數(shù)得到返回結(jié)果寨辩,并返回HTTP報(bào)文

  5. 瀏覽器解析渲染頁面:瀏覽器得到報(bào)文,解析HTML代碼病往,并請(qǐng)求HTML代碼中的資源(例如js捣染、css等)茸塞,然后渲染頁面

  6. 連接結(jié)束:TCP4次揮手芝加,HTTP斷開連接

知識(shí)圖譜

OSI七層架構(gòu)

七層結(jié)構(gòu)簡介:

7層結(jié)構(gòu)數(shù)據(jù)傳輸流程:

詳細(xì)介紹每層的功能和

  • 應(yīng)用層(Application Layer)

  1. 是計(jì)算機(jī)用戶,以及各種應(yīng)用程序和網(wǎng)絡(luò)之間的接口:

  2. 是用戶與網(wǎng)絡(luò)堪滨,以及應(yīng)用程序與網(wǎng)絡(luò)間的直接接口畔勤,使得用戶能夠與網(wǎng)絡(luò)進(jìn)行交互式聯(lián)系蕾各。

  3. 實(shí)現(xiàn)各種服務(wù):該層具有的各種應(yīng)用程序可以完成和實(shí)現(xiàn)用戶請(qǐng)求的各種服務(wù)。

  4. 該層還負(fù)責(zé)協(xié)調(diào)各個(gè)應(yīng)用程序間的工作庆揪。

  5. 應(yīng)用層為用戶提供的服務(wù)和協(xié)議有:文件服務(wù)式曲、目錄服務(wù)、文件傳輸服務(wù)(FTP)缸榛、遠(yuǎn)程登錄服務(wù)(Telnet)吝羞、電子郵件服務(wù)(E-mail)、打印服務(wù)内颗、安全服務(wù)钧排、網(wǎng)絡(luò)管理服務(wù)、數(shù)據(jù)庫服務(wù)等均澳。

  • 表示層(Presentation Layer)

  1. 對(duì)來自應(yīng)用層的命令和數(shù)據(jù)進(jìn)行解釋恨溜,對(duì)各種語法賦予相應(yīng)的含義符衔,并按照一定的格式傳送給會(huì)話層。

  2. 主要功能:數(shù)據(jù)格式處理糟袁、編碼判族、壓縮解壓、加密解密等项戴,具體說明如下:

    1. 數(shù)據(jù)格式處理:協(xié)商和建立數(shù)據(jù)交換的格式形帮,解決各應(yīng)用程序之間在數(shù)據(jù)格式表示上的差異。

    2. 數(shù)據(jù)的編碼:處理字符集和數(shù)字的轉(zhuǎn)換肯尺。例如由于用戶程序中的數(shù)據(jù)類型(整型或?qū)嵭臀衷怠⒂蟹?hào)或無符號(hào)等)、用戶標(biāo)識(shí)等都可以有不同的表示方式则吟,因此槐臀,在設(shè)備之間需要具有在不同字符集或格式之間轉(zhuǎn)換的功能。

    3. 壓縮和解壓縮:為了減少數(shù)據(jù)的傳輸量氓仲,這一層還負(fù)責(zé)數(shù)據(jù)的壓縮與恢復(fù)水慨。

    4. 數(shù)據(jù)的加密和解密:可以提高網(wǎng)絡(luò)的安全性。

  • 會(huì)話層(Session Layer)

    其任務(wù)就是組織和協(xié)調(diào)兩個(gè)會(huì)話進(jìn)程之間的通信敬扛,并對(duì)數(shù)據(jù)交換進(jìn)行管理晰洒,具體如下:

    1. 會(huì)話管理:允許用戶在兩個(gè)實(shí)體設(shè)備之間建立、維持和終止會(huì)話啥箭,并支持它們之間的數(shù)據(jù)交換谍珊。例如提供單方向會(huì)話或雙向同時(shí)會(huì)話,并管理會(huì)話中的發(fā)送順序急侥,以及會(huì)話所占用時(shí)間的長短砌滞。

    2. 會(huì)話流量控制:提供會(huì)話流量控制和交叉會(huì)話功能。

    3. 尋址:使用遠(yuǎn)程地址建立會(huì)話連接坏怪。

    4. 出錯(cuò)控制:從邏輯上講會(huì)話層主要負(fù)責(zé)數(shù)據(jù)交換的建立贝润、保持和終止,但實(shí)際的工作卻是接收來自傳輸層的數(shù)據(jù)铝宵,并負(fù)責(zé)糾正錯(cuò)誤打掘。會(huì)話控制和遠(yuǎn)程過程調(diào)用均屬于這一層的功能。但應(yīng)注意鹏秋,此層檢查的錯(cuò)誤不是通信介質(zhì)的錯(cuò)誤尊蚁,而是磁盤空間、打印機(jī)缺紙等類型的高級(jí)錯(cuò)誤侣夷。

  • 傳輸層(Transport Layer)

  1. 向用戶提供可靠的端到端的差錯(cuò)和流量控制横朋,保證報(bào)文的正確傳輸。傳輸層的作用是向高層屏蔽下層數(shù)據(jù)通信的細(xì)節(jié)惜纸,即向用戶透明地傳送報(bào)文叶撒。

    1. 傳輸連接管理:提供建立、維護(hù)和拆除傳輸連接的功能耐版。傳輸層在網(wǎng)絡(luò)層的基礎(chǔ)上為高層提供“面向連接”和“面向無接連”的兩種服務(wù)祠够。

    2. 處理傳輸差錯(cuò):提供可靠的“面向連接”和不太可靠的“面向無連接”的數(shù)據(jù)傳輸服務(wù)、差錯(cuò)控制和流量控制粪牲。在提供“面向連接”服務(wù)時(shí)古瓤,通過這一層傳輸?shù)臄?shù)據(jù)將由目標(biāo)設(shè)備確認(rèn),如果在指定的時(shí)間內(nèi)未收到確認(rèn)信息腺阳,數(shù)據(jù)將被重發(fā)落君。

    3. 監(jiān)控服務(wù)質(zhì)量。

  2. 該層常見的協(xié)議:TCP/IP中的TCP協(xié)議亭引、Novell網(wǎng)絡(luò)中的SPX協(xié)議和微軟的NetBIOS/NetBEUI協(xié)議绎速。

  • 網(wǎng)絡(luò)層(Network Layer)

  1. 通過路由選擇算法,為報(bào)文或分組通過通信子網(wǎng)選擇最適當(dāng)?shù)穆窂?/p>

  2. 數(shù)據(jù)鏈路層的數(shù)據(jù)在這一層被轉(zhuǎn)換為數(shù)據(jù)包焙蚓,然后通過路徑選擇纹冤、分段組合、順序购公、進(jìn)/出路由等控制萌京,將信息從一個(gè)網(wǎng)絡(luò)設(shè)備傳送到另一個(gè)網(wǎng)絡(luò)設(shè)備。

    1. 尋址:數(shù)據(jù)鏈路層中使用的物理地址(如MAC地址)僅解決網(wǎng)絡(luò)內(nèi)部的尋址問題宏浩。在不同子網(wǎng)之間通信時(shí)知残,為了識(shí)別和找到網(wǎng)絡(luò)中的設(shè)備,每一子網(wǎng)中的設(shè)備都會(huì)被分配一個(gè)唯一的地址比庄。由于各子網(wǎng)使用的物理技術(shù)可能不同求妹,因此這個(gè)地址應(yīng)當(dāng)是邏輯地址(如IP地址)。

    2. 交換:規(guī)定不同的信息交換方式印蔗。常見的交換技術(shù)有:線路交換技術(shù)和存儲(chǔ)轉(zhuǎn)發(fā)技術(shù)扒最,后者又包括報(bào)文交換技術(shù)和分組交換技術(shù)。

    3. 路由算法:當(dāng)源節(jié)點(diǎn)和目的節(jié)點(diǎn)之間存在多條路徑時(shí)华嘹,本層可以根據(jù)路由算法吧趣,通過網(wǎng)絡(luò)為數(shù)據(jù)分組選擇最佳路徑,并將信息從最合適的路徑由發(fā)送端傳送到接收端耙厚。

    4. 連接服務(wù):與數(shù)據(jù)鏈路層流量控制不同的是强挫,前者控制的是網(wǎng)絡(luò)相鄰節(jié)點(diǎn)間的流量,后者控制的是從源節(jié)點(diǎn)到目的節(jié)點(diǎn)間的流量薛躬。其目的在于防止阻塞俯渤,并進(jìn)行差錯(cuò)檢測(cè)。

  3. 數(shù)據(jù)鏈路層是解決同一網(wǎng)絡(luò)內(nèi)節(jié)點(diǎn)之間的通信型宝,而網(wǎng)絡(luò)層主要解決不同子網(wǎng)間的通信八匠。例如在廣域網(wǎng)之間通信時(shí)絮爷,必然會(huì)遇到路由(即兩節(jié)點(diǎn)間可能有多條路徑)選擇問題。?

  • 數(shù)據(jù)鏈路層(Data Link Layer)

  1. 物理層提供的比特流的基礎(chǔ)上梨树,通過差錯(cuò)控制坑夯、流量控制方法,使有差錯(cuò)的物理線路變?yōu)闊o差錯(cuò)的數(shù)據(jù)鏈路抡四,即提供可靠的通過物理介質(zhì)傳輸數(shù)據(jù)的方法柜蜈。

  2. 該層通常又被分為介質(zhì)訪問控制(MAC)和邏輯鏈路控制(LLC)兩個(gè)子層

    1. MAC子層的主要任務(wù)是解決共享型網(wǎng)絡(luò)中多用戶對(duì)信道競爭的問題,完成網(wǎng)絡(luò)介質(zhì)的訪問控制指巡;

    2. LLC子層的主要任務(wù)是建立和維護(hù)網(wǎng)絡(luò)連接淑履,執(zhí)行差錯(cuò)校驗(yàn)、流量控制和鏈路控制藻雪。數(shù)據(jù)鏈路層的具體工作是接收來自物理層的位流形式的數(shù)據(jù)秘噪,并封裝成幀,傳送到上一層阔涉;同樣缆娃,也將來自上層的數(shù)據(jù)幀,拆裝為位流形式的數(shù)據(jù)轉(zhuǎn)發(fā)到物理層瑰排;并且贯要,還負(fù)責(zé)處理接收端發(fā)回的確認(rèn)幀的信息,以便提供可靠的數(shù)據(jù)傳輸椭住。

  • 物理層(Physical Layer)

  1. 利用傳輸介質(zhì)為數(shù)據(jù)鏈路層提供物理連接崇渗,實(shí)現(xiàn)比特流的透明傳輸。

  2. 物理層的作用是實(shí)現(xiàn)相鄰計(jì)算機(jī)節(jié)點(diǎn)之間比特流的透明傳送京郑,盡可能屏蔽掉具體傳輸介質(zhì)和物理設(shè)備的差異宅广。使其上面的數(shù)據(jù)鏈路層不必考慮網(wǎng)絡(luò)的具體傳輸介質(zhì)是什么。

分享一張大而全的七層協(xié)議框架圖

TCP/IP協(xié)議-OSI的一種“實(shí)現(xiàn)”

傳輸控制協(xié)議TCP簡介

  • 面向連接的些举、可靠的跟狱、基于字節(jié)流的傳輸層通信協(xié)議

  • 將應(yīng)用的數(shù)據(jù)流分割成報(bào)文段并發(fā)送個(gè)給目標(biāo)節(jié)點(diǎn)的TCP層,

    • 分段的長度受數(shù)據(jù)鏈路層MTU(最大傳輸單元户魏,Maximum Transmission Unit)的限制

    • TCP單個(gè)數(shù)據(jù)報(bào)的最大長度稱為最大段尺寸MSS驶臊;

    • 在TCP三次握手建立連接的時(shí)候,雙方會(huì)商量傳輸中MSS的大械鸪蟆关翎;

  • 數(shù)據(jù)包都有序號(hào)以保證消息接收的順序,對(duì)方收到則發(fā)送ACK確認(rèn)鸠信,未收到則重傳

  • 使用奇偶校驗(yàn)和來校驗(yàn)數(shù)據(jù)在傳輸過程中是否有誤

TCP報(bào)文頭


  • SourcePort:源端口纵寝,占用2個(gè)字節(jié)。源端口和IP地址的作用是標(biāo)識(shí)報(bào)文的返回地址星立。

    p.s. IP可以唯一表示一臺(tái)主機(jī)爽茴,TCP協(xié)議和端口號(hào)可以唯一表示主機(jī)中的一個(gè)進(jìn)程葬凳;所以我們可以根據(jù)IP地址+協(xié)議+端口號(hào)唯一表示網(wǎng)絡(luò)中的一個(gè)進(jìn)程(即Socket的工作原理)。

  • DestinationPort:目的端口室奏,占用2個(gè)字節(jié)沮明;指明接收方計(jì)算機(jī)上的應(yīng)用程序的端口。

  • SequenceNumber(序號(hào)seq):本報(bào)文段發(fā)送的數(shù)據(jù)組的第一個(gè)字節(jié)的序號(hào)窍奋。e.g.一個(gè)報(bào)文段的序號(hào)為300,此報(bào)文段數(shù)據(jù)部分共有100字節(jié)酱畅,則下一個(gè)報(bào)文段的序號(hào)為400琳袄。所以序號(hào)確保了TCP傳輸?shù)挠行蛐浴?/p>

  • AcknowledgmentNumber(確認(rèn)號(hào)ack):指明下一個(gè)期待收到的字節(jié)序號(hào),表明該序號(hào)之前的所有數(shù)據(jù)已經(jīng)正確無誤的收到纺酸。確認(rèn)號(hào)只有當(dāng)ACK標(biāo)志為1時(shí)才有效窖逗。

  • offset(數(shù)據(jù)偏移):占用4bits。由于首部可能含有可選項(xiàng)內(nèi)容餐蔬,因此TCP報(bào)頭的長度是不確定的碎紊,報(bào)頭不包含任何任選字段則長度為20字節(jié),4位首部長度字段所能表示的最大值為1111樊诺,轉(zhuǎn)化為10進(jìn)制為15仗考,15*32/8 = 60,故報(bào)頭最大長度為60字節(jié)词爬。首部長度也叫數(shù)據(jù)偏移秃嗜,是因?yàn)槭撞块L度實(shí)際上指示了數(shù)據(jù)區(qū)在報(bào)文段中的起始偏移值。

  • Reserved(保留字節(jié)):為將來定義新的用途保留顿膨,現(xiàn)在一般置0锅锨。

  • TCP Flags(TCP控制位)

    • SYN:同步序號(hào),用于建立連接過程恋沃,在連接請(qǐng)求中必搞,SYN=1和ACK=0表示該數(shù)據(jù)段沒有使用捎帶的確認(rèn)域,而連接應(yīng)答捎帶一個(gè)確認(rèn)囊咏,即SYN=1和ACK=1恕洲。?

    • ACK:確認(rèn)序號(hào)標(biāo)志,為1時(shí)表示確認(rèn)號(hào)有效匆笤,為0表示報(bào)文中不含確認(rèn)信息研侣,忽略確認(rèn)號(hào)字段。?

    • FIN:finish標(biāo)志炮捧,用于釋放連接庶诡,為1時(shí)表示發(fā)送方已經(jīng)沒有數(shù)據(jù)發(fā)送了,即關(guān)閉本方數(shù)據(jù)流咆课。

    • URG:緊急指針標(biāo)志末誓,為1時(shí)表示緊急指針有效扯俱,為0則忽略緊急指針。?

    • PSH:push標(biāo)志喇澡,為1表示是帶有push標(biāo)志的數(shù)據(jù)迅栅,指示接收方在接收到該報(bào)文段以后,應(yīng)盡快將這個(gè)報(bào)文段交給應(yīng)用程序晴玖,而不是在緩沖區(qū)排隊(duì)读存。?

    • RST:重置連接標(biāo)志,用于重置由于主機(jī)崩潰或其他原因而出現(xiàn)錯(cuò)誤的連接呕屎∪貌荆或者用于拒絕非法的報(bào)文段和拒絕連接請(qǐng)求。?

    • CWR:Congestion Window Reduced

    • ECE:ECN echo

  • Window(窗口):滑動(dòng)窗口大小秀睛,用來告知發(fā)送端接受端的緩存大小尔当,以此控制發(fā)送端發(fā)送數(shù)據(jù)的速率,從而達(dá)到流量控制蹂安。窗口大小時(shí)一個(gè)16bit字段椭迎,因而窗口大小最大為65535。

  • Checksum(校驗(yàn)和):奇偶校驗(yàn)田盈,此校驗(yàn)和是對(duì)整個(gè)的?TCP?報(bào)文段畜号,包括?TCP?頭部和?TCP?數(shù)據(jù),以 16位進(jìn)行計(jì)算所得允瞧。由發(fā)送端計(jì)算和存儲(chǔ)弄兜,并由接收端進(jìn)行驗(yàn)證。

  • UrgentPointer(緊急指針):只有當(dāng)?URG?標(biāo)志置?1?時(shí)緊急指針才有效瓷式。緊急指針是一個(gè)正的偏移量替饿,和順序號(hào)字段中的值相加表示緊急數(shù)據(jù)最后一個(gè)字節(jié)的序號(hào)。?TCP?的緊急方式是發(fā)送端向另一端發(fā)送緊急數(shù)據(jù)的一種方式贸典。

  • TCP Options(選項(xiàng)與填充)如果沒有選項(xiàng)视卢,則TCP頭長度是20字節(jié),TCP選項(xiàng)最大是40個(gè)字節(jié)。最常見的可選字段是最長報(bào)文大小,又稱為MSS(Maximum Segment Size)穷当,每個(gè)連接方通常都在通信的第一個(gè)報(bào)文段(為建立連接而設(shè)置SYN標(biāo)志為1的那個(gè)段)中指明這個(gè)選項(xiàng)持偏,它表示本端所能接受的最大報(bào)文段的長度劝堪。選項(xiàng)長度不一定是32位的整數(shù)倍,所以要加填充位,即在這個(gè)字段中加入額外的零,以保證TCP頭是32的整數(shù)倍鳞芙。

  • Data(數(shù)據(jù)部分)TCP?報(bào)文段中的數(shù)據(jù)部分是可選的。在一個(gè)連接建立和一個(gè)連接終止時(shí),雙方交換的報(bào)文段僅有?TCP?首部原朝。如果一方?jīng)]有數(shù)據(jù)要發(fā)送驯嘱,也使用沒有任何數(shù)據(jù)的首部來確認(rèn)收到的數(shù)據(jù)。在處理超時(shí)的許多情況中喳坠,也會(huì)發(fā)送不帶任何數(shù)據(jù)的報(bào)文段鞠评。

說說TCP的三次握手

在TCP/IP協(xié)議中,TCP協(xié)議提供可靠的連接服務(wù)壕鹉,采用三次握手建立一個(gè)連接

  1. 第一次握手:建立連接時(shí)剃幌,客戶端發(fā)送SYN包到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài)晾浴,等待服務(wù)器確認(rèn)锥忿。這里發(fā)送的SYN包,SYN標(biāo)志位為1怠肋,seq序號(hào)初始為x

  2. 第二次握手:服務(wù)器收到SYN包,必須確認(rèn)客戶的SYN淹朋,同時(shí)自己也發(fā)送一個(gè)SYN包給客戶端笙各,此時(shí)服務(wù)端進(jìn)入SYN_RECV狀態(tài)。這里服務(wù)端發(fā)送的SYN包中SYN標(biāo)志位和ACK標(biāo)志位都是1础芍,seq序號(hào)初始為y杈抢,ack為x+1(表示客戶端下次再發(fā)送包seq從x+1開始)

  3. 第三次握手:客戶端收到服務(wù)器的SYN+ACK的包,向服務(wù)器發(fā)送確認(rèn)包仑性,此包ACK標(biāo)志位1惶楼,seq序號(hào)為x+1,ack為y+1(表示服務(wù)端下一次發(fā)送數(shù)據(jù)seq從y+1開始)诊杆。此包發(fā)送完畢歼捐,客戶端和服務(wù)器端都進(jìn)入ESTABLISHED狀態(tài),完成三次握手晨汹,開始數(shù)據(jù)傳送豹储。

為什么需要三次握手才能建立連接

  • 為了初始化SequenceNumber

  • 為了防止服務(wù)器端開啟一些無用的連接增加服務(wù)器開銷以及防止已失效的連接請(qǐng)求報(bào)文段突然又傳送到了服務(wù)端,因而產(chǎn)生錯(cuò)誤淘这。

三次握手的隱患-SYN Flood

問題描述

  • Server收到Client的SYN剥扣,回復(fù)SYN-ACK的時(shí)候未收到ACK確認(rèn)

  • Server不斷重試直至超時(shí),Linux默認(rèn)等待63秒才斷開連接(Linux默認(rèn)重試5次铝穷,每次等待時(shí)間翻倍钠怯,第一次重試前等待時(shí)間為1秒,第五次重試后等待時(shí)間是32秒曙聂,然后才斷開連接)

  • 惡意攻擊者晦炊,不斷向服務(wù)端發(fā)送SYN請(qǐng)求后立刻下線,服務(wù)器端會(huì)等待63秒后才斷開連接,進(jìn)而導(dǎo)致服務(wù)端資源耗盡刽锤,讓正常的連接請(qǐng)求不能處理

針對(duì)SYN Flood的防護(hù)措施

針對(duì)上述問題的解決辦法

  • SYN隊(duì)列滿后镊尺,通過tcp_syncookies參數(shù)回發(fā)SYN Cookie

  • 如果是正常連接,Client會(huì)回發(fā)SYN Cookie給服務(wù)端并思;如果是惡意攻擊庐氮,因?yàn)镃lient已經(jīng)下線,則不會(huì)返回宋彼。

  • 正常連接返回SYN Cookie后弄砍,可以直接建立連接

建立連接后,Client出現(xiàn)故障怎么辦

笔涮椋活機(jī)制

  • 向?qū)Ψ桨l(fā)送币羯簦活探測(cè)報(bào)文,如果未收到響應(yīng)則繼續(xù)發(fā)送

  • 嘗試次數(shù)達(dá)到崩晨玻活探測(cè)數(shù)仍未收到響應(yīng)衣式,則中斷連接

TCP四次揮手

揮手是為了終止連接,TCP采用四次揮手來釋放連接

  1. 第一次揮手:Client發(fā)送一個(gè)FIN檐什,用來關(guān)閉Client到Server的數(shù)據(jù)傳送碴卧,Client進(jìn)入FIN-WAIT_1狀態(tài);

  2. 第二次揮手:Server收到FIN后乃正,發(fā)送一個(gè)ACK給client住册,確認(rèn)序號(hào)為收到序號(hào)+1(與SYN相同,一個(gè)FIN占用一個(gè)序號(hào))瓮具,Server進(jìn)入CLOSE_WAIT狀態(tài)荧飞;Client接收到Server的FIN之后,進(jìn)入FIN_WAIT_2狀態(tài)名党;

  3. 第三次揮手:Server發(fā)送一個(gè)FIN叹阔,用來關(guān)閉Server到Client的數(shù)據(jù)傳送,Server進(jìn)入LAST_ACK狀態(tài)传睹;

  4. 第四次揮手:Client收到FIN后条获,Client進(jìn)入TIME_WAIT狀態(tài),接著發(fā)送一個(gè)ACK給Server蒋歌,確認(rèn)序號(hào)為收到序號(hào)+1帅掘,Server進(jìn)入CLOSED狀態(tài),完成四次握手

為什么要有TIME_WAIT狀態(tài)

  • 防止上一次連接中的包堂油,迷路后重新出現(xiàn)修档,影響新連接(經(jīng)過2MSL,上一次連接中所有的重復(fù)包都會(huì)消失)

  • 可靠的關(guān)閉TCP連接府框。為的是確認(rèn)服務(wù)器端是否收到客戶端發(fā)出的ACK確認(rèn)報(bào)文吱窝。當(dāng)客戶端發(fā)出最后的ACK確認(rèn)報(bào)文時(shí),并不能確定服務(wù)器端能夠收到該段報(bào)文。所以客戶端在發(fā)送完ACK確認(rèn)報(bào)文之后院峡,會(huì)設(shè)置一個(gè)時(shí)長為2MSL的計(jì)時(shí)器兴使。MSL指的是Maximum Segment Lifetime:一段TCP報(bào)文在傳輸過程中的最大生命周期。2MSL即是服務(wù)器端發(fā)出為FIN報(bào)文和客戶端發(fā)出的ACK確認(rèn)報(bào)文所能保持有效的最大時(shí)長照激。

  • 服務(wù)器端在1MSL內(nèi)沒有收到客戶端發(fā)出的ACK確認(rèn)報(bào)文发魄,就會(huì)再次向客戶端發(fā)出FIN報(bào)文;

    • 如果客戶端在2MSL內(nèi)俩垃,再次收到了來自服務(wù)器端的FIN報(bào)文励幼,說明服務(wù)器端由于各種原因沒有接收到客戶端發(fā)出的ACK確認(rèn)報(bào)文】诹客戶端再次向服務(wù)器端發(fā)出ACK確認(rèn)報(bào)文苹粟,計(jì)時(shí)器重置,重新開始2MSL的計(jì)時(shí)跃闹;

    • 否則客戶端在2MSL內(nèi)沒有再次收到來自服務(wù)器端的FIN報(bào)文嵌削,說明服務(wù)器端正常接收了ACK確認(rèn)報(bào)文,客戶端可以進(jìn)入CLOSED階段望艺,完成“四次揮手”苛秕。

為什么需要四次握手

  • 因?yàn)槿p工,發(fā)送方和接收方都需要FIN報(bào)文和ACK保報(bào)文

  • 建立連接時(shí)荣茫,被動(dòng)方服務(wù)器端結(jié)束CLOSED階段進(jìn)入“握手”階段并不需要任何準(zhǔn)備,可以直接返回SYN和ACK報(bào)文场靴,開始建立連接啡莉。釋放連接時(shí),被動(dòng)方服務(wù)器旨剥,突然收到主動(dòng)方客戶端釋放連接的請(qǐng)求時(shí)并不能立即釋放連接咧欣,因?yàn)檫€有必要的數(shù)據(jù)需要處理,所以服務(wù)器先返回ACK確認(rèn)收到報(bào)文轨帜,經(jīng)過CLOSE-WAIT階段準(zhǔn)備好釋放連接之后魄咕,才能返回FIN釋放連接報(bào)文。

服務(wù)器出現(xiàn)大量CLOSE_WAIT狀態(tài)的原因

如果一直保持在CLOSE_WAIT狀態(tài)蚌父,那么只有一種情況哮兰,就是在對(duì)方關(guān)閉連接之后服務(wù)器程序自己沒有進(jìn)一步發(fā)出ack信號(hào)。換句話說苟弛,就是在對(duì)方連接關(guān)閉之后喝滞,程序里沒有檢測(cè)到,或者程序壓根就忘記了這個(gè)時(shí)候需要關(guān)閉連接膏秫,于是這個(gè)資源就一直被程序占著右遭。

  • 檢查代碼,特別是釋放資源的代碼

  • 檢查配置,特別是處理請(qǐng)求的線程配置 ? ?

UDP報(bào)文結(jié)構(gòu)

UDP 報(bào)文中每個(gè)字段的含義如下:

  • 源端口:這個(gè)字段占據(jù) UDP 報(bào)文頭的前 16 位窘哈,通常包含發(fā)送數(shù)據(jù)報(bào)的應(yīng)用程序所使用的 UDP 端口吹榴。接收端的應(yīng)用程序利用這個(gè)字段的值作為發(fā)送響應(yīng)的目的地址。這個(gè)字段是可選的滚婉,所以發(fā)送端的應(yīng)用程序不一定會(huì)把自己的端口號(hào)寫入該字段中图筹。如果不寫入端口號(hào),則把這個(gè)字段設(shè)置為 0满哪。這樣婿斥,接收端的應(yīng)用程序就不能發(fā)送響應(yīng)了。

  • 目的端口:接收端計(jì)算機(jī)上 UDP 軟件使用的端口哨鸭,占據(jù) 16 位民宿。

  • 長度:該字段占據(jù) 16 位,表示 UDP 數(shù)據(jù)報(bào)長度像鸡,包含 UDP 報(bào)文頭和 UDP 數(shù)據(jù)長度活鹰。因?yàn)?UDP 報(bào)文頭長度是 8 個(gè)字節(jié),所以這個(gè)值最小為 8只估。

  • 校驗(yàn)值:該字段占據(jù) 16 位志群,可以檢驗(yàn)數(shù)據(jù)在傳輸過程中是否被損壞。

UDP特點(diǎn)

  • 面向非連接

  • 不維護(hù)連接狀態(tài)蛔钙,支持同時(shí)向多個(gè)客戶端傳輸相同的消息

  • 數(shù)據(jù)包報(bào)頭只有8個(gè)字節(jié)锌云,額外開銷較小

  • 吞吐量只受限于數(shù)據(jù)生成速率、傳輸速率以及機(jī)器性能

  • 盡最大努力交付吁脱,不保證可靠交付桑涎,不需要維護(hù)復(fù)雜的連接狀態(tài)表

  • 面向報(bào)文,不對(duì)應(yīng)用程序提交的報(bào)文信息進(jìn)行拆分或者合并

TCP和UDP的區(qū)別

可以從以下幾個(gè)方面總結(jié)區(qū)別

TCP的滑動(dòng)窗口

窗口數(shù)據(jù)的計(jì)算過程

左邊是TCP發(fā)送端緩沖區(qū)兼贡,右邊是接收端緩沖區(qū)攻冷,左邊向右邊發(fā)送數(shù)據(jù);從發(fā)送端看遍希,下面的長條代表發(fā)送的字節(jié)流等曼,從左向右依次發(fā)送;從接收端看凿蒜,下面的長條代表接收字節(jié)流禁谦,從左向右一次接收。

  • LastByteAcked:指向已經(jīng)接收到ack反饋的連續(xù)內(nèi)存的最大位置废封,LastByteAcked之前字節(jié)都已經(jīng)接收到接收端的ack回執(zhí)

  • LastByteSent:指向已經(jīng)發(fā)送的最后一個(gè)字節(jié)的位置

  • LastByteWrittten:指向上層應(yīng)用已寫完的最大內(nèi)存位置

  • LastByteRead:指向上層已經(jīng)讀完的最后一個(gè)字節(jié)的位置

  • NextByteExpected:指向已經(jīng)收到的連續(xù)內(nèi)存的最大位置枷畏,已經(jīng)收到了但是還沒有返回ack回執(zhí)

  • LastByteRcvd:指向已經(jīng)接收到的最大內(nèi)存的位置,NextByteExpected與LastByteRcvd之間存在沒有接收到的seq

接收端可接收窗口 AdvertisedWindow 大惺觥:

AdvertisedWindow = MaxRevBuffer - (LastByteRcvd - LastByteRead)

發(fā)送端窗口內(nèi)剩余可發(fā)送的窗口 EffectiveWindow 大杏倒睢:

EffectiveWindow =?AdvertisedWindow - (LastByteSent -?LastByteAcked)

這樣計(jì)算是做最壞的打算触趴,就是認(rèn)為發(fā)送端已經(jīng)接收到回執(zhí)的連續(xù)最大內(nèi)存到已經(jīng)發(fā)送的最大內(nèi)存位置的數(shù)據(jù),還在路上沒有被接收端接收渴肉;接收端的最大接收位置的都已經(jīng)發(fā)送了ack冗懦,但是還沒有被上層應(yīng)用處理〕鸺溃【這里AdvertisedWindow是接收端反饋給接收端的報(bào)文頭里window的值,告訴發(fā)送端接收端還可以接收多少數(shù)據(jù)乌奇;發(fā)送端根據(jù)window大小計(jì)算自己還可以發(fā)送多少數(shù)據(jù)

TCP會(huì)話的發(fā)送方

TCP發(fā)送方没讲,任何時(shí)候在其緩存內(nèi)的數(shù)據(jù)都可以分為四類

  • Category #1:已經(jīng)發(fā)送并且已經(jīng)收到ack回執(zhí)的部分

  • Category #2:已經(jīng)發(fā)送但是沒有收到ack回執(zhí)的部分;這部分大小是LastByteSent 與LastByteAcked的差

  • Category #3:已經(jīng)準(zhǔn)備好并且允許發(fā)送礁苗,但是還沒有發(fā)送的部分爬凑;這部分就是EffectiveWindow 的大小

  • Category #4:不允許發(fā)送的部分;已經(jīng)準(zhǔn)備好的數(shù)據(jù)试伙,但是由于接收端緩存限制暫時(shí)不能發(fā)送的部分

其中Category #2 和 Category #3 組成了滑動(dòng)窗口嘁信,當(dāng)LastByteAcked向前移動(dòng)的時(shí)候,滑動(dòng)窗口才能向前移動(dòng)疏叨。

TCP會(huì)話的接收方

TCP接收方潘靖,任何時(shí)候在其接收緩存內(nèi)的數(shù)據(jù)都可以分為三類或叫三種狀態(tài)

  • Category #1+#2:已經(jīng)接收并且已經(jīng)回執(zhí)ack

  • Category #3:未接收但是可以接收,準(zhǔn)備接收的

  • Category #4:不能接收蚤蔓,達(dá)到了窗口的閾值了卦溢,不能接收了

因?yàn)榻邮盏降臄?shù)據(jù)TCP機(jī)制會(huì)立刻ack回執(zhí),認(rèn)為沒有延遲秀又,所以不存在已接收但沒有回執(zhí)ack的狀態(tài)单寂;

未接收但是準(zhǔn)備接收的 Category #3 就是叫做接收窗口;接收窗口的滑動(dòng)機(jī)制與發(fā)送發(fā)一致

TCP的滑動(dòng)窗口總結(jié)

TCP最基本的傳輸可靠性來源于確認(rèn)重傳機(jī)制涮坐,TCP的滑動(dòng)窗口的可靠性也是建立在確認(rèn)重傳機(jī)制的基礎(chǔ)上的凄贩;發(fā)送窗口只有接收到接收端對(duì)本段發(fā)送窗口內(nèi)字節(jié)的ack確認(rèn)誓军,才會(huì)滑動(dòng)發(fā)送窗口的左邊界袱讹;接收窗口只有在前面的端都確認(rèn)的情況下,才移動(dòng)左邊界昵时,當(dāng)前面字節(jié)沒有接收但是接收到后面的字節(jié)的情況下捷雕,窗口是不會(huì)移動(dòng)的,并且不會(huì)對(duì)接收到的后邊的字節(jié)確認(rèn)壹甥,以此讓對(duì)端確認(rèn)這些字段是否需要重傳救巷。

滑動(dòng)窗口可以按照一定的策略動(dòng)態(tài)的挑戰(zhàn),應(yīng)用程序可以根據(jù)自身的處理能力設(shè)置調(diào)整策略

HTTP簡介

HTTP協(xié)議是Hyper Text Transfer Protocol(超文本傳輸協(xié)議)的縮寫,是用于從萬維網(wǎng)(WWW:World Wide Web )服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議句柠。HTTP是一個(gè)基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù)(HTML 文件, 圖片文件, 查詢結(jié)果等)

HTTP工作原理

HTTP協(xié)議工作于客戶端-服務(wù)端架構(gòu)上浦译。瀏覽器作為HTTP客戶端通過URL向HTTP服務(wù)端即WEB服務(wù)器發(fā)送所有請(qǐng)求棒假。

Web服務(wù)器有:Apache服務(wù)器,IIS服務(wù)器(Internet Information Services)等精盅。

Web服務(wù)器根據(jù)接收到的請(qǐng)求后帽哑,向客戶端發(fā)送響應(yīng)信息。HTTP默認(rèn)端口號(hào)為80叹俏,但是你也可以改為8080或者其他端口妻枕。

HTTP三點(diǎn)注意事項(xiàng):

  • HTTP是無連接:無連接的含義是限制每次連接只處理一個(gè)請(qǐng)求。服務(wù)器處理完客戶的請(qǐng)求粘驰,并收到客戶的應(yīng)答后屡谐,即斷開連接。采用這種方式可以節(jié)省傳輸時(shí)間蝌数。

  • HTTP是媒體獨(dú)立的:這意味著愕掏,只要客戶端和服務(wù)器知道如何處理的數(shù)據(jù)內(nèi)容,任何類型的數(shù)據(jù)都可以通過HTTP發(fā)送籽前⊥ふ洌客戶端以及服務(wù)器指定使用適合的MIME-type內(nèi)容類型。

  • HTTP是無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議枝哄。無狀態(tài)是指協(xié)議對(duì)于事務(wù)處理沒有記憶能力肄梨。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳挠锥,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大众羡。另一方面寻定,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快淡诗。

HTTP請(qǐng)求結(jié)構(gòu)

客戶端發(fā)送一個(gè)HTTP請(qǐng)求到服務(wù)器的請(qǐng)求消息包括以下格式:請(qǐng)求行(request line)、請(qǐng)求頭部(header)侥祭、空行和請(qǐng)求數(shù)據(jù)四個(gè)部分組成蓖宦,下圖給出了請(qǐng)求報(bào)文的一般格式齐婴。

HTTP響應(yīng)報(bào)文

實(shí)例

下面實(shí)例是一點(diǎn)典型的使用GET來傳遞數(shù)據(jù)的實(shí)例:

客戶端請(qǐng)求:

GET?/hello.txt?HTTP/1.1
User-Agent:?curl/7.16.3?libcurl/7.16.3?OpenSSL/0.9.7l?zlib/1.2.3
Host:?www.example.com?
Accept-Language:?en,?mi

服務(wù)端響應(yīng):

HTTP/1.1?200?OK
Date:?Mon,?27?Jul?2009?12:28:53?GMT
Server:?Apache
Last-Modified:?Wed,?22?Jul?2009?19:15:56?GMT
ETag:?"34aa387-d-1568eb00"
Accept-Ranges:?bytes
Content-Length:?51
Vary:?Accept-Encoding
Content-Type:?text/plain

面試題:在瀏覽器地址欄鍵入U(xiǎn)RL,按下回車之后經(jīng)歷的流程

  1. DNS解析:如果URL中是網(wǎng)址稠茂,需要向?qū)@個(gè)網(wǎng)址進(jìn)行域名解析柠偶,得到相應(yīng)的IP地址,請(qǐng)求會(huì)逐層查詢DNS緩存得到目的IP地址(DNS緩存由近到遠(yuǎn)依次是:瀏覽器緩存睬关、系統(tǒng)緩存诱担、路由器緩存、IPS服務(wù)器緩存电爹、根域名服務(wù)器緩存蔫仙、頂級(jí)域名服務(wù)器緩存)

  2. TCP連接:根據(jù)IP地址和斷開,找到對(duì)應(yīng)的服務(wù)器丐箩,通過TCP的三次握手建立連接

  3. 發(fā)送HTTP請(qǐng)求:建立TCP連接后發(fā)起HTTP請(qǐng)求

  4. 服務(wù)器處理請(qǐng)求并返回HTTP報(bào)文:服務(wù)器根據(jù)請(qǐng)求參數(shù)得到返回結(jié)果摇邦,并返回HTTP報(bào)文

  5. 瀏覽器解析渲染頁面:瀏覽器得到報(bào)文恤煞,解析HTML代碼,并請(qǐng)求HTML代碼中的資源(例如js施籍、css等)阱州,然后渲染頁面

  6. 連接結(jié)束:TCP4次揮手,HTTP斷開連接

HTTP狀態(tài)碼

狀態(tài)碼分類

HTTP狀態(tài)碼由三個(gè)十進(jìn)制數(shù)字組成法梯,第一個(gè)十進(jìn)制數(shù)字定義了狀態(tài)碼的類型苔货,后兩個(gè)數(shù)字沒有分類的作用。HTTP狀態(tài)碼共分為5種類型:

  • 1xx:指示信息--表示請(qǐng)求已接收立哑,繼續(xù)處理

  • 2xx:請(qǐng)求成功-表示請(qǐng)求已經(jīng)成功接收夜惭、理解、接受

  • 3xx:重定向--要完成請(qǐng)求必須進(jìn)行更進(jìn)一步的操作

  • 4xx:客戶端錯(cuò)誤--請(qǐng)求有語法錯(cuò)誤或請(qǐng)求無法實(shí)現(xiàn)

  • 5xx:服務(wù)器端錯(cuò)誤-服務(wù)器未實(shí)現(xiàn)合法的請(qǐng)求

常見的狀態(tài)碼:

HTTP 請(qǐng)求方法

GET與POST請(qǐng)求的區(qū)別

  • HTTP報(bào)文層面:一般情況铛绰,GET將請(qǐng)求信息放在URL诈茧,POST放在請(qǐng)求體里面

  • 數(shù)據(jù)層面:GET符合冪等性和安全性,POST不符合

  • GET請(qǐng)求可以被緩存捂掰,被存儲(chǔ)敢会,POST不行

Cookie、Session这嚣、token

https://www.cnblogs.com/moyand/p/9047978.html

https://segmentfault.com/a/1190000017831088

Cookie

Cookie指的是瀏覽器里面能永久存儲(chǔ)的一種數(shù)據(jù)鸥昏,僅僅是瀏覽器實(shí)現(xiàn)的一種數(shù)據(jù)存儲(chǔ)功能

cookie由服務(wù)器生成,發(fā)送給瀏覽器姐帚,瀏覽器把cookie以kv的形式保存到某個(gè)目錄的文本文件內(nèi)吏垮,下一次請(qǐng)求同一網(wǎng)址時(shí)會(huì)把該cookie發(fā)送給服務(wù)端。由于cookie是存在客戶端上的罐旗,所以瀏覽器加入了一些限制確保cookie不會(huì)被惡意使用膳汪,同時(shí)不會(huì)占據(jù)太多磁盤空間,所以每個(gè)域的cookie數(shù)量有限

cookie的設(shè)置和發(fā)送過程:

Session

session從字面上講九秀,就是會(huì)話遗嗽,就是服務(wù)器要知道當(dāng)前發(fā)請(qǐng)求給自己的是誰。為了做這種區(qū)分鼓蜒,服務(wù)器就要給每個(gè)客戶端分配不同的“身份標(biāo)識(shí)”痹换,然后客戶端每次向服務(wù)器發(fā)送請(qǐng)求,都帶上這個(gè)標(biāo)識(shí)友酱,服務(wù)器就知道這個(gè)請(qǐng)求來源于誰晴音。瀏覽器默認(rèn)采用cookie來保存這個(gè)標(biāo)識(shí)柔纵。

服務(wù)器使用session把用戶信息臨時(shí)保存在服務(wù)器上缔杉,用戶離開網(wǎng)站后session會(huì)被銷毀。

????注意

  • cookie只是實(shí)現(xiàn)session的其中一種方案搁料。雖然是最常用的或详,但并不是唯一的方法系羞。禁用cookie后還有其他方法存儲(chǔ),比如放在url中

  • 現(xiàn)在大多都是Session + Cookie霸琴,但是只用session不用cookie椒振,或是只用cookie,不用session在理論上都可以保持會(huì)話狀態(tài)梧乘∨煊可是實(shí)際中因?yàn)槎喾N原因,一般不會(huì)單獨(dú)使用

  • 用session只需要在客戶端保存一個(gè)id选调,實(shí)際上大量數(shù)據(jù)都是保存在服務(wù)端夹供。如果全部用cookie,數(shù)據(jù)量大的時(shí)候客戶端是沒有那么多空間的仁堪。

  • 如果只用cookie不用session哮洽,那么賬戶信息全部保存在客戶端,一旦被劫持弦聂,全部信息都會(huì)泄露鸟辅。并且客戶端數(shù)據(jù)量變大,網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量也會(huì)變大

Token

token 也稱作令牌莺葫,由uid+time+sign[+固定參數(shù)]
token 的認(rèn)證方式類似于臨時(shí)的證書簽名, 并且是一種服務(wù)端無狀態(tài)的認(rèn)證方式, 非常適合于 REST API 的場(chǎng)景. 所謂無狀態(tài)就是服務(wù)端并不會(huì)保存身份認(rèn)證相關(guān)的數(shù)據(jù)匪凉。

token 的認(rèn)證流程與cookie很相似

  • 用戶登錄,成功后服務(wù)器返回Token給客戶端捺檬。

  • 客戶端收到數(shù)據(jù)后保存在客戶端

  • 客戶端再次訪問服務(wù)器洒缀,將token放入headers中

  • 服務(wù)器端采用filter過濾器校驗(yàn)。校驗(yàn)成功則返回請(qǐng)求數(shù)據(jù)欺冀,校驗(yàn)失敗則返回錯(cuò)誤碼

分布式情況下的session和token

我們已經(jīng)知道session時(shí)有狀態(tài)的树绩,一般存于服務(wù)器內(nèi)存或硬盤中,當(dāng)服務(wù)器采用分布式或集群時(shí)隐轩,session就會(huì)面對(duì)負(fù)載均衡問題饺饭。

  • 負(fù)載均衡多服務(wù)器的情況,不好確認(rèn)當(dāng)前用戶是否登錄职车,因?yàn)槎喾?wù)器不共享session瘫俊。這個(gè)問題也可以將session存在一個(gè)服務(wù)器中來解決,但是就不能完全達(dá)到負(fù)載均衡的效果悴灵。

而token是無狀態(tài)的扛芽,token字符串里就保存了所有的用戶信息

  • 客戶端登陸傳遞信息給服務(wù)端,服務(wù)端收到后把用戶信息加密(token)傳給客戶端积瞒,客戶端將token存放于localStroage等容器中川尖。客戶端每次訪問都傳遞token茫孔,服務(wù)端解密token叮喳,就知道這個(gè)用戶是誰了被芳。通過cpu加解密,服務(wù)端就不需要存儲(chǔ)session占用存儲(chǔ)空間馍悟,就很好的解決負(fù)載均衡多服務(wù)器的問題了畔濒。這個(gè)方法叫做JWT(Json Web Token)

總結(jié)

  • session存儲(chǔ)于服務(wù)器,可以理解為一個(gè)狀態(tài)列表锣咒,擁有一個(gè)唯一識(shí)別符號(hào)sessionId侵状,通常存放于cookie中。服務(wù)器收到cookie后解析出sessionId毅整,再去session列表中查找壹将,才能找到相應(yīng)session。依賴cookie

  • cookie類似一個(gè)令牌毛嫉,裝有sessionId诽俯,存儲(chǔ)在客戶端,瀏覽器通常會(huì)自動(dòng)添加承粤。

  • token也類似一個(gè)令牌暴区,無狀態(tài),用戶信息都被加密到token中辛臊,服務(wù)器收到token后解密就可知道是哪個(gè)用戶仙粱。需要開發(fā)者手動(dòng)添加。

  • jwt只是一個(gè)跨域認(rèn)證的方案

HTTPS

https://zhuanlan.zhihu.com/p/27395037

http://www.reibang.com/p/14cd2c9d2cd2

HTTPS 協(xié)議(HyperText Transfer Protocol over Secure Socket Layer):可以理解為HTTP+SSL/TLS彻舰, 即 HTTP 下加入 SSL 層伐割,HTTPS 的安全基礎(chǔ)是 SSL,因此加密的詳細(xì)內(nèi)容就需要 SSL刃唤,用于安全的 HTTP 數(shù)據(jù)傳輸隔心。

如上圖所示 HTTPS 相比 HTTP 多了一層 SSL/TLS

SSL(Secure Socket Layer,安全套接字層):SSL 協(xié)議位于 TCP/IP 協(xié)議與各種應(yīng)用層協(xié)議之間尚胞,為數(shù)據(jù)通訊提供安全支持硬霍。

TLS(Transport Layer Security,傳輸層安全):其前身是 SSL笼裳,目前使用最廣泛的是TLS 1.1唯卖、TLS 1.2。

  • SSL/TLS 為網(wǎng)絡(luò)通信提供安全及數(shù)據(jù)完整性的一種安全協(xié)議

  • SSL/TLS 是操作系統(tǒng)對(duì)外的API躬柬,SSL3.0后更新為TLS

  • SSL/TLS?采用身份驗(yàn)證和數(shù)據(jù)加密保證網(wǎng)絡(luò)通信的安全和數(shù)據(jù)的完整性

加密算法:

  1. 對(duì)稱加密:加密和解密都是使用的同一個(gè)密鑰

  • 有流式拜轨、分組兩種

  • 例如:DES、AES-GCM允青、ChaCha20-Poly1305等

  • 非對(duì)稱加密:加密使用的密鑰和解密使用的密鑰是不相同的

    • 加密解密的秘鑰分別稱為:公鑰橄碾、私鑰

    • 公鑰和算法都是公開的,私鑰是保密的。非對(duì)稱加密算法性能較低堪嫂,但是安全性超強(qiáng),由于其加密特性木柬,非對(duì)稱加密算法能加密的數(shù)據(jù)長度也是有限的皆串。

    • 例如:RSA、DSA眉枕、ECDSA恶复、 DH、ECDHE

  • 哈希算法

    • 將任意長度的信息轉(zhuǎn)換為較短的固定長度的值速挑,通常其長度要比信息小得多谤牡,且算法不可逆。

    • 例如:MD5姥宝、SHA-1翅萤、SHA-2、SHA-256 等

  • 數(shù)字簽名

    • 簽名就是在信息的后面再加上一段內(nèi)容(信息經(jīng)過hash后的值)腊满,可以證明信息沒有被修改過套么。hash值一般都會(huì)加密后(也就是簽名)再和信息一起發(fā)送,以保證這個(gè)hash值不被修改碳蛋。

    HTTPS數(shù)據(jù)傳輸流程

    HTTPS在傳輸?shù)倪^程中會(huì)涉及到三個(gè)密鑰:

    服務(wù)器端的公鑰和私鑰胚泌,用來進(jìn)行非對(duì)稱加密

    客戶端生成的隨機(jī)密鑰,用來進(jìn)行對(duì)稱加密

    一個(gè)HTTPS請(qǐng)求實(shí)際上包含了兩次HTTP傳輸肃弟,可以細(xì)分為8步玷室。

    1. 客戶端向服務(wù)器發(fā)起HTTPS請(qǐng)求,將瀏覽器支持的加密算法發(fā)送給服務(wù)器

    2. 服務(wù)器端有一個(gè)密鑰對(duì)笤受,即公鑰和私鑰穷缤,是用來進(jìn)行非對(duì)稱加密使用的,服務(wù)器端保存著私鑰箩兽,不能將其泄露绅项,公鑰可以發(fā)送給任何人。

    3. 服務(wù)器選擇一套瀏覽器支持的加密算法比肄,以證書的形式發(fā)送給客戶端快耿,其中包含服務(wù)端的公鑰。

    4. 客戶端收到服務(wù)器端的證書之后芳绩,會(huì)對(duì)證書進(jìn)行檢查掀亥,驗(yàn)證其合法性,如果發(fā)現(xiàn)發(fā)現(xiàn)證書有問題妥色,那么HTTPS傳輸就無法繼續(xù)搪花。如果公鑰合格,那么客戶端會(huì)生成一個(gè)隨機(jī)值,這個(gè)隨機(jī)值就是用于進(jìn)行對(duì)稱加密的密鑰撮竿,我們將該密鑰稱之為client key吮便,即客戶端密鑰,這樣在概念上和服務(wù)器端的密鑰容易進(jìn)行區(qū)分幢踏。然后用服務(wù)器的公鑰對(duì)客戶端密鑰進(jìn)行非對(duì)稱加密髓需,這樣客戶端密鑰就變成密文了,至此房蝉,HTTPS中的第一次HTTP請(qǐng)求結(jié)束僚匆。

    5. 客戶端會(huì)發(fā)起HTTPS中的第二個(gè)HTTP請(qǐng)求,將加密之后的客戶端密鑰發(fā)送給服務(wù)器搭幻。

    6. 服務(wù)器接收到客戶端發(fā)來的密文之后咧擂,會(huì)用自己的私鑰對(duì)其進(jìn)行非對(duì)稱解密、驗(yàn)證哈希檀蹋,解密之后的明文就是客戶端密鑰松申,然后用客戶端密鑰對(duì)數(shù)據(jù)進(jìn)行對(duì)稱加密,這樣數(shù)據(jù)就變成了密文俯逾。

    7. 然后服務(wù)器將加密后的密文發(fā)送給客戶端攻臀。

    8. 客戶端收到服務(wù)器發(fā)送來的密文,用客戶端密鑰對(duì)其進(jìn)行對(duì)稱解密纱昧,得到服務(wù)器發(fā)送的數(shù)據(jù)刨啸。這樣HTTPS中的第二個(gè)HTTP請(qǐng)求結(jié)束,整個(gè)HTTPS傳輸完成识脆。

    問題:
    1.怎么保證保證服務(wù)器給客戶端下發(fā)的公鑰是真正的公鑰设联,而不是中間人偽造的公鑰呢?

    SSL 證書灼捂,權(quán)威證書機(jī)構(gòu)發(fā)布CA證書

    2.證書如何安全傳輸离例,被掉包了怎么辦?

    1. 首先悉稠,數(shù)字證書內(nèi)容是加密的

    • 包括了加密后服務(wù)器的公鑰宫蛆、權(quán)威機(jī)構(gòu)的信息、服務(wù)器域名的猛,還有經(jīng)過CA私鑰簽名之后的證書內(nèi)容(經(jīng)過先通過Hash函數(shù)計(jì)算得到證書數(shù)字摘要耀盗,然后用權(quán)威機(jī)構(gòu)私鑰加密數(shù)字摘要得到數(shù)字簽名),簽名計(jì)算方法以及證書對(duì)應(yīng)的域名卦尊。

  • 驗(yàn)證證書過程是安全的

    • 當(dāng)客戶端收到這個(gè)證書之后叛拷,使用本地配置的權(quán)威機(jī)構(gòu)的公鑰對(duì)證書進(jìn)行解密得到服務(wù)端的公鑰和證書的數(shù)字簽名,數(shù)字簽名經(jīng)過CA公鑰解密得到證書信息摘要岂却。

    • 然后證書簽名的方法計(jì)算一下當(dāng)前證書的信息摘要忿薇,與收到的信息摘要作對(duì)比裙椭,如果一樣,表示證書一定是服務(wù)器下發(fā)的署浩,沒有被中間人篡改過揉燃。因?yàn)橹虚g人雖然有權(quán)威機(jī)構(gòu)的公鑰,能夠解析證書內(nèi)容并篡改筋栋,但是篡改完成之后中間人需要將證書重新加密炊汤,但是中間人沒有權(quán)威機(jī)構(gòu)的私鑰,無法加密二汛,強(qiáng)行加密只會(huì)導(dǎo)致客戶端無法解密婿崭,如果中間人強(qiáng)行亂修改證書拨拓,就會(huì)導(dǎo)致證書內(nèi)容和證書簽名不匹配肴颊。

    HTTPS和HTTP的區(qū)別

    • HTTPS需要到CA申請(qǐng)證書,HTTP不需要

    • HTTPS密文傳輸渣磷,HTTP明文傳輸

    • 連接方式不同婿着,HTTPS默認(rèn)使用443端口,HTTP默認(rèn)80

    • HTTPS=HTTP+加密+認(rèn)證+完整性保護(hù)醋界,較HTTP安全

    Socket簡介

    socket是對(duì)TCP/IP協(xié)議的抽象竟宋,是操作系統(tǒng)對(duì)外開放的接口

    Socket通信流程

    客戶端:

    • 4.用戶創(chuàng)建socket

    • 5.用戶打開socket,并通過IP地址+端口號(hào)試圖connect服務(wù)器的socket

    • 7.客戶端連接成功形纺,開始向服務(wù)器輸入狀態(tài)信息

    • 9.客戶端寫入信息

    • 11.客戶端關(guān)閉

    服務(wù)器:

    • 1.服務(wù)器根據(jù)地址類型(ipv4丘侠、ipv6)、socket類型逐样、協(xié)議創(chuàng)建socket

    • 2.服務(wù)器為socket綁定對(duì)應(yīng)的IP地址和端口號(hào)

    • 3.服務(wù)器監(jiān)聽端口號(hào)請(qǐng)求蜗字,接收用戶發(fā)來的連接請(qǐng)求,此時(shí)服務(wù)器沒有打開socket

    • 6.服務(wù)器接收到了用戶發(fā)來的socket連接請(qǐng)求脂新,被動(dòng)打開socket挪捕,開始接收客戶端請(qǐng)求,直到用戶返回連接信息争便。這時(shí)候服務(wù)器的socket進(jìn)入堵塞狀態(tài)级零,所謂堵塞,即accept();方法一直接收到客戶端返回連接信息后才返回滞乙,然后開始接收下一個(gè)用戶端請(qǐng)求

    • 8.服務(wù)器accept();方法返回奏纪,連接成功

    • 10.服務(wù)器讀取信息

    • 12.服務(wù)端關(guān)閉


    完成~

    小猿同事面試過程中,計(jì)算機(jī)網(wǎng)絡(luò)相關(guān)的基礎(chǔ)知識(shí)也就問了這么多亥贸,肯定還是有很多知識(shí)點(diǎn)和細(xì)節(jié)沒有介紹到荣挨,小猿和同事們還需要繼續(xù)努力深究,爭取再整理更詳細(xì)的知識(shí)點(diǎn)分析給大家~

    最后編輯于
    ?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
    • 序言:七十年代末鹃操,一起剝皮案震驚了整個(gè)濱河市椰拒,隨后出現(xiàn)的幾起案子缆毁,更是在濱河造成了極大的恐慌养盗,老刑警劉巖聂儒,帶你破解...
      沈念sama閱讀 221,635評(píng)論 6 515
    • 序言:濱河連續(xù)發(fā)生了三起死亡事件缓屠,死亡現(xiàn)場(chǎng)離奇詭異滨溉,居然都是意外死亡虽画,警方通過查閱死者的電腦和手機(jī)绎巨,發(fā)現(xiàn)死者居然都...
      沈念sama閱讀 94,543評(píng)論 3 399
    • 文/潘曉璐 我一進(jìn)店門留瞳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硬梁,“玉大人前硫,你說我怎么就攤上這事屹电〉菡” “怎么了英融?”我有些...
      開封第一講書人閱讀 168,083評(píng)論 0 360
    • 文/不壞的土叔 我叫張陵,是天一觀的道長材失。 經(jīng)常有香客問我痕鳍,道長,這世上最難降的妖魔是什么龙巨? 我笑而不...
      開封第一講書人閱讀 59,640評(píng)論 1 296
    • 正文 為了忘掉前任笼呆,我火速辦了婚禮,結(jié)果婚禮上旨别,老公的妹妹穿的比我還像新娘诗赌。我一直安慰自己,他們只是感情好秸弛,可當(dāng)我...
      茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
    • 文/花漫 我一把揭開白布铭若。 她就那樣靜靜地躺著,像睡著了一般胆屿。 火紅的嫁衣襯著肌膚如雪奥喻。 梳的紋絲不亂的頭發(fā)上,一...
      開封第一講書人閱讀 52,262評(píng)論 1 308
    • 那天非迹,我揣著相機(jī)與錄音环鲤,去河邊找鬼。 笑死憎兽,一個(gè)胖子當(dāng)著我的面吹牛冷离,可吹牛的內(nèi)容都是我干的吵冒。 我是一名探鬼主播,決...
      沈念sama閱讀 40,833評(píng)論 3 421
    • 文/蒼蘭香墨 我猛地睜開眼西剥,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼痹栖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瞭空,我...
      開封第一講書人閱讀 39,736評(píng)論 0 276
    • 序言:老撾萬榮一對(duì)情侶失蹤揪阿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后咆畏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體南捂,經(jīng)...
      沈念sama閱讀 46,280評(píng)論 1 319
    • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
      茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
    • 正文 我和宋清朗相戀三年旧找,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了溺健。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
      茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
    • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钮蛛,死狀恐怖鞭缭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情魏颓,我是刑警寧澤岭辣,帶...
      沈念sama閱讀 36,185評(píng)論 5 350
    • 正文 年R本政府宣布,位于F島的核電站琼开,受9級(jí)特大地震影響易结,放射性物質(zhì)發(fā)生泄漏枕荞。R本人自食惡果不足惜柜候,卻給世界環(huán)境...
      茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
    • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望躏精。 院中可真熱鬧渣刷,春花似錦、人聲如沸矗烛。這莊子的主人今日做“春日...
      開封第一講書人閱讀 32,340評(píng)論 0 24
    • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞭吃。三九已至碌嘀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間歪架,已是汗流浹背股冗。 一陣腳步聲響...
      開封第一講書人閱讀 33,460評(píng)論 1 272
    • 我被黑心中介騙來泰國打工止状, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伏社,地道東北人第焰。 一個(gè)月前我還...
      沈念sama閱讀 48,909評(píng)論 3 376
    • 正文 我出身青樓,卻偏偏與公主長得像脖咐,于是被迫代替她去往敵國和親派歌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
      茶點(diǎn)故事閱讀 45,512評(píng)論 2 359