抱佛腳-基礎(chǔ)知識(shí)系列之計(jì)網(wǎng)

抱佛腳一時(shí)爽,一直抱佛腳一直爽爬早!這篇文章總結(jié)常見的計(jì)算機(jī)網(wǎng)絡(luò)面試問題~因?yàn)槭潜Х鹉_碳锈,所以結(jié)構(gòu)上沒有什么邏輯...

參考鏈接:Waking-Up CycNotes 糯剐唬客網(wǎng) 博客園 知乎專欄

session vs cookie

  • Cookie通過在客戶端記錄信息確定用戶身份,Session通過在服務(wù)器端記錄信息確定用戶身份

  • 通常session的生存期會(huì)比cookie更長一些

  • 考慮到安全應(yīng)該使用session:別人可以分析存放在本地的cookie并進(jìn)行cookie欺騙

  • 考慮到服務(wù)器性能應(yīng)該使用cookie:session會(huì)在一定時(shí)間內(nèi)保留在服務(wù)器上

  • cookie的分類

    • 會(huì)話cookie:關(guān)閉瀏覽器窗口,cookie就消失泽篮;一般不存儲(chǔ)在硬盤上而是保存在內(nèi)存里

    • 持久cookie:把cookie保存到硬盤上坊秸,關(guān)閉后再次打開瀏覽器,這些cookie仍然有效直到超過設(shè)定的過期時(shí)間

  • 流程

    • 若沒有禁用cookie

      • 客戶端第一次發(fā)請(qǐng)求給服務(wù)端选脊,請(qǐng)求中有包含用戶名和密碼的表單

      • 服務(wù)端驗(yàn)證用戶名和密碼杭抠,把用戶信息存儲(chǔ)到 Redis 中,它在 Redis 中的 Key 稱為 Session ID恳啥,返回響應(yīng)報(bào)文的 Set-Cookie 首部字段包含了這個(gè) Session ID

      • 客戶端收到響應(yīng)報(bào)文之后將該id寫入 Cookie 偏灿,存入瀏覽器中

      • 客戶端之后對(duì)同一個(gè)服務(wù)器進(jìn)行請(qǐng)求時(shí)會(huì)包含該 Cookie

      • 服務(wù)器收到之后提取出 Session ID,從 Redis 中取出用戶信息钝的,繼續(xù)之前的業(yè)務(wù)操作

    • 若禁用了cookie

      • 客戶端第一次發(fā)請(qǐng)求給服務(wù)端

      • 服務(wù)端創(chuàng)建session并生成sessionId翁垂,返回給客戶端

      • 客戶端再次發(fā)請(qǐng)求,通過url重寫等方法在請(qǐng)求中加上sessionId發(fā)給服務(wù)端

      • 服務(wù)器按照sessionId把這個(gè)session檢索出來使用

token

  • 最簡單的token組成:uid(用戶唯一的身份標(biāo)識(shí))硝桩、time(當(dāng)前時(shí)間的時(shí)間戳)沿猜、sign(簽名,由token的前幾位+鹽以哈希算法壓縮成一定長的十六進(jìn)制字符串碗脊,可以防止惡意第三方拼接token請(qǐng)求服務(wù)器)啼肩。還可以把不變的參數(shù)也放進(jìn)token,避免多次查庫

  • 當(dāng)用戶首次登錄成功(注冊(cè)也是一種可以適用的場(chǎng)景)之后, 服務(wù)器端就會(huì)生成一個(gè) token 值,這個(gè)值祈坠,會(huì)在服務(wù)器保存token值(保存在數(shù)據(jù)庫中)害碾,再將這個(gè)token值返回給客戶端

  • 客戶端拿到 token 值之后,進(jìn)行本地保存;當(dāng)客戶端再次發(fā)送網(wǎng)絡(luò)請(qǐng)求(一般不是登錄請(qǐng)求)的時(shí)候,就會(huì)將這個(gè) token 值附帶到參數(shù)中發(fā)送給服務(wù)器

token vs session vs cookie

  • session代表服務(wù)器與瀏覽器的一次會(huì)話過程赦拘,token是一種認(rèn)證手段

  • cookie慌随,session都可以是token存儲(chǔ)的一種方式

  • 作為身份認(rèn)證,token安全性比session好

socket

含義

  • 應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層

  • 把復(fù)雜的TCP/IP協(xié)議族隱藏在Socket接口后面另绩,對(duì)用戶來說儒陨,一組簡單的接口就是全部,讓Socket去組織數(shù)據(jù)笋籽,以符合指定的協(xié)議

套接字地址

  • = ip + 端口號(hào)

  • 當(dāng)客戶端發(fā)起一個(gè)連接請(qǐng)求時(shí)蹦漠,客戶端套接字地址中的端口是由內(nèi)核自動(dòng)分配的,稱為臨時(shí)端口

  • 服務(wù)端的套接字端口通常是某個(gè)知名的端口

  • 一個(gè)連接由它兩端的套接字地址唯一確定

套接字接口

  • 是一組函數(shù)

socket通信(網(wǎng)絡(luò)I/O)過程

  • 服務(wù)端

    • 初始化socket(包括協(xié)議车海、socket類型等)

    • 與端口綁定(bind笛园,ip地址+端口號(hào)用于標(biāo)識(shí)socket)

    • 對(duì)端口進(jìn)行監(jiān)聽(listen)

    • 調(diào)用accept(是阻塞的),等待客戶端連接

    • 處理請(qǐng)求

    • close(注意最后一個(gè)close后返回accept階段侍芝,等待下一個(gè)連接請(qǐng)求

  • 客戶端

    • 初始化socket(包括協(xié)議研铆、socket類型等)

    • 發(fā)送連接請(qǐng)求(connect)

    • 發(fā)送數(shù)據(jù)請(qǐng)求

    • 關(guān)閉連接(close)

  • 當(dāng)接收到一個(gè)TCP連接請(qǐng)求后,如果上層還沒有接受它州叠,那么系統(tǒng)將緩存這個(gè)連接請(qǐng)求棵红;當(dāng)超過指定數(shù)量后,系統(tǒng)將會(huì)拒絕連接咧栗;假如緩存的TCP連接請(qǐng)求發(fā)送來數(shù)據(jù)逆甜,那么系統(tǒng)也會(huì)緩存這些數(shù)據(jù),等待SocketServer獲得這個(gè)連接的時(shí)候一并交給它

I/O模型

總過程

對(duì)于一個(gè)套接字上的輸入操作致板,第一步通常涉及等待數(shù)據(jù)從網(wǎng)絡(luò)中到達(dá)交煞。當(dāng)所等待數(shù)據(jù)到達(dá)時(shí),它被復(fù)制到內(nèi)核中的某個(gè)緩沖區(qū)斟或。第二步就是把數(shù)據(jù)從內(nèi)核緩沖區(qū)復(fù)制到應(yīng)用進(jìn)程緩沖區(qū)

同步 vs 異步

  • 同步:用戶進(jìn)程觸發(fā)IO操作素征,須等待或者主動(dòng)的去詢問IO是否完成,完成則發(fā)送IO系統(tǒng)調(diào)用

  • 異步:用戶進(jìn)程觸發(fā)IO 操作以后便開始做自己的事情萝挤,而當(dāng)IO 操作已經(jīng)完成的時(shí)候會(huì)得到IO 完成的通知

阻塞 vs 非阻塞

  • 阻塞:數(shù)據(jù)未就緒時(shí)讀取或者寫入函數(shù)將一直等待

  • 非阻塞:數(shù)據(jù)未就緒時(shí)會(huì)立刻得到error

阻塞式I/O

  • 應(yīng)用進(jìn)程被阻塞御毅,直到數(shù)據(jù)從內(nèi)核緩沖區(qū)復(fù)制到應(yīng)用進(jìn)程緩沖區(qū)中才返回

  • 其它應(yīng)用進(jìn)程還可以執(zhí)行,所以不消耗 CPU

非阻塞式I/O

  • 應(yīng)用進(jìn)程執(zhí)行系統(tǒng)調(diào)用之后怜珍,內(nèi)核返回一個(gè)錯(cuò)誤碼亚享。應(yīng)用進(jìn)程可以繼續(xù)執(zhí)行,但是需要不斷的執(zhí)行系統(tǒng)調(diào)用來獲知 I/O 是否完成绘面,這種方式稱為輪詢(polling)

  • CPU 要處理更多的系統(tǒng)調(diào)用欺税,因此這種模型的 CPU 利用率比較低

I/O多路復(fù)用

  • 讓單個(gè)進(jìn)程(reactor)具有處理多個(gè) I/O 事件的能力

  • 主進(jìn)程是阻塞的

  • 使用 select / poll / epoll 等待數(shù)據(jù)侈沪,并且可以等待多個(gè)套接字中的任何一個(gè)變?yōu)榭勺x。這一過程會(huì)被阻塞晚凿,當(dāng)某一個(gè)套接字可讀時(shí)返回亭罪,之后再使用 recvfrom 把數(shù)據(jù)從內(nèi)核復(fù)制到進(jìn)程中

信號(hào)驅(qū)動(dòng) I/O

  • 應(yīng)用進(jìn)程使用 sigaction 系統(tǒng)調(diào)用,內(nèi)核立即返回歼秽,應(yīng)用進(jìn)程可以繼續(xù)執(zhí)行应役,也就是說等待數(shù)據(jù)階段應(yīng)用進(jìn)程是非阻塞的

  • 內(nèi)核在數(shù)據(jù)到達(dá)時(shí)向應(yīng)用進(jìn)程發(fā)送 SIGIO 信號(hào),應(yīng)用進(jìn)程收到之后在信號(hào)處理程序中調(diào)用 recvfrom 將數(shù)據(jù)從內(nèi)核復(fù)制到應(yīng)用進(jìn)程中

異步I/O

  • 應(yīng)用進(jìn)程執(zhí)行 aio_read 系統(tǒng)調(diào)用會(huì)立即返回燥筷,應(yīng)用進(jìn)程可以繼續(xù)執(zhí)行箩祥,不會(huì)被阻塞,內(nèi)核會(huì)在所有操作完成之后向應(yīng)用進(jìn)程發(fā)送信號(hào)

  • 異步 I/O 的信號(hào)是通知應(yīng)用進(jìn)程 I/O 完成肆氓,而信號(hào)驅(qū)動(dòng) I/O 的信號(hào)是通知應(yīng)用進(jìn)程可以開始 I/O

select vs poll vs epoll

select

  • 用戶把需要監(jiān)控的描述符對(duì)應(yīng)的bit置為1

  • 用戶進(jìn)程調(diào)用select(是一個(gè)系統(tǒng)調(diào)用)袍祖,整個(gè)進(jìn)程會(huì)被阻塞,直到select返回

  • select把描述符集從用戶態(tài)拷貝到內(nèi)核態(tài)谢揪,不斷輪詢所負(fù)責(zé)的所有socket蕉陋,當(dāng)任何一個(gè)/多個(gè)socket中的數(shù)據(jù)準(zhǔn)備好了,把它們對(duì)應(yīng)的bit置為0拨扶,并把所有描述符從內(nèi)核態(tài)拷貝回用戶態(tài)凳鬓,select返回

  • 用戶進(jìn)程遍歷檢查描述符集中哪個(gè)描述符上返回了,通過系統(tǒng)調(diào)用調(diào)用內(nèi)核的read操作患民,把數(shù)據(jù)從內(nèi)核拷貝到用戶進(jìn)程的地址空間

  • 描述符集的大小受限于FD_SIZE

poll

  • 本質(zhì)上和select沒有區(qū)別

  • 但是它沒有最大連接數(shù)的限制缩举,原因是它是基于鏈表來存儲(chǔ)的

  • 每增加一個(gè)描述符就向數(shù)組中加入一個(gè)含描述符的結(jié)構(gòu)體,結(jié)構(gòu)體只需拷貝一次到內(nèi)核態(tài)

epoll

  • 只返回狀態(tài)發(fā)生變化的文件描述符給用戶:文件描述符就緒時(shí)匹颤,采用回調(diào)機(jī)制蚁孔,避免了輪詢(回調(diào)函數(shù)將就緒的描述符添加到一個(gè)鏈表中,執(zhí)行epoll_wait時(shí)惋嚎,返回這個(gè)鏈表)

  • 當(dāng)連接數(shù)較多并且有很多的不活躍連接時(shí),epoll的效率比其它兩者高很多站刑;但是當(dāng)連接數(shù)較少并且都十分活躍的情況下另伍,由于epoll需要很多回調(diào),因此性能可能低于其它兩者

  • 水平觸發(fā) vs 邊緣觸發(fā)

    • 水平觸發(fā)(LT绞旅,Level Trigger)模式下摆尝,一個(gè)文件描述符F就緒觸發(fā)通知,如果用戶程序沒有一次性把數(shù)據(jù)讀寫完因悲,下次用戶調(diào)用epoll_wait時(shí)還會(huì)通知用戶F就緒了

    • 邊緣觸發(fā)(ET堕汞,Edge Trigger)模式下,當(dāng)描述符從未就緒變?yōu)榫途w時(shí)通知一次晃琳,之后不會(huì)再通知讯检,直到再次從未就緒變?yōu)榫途w琐鲁;所以邊緣觸發(fā)一定要用非阻塞(non-block)IO

主機(jī)間通信

方式

  • 客戶-服務(wù)器(C/S):客戶是服務(wù)的請(qǐng)求方,服務(wù)器是服務(wù)的提供方

  • 對(duì)等(P2P):不區(qū)分客戶和服務(wù)器

過程

  • 若在同一局域網(wǎng)中

    • 若A的ARP緩存中有主機(jī)B的IP到MAC的映射

      • 構(gòu)造報(bào)文:目的IP人灼、MAC都是主機(jī)B围段;源IP、MAC都是主機(jī)A

      • 把報(bào)文發(fā)給交換機(jī)C投放,C記錄A的MAC到端口號(hào)的映射

        • 若C記錄過B的MAC到端口號(hào)的映射:將報(bào)文從對(duì)應(yīng)端口轉(zhuǎn)發(fā)出去

        • 若C未記錄B的MAC到端口號(hào)的映射:洪泛奈泪,廣播報(bào)文到局域網(wǎng)所有機(jī)器;B收到廣播后會(huì)發(fā)給C要回復(fù)給A的報(bào)文灸芳;C記錄B的MAC到端口號(hào)的映射

    • 若A的ARP緩存中沒有主機(jī)B的IP到MAC的映射

      • A發(fā)送ARP請(qǐng)求報(bào)文給C

      • C洪泛涝桅,把ARP請(qǐng)求廣播到局域網(wǎng)所有機(jī)器

      • B收到廣播報(bào)文,在自己的ARP緩存表中寫入A的IP到MAC的映射烙样;將自己的MAC封裝到ARP回復(fù)報(bào)文中冯遂,單播給A

      • A獲取到主機(jī)B的MAC后,在自己的ARP緩存表中寫入B的IP到MAC的映射

  • 若不在同一局域網(wǎng)中

    • A先發(fā)給路由器(目的IP是路由器)

電路交換 vs 分組交換

電路交換

建立連接误阻,且在整個(gè)通信過程中始終占用該鏈路

分組交換

  • 每個(gè)分組都有首部和尾部债蜜,包含了源地址和目的地址等控制信息

  • 在同一條傳輸線路上允許同時(shí)傳輸多個(gè)分組,分組交換不需要占用傳輸線路

傳輸時(shí)延 vs 傳播時(shí)延

傳輸時(shí)延

數(shù)據(jù)幀的長度 / 傳輸速率

傳播時(shí)延

信道長度 / 電磁波傳播速度

體系結(jié)構(gòu)

五層協(xié)議

數(shù)據(jù)單位 栗子 功能 設(shè)備
應(yīng)用層 報(bào)文 http究反、dns 應(yīng)用程序之間的數(shù)據(jù)傳輸
傳輸層 報(bào)文段(TCP) 用戶數(shù)據(jù)報(bào)(UDP) tcp寻定、udp 進(jìn)程之間的數(shù)據(jù)傳輸
網(wǎng)絡(luò)層 分組 ip 主機(jī)之間的數(shù)據(jù)傳輸 路由器
數(shù)據(jù)鏈路層 csma/cd、ppp 一條鏈路兩端主機(jī)之間的數(shù)據(jù)傳輸 交換機(jī)
物理層 bit 在傳輸媒體上傳輸數(shù)據(jù)bit流 集線器

OSI七層協(xié)議

把應(yīng)用層由上至下分為:

  • 會(huì)話層:建立及管理會(huì)話

  • 表示層:數(shù)據(jù)壓縮精耐、加密以及數(shù)據(jù)描述狼速,這使得應(yīng)用程序不必關(guān)心在各臺(tái)主機(jī)中數(shù)據(jù)內(nèi)部格式不同的問題

  • 應(yīng)用層

TCP/IP四層協(xié)議

  • 把數(shù)據(jù)鏈路層和物理層合為網(wǎng)絡(luò)接口層

  • TCP/IP 體系結(jié)構(gòu)不嚴(yán)格遵循 OSI 分層概念,應(yīng)用層可能會(huì)直接使用 IP 層或者網(wǎng)絡(luò)接口層

數(shù)據(jù)在各層之間的傳遞過程

  • 在向下的過程中卦停,需要添加下層協(xié)議所需要的首部或者尾部

  • 在向上的過程中不斷拆開首部和尾部

路由器 vs 交換機(jī)

路由器

網(wǎng)絡(luò)層設(shè)備向胡,連接不同的局域網(wǎng),根據(jù)IP地址進(jìn)行轉(zhuǎn)發(fā)

交換機(jī)

鏈路層設(shè)備惊完,連接同一局域網(wǎng)中的不同主機(jī)僵芹,根據(jù)MAC地址進(jìn)行轉(zhuǎn)發(fā)

物理層

通信方式

  • 單工通信:單向傳輸

  • 半雙工通信:雙向交替?zhèn)鬏?/p>

  • 全雙工通信:雙向同時(shí)傳輸

帶通調(diào)制

  • 模擬信號(hào)是連續(xù)的信號(hào),數(shù)字信號(hào)是離散的信號(hào)

  • 帶通調(diào)制把數(shù)字信號(hào)轉(zhuǎn)換為模擬信號(hào)

鏈路層

基本功能

  • 成幀(給IP數(shù)據(jù)包添加首部和尾部)

  • 透明傳輸(如果幀的數(shù)據(jù)部分含有和首部尾部相同的內(nèi)容小槐,需插入轉(zhuǎn)義符拇派,接收端處理后可以還原數(shù)據(jù);整個(gè)過程對(duì)用戶透明)

  • 差錯(cuò)檢測(cè)(用循環(huán)冗余檢驗(yàn)CRC檢查比特差錯(cuò))

信道分類

  • 廣播信道:一對(duì)多

  • 點(diǎn)對(duì)點(diǎn)信道:一對(duì)一

信道復(fù)用

  • 頻分復(fù)用:所有主機(jī)在相同的時(shí)間占用不同的頻率帶寬資源

  • 時(shí)分復(fù)用:所有主機(jī)在不同的時(shí)間占用相同的(所有的)頻率帶寬資源【ABCDABCD】

  • 統(tǒng)計(jì)時(shí)分復(fù)用:不固定每個(gè)用戶在時(shí)分復(fù)用幀中的位置凿跳,只要有數(shù)據(jù)就集中起來組成統(tǒng)計(jì)時(shí)分復(fù)用幀然后發(fā)送【ACDABBCD】

  • 波分復(fù)用:光的頻分復(fù)用

  • 碼分復(fù)用

    • 為每個(gè)用戶分配 m bit 的碼片件豌,并且所有的碼片正交

    • 擁有該碼片的用戶發(fā)送比特 1 時(shí)就發(fā)送該碼片,發(fā)送比特 0 時(shí)就發(fā)送該碼片的反碼

    • 接收端使用碼片 對(duì)接收到的數(shù)據(jù)進(jìn)行內(nèi)積運(yùn)算時(shí)控嗜,結(jié)果為 0 的是其它用戶發(fā)送的數(shù)據(jù)茧彤,結(jié)果為 1 的是用戶發(fā)送的比特 1,結(jié)果為 -1 的是用戶發(fā)送的比特 0

CSMA/CD 協(xié)議

  • 總線型網(wǎng)絡(luò)疆栏,許多主機(jī)以多點(diǎn)的方式連接到總線上

  • 每個(gè)主機(jī)都必須不停地監(jiān)聽信道曾掂。在發(fā)送前惫谤,如果監(jiān)聽到信道正在使用,就必須等待

  • 雖然每個(gè)主機(jī)在發(fā)送數(shù)據(jù)之前都已經(jīng)監(jiān)聽到信道為空閑遭殉,但是由于電磁波的傳播時(shí)延的存在石挂,還是有可能會(huì)發(fā)生碰撞

  • 當(dāng)發(fā)生碰撞時(shí),站點(diǎn)要停止發(fā)送险污,等待一段時(shí)間再發(fā)送

PPP協(xié)議

用戶計(jì)算機(jī)和 ISP 進(jìn)行通信時(shí)所使用的數(shù)據(jù)鏈路層協(xié)議

MAC地址

鏈路層地址痹愚,用于唯一標(biāo)識(shí)網(wǎng)絡(luò)適配器(網(wǎng)卡)

以太網(wǎng)

  • 星型拓?fù)浣Y(jié)構(gòu)局域網(wǎng)

  • 使用廣播信道

  • 使用交換機(jī)根據(jù)MAC地址進(jìn)行存儲(chǔ)轉(zhuǎn)發(fā)

交換機(jī)

  • 交換表中存儲(chǔ)著 MAC 地址到接口的映射

  • 交換機(jī)可以自學(xué)習(xí)交換表的內(nèi)容,即插即用蛔糯,不需要網(wǎng)絡(luò)管理員手動(dòng)配置交換表

虛擬局域網(wǎng) VLAN

虛擬局域網(wǎng)可以建立與物理位置無關(guān)的邏輯組拯腮,只有在同一個(gè)虛擬局域網(wǎng)中的成員才會(huì)收到鏈路層廣播信息

網(wǎng)絡(luò)層

IP數(shù)據(jù)報(bào)格式

  • 版本 : 有 4(IPv4,32位)和 6(IPv6蚁飒,128位)兩個(gè)值

  • 總長度:首部長度+數(shù)據(jù)部分長度

  • 生存時(shí)間 TTL:防止無法交付的數(shù)據(jù)報(bào)在互聯(lián)網(wǎng)中不斷兜圈子

  • 首部檢驗(yàn)和:數(shù)據(jù)報(bào)每經(jīng)過一個(gè)路由器动壤,都要重新計(jì)算檢驗(yàn)和,首部檢驗(yàn)和不包括對(duì)數(shù)據(jù)部分的檢驗(yàn)

  • 標(biāo)識(shí):在數(shù)據(jù)報(bào)長度過長從而發(fā)生分片的情況下淮逻,相同數(shù)據(jù)報(bào)的不同分片具有相同的標(biāo)識(shí)

  • 片偏移:和標(biāo)識(shí)符一起琼懊,用于發(fā)生分片的情況

無分類編址 CIDR

  • 128.14.35.7/20 表示前 20 位為網(wǎng)絡(luò)前綴

  • 子網(wǎng)掩碼首 1 長度為網(wǎng)絡(luò)前綴的長度,對(duì)長度沒有規(guī)定

  • IP地址與子網(wǎng)掩碼相與可得子網(wǎng)ip

ARP協(xié)議

  • ARP 實(shí)現(xiàn)由 IP 地址得到 MAC 地址

  • 每個(gè)主機(jī)都有一個(gè) ARP 高速緩存爬早,里面有本局域網(wǎng)上的各主機(jī)和路由器的 IP 地址到 MAC 地址的映射表

ICMP協(xié)議

  • Ping:向目的主機(jī)發(fā)送 ICMP Echo 請(qǐng)求報(bào)文哼丈,目的主機(jī)收到之后會(huì)發(fā)送 Echo 回答報(bào)文。Ping 會(huì)根據(jù)時(shí)間和成功響應(yīng)的次數(shù)估算出數(shù)據(jù)包往返時(shí)間以及丟包率

  • Traceroute:跟蹤一個(gè)分組從源點(diǎn)到終點(diǎn)的路徑

VPN 虛擬專用網(wǎng)

  • 機(jī)構(gòu)內(nèi)的計(jì)算機(jī)可以使用僅在本機(jī)構(gòu)有效的 IP 地址(專用地址)

  • 機(jī)構(gòu)內(nèi)的主機(jī)只與本機(jī)構(gòu)內(nèi)的其它主機(jī)通信

NAT 網(wǎng)絡(luò)地址轉(zhuǎn)換

  • 專用網(wǎng)內(nèi)部的主機(jī)使用本地 IP 地址又想和互聯(lián)網(wǎng)上的主機(jī)通信時(shí)筛严,可以使用 NAT 來將本地 IP 轉(zhuǎn)換為全球 IP

  • 分為靜態(tài)轉(zhuǎn)換(轉(zhuǎn)換得到的全球IP地址固定不變)和動(dòng)態(tài)NAT轉(zhuǎn)換

路由器分組轉(zhuǎn)發(fā)流程

  • 從數(shù)據(jù)報(bào)的首部提取目的主機(jī)的 IP 地址 D醉旦,得到目的網(wǎng)絡(luò)地址 N

  • 若 N 就是與此路由器直接相連的某個(gè)網(wǎng)絡(luò)地址桨啃,則進(jìn)行直接交付

  • 若路由表中有目的地址為 D 的特定主機(jī)路由车胡,則把數(shù)據(jù)報(bào)傳送給表中所指明的下一跳路由器

  • 若路由表中有到達(dá)網(wǎng)絡(luò) N 的路由,則把數(shù)據(jù)報(bào)傳送給路由表中所指明的下一跳路由器

  • 若路由表中有一個(gè)默認(rèn)路由照瘾,則把數(shù)據(jù)報(bào)傳送給路由表中所指明的默認(rèn)路由器

  • 報(bào)告轉(zhuǎn)發(fā)分組出錯(cuò)

傳輸層

UDP vs TCP

UDP TCP
連接 無連接 面向連接
可靠 不可靠 可靠
服務(wù) 提供及時(shí)性服務(wù) 提供完整性服務(wù)
流量控制
擁塞控制
面向 面向報(bào)文(對(duì)于應(yīng)用程序傳下來的報(bào)文不合并也不拆分匈棘,只是添加 UDP 首部) 面向字節(jié)流(把應(yīng)用層傳下來的報(bào)文看成字節(jié)流,把字節(jié)流組織成大小不等的數(shù)據(jù)塊)
n對(duì)n 支持一對(duì)一析命、一對(duì)多主卫、多對(duì)一和多對(duì)多 支持一對(duì)一

TCP三次握手

  • 客戶端隨機(jī)生成序列號(hào)x,向服務(wù)端發(fā)送連接請(qǐng)求報(bào)文碳却,進(jìn)入SYN_SENT狀態(tài)

    • SYN=1, ACK=0, seq=x
  • 服務(wù)端收到連接請(qǐng)求報(bào)文,同意建立連接則隨機(jī)生成序列號(hào)y笑旺,向客戶端發(fā)送連接確認(rèn)報(bào)文昼浦,進(jìn)入SYN_RCVD狀態(tài)

    • SYN=1, ACK=1, seq=y, ack=x+1
  • 客戶端收到連接確認(rèn)報(bào)文,再次向服務(wù)端發(fā)出確認(rèn)報(bào)文筒主,連接建立关噪,進(jìn)入ESTABLISHED狀態(tài)

    • ACK=1, seq=x+1, ack=y+1
  • 服務(wù)端收到確認(rèn)報(bào)文后鸟蟹,連接建立,進(jìn)入ESTABLISHED狀態(tài)

三次握手的原因

  • 客戶端發(fā)送的連接請(qǐng)求如果在網(wǎng)絡(luò)中滯留使兔,那么就會(huì)隔很長一段時(shí)間才能收到服務(wù)器端發(fā)回的連接確認(rèn)建钥。客戶端等待一個(gè)超時(shí)重傳時(shí)間之后虐沥,就會(huì)重新請(qǐng)求連接熊经。但是這個(gè)滯留的連接請(qǐng)求最后還是會(huì)到達(dá)服務(wù)器,如果不進(jìn)行三次握手欲险,那么服務(wù)器就會(huì)打開兩個(gè)連接镐依。如果有第三次握手,客戶端會(huì)忽略服務(wù)器之后發(fā)送的對(duì)滯留連接請(qǐng)求的連接確認(rèn)天试,不進(jìn)行第三次握手槐壳,因此就不會(huì)再次打開連接

  • 兩次握手無法保證Client正確接收第二次握手的報(bào)文(Server無法確認(rèn)Client是否收到)

為什么不用四次握手

因?yàn)閠cp是全雙工的,三次已經(jīng)確認(rèn)了數(shù)據(jù)在兩個(gè)方向上都是可以正確到達(dá)的

第三次握手中客戶端的報(bào)文未到達(dá)服務(wù)端會(huì)怎樣

  • 服務(wù)端:由于Server沒有收到ACK確認(rèn)喜每,因此會(huì)重發(fā)之前的SYN+ACK(默認(rèn)重發(fā)五次务唐,之后自動(dòng)關(guān)閉連接進(jìn)入CLOSED狀態(tài));在Server進(jìn)入CLOSED狀態(tài)之后带兜,如果Client向服務(wù)器發(fā)送數(shù)據(jù)枫笛,服務(wù)器會(huì)以RST包應(yīng)答

  • 客戶端:收到服務(wù)端重發(fā)的SYN+ACK報(bào)文后,重新傳ACK給Server

如果已經(jīng)建立了連接鞋真,但客戶端出現(xiàn)了故障怎么辦

服務(wù)器每收到一次客戶端的請(qǐng)求后都會(huì)重新復(fù)位一個(gè)計(jì)時(shí)器崇堰,時(shí)間通常是設(shè)置為2小時(shí),若兩小時(shí)還沒有收到客戶端的任何數(shù)據(jù)涩咖,服務(wù)器就會(huì)發(fā)送一個(gè)探測(cè)報(bào)文段海诲,以后每隔75秒鐘發(fā)送一次。若一連發(fā)送10個(gè)探測(cè)報(bào)文仍然沒反應(yīng)檩互,服務(wù)器就認(rèn)為客戶端出了故障特幔,接著就關(guān)閉連接

TCP四次揮手

  • 客戶端發(fā)送連接釋放報(bào)文

    • FIN=1, seq=u
  • 服務(wù)端收到釋放報(bào)文后,發(fā)出確認(rèn)報(bào)文闸昨,此時(shí)TCP半關(guān)閉蚯斯,服務(wù)端能向客戶端發(fā)送數(shù)據(jù),但客戶端不能向服務(wù)端發(fā)送數(shù)據(jù)饵较,服務(wù)端進(jìn)入CLOSE-WAIT狀態(tài)

    • ACK=1, seq=v, ack=u+1
  • 服務(wù)端數(shù)據(jù)傳輸完成后拍嵌,發(fā)出連接釋放報(bào)文

    • FIN=1, ACK=1, seq=w, ack=u+1
  • 客戶端收到連接釋放報(bào)文后發(fā)出確認(rèn),客戶端進(jìn)入TIME-WAIT 狀態(tài)循诉,等待 2 MSL(最大報(bào)文存活時(shí)間)后如果沒有收到服務(wù)端的回復(fù)横辆,則釋放連接

    • ACK=1, seq=u+1, ack=w+1
  • 服務(wù)端收到客戶端的確認(rèn)后,釋放連接

四次揮手的原因

  • 客戶端發(fā)送了 FIN 連接釋放報(bào)文之后茄猫,服務(wù)器收到了這個(gè)報(bào)文狈蚤,就進(jìn)入了 CLOSE-WAIT 狀態(tài)困肩。這個(gè)狀態(tài)是為了讓服務(wù)器端發(fā)送還未傳送完畢的數(shù)據(jù),傳送完畢之后脆侮,服務(wù)器會(huì)發(fā)送 FIN 連接釋放報(bào)文

  • 客戶端接收到服務(wù)器端的 FIN 報(bào)文后進(jìn)入 TIME-WAIT狀態(tài)锌畸,要等最大數(shù)據(jù)包生存期的兩倍,是為了:

    • 確保最后一個(gè)確認(rèn)報(bào)文能夠到達(dá)靖避。如果服務(wù)端沒收到客戶端發(fā)送來的確認(rèn)報(bào)文潭枣,那么就會(huì)重新發(fā)送連接釋放請(qǐng)求報(bào)文,那么客戶端就會(huì)重傳確認(rèn)報(bào)文

    • 讓本連接持續(xù)時(shí)間內(nèi)所產(chǎn)生的所有報(bào)文都從網(wǎng)絡(luò)中消失筋蓖,使得下一個(gè)新的連接不會(huì)出現(xiàn)舊連接的報(bào)文

TCP可靠傳輸

  • 超時(shí)重傳:如果一個(gè)已經(jīng)發(fā)送的報(bào)文段在超時(shí)時(shí)間內(nèi)沒有收到確認(rèn)卸耘,那么就重傳這個(gè)報(bào)文段

  • 確認(rèn)機(jī)制:當(dāng)TCP收到發(fā)自TCP連接另一端的數(shù)據(jù),它將發(fā)送一個(gè)確認(rèn)

  • 校驗(yàn)和:校驗(yàn)出包有錯(cuò)粘咖,丟棄報(bào)文段蚣抗,不給出響應(yīng)

  • 如果有必要,TCP將對(duì)收到的數(shù)據(jù)進(jìn)行重新排序瓮下,將收到的數(shù)據(jù)以正確的順序交給應(yīng)用層

TCP流量控制

  • 接收方發(fā)送的確認(rèn)報(bào)文中的窗口字段可以用來控制發(fā)送方窗口大小翰铡,從而影響發(fā)送方的發(fā)送速率,保證接收方來得及接收

  • 發(fā)送窗口

    • 如果發(fā)送窗口左部的字節(jié)已經(jīng)發(fā)送并且收到了確認(rèn)讽坏,那么就將發(fā)送窗口向右滑動(dòng)一定距離锭魔,直到左部第一個(gè)字節(jié)不是已發(fā)送并且已確認(rèn)的狀態(tài)

    • 發(fā)送方得到一個(gè)字節(jié)的確認(rèn)之后,就知道這個(gè)字節(jié)之前的所有字節(jié)都已經(jīng)被接收

  • 接收窗口

    • 接收窗口左部字節(jié)已經(jīng)發(fā)送確認(rèn)并交付主機(jī)路呜,就向右滑動(dòng)接收窗口

    • 接收窗口只會(huì)對(duì)窗口內(nèi)最后一個(gè)按序到達(dá)的字節(jié)進(jìn)行確認(rèn)迷捧,例如接收窗口已經(jīng)收到的字節(jié)為 {31, 34, 35},其中 {31} 按序到達(dá)胀葱,而 {34, 35} 就不是漠秋,因此只對(duì)字節(jié) 31 進(jìn)行確認(rèn)

    • 如果接收方?jīng)]有能力接收數(shù)據(jù),就會(huì)將接收窗口設(shè)置為0抵屿,這時(shí)發(fā)送方必須暫停發(fā)送數(shù)據(jù)庆锦,但是會(huì)啟動(dòng)一個(gè)持續(xù)計(jì)時(shí)器(persistence timer),到期后發(fā)送一個(gè)大小為1字節(jié)的探測(cè)數(shù)據(jù)包轧葛,以查看接收窗口狀態(tài)搂抒。如果接收方能夠接收數(shù)據(jù),就會(huì)在返回的報(bào)文中更新接收窗口大小尿扯,恢復(fù)數(shù)據(jù)傳送

TCP擁塞控制

  • 必要性:流控只簡單地表明了接收方的處理能力求晶,并不能代表中間網(wǎng)絡(luò)的處理能力

  • 慢開始與擁塞避免:慢開始:cwnd初始值為1,每收到一次確認(rèn)cwnd*=2衷笋;擁塞避免:cwnd達(dá)到ssthresh時(shí)芳杏,每收到一次確認(rèn)cwnd+=1;如果出現(xiàn)超時(shí),令ssthresh = cwnd / 2蚜锨,cwnd=1

  • 快重傳與快恢復(fù):快重傳:發(fā)送方收到3個(gè)重復(fù)確認(rèn)時(shí)可知下一個(gè)報(bào)文段丟失,立即重傳下一個(gè)報(bào)文段慢蜓;快恢復(fù):考慮到如果網(wǎng)絡(luò)出現(xiàn)擁塞的話就不會(huì)收到好幾個(gè)重復(fù)的確認(rèn)亚再,所以發(fā)送方現(xiàn)在認(rèn)為網(wǎng)絡(luò)可能沒有出現(xiàn)擁塞,所以此時(shí)不執(zhí)行慢開始算法晨抡,而是直接令cwnd = ssthresh氛悬,從而進(jìn)入擁塞避免執(zhí)行擁塞避免算法

窗口

  • cwnd:擁塞窗口;awnd:接收方指定的發(fā)送窗口

  • 實(shí)際的發(fā)送窗口:W=min(cwnd,awnd)

TCP的四個(gè)隊(duì)列

  • receive隊(duì)列

    • 是真正的接收隊(duì)列

    • 操作系統(tǒng)收到的TCP數(shù)據(jù)包經(jīng)過檢查和處理后耘柱,就會(huì)保存到這個(gè)隊(duì)列中

  • backlog隊(duì)列

    • 是備用隊(duì)列

    • 當(dāng)用戶正在對(duì)socket進(jìn)行系統(tǒng)調(diào)用如捅,如recv時(shí),操作系統(tǒng)收到數(shù)據(jù)包時(shí)會(huì)將數(shù)據(jù)包保存到 backlog隊(duì)列中

  • prequeue隊(duì)列

    • 是預(yù)存隊(duì)列

    • 當(dāng)socket沒有正在被用戶進(jìn)程使用時(shí)调煎,也就是用戶進(jìn)程調(diào)用了read或者recv系統(tǒng)調(diào)用镜遣,但是進(jìn)入了睡眠狀態(tài)時(shí),操作系統(tǒng)直接將收到的報(bào)文保存在 prequeue中

  • out_of_order隊(duì)列

    • 是亂序隊(duì)列

    • 隊(duì)列存儲(chǔ)的是亂序的報(bào)文士袄,操作系統(tǒng)收到的報(bào)文并不是TCP準(zhǔn)備接收的下一個(gè)序號(hào)的報(bào)文悲关,則放入 out_of_order隊(duì)列

TCP接收?qǐng)?bào)文的流程

TCP粘包

  • 產(chǎn)生原因

    • 只有TCP有粘包現(xiàn)象,UDP永遠(yuǎn)不會(huì)粘包娄柳,因?yàn)門CP是基于數(shù)據(jù)流的協(xié)議寓辱,而UDP是基于數(shù)據(jù)報(bào)的協(xié)議

    • 接收方不知道消息之間的界限,不知道一次性提取多少字節(jié)的數(shù)據(jù)

    • TCP為提高傳輸效率赤拒,會(huì)根據(jù)nagel優(yōu)化算法(將數(shù)據(jù)量小的秫筏,且時(shí)間間隔較短的數(shù)據(jù)一次性發(fā)給對(duì)方)把數(shù)據(jù)合成一個(gè)TCP段后一次發(fā)送出去,這樣接收方就收到了粘包數(shù)據(jù)

  • 發(fā)生時(shí)機(jī)

    • 發(fā)送端需要等緩沖區(qū)滿才發(fā)送出去挎挖,造成粘包(發(fā)送數(shù)據(jù)時(shí)間間隔很短这敬,數(shù)據(jù)了很小,會(huì)合到一起肋乍,產(chǎn)生粘包)

    • 接收方不及時(shí)接收緩沖區(qū)的包鹅颊,造成多個(gè)包接收(客戶端發(fā)送了一段數(shù)據(jù),服務(wù)端只收了一小部分墓造,服務(wù)端下次再收的時(shí)候還是從緩沖區(qū)拿上次遺留的數(shù)據(jù)堪伍,產(chǎn)生粘包)

  • 解決方法

    • 發(fā)送定長包

    • 包尾加上\r\n標(biāo)記

    • 包頭加上包體長度

    • 使用更加復(fù)雜的應(yīng)用層協(xié)議

TCP首部

  • 固定部分:20字節(jié)

    • 源端口、目的端口

    • 序號(hào)觅闽、確認(rèn)號(hào)

    • 數(shù)據(jù)偏移:即首部長度

    • 控制位:6個(gè)保留帝雇,剩下6個(gè)是

      • URG:告訴系統(tǒng)此報(bào)文段中有緊急數(shù)據(jù),應(yīng)盡快發(fā)送

      • ACK:僅當(dāng)ACK = 1時(shí)確認(rèn)號(hào)字段才有效蛉拙;TCP規(guī)定尸闸,在連接建立后所有的傳送的報(bào)文段都必須把ACK置為1

      • PSH:在一端的應(yīng)用進(jìn)程希望在鍵入一個(gè)命令后立即就能收到對(duì)方的響應(yīng);接收方TCP收到PSH=1的報(bào)文段,就盡快地(即“推送”向前)交付接收應(yīng)用進(jìn)程吮廉。而不用再等到整個(gè)緩存都填滿了后再向上交付

      • RST:當(dāng)RST=1時(shí)苞尝,表明TCP連接中出現(xiàn)了嚴(yán)重錯(cuò)誤(如由于主機(jī)崩潰或其他原因),必須釋放連接宦芦,然后再重新建立傳輸連接宙址。RST置為1還用來拒絕一個(gè)非法的報(bào)文段或拒絕打開一個(gè)連接

      • SYN:SYN置為1就表示這是一個(gè)連接請(qǐng)求或連接接受報(bào)文

      • FIN:當(dāng)FIN=1時(shí),表明此報(bào)文段的發(fā)送發(fā)的數(shù)據(jù)已發(fā)送完畢调卑,并要求釋放運(yùn)輸連接

    • 窗口:接收窗口的大小

    • 校驗(yàn)和:偽首部抡砂、首部和數(shù)據(jù)的校驗(yàn)和

    • 緊急指針:僅在URG=1時(shí)才有意義,它指出本報(bào)文段中的緊急數(shù)據(jù)的字節(jié)數(shù)(緊急數(shù)據(jù)結(jié)束后就是普通數(shù)據(jù))恬涧;當(dāng)所有緊急數(shù)據(jù)都處理完時(shí)注益,TCP就告訴應(yīng)用程序恢復(fù)到正常操作;即使窗口為0時(shí)也可以發(fā)送緊急數(shù)據(jù)

  • 長度可變部分

    • 選項(xiàng)(長度可變)

    • 填充部分

UDP首部

  • 固定為8字節(jié)

    • 源端口溯捆、目的端口

    • UDP長度:偽首部丑搔、首部和數(shù)據(jù)的總長

    • 校驗(yàn)和:偽首部、首部和數(shù)據(jù)的校驗(yàn)和

TCP/UDP偽首部

  • 在首部前面提揍,不屬于首部

  • 長度為12字節(jié)

  • 作用:這樣的校驗(yàn)和低匙,既校驗(yàn)了TCP&UDP用戶數(shù)據(jù)的源端口號(hào)和目的端口號(hào)以及TCP&UDP用戶數(shù)據(jù)報(bào)的數(shù)據(jù)部分,又檢驗(yàn)了IP數(shù)據(jù)報(bào)的源IP地址和目的地址碳锈。偽報(bào)頭保證TCP&UDP數(shù)據(jù)單元到達(dá)正確的目的地址

  • 內(nèi)容:

    • 源IP顽冶、目的IP

    • 8位填充0

    • 協(xié)議

    • TCP/UDP長度

應(yīng)用層

web頁面請(qǐng)求過程

  • 若A沒有 IP 地址:DHCP(用的是UDP)

    • A發(fā)送DHCP請(qǐng)求報(bào)文給交換機(jī),目的IP是255.255.255.255售碳,源 IP是0.0.0.0强重;目的MAC是FF:FF:FF:FF:FF:FF,源MAC是自己的MAC

    • 交換機(jī)洪泛贸人,該局域網(wǎng)的DHCP 服務(wù)器返回IP间景、DNS服務(wù)器IP、默認(rèn)網(wǎng)關(guān)路由器的 IP 地址和子網(wǎng)掩碼

    • 交換機(jī)把報(bào)文單發(fā)給A

  • 若A的ARP緩存中沒有網(wǎng)關(guān)路由器的IP和MAC的映射:ARP

    • A發(fā)送ARP請(qǐng)求給交換機(jī)

    • 交換機(jī)洪泛艺智,網(wǎng)關(guān)路由器返回其MAC

    • 交換機(jī)把報(bào)文單發(fā)給A

  • 若瀏覽器緩存和OS緩存中沒有HTTP服務(wù)器的域名和IP的映射:DNS(用的是UDP)

    • A通過交換機(jī)發(fā)送DNS報(bào)文給網(wǎng)關(guān)路由器

    • 網(wǎng)關(guān)路由器把報(bào)文轉(zhuǎn)發(fā)給DNS服務(wù)器

    • DNS服務(wù)器在 DNS 數(shù)據(jù)庫中查找待解析的域名

      • A到本地域名服務(wù)器進(jìn)行遞歸查詢:即本地域名服務(wù)器代替它進(jìn)行查詢

      • 本地域名服務(wù)器進(jìn)行迭代查詢:先通過根域名服務(wù)器知道.com這個(gè)頂級(jí)域名服務(wù)器的IP倘要;再通過.com頂級(jí)服務(wù)器知道.baidu這個(gè)二級(jí)域名服務(wù)器的IP

    • 原路返回

    • A根據(jù)IP生成TCP套接字

  • HTTP

    • TCP三握手和HTTP服務(wù)器建立連接:端口是80

    • 瀏覽器生成 HTTP GET 報(bào)文,并交付給 HTTP 服務(wù)器

    • HTTP 服務(wù)器生成一個(gè) HTTP 響應(yīng)報(bào)文十拣,將 Web 頁面內(nèi)容放入報(bào)文主體中封拧,發(fā)回給客戶端

    • 瀏覽器收到 HTTP 響應(yīng)報(bào)文后,抽取出 Web 頁面內(nèi)容夭问,之后進(jìn)行渲染泽西,顯示 Web 頁面

  • 瀏覽器

    • 瀏覽器處理HTTP響應(yīng)報(bào)文中的主體內(nèi)容,首先使用loader模塊加載相應(yīng)的資源【loader模塊有兩條資源加載路徑:主資源加載路徑和派生資源加載路徑:主資源即google主頁的index.html文件 缰趋,派生資源即index.html文件中用到的資源】

      • 瀏覽器的Parser模塊解析主資源的內(nèi)容捧杉,生成派生資源對(duì)應(yīng)的DOM結(jié)構(gòu)

      • 后根據(jù)需求觸發(fā)派生資源的加載流程(比如陕见,在解析過程中,如果遇到img的起始標(biāo)簽味抖,會(huì)創(chuàng)建相應(yīng)的image元素HTMLImageElement评甜,接著依據(jù)img標(biāo)簽的內(nèi)容設(shè)置HTMLImageElement的屬性。在設(shè)置src屬性時(shí)仔涩,會(huì)觸發(fā)圖片資源加載蜕着,發(fā)起加載資源請(qǐng)求)【這里常見的優(yōu)化點(diǎn)是對(duì)派生資源使用緩存】

    • 構(gòu)建DOM樹(經(jīng)過了Parser模塊的處理,瀏覽器把頁面文本轉(zhuǎn)換成了一棵節(jié)點(diǎn)帶CSS Style红柱、會(huì)響應(yīng)自定義事件的Styled DOM樹)

      • 使用parse模塊解析HTML

        • 解碼:將網(wǎng)絡(luò)上接收到的經(jīng)過編碼的字節(jié)流,解碼成Unicode字符

        • 分詞:按照一定的切詞規(guī)則蓖乘,將Unicode字符流切成一個(gè)個(gè)的詞語(Tokens)

        • 解析:根據(jù)詞語的語義锤悄,創(chuàng)建相應(yīng)的節(jié)點(diǎn)(Node)

        • 建樹:將節(jié)點(diǎn)關(guān)聯(lián)到一起,創(chuàng)建DOM樹

      • 使用parse模塊解析CSS

        • 解析出一系列CSSRule嘉抒,含有CSS屬性和值的Key-Value集合

        • 進(jìn)行CSSRule的匹配過程零聚,即尋找滿足每條CSS規(guī)則Selector部分的HTML元素,然后將其Declaration聲明部分應(yīng)用于該元素

      • 使用parse模塊解析JS

        • 動(dòng)態(tài)地改變DOM樹(比如為DOM節(jié)點(diǎn)添加事件響應(yīng)處理函數(shù))些侍,即根據(jù)時(shí)間(timer)或事件(event)映射一棵DOM樹到另一棵DOM樹
    • 構(gòu)建Render樹

      • Render樹用于表示文檔的可視信息隶症,記錄了文檔中每個(gè)可視元素的布局及渲染方式

      • DOM樹上的節(jié)點(diǎn)與Render樹上的節(jié)點(diǎn)并不是一一對(duì)應(yīng)的。只有DOM樹的根節(jié)點(diǎn)及可視節(jié)點(diǎn)才會(huì)創(chuàng)建對(duì)應(yīng)的RenderObject節(jié)點(diǎn)

    • 構(gòu)建Render Layer樹

      • 以層為節(jié)點(diǎn)組織文檔的可視信息岗宣,網(wǎng)頁上的每一層對(duì)應(yīng)一個(gè)Render Layer對(duì)象

      • 每個(gè)RenderLayer樹的節(jié)點(diǎn)都對(duì)應(yīng)著一棵Render樹的子樹蚂会,這棵子樹上所有Render節(jié)點(diǎn)都在網(wǎng)頁的同一層顯示

    • 布局和渲染

      • 布局就是安排和計(jì)算頁面中每個(gè)元素大小位置等幾何信息;HTML采用流式布局模型耗式,基本的原則是頁面元素在順序遍歷過程中依次按從左至右胁住、從上至下的排列方式確定各自的位置區(qū)域

      • 渲染:將Render樹映射成可視的圖形,它會(huì)遍歷Render樹調(diào)用每個(gè)Render節(jié)點(diǎn)的繪制方法將其內(nèi)容顯示在一塊畫布或者位圖上刊咳,并最終呈現(xiàn)在瀏覽器應(yīng)用窗口中成為用戶看到的實(shí)際頁面

HTTP協(xié)議(80端口)

  • http方法

    • GET:獲取資源

    • POST:傳輸實(shí)體主體,如提交表單等

    • HEAD:獲取報(bào)文首部,主要用于確認(rèn) URL 的有效性以及資源更新的日期時(shí)間

    • OPTIONS:查詢支持的方法

    • PUT:上傳文件(由于自身不帶驗(yàn)證機(jī)制睦柴,任何人都可以上傳文件醉途,因此存在安全性問題),從客戶端向服務(wù)器傳送的數(shù)據(jù)取代指定的文檔的內(nèi)容

    • PATCH:對(duì)資源進(jìn)行部分修改(PUT 也可以用于修改資源跷坝,但是只能完全替代原始資源酵镜,PATCH 允許部分修改)

    • DELETE:刪除文件,與 PUT 功能相反柴钻,并且同樣不帶驗(yàn)證機(jī)制

    • CONNECT:要求在與代理服務(wù)器通信時(shí)建立隧道笋婿,把通信內(nèi)容加密后經(jīng)網(wǎng)絡(luò)隧道傳輸

    • TRACE:服務(wù)器會(huì)將通信路徑返回給客戶端

  • GET vs POST

    • GET用于獲取資源,POST用于傳輸實(shí)體主體顿颅,比如提交表單等

    • GET不會(huì)改變服務(wù)器存儲(chǔ)的數(shù)據(jù)缸濒,POST可能會(huì)改變服務(wù)器狀態(tài)足丢,比如上傳了表單,存儲(chǔ)到了數(shù)據(jù)庫中

    • GET的參數(shù)在URL中庇配,POST的參數(shù)在實(shí)體主體中

    • GET請(qǐng)求可被緩存斩跌、收藏、保留到歷史記錄捞慌,且其請(qǐng)求數(shù)據(jù)以明文出現(xiàn)在URL中耀鸦;POST的參數(shù)不會(huì)被保存,安全性相對(duì)較高

    • GET請(qǐng)求在URL中傳送的參數(shù)是有長度限制的啸澡,而POST沒有

    • GET產(chǎn)生一個(gè)TCP數(shù)據(jù)包袖订、POST產(chǎn)生兩個(gè)TCP數(shù)據(jù)包:對(duì)于GET方式的請(qǐng)求,瀏覽器會(huì)把http header和data一并發(fā)送出去嗅虏,服務(wù)器響應(yīng)200(返回?cái)?shù)據(jù))洛姑;而對(duì)于POST,瀏覽器先發(fā)送header皮服,服務(wù)器響應(yīng)100 continue楞艾,瀏覽器再發(fā)送data,服務(wù)器響應(yīng)200 ok(返回?cái)?shù)據(jù))

  • http狀態(tài)碼

    • 100 continue:表示到目前為止都很正常

    • 2xx 成功

      • 200 ok:請(qǐng)求成功龄广;一般用于GET與POST請(qǐng)求

      • 203 非授權(quán)信息:請(qǐng)求成功硫眯,但返回的meta信息不在原始的服務(wù)器,而是一個(gè)副本

      • 204 無內(nèi)容:服務(wù)器成功處理择同,但未返回內(nèi)容

    • 3xx 重定向

      • 301 永久移動(dòng):請(qǐng)求的資源已被永久的移動(dòng)到新URI两入,返回信息會(huì)包括新的URI,瀏覽器會(huì)自動(dòng)定向到新URI敲才,今后任何新的請(qǐng)求都應(yīng)使用新的URI代替

      • 302 臨時(shí)移動(dòng):資源只是臨時(shí)被移動(dòng)谆刨,客戶端應(yīng)繼續(xù)使用原有URI

    • 4xx 客戶端錯(cuò)誤

      • 400 請(qǐng)求報(bào)文語法錯(cuò)誤

      • 401 請(qǐng)求中缺少認(rèn)證信息

      • 403 請(qǐng)求被拒絕

      • 404 服務(wù)器無法根據(jù)客戶端的請(qǐng)求找到資源

      • 405 客戶端請(qǐng)求中的方法被禁止

    • 5xx 服務(wù)端錯(cuò)誤

      • 500 服務(wù)器內(nèi)部錯(cuò)誤,無法完成請(qǐng)求

      • 502 作為網(wǎng)關(guān)或者代理工作的服務(wù)器嘗試執(zhí)行請(qǐng)求時(shí)归斤,從遠(yuǎn)程服務(wù)器接收到了一個(gè)無效的響應(yīng)

      • 503 由于超載或系統(tǒng)維護(hù)痊夭,服務(wù)器暫時(shí)無法處理客戶端的請(qǐng)求

    • 600 源站沒有返回響應(yīng)頭部,只返回實(shí)體內(nèi)容

  • 短連接與長連接

    • 當(dāng)瀏覽器訪問一個(gè)包含多張圖片的 HTML 頁面時(shí)脏里,除了請(qǐng)求訪問的 HTML 頁面資源她我,還會(huì)請(qǐng)求圖片資源。如果每進(jìn)行一次 HTTP 通信就要新建一個(gè) TCP 連接迫横,那么開銷會(huì)很大

    • 長連接只需要建立一次 TCP 連接就能進(jìn)行多次 HTTP 通信

  • 流水線

    • 默認(rèn)情況下番舆,HTTP 請(qǐng)求是按順序發(fā)出的,下一個(gè)請(qǐng)求只有在當(dāng)前請(qǐng)求收到響應(yīng)之后才會(huì)被發(fā)出

    • 流水線是在同一條長連接上連續(xù)發(fā)出請(qǐng)求矾踱,而不用等待響應(yīng)返回

  • 各版本區(qū)別

    • 1.0 vs 1.1

      • HTTP1.1中默認(rèn)開啟長連接恨狈;HTTP1.0需要使用keep-alive參數(shù)來告知服務(wù)器端要建立一個(gè)長連接

      • 1.1節(jié)約帶寬:支持只發(fā)送header信息(不帶任何body信息),如果服務(wù)器認(rèn)為客戶端有權(quán)限請(qǐng)求服務(wù)器呛讲,則返回100禾怠,客戶端接收到100才開始把請(qǐng)求body發(fā)送到服務(wù)器返奉;如果返回401,客戶端就可以不用發(fā)送請(qǐng)求body了

      • 在HTTP1.0中認(rèn)為每臺(tái)服務(wù)器都綁定一個(gè)唯一的IP地址吗氏,因此芽偏,請(qǐng)求消息中的URL并沒有傳遞主機(jī)名(hostname),HTTP1.0沒有host域弦讽。隨著虛擬主機(jī)技術(shù)的發(fā)展污尉,在一臺(tái)物理服務(wù)器上可以存在多個(gè)虛擬主機(jī),它們共享一個(gè)IP地址往产。HTTP1.1的請(qǐng)求消息和響應(yīng)消息都支持host域被碗,且請(qǐng)求消息中如果沒有host域會(huì)報(bào)告一個(gè)錯(cuò)誤(400 Bad Request)

      • 1.1中新增了24個(gè)錯(cuò)誤狀態(tài)響應(yīng)碼,如409(Conflict)表示請(qǐng)求的資源與資源的當(dāng)前狀態(tài)發(fā)生沖突仿村;410(Gone)表示服務(wù)器上的某個(gè)資源被永久性的刪除

    • 1.1 vs 2.0

      • HTTP2.0使用了多路復(fù)用的技術(shù)锐朴,做到同一個(gè)連接并發(fā)處理多個(gè)請(qǐng)求(原長連接是同一連接串行處理多個(gè)請(qǐng)求:請(qǐng)求1-回復(fù)1-請(qǐng)求2-回復(fù)2...)

      • HTTP2.0使用HPACK算法對(duì)header的數(shù)據(jù)進(jìn)行壓縮,這樣數(shù)據(jù)體積小了

      • 2.0允許服務(wù)器在客戶端未請(qǐng)求時(shí)推送數(shù)據(jù)給客戶端奠宜;這樣客戶端可以直接從本地加載這些資源,不用再通過網(wǎng)絡(luò)

  • HTTP請(qǐng)求報(bào)文格式

    • 請(qǐng)求行:方法瞻想、協(xié)議版本压真、URL(包括參數(shù)信息)

    • 請(qǐng)求頭部:是一個(gè)個(gè)的key-value值,包括瀏覽器類型蘑险,客戶端支持的數(shù)據(jù)格式滴肿,主機(jī)名等

    • 空行:表示header和請(qǐng)求數(shù)據(jù)的分隔

    • 請(qǐng)求數(shù)據(jù):GET方法沒有攜帶數(shù)據(jù), POST方法攜帶一個(gè)body

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

    • 狀態(tài)行:狀態(tài)碼佃迄、協(xié)議版本

    • 消息報(bào)頭:時(shí)間戳泼差、使用的字符集、正文的長度呵俏、最后修改時(shí)間堆缘、媒體格式類型(html、圖片普碎、json吼肥、pdf等)等

    • 空行:分割消息報(bào)頭和響應(yīng)正文

    • 響應(yīng)正文

  • HTTP特點(diǎn)

    • 無狀態(tài):http服務(wù)器并不保存關(guān)于客戶的任何信息,HTTP/1.1 引入 Cookie 來保存狀態(tài)信息

    • 無連接:無連接的含義是限制每次連接只處理一個(gè)請(qǐng)求麻车。服務(wù)器處理完客戶的請(qǐng)求缀皱,并收到客戶的應(yīng)答后,即斷開連接动猬;HTTP的短連接和長連接是指TCP的短連接和長連接啤斗,從HTTP角度看其實(shí)是無連接的

HTTPS協(xié)議(443端口)

  • 作用:解決了http的安全問題

    • http使用明文進(jìn)行通信,內(nèi)容可能會(huì)被竊聽赁咙;https則是加密通信

    • http不驗(yàn)證通信方的身份钮莲,通信方的身份有可能遭遇偽裝免钻;https則有身份驗(yàn)證

    • http無法證明報(bào)文的完整性,報(bào)文有可能遭篡改臂痕;https有報(bào)文摘要

  • 本質(zhì)

    • HTTPS 并不是新協(xié)議伯襟,而是讓 HTTP 先和 SSL(Secure Sockets Layer)通信協(xié)商加密使用的對(duì)稱加密密鑰,再由 SSL 和 TCP 通信

    • https采用混合加密:使用非對(duì)稱密鑰加密方式握童,傳輸對(duì)稱密鑰加密方式所需要的 Secret Key姆怪,從而保證安全性;獲取到 Secret Key 后澡绩,再使用對(duì)稱密鑰加密方式進(jìn)行通信稽揭,從而保證效率

  • 對(duì)稱加密 vs 非對(duì)稱加密

    • 對(duì)稱密鑰加密:

      • 加密和解密使用同一密鑰

      • AES:設(shè)AES加密函數(shù)為E,則 C = E(K, P),其中P為明文肥卡,K為密鑰溪掀,C為密文;設(shè)AES解密函數(shù)為D步鉴,則 P = D(K, C),其中C為密文揪胃,K為密鑰,P為明文氛琢;AES為分組密碼喊递,分組密碼也就是把明文分成一組一組的,每組長度相等阳似,每次加密一組數(shù)據(jù)骚勘,直到加密完整個(gè)明文

    • 非對(duì)稱密鑰加密:

      • 通信發(fā)送方獲得接收方的公開密鑰之后,就可以使用公開密鑰進(jìn)行加密撮奏,接收方收到通信內(nèi)容后使用私有密鑰解密

      • 通信發(fā)送方使用其私有密鑰進(jìn)行簽名俏讹,通信接收方使用發(fā)送方的公開密鑰對(duì)簽名進(jìn)行解密,就能判斷這個(gè)簽名是否正確

      • RSA加密通過生成密文【密文=明文^e mod N】畜吊,其中(N泽疆,e)是您的公鑰,解密通過【明文=密文^d mod N】其中(N玲献,d)是私鑰

    • 為什么RSA(非對(duì)稱加密)比AES(對(duì)稱加密)慢

      • RSA主要慢在解密過程于微,因?yàn)樗借€很長

      • RSA有冪模運(yùn)算,AES主要是異或青自、移位等運(yùn)算

  • 數(shù)字證書

    • 數(shù)字證書認(rèn)證機(jī)構(gòu)(CA株依,Certificate Authority)是客戶端與服務(wù)器雙方都可信賴的第三方機(jī)構(gòu)

    • 服務(wù)器的運(yùn)營人員向 CA 提出公開密鑰的申請(qǐng),CA 在判明提出申請(qǐng)者的身份之后延窜,會(huì)對(duì)用自己的私鑰已申請(qǐng)的公開密鑰做數(shù)字簽名恋腕,做成證書

    • 進(jìn)行 HTTPS 通信時(shí),服務(wù)器會(huì)把證書發(fā)送給客戶端逆瑞≤伲客戶端取得其中的公開密鑰之后伙单,用CA的公鑰對(duì)數(shù)字簽名進(jìn)行驗(yàn)證,如果驗(yàn)證通過哈肖,就可以開始通信了

  • SSL握手過程

    • 客戶端向服務(wù)端發(fā)送:隨機(jī)數(shù)A吻育;支持的加密算法與摘要算法

    • 服務(wù)端向客戶端發(fā)送:選擇的加密算法與摘要算法;數(shù)字證書(含服務(wù)端的公鑰)淤井;隨機(jī)數(shù)B

    • 客戶端驗(yàn)證服務(wù)器的合法性:用CA的公鑰解開數(shù)字證書進(jìn)行驗(yàn)證布疼,并得到服務(wù)端公鑰

    • 客戶端向服務(wù)端發(fā)送:用服務(wù)端公鑰加密的隨機(jī)數(shù)C(并且計(jì)算出對(duì)稱加密的公鑰K=f(A,B,C))

    • 服務(wù)端接收到信息后,用自己的私鑰解密得到C币狠,并且計(jì)算出對(duì)稱加密的公鑰K=f(A,B,C)

  • 報(bào)文摘要

    • 發(fā)送方:用哈希函數(shù)將報(bào)文明文生成報(bào)文摘要游两;將摘要用私鑰加密;同時(shí)發(fā)送明文和加密后的摘要

    • 接收方:用哈希函數(shù)將報(bào)文明文生成報(bào)文摘要1漩绵;用公鑰將摘要解密贱案,獲取摘要2;比較摘要1和2

  • http如何轉(zhuǎn)為https

    • 302 跳轉(zhuǎn)

      • 服務(wù)端把所有的 HTTP 流量跳轉(zhuǎn)到 HTTPS 上

      • 有安全漏洞:第一次訪問站點(diǎn)的時(shí)候如果是 HTTP 就有可能被中間人劫持止吐,很可能都沒到 302 跳轉(zhuǎn)的時(shí)候就被劫持了

    • HSTS機(jī)制

      • 支持 HSTS 的服務(wù)端宝踪,可以強(qiáng)制訪問它的瀏覽器使用 HTTPS 協(xié)議

      • 用戶的瀏覽器一旦得到了 HSTS 的信息,下次再訪問站點(diǎn)的時(shí)候客戶端瀏覽器就會(huì)強(qiáng)制使用 HTTPS

      • 這樣就解釋了為什么我們使用主流瀏覽器輸入網(wǎng)站域名的時(shí)候碍扔,都會(huì)自動(dòng)跳轉(zhuǎn)到 HTTPS 了:因?yàn)槲覀冊(cè)L問的大多是主流的大網(wǎng)站

      • 缺點(diǎn)

        • 假如用戶的瀏覽器從未訪問過這個(gè)站點(diǎn)瘩燥,這個(gè)時(shí)候依然會(huì)有被劫持風(fēng)險(xiǎn)

        • 如果你的站點(diǎn)的 HTTPS 服務(wù)沒有完全準(zhǔn)備好,不要輕易的開啟 HSTS 響應(yīng)頭蕴忆。因?yàn)橐坏g覽器得到這個(gè)響應(yīng)頭颤芬,就會(huì)在規(guī)定的 max-age 的時(shí)間段內(nèi)強(qiáng)制使用 HTTPS 訪問悲幅,如果你的服務(wù)沒準(zhǔn)備好套鹅,用戶就會(huì)一直訪問失敗,并且不能降級(jí)

RIP協(xié)議

  • 應(yīng)用層協(xié)議

  • 每個(gè)路由器維護(hù)一張表汰具,記錄該路由器到其它網(wǎng)絡(luò)的”跳數(shù)“卓鹿,路由器到與其直接連接的網(wǎng)絡(luò)的跳數(shù)是1,每多經(jīng)過一個(gè)路由器跳數(shù)就加1留荔;更新該表時(shí)和相鄰路由器交換路由信息吟孙;路由器允許一個(gè)路徑最多包含15個(gè)路由器,如果跳數(shù)為16聚蝶,則不可達(dá)杰妓。交付數(shù)據(jù)報(bào)時(shí)優(yōu)先選取距離最短的路徑

一些常用端口

  • FTP(21端口):文件傳輸協(xié)議

  • SSH(22端口):遠(yuǎn)程登陸

  • DNS(53端口):域名解析

  • HTTP 80

  • HTTPS 443

接口限流

計(jì)數(shù)器算法

  • 限制一秒鐘的能夠通過的請(qǐng)求數(shù),比如限流qps為100碘勉,算法的實(shí)現(xiàn)思路就是從第一個(gè)請(qǐng)求進(jìn)來開始計(jì)時(shí)巷挥,在接下去的1s內(nèi),每來一個(gè)請(qǐng)求验靡,就把計(jì)數(shù)加1倍宾,如果累加的數(shù)字達(dá)到了100雏节,那么后續(xù)的請(qǐng)求就會(huì)被全部拒絕

  • 有一個(gè)弊端:如果我在單位時(shí)間1s內(nèi)的前10ms,已經(jīng)通過了100個(gè)請(qǐng)求高职,那后面的990ms钩乍,只能眼巴巴的把請(qǐng)求拒絕,我們把這種現(xiàn)象稱為“突刺現(xiàn)象”

漏桶算法

  • 處理的速度是固定的怔锌,請(qǐng)求進(jìn)來的速度是未知的寥粹,可能突然進(jìn)來很多請(qǐng)求,沒來得及處理的請(qǐng)求就先放在桶里产禾,既然是個(gè)桶排作,肯定是有容量上限,如果桶滿了亚情,那么新進(jìn)來的請(qǐng)求就丟棄

  • 在算法實(shí)現(xiàn)方面妄痪,可以準(zhǔn)備一個(gè)隊(duì)列,用來保存請(qǐng)求楞件,另外通過一個(gè)線程池定期從隊(duì)列中獲取請(qǐng)求并執(zhí)行衫生,可以一次性獲取多個(gè)并發(fā)執(zhí)行

  • 存在弊端:無法應(yīng)對(duì)短時(shí)間的突發(fā)流量

令牌桶算法

  • 存在一個(gè)桶,用來存放固定數(shù)量的令牌土浸。算法中存在一種機(jī)制罪针,以一定的速率往桶中放令牌。每次請(qǐng)求調(diào)用需要先獲取令牌黄伊,只有拿到令牌泪酱,才有機(jī)會(huì)繼續(xù)執(zhí)行,否則選擇選擇等待可用的令牌还最、或者直接拒絕

  • 如果桶中令牌數(shù)達(dá)到上限墓阀,就丟棄令牌

  • 可以準(zhǔn)備一個(gè)隊(duì)列,用來保存令牌拓轻,另外通過一個(gè)線程池定期生成令牌放到隊(duì)列中斯撮,每來一個(gè)請(qǐng)求,就從隊(duì)列中獲取一個(gè)令牌扶叉,并繼續(xù)執(zhí)行

網(wǎng)絡(luò)攻擊

DNS劫持

  • 現(xiàn)象:輸入的網(wǎng)址是 http://www.google.com勿锅,出來的是百度的頁面

  • 解決方法:修改DNS服務(wù)器為一個(gè)更可靠的服務(wù)器;在host文件中記錄域名到ip的映射

HTTP劫持

  • 現(xiàn)象:打開一個(gè)頁面枣氧,右下角彈出廣告

  • 解決方法:https(加密+認(rèn)證+報(bào)文摘要)

SSL劫持

  • 過程:攻擊者將自己偽裝成客戶端溢十,獲取到服務(wù)器真實(shí)有效的 CA 證書(非對(duì)稱加密的公鑰);將自己偽裝成服務(wù)器达吞,獲取到客戶端的之后通信的密鑰(對(duì)稱加密的密鑰)张弛;有了證書和密鑰就可以監(jiān)聽之后通信的內(nèi)容了

  • 解決方法:客戶端不要輕易信任證書;提前預(yù)埋證書在本地

SSL剝離

  • 過程:攻擊者利用用戶對(duì)于地址欄中HTTPS與HTTP的疏忽,將所有的HTTPS連接都用HTTP來代替乌庶;同時(shí)种蝶,與目標(biāo)服務(wù)器建立正常的HTTPS連接,受攻擊客戶端與原始請(qǐng)求服務(wù)器之間的全部通信經(jīng)過了攻擊者的轉(zhuǎn)發(fā)

  • 解決方法:客戶端使用https瞒大;使用HSTS機(jī)制

SYN洪泛攻擊

  • 過程:攻擊者發(fā)送大量TCP SYN報(bào)文段螃征,而不完成第三次握手,服務(wù)器不斷為這些半開連接分配資源(TCP每建立一個(gè)連接都要分配資源:一些變量透敌、發(fā)送/接收緩存等)盯滚,導(dǎo)致服務(wù)器的連接資源被耗盡

  • 解決方法:

    • 服務(wù)器接收到SYN報(bào)文段時(shí),不會(huì)建立半開連接酗电,而是生成一個(gè)初始TCP序列號(hào)x魄藕,并發(fā)送以x為序列號(hào)的SYNACK分組

    • 只有收到確認(rèn)號(hào)為x+1的ACK報(bào)文段,才會(huì)建立全連接(即完成了三次握手)

ARP欺騙

  • 過程:攻擊者發(fā)送ARP包撵术,其中IP地址到MAC地址的映射是錯(cuò)誤的

  • 解決方法:把映射寫死

反向代理 vs 正向代理

正向代理

  • 客戶端代理背率,服務(wù)端不知道實(shí)際發(fā)起請(qǐng)求的客戶端

  • 比如我們國內(nèi)訪問谷歌,直接訪問訪問不到嫩与,我們可以通過一個(gè)正向代理服務(wù)器寝姿,請(qǐng)求發(fā)到代理,代理服務(wù)器能夠訪問谷歌划滋,這樣由代理去谷歌取到返回?cái)?shù)據(jù)饵筑,再返回給我們,這樣我們就能訪問谷歌了

  • 條件GET請(qǐng)求

    • 為避免代理服務(wù)器中存的數(shù)據(jù)已過期处坪,web緩存器(即代理服務(wù)器)每次都會(huì)向源服務(wù)器發(fā)送條件GET請(qǐng)求(在請(qǐng)求報(bào)文中有if-modified-since)根资,僅當(dāng)自指定日期之后該對(duì)象被修改過,源服務(wù)器才會(huì)發(fā)送該對(duì)象給web緩存器
  • 作用

    • 訪問原來無法訪問的資源

    • 可以做緩存同窘,加速訪問資源

    • 對(duì)客戶端訪問授權(quán)玄帕,上網(wǎng)進(jìn)行認(rèn)證

    • 代理可以記錄用戶訪問記錄(上網(wǎng)行為管理),對(duì)外隱藏用戶信息

反向代理

  • 以代理服務(wù)器來接受internet上的連接請(qǐng)求塞椎,然后將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器桨仿,并將從服務(wù)器上得到的結(jié)果返回給internet上請(qǐng)求連接的客戶端睛低,此時(shí)代理服務(wù)器對(duì)外就表現(xiàn)為一個(gè)服務(wù)器

  • 服務(wù)端代理案狠,客戶端不知道實(shí)際提供服務(wù)的服務(wù)端

  • 作用

    • 保證內(nèi)網(wǎng)的安全,阻止web攻擊钱雷,大型網(wǎng)站骂铁,通常將反向代理作為公網(wǎng)訪問地址,Web服務(wù)器是內(nèi)網(wǎng)

    • 負(fù)載均衡罩抗,通過反向代理服務(wù)器來優(yōu)化網(wǎng)站的負(fù)載

MSS vs MTU

MSS

  • 最大報(bào)文段長度

  • TCP可從緩存中取出并放入報(bào)文段中的最大數(shù)據(jù)數(shù)量

  • MSS<=MTU-TCP首部長度(因?yàn)橐WC一個(gè)TCP報(bào)文段可以裝進(jìn)幀中)

MTU

  • 最大傳輸單元

  • 最大鏈路層幀長度

斷點(diǎn)續(xù)傳

含義

將一個(gè)文件按照一定的規(guī)則人為的分割成多個(gè)小文件拉庵,然后客戶端每次只上傳一個(gè)小文件(當(dāng)然我們也可以利用多線程技術(shù)每次上傳多個(gè)小文件),服務(wù)器接收到上傳過來的小文件后根據(jù)一定的規(guī)則來組合這些小文件套蒂。如果在上傳過程中出現(xiàn)網(wǎng)絡(luò)中斷等意外情況钞支,下次再次上傳時(shí)可以從已經(jīng)上傳的部分繼續(xù)上傳茫蛹,而不是重新上傳

實(shí)現(xiàn)

  • 在 http報(bào)文頭部 里添加兩個(gè)參數(shù):客戶端請(qǐng)求時(shí)發(fā)送的 Range 和服務(wù)器返回信息時(shí)返回的 Content-Range,Range 用于指定第一個(gè)字節(jié)和最后一個(gè)字節(jié)的位置

  • http響應(yīng)狀態(tài)行會(huì)有“partial content”字樣

  • 如果在客戶端請(qǐng)求報(bào)文頭中烁挟,對(duì) Range 填入了錯(cuò)誤的范圍值婴洼,服務(wù)器會(huì)返回 416 狀態(tài)碼

如何判斷服務(wù)器是否支持?jǐn)帱c(diǎn)續(xù)傳

  • 判斷服務(wù)端是否只 HTTP/1.1 及以上版本,如果是則支持?jǐn)帱c(diǎn)續(xù)傳撼嗓,如果不是則不支持

  • 服務(wù)端返回響應(yīng)的頭部是否包含 Access-Ranges 柬采,且參數(shù)內(nèi)容是 bytes

當(dāng)服務(wù)器端的文件發(fā)生改變時(shí),客戶端再次向服務(wù)端發(fā)送斷點(diǎn)續(xù)傳請(qǐng)求且警,如何處理

  • 法一:最后修改時(shí)間

    • 先前服務(wù)器發(fā)送給了客戶端一個(gè) Last-Modified 時(shí)間

    • 客戶端把這個(gè)時(shí)間 寫入if-Modified-Since粉捻,發(fā)給服務(wù)器

    • 服務(wù)器進(jìn)行最后修改時(shí)間驗(yàn)證后,告知客戶端是否需要重新從服務(wù)器端獲取新內(nèi)容

    • 服務(wù)器返回狀態(tài)碼 206 代表不需要重新獲取接著下載就行斑芜,200代表需要重新獲取

  • 法二:版本號(hào)

    • 法一存在的問題

      • 某些文件只是修改了修改時(shí)間而內(nèi)容卻沒變肩刃,這時(shí)我們并不希望客戶端重新緩存這些文件

      • 某些文件修改頻繁,有時(shí)一秒要修改十幾次杏头,但是 if-Modified-Since 是秒級(jí)的

      • 部分服務(wù)器無法獲得精確的修改時(shí)間

    • 使用etag:文件版本號(hào)

    • 如果etag沒有發(fā)生改變服務(wù)器將向客戶端發(fā)送剩余的部分树酪,否則發(fā)送全部

秒傳

將文件的MD5發(fā)送給服務(wù)器,服務(wù)器根據(jù)傳輸過來的MD5判斷服務(wù)器上是否存在相同類型的文件大州,如果存在就將文件復(fù)制一份续语,而不是本地上傳

服務(wù)端如何處理多個(gè)客戶端的socket

每有一個(gè)Socket請(qǐng)求的時(shí)候,就從線程池中取一個(gè)線程來處理這個(gè)請(qǐng)求

線程池的好處

  • 線程復(fù)用厦画,創(chuàng)建線程耗時(shí)疮茄,回收線程慢

  • 防止短時(shí)間內(nèi)高并發(fā),指定線程池大小根暑,超過數(shù)量將等待力试,方式短時(shí)間創(chuàng)建大量線程導(dǎo)致資源耗盡,服務(wù)掛掉

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末排嫌,一起剝皮案震驚了整個(gè)濱河市畸裳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌淳地,老刑警劉巖怖糊,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異颇象,居然都是意外死亡伍伤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門遣钳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扰魂,“玉大人,你說我怎么就攤上這事∪捌溃” “怎么了姐直?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蒋畜。 經(jīng)常有香客問我简肴,道長,這世上最難降的妖魔是什么百侧? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任砰识,我火速辦了婚禮,結(jié)果婚禮上佣渴,老公的妹妹穿的比我還像新娘辫狼。我一直安慰自己,他們只是感情好辛润,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布膨处。 她就那樣靜靜地躺著,像睡著了一般砂竖。 火紅的嫁衣襯著肌膚如雪真椿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天乎澄,我揣著相機(jī)與錄音突硝,去河邊找鬼解恰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛裤园,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播积蔚,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼夭委,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼逐抑!你這毒婦竟也來了玄括?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤糠惫,失蹤者是張志新(化名)和其女友劉穎疫剃,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硼讽,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡巢价,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了固阁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壤躲。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖备燃,靈堂內(nèi)的尸體忽然破棺而出柒爵,到底是詐尸還是另有隱情,我是刑警寧澤赚爵,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布棉胀,位于F島的核電站,受9級(jí)特大地震影響冀膝,放射性物質(zhì)發(fā)生泄漏唁奢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一窝剖、第九天 我趴在偏房一處隱蔽的房頂上張望麻掸。 院中可真熱鬧,春花似錦赐纱、人聲如沸脊奋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诚隙。三九已至,卻和暖如春起胰,著一層夾襖步出監(jiān)牢的瞬間久又,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國打工效五, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留地消,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓畏妖,卻偏偏與公主長得像脉执,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子戒劫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348