計(jì)算機(jī)網(wǎng)絡(luò)不權(quán)威總結(jié)
歡迎閱讀
對(duì)于程序員平窘,網(wǎng)絡(luò)方面的知識(shí)是必不可少的,本文為大家梳理計(jì)算機(jī)網(wǎng)絡(luò)方面的主要知識(shí)體系签孔,淺嘗輒止叉讥,可以作為一個(gè)知識(shí)的索引,有需要的同學(xué)可以通過附上的文章更深入學(xué)習(xí)饥追。必有疏漏錯(cuò)誤的地方图仓,歡迎大家指出分享
網(wǎng)絡(luò)模型
可以說整個(gè)計(jì)算機(jī)網(wǎng)絡(luò)都是圍繞以下這個(gè)五層模型進(jìn)行構(gòu)建的
- 應(yīng)用層,HTTP但绕、SMTP救崔、FTP、DNS捏顺,應(yīng)用之間數(shù)據(jù)交換六孵,報(bào)文
- 傳輸層,TCP幅骄、UDP劫窒,在不穩(wěn)定的網(wǎng)絡(luò)基礎(chǔ)上實(shí)現(xiàn)可控(穩(wěn)定)網(wǎng)絡(luò)傳輸,報(bào)文段
- 網(wǎng)絡(luò)層拆座,IP主巍、DHCP、NAT挪凑,劃分孕索、定位網(wǎng)絡(luò),實(shí)現(xiàn)數(shù)據(jù)跨網(wǎng)絡(luò)傳輸岖赋;構(gòu)建路由表檬果,轉(zhuǎn)發(fā)數(shù)據(jù)報(bào),數(shù)據(jù)報(bào)
- 鏈路層唐断,ARP选脊、RARP、RIP脸甘,信道調(diào)度恳啥,幀
- 物理層,利用各種介質(zhì)(雙絞銅線丹诀、光纖钝的、電磁波)實(shí)現(xiàn)0、1數(shù)據(jù)的真實(shí)傳輸铆遭,位
始終不要忘記硝桩,網(wǎng)絡(luò)的目的是為了實(shí)現(xiàn)遠(yuǎn)程終端之間應(yīng)用的信息共享
,也就是應(yīng)用層的目的枚荣。由此出發(fā)碗脊,自上而下來分析,這個(gè)模型就很合情合理了橄妆,甚至可以理解為當(dāng)時(shí)的最優(yōu)可行解
這樣的層級(jí)劃分衙伶,可以讓每一層需要實(shí)現(xiàn)的功能都簡單直接祈坠。首先對(duì)網(wǎng)絡(luò)模型有個(gè)總體的了解,至于各層的細(xì)節(jié)矢劲,比如終端中包含了很多應(yīng)用赦拘,如何區(qū)分?IP地址即將耗盡芬沉,如何最大效率的分配躺同?一些企業(yè)的私有網(wǎng)絡(luò)又是如何和因特網(wǎng)對(duì)接的?將會(huì)在之后陸續(xù)進(jìn)行總結(jié)
網(wǎng)絡(luò)接入
說了這么多花嘶,好像所有都是免費(fèi)的啊笋籽,除了自己買根網(wǎng)線蹦漠。那我們的網(wǎng)費(fèi)都交給誰了椭员?
我們的網(wǎng)費(fèi)都交給各級(jí)網(wǎng)絡(luò)提供商了(ISP)。各大洲之間會(huì)有海底光纜進(jìn)行互聯(lián)笛园,然后各個(gè)國家又有自己的主網(wǎng)絡(luò)節(jié)點(diǎn)隘击,然后各個(gè)地區(qū)都有ISP的節(jié)點(diǎn),這些節(jié)點(diǎn)將散落在各個(gè)社區(qū)的住戶接入了互聯(lián)網(wǎng)
另外值得一提的是谷歌由于財(cái)大氣粗和出于安全考慮研铆,自己完成了網(wǎng)絡(luò)的接入埋同,在各個(gè)國家建立了自己的節(jié)點(diǎn),儼然一個(gè)小型ISP
網(wǎng)絡(luò)安全
深入了解網(wǎng)絡(luò)模型后棵红,你會(huì)發(fā)現(xiàn)這里面有很多地方都是基于相信各個(gè)終端是不會(huì)作惡的(這主要是由于網(wǎng)絡(luò)最初的建立便是基于“一群相互信任的用戶連接到一個(gè)透明的網(wǎng)絡(luò)上”)凶赁,但現(xiàn)實(shí)中這幾乎是不可能的,所以網(wǎng)絡(luò)攻擊手段層出不窮
比如網(wǎng)絡(luò)嗅探
逆甜,本來一些終端是應(yīng)該忽略掉不是發(fā)給他的信息的虱肄,就比如學(xué)校傳達(dá)室里的信件,誰都能夠接觸到交煞,但應(yīng)該又收信人查看咏窿,網(wǎng)絡(luò)嗅探就是在窺伺別人的隱私
又比如IP哄騙
,快遞員把郵件送到了你們的合租房素征,本來是你室友的東西集嵌,但你冒充了他,哄騙了快遞員御毅,將數(shù)據(jù)交付給了你
另一個(gè)臭名昭著的是拒絕服務(wù)攻擊(DoS)
根欧,不斷的對(duì)網(wǎng)絡(luò)服務(wù)發(fā)起請求,直到其癱瘓為止端蛆,后來又演變?yōu)?code>分布式的拒絕服務(wù)攻擊(DDoS)凤粗,消耗服務(wù)器資源的方式也層出不窮,最簡單即暴力請求欺税,復(fù)雜點(diǎn)的如利用TCP協(xié)議的一些特性侈沪,發(fā)送一些特制的報(bào)文揭璃,延長服務(wù)器的處理時(shí)間,消耗有限資源
應(yīng)用層
網(wǎng)絡(luò)應(yīng)用是計(jì)算機(jī)網(wǎng)絡(luò)存在的的理由
亭罪,所以上至TCP/IP協(xié)議棧瘦馍,下至雙絞銅線和光纖,都是為實(shí)現(xiàn)網(wǎng)絡(luò)應(yīng)用提供各種服務(wù)
但是由于良好的分層模型应役,應(yīng)用層協(xié)議已經(jīng)高度抽象情组,程序員只需要關(guān)注應(yīng)用之間的數(shù)據(jù)交互,其他的基本是透明的箩祥,大大降低了軟件開發(fā)復(fù)雜度
網(wǎng)絡(luò)應(yīng)用常見的體系機(jī)構(gòu)有兩種
- Client/Server院崇,即客戶機(jī)/服務(wù)器體系結(jié)構(gòu),該體系結(jié)構(gòu)包含一個(gè)始終運(yùn)行著提供服務(wù)的
服務(wù)器
袍祖,以及分布在各個(gè)用戶那里的客戶機(jī)
- P2P底瓣,該體系結(jié)構(gòu)很少依賴服務(wù)器,主要利用網(wǎng)絡(luò)中互相平等的主機(jī)提供服務(wù)蕉陋,著名的Skype捐凭、BT均便是該體系結(jié)構(gòu)
HTTP
超文本傳輸協(xié)議(HyperText Transfer Protocol),它是web的核心凳鬓。使用TCP作為它的支撐運(yùn)輸層協(xié)議茁肠。是一個(gè)無狀態(tài)
協(xié)議
HTTP請求報(bào)文格式
請求報(bào)文第一行是請求行(request line),后續(xù)為首部行(header line)
請求行中請求方法一般為POST缩举、GET垦梆、PUT、DELETE仅孩,協(xié)議版本類似HTTP/1.1
HTTP響應(yīng)報(bào)文格式
一些常見的響應(yīng)碼
- 200 ok 請求成功
- 301 moved permanently 請求的對(duì)象已經(jīng)被永久轉(zhuǎn)移了
- 400 bad request 一個(gè)通用差錯(cuò)代碼托猩,該請求服務(wù)器無法理解
- 404 not found 被請求的文檔不在服務(wù)器
- 500 server error 服務(wù)器錯(cuò)誤
- 505 http version is not supported 當(dāng)前http版本不被支持
Header
請求報(bào)文和響應(yīng)報(bào)文中都包含一些頭部說明標(biāo)識(shí),用以對(duì)交互附加說明杠氢,比如
- Data站刑,報(bào)文的構(gòu)建時(shí)間,通用鼻百,如Thu 03 Jan 2019 12:23
- Accept绞旅,客戶端接收的數(shù)據(jù)類型,請求報(bào)文温艇,如text/html application/xml
- Content-Type因悲,報(bào)文body部分的數(shù)據(jù)類型,通用勺爱,如text/plain; charset=utf-8
Cookie
cookie是存儲(chǔ)在客戶端的一個(gè)小文件晃琳,是對(duì)Http無狀態(tài)的補(bǔ)充,方便在不同請求之間同步數(shù)據(jù)。Http協(xié)議在響應(yīng)報(bào)文中聲明要設(shè)置的cookie的名稱卫旱、值與過期時(shí)間人灼。客戶端在每次請求時(shí)都會(huì)自動(dòng)帶上該請求同域名的cookie
由于cookie存儲(chǔ)在客戶端且有大小限制顾翼,不適合存儲(chǔ)敏感信息投放,只可以用了存儲(chǔ)一些短暫的會(huì)話id或者默認(rèn)賬號(hào)等
緩存
Http協(xié)議包含緩存機(jī)制,可以將一些不常變的資源設(shè)置緩存時(shí)間或簡單策略适贸。但由于緩存機(jī)制比較簡單灸芳,而且目前web 2.0,http交互大部分都是業(yè)務(wù)請求拜姿,緩存基本由服務(wù)端處理
keep-alive
Http協(xié)議是無狀態(tài)的烙样,并且大部分都是短請求,所以需要頻繁建立斷開tcp連接蕊肥,既消耗資源也浪費(fèi)時(shí)間谒获。客戶端和服務(wù)端任何一方都可以在http交互中添加keep-alive標(biāo)記晴埂,這樣底層的tcp連接便不會(huì)斷開究反,一個(gè)連接中可以完成多次http請求
HTTPS
由于HTTP協(xié)議是明文傳輸,所以經(jīng)常發(fā)生數(shù)據(jù)泄露儒洛、劫持、篡改狼速,HTTPS便是在HTTP協(xié)議基礎(chǔ)上實(shí)現(xiàn)了加密琅锻,大致原理為:
- 客戶端訪問服務(wù)端,獲取其證書向胡,瀏覽器解析證書中包含的服務(wù)端公鑰
- 客戶端使用服務(wù)端的公鑰加密自己的公鑰恼蓬,然后發(fā)送給服務(wù)端
- 服務(wù)端用私鑰解密后,拿到客戶端的公鑰僵芹,然后使用其對(duì)數(shù)據(jù)進(jìn)行加密处硬,至此完成信道的加密
- 客戶端收到數(shù)據(jù)后用自己的私鑰解密
公鑰 私鑰
非對(duì)稱可逆加密,即加密的數(shù)據(jù)可進(jìn)行解密拇派,而且加密和解密使用的key不同荷辕。對(duì)外暴露的key叫做公鑰,自己保留的是私鑰
證書
證書服務(wù)端向第三方機(jī)構(gòu)申請的件豌,記錄了其公鑰疮方。如何防止證書造假:
- 證書是使用該機(jī)構(gòu)的私鑰加密的,只有該機(jī)構(gòu)的公鑰才能正確解密茧彤,獲取證書內(nèi)容
- 而主要瀏覽器都會(huì)內(nèi)置知名第三方機(jī)構(gòu)的公鑰骡显,如果發(fā)現(xiàn)不認(rèn)識(shí)的證書會(huì)發(fā)出警告
DNS
客戶端請求服務(wù)時(shí)需要通過ip地址定位服務(wù)器所在,但106.75.17.181這樣的ip實(shí)在難以記憶,最初的方案很簡單惫谤,就是在操作系統(tǒng)中維護(hù)一個(gè)hosts文件壁顶,記錄了域名和ip的對(duì)應(yīng)關(guān)系,但是隨著互聯(lián)網(wǎng)越來越大溜歪,hosts文件已經(jīng)不能滿足需求
DNS(domain name system)域名系統(tǒng)便是為了解決這一問題博助。基于UDP協(xié)議(運(yùn)行在53端口)痹愚,在全世界各地部署了大量DNS服務(wù)器用于提供域名與ip對(duì)應(yīng)關(guān)系解析服務(wù)富岳。這里簡單舉一個(gè)例子,比如我們要訪問www.liufuxin.cn.org
- 首先會(huì)請求操作系統(tǒng)默認(rèn)的dns服務(wù)器拯腮,這個(gè)也可以修改我們信任的權(quán)威服務(wù)器窖式,如谷歌的8.8.8.8
- 如果本地dns服務(wù)器沒有記錄,則請求根域名服務(wù)器动壤,根域名服務(wù)器告訴你org頂級(jí)域名應(yīng)該訪問另外一個(gè)服務(wù)器
- org的頂級(jí)域名服務(wù)器萝喘,告訴了我cn域名的服務(wù)器
- cn域名服務(wù)器告訴了該域名的ip地址
- 本地dns服務(wù)器會(huì)緩存這個(gè)結(jié)果
DNS同時(shí)也可以提供負(fù)載均衡服務(wù),即同一個(gè)域名琼懊,依據(jù)策略返回不同的ip地址均衡負(fù)載
延伸
全方位深入理解DNS
P2P
P2P是除了服務(wù)器-客戶端之外另一種重要的網(wǎng)絡(luò)體系阁簸,是在網(wǎng)絡(luò)中互相對(duì)等的兩個(gè)終端之間進(jìn)行通信,常見的應(yīng)用為文件分發(fā)
哼丈,即著名的BitTorrent協(xié)議启妹;另一種是在對(duì)等方中組織并搜索信息;第三種是Skype醉旦,一個(gè)成功的P2P因特網(wǎng)電話應(yīng)用饶米。
BitTorrent
BT下載的主要原理是充分利用加入分發(fā)的各終端的網(wǎng)絡(luò)上載流量,因?yàn)橐话闱闆r下车胡,終端的下載流量會(huì)遠(yuǎn)遠(yuǎn)大于上載檬输。簡單來說,就是各終端均勻的下載文件的各個(gè)部分匈棘,然后再在臨近的終端之間互相交換數(shù)據(jù)丧慈,既減輕服務(wù)器下載壓力,又能提供終端的下載速度主卫,實(shí)現(xiàn)了下載的人越多逃默,下載速度越快的“變態(tài)”下載
運(yùn)輸層
運(yùn)輸層將網(wǎng)絡(luò)層在兩個(gè)端系統(tǒng)之間的交付服務(wù),擴(kuò)展到運(yùn)行在兩個(gè)不同端系統(tǒng)上的應(yīng)用層進(jìn)程之間的交付服務(wù)队秩,同時(shí)提供了額外的邏輯通信
服務(wù)笑旺,
UDP
UDP其實(shí)很簡單,只是在網(wǎng)絡(luò)層的數(shù)據(jù)報(bào)基礎(chǔ)上增加了部分多路復(fù)用和分解的報(bào)頭馍资。也就是說UDP如同網(wǎng)絡(luò)層一樣筒主,只提供盡力的交付服務(wù)
关噪,不保證完整、有序乌妙,那我們選擇UDP的場景有哪些呢使兔?
-
可以忍受一定的數(shù)據(jù)丟失,但要求強(qiáng)實(shí)時(shí)性
因?yàn)椴灰⑦B接藤韵,同時(shí)沒有擁塞控制虐沥,所以UDP的網(wǎng)絡(luò)時(shí)延小 -
性能更好
因?yàn)椴恍枰S護(hù)連接,所以UDP的性能要更好泽艘,可以支持更多的活躍客戶機(jī) -
網(wǎng)絡(luò)開銷小
因?yàn)楣δ芎唵嗡訳DP的報(bào)文頭短小欲险,所以報(bào)文整體要比TCP小
TCP
TCP提供的一個(gè)重要服務(wù)便是可靠傳輸,即保證數(shù)據(jù)完整匹涮、有序天试,且在合理的時(shí)間范圍內(nèi)
。我們知道傳輸層所依賴的網(wǎng)絡(luò)層并不是可靠的然低,那TCP是如何在此基礎(chǔ)上實(shí)現(xiàn)了可靠傳輸協(xié)議呢喜每?在本小節(jié)中,我們會(huì)在一個(gè)不斷接近真實(shí)的網(wǎng)絡(luò)模型上逐步建立一個(gè)可靠傳輸協(xié)議雳攘。希望能夠幫助大家更加深入的理解TCP的各個(gè)功能的意義
手撕可靠傳輸協(xié)議
完全可靠的信道
假設(shè)網(wǎng)絡(luò)是完全可靠的带兜,不會(huì)丟失數(shù)據(jù)、不會(huì)擁塞吨灭。那么我們該如何構(gòu)建該協(xié)議呢刚照?
很簡單斥难,發(fā)送方發(fā)送數(shù)據(jù)勘高,然后接收方收到數(shù)據(jù)后發(fā)送一個(gè)反饋,發(fā)送方接收到反饋后繼續(xù)發(fā)送级野,甚至當(dāng)我們可以約定兩者的速度匹配繁莹,則不需要接收方發(fā)送反饋,這樣我們完成了可靠傳輸協(xié)議rdt1.0
會(huì)出現(xiàn)比特差錯(cuò)的信道
再增加一點(diǎn)真實(shí)性特幔,即信道中傳輸?shù)臄?shù)據(jù)會(huì)出現(xiàn)比特差錯(cuò)(即0咨演、1跳變),現(xiàn)在該怎么辦呢蚯斯?也很簡單薄风,只需要在rdt1.0的基礎(chǔ)上增加
-
差錯(cuò)檢測
檢測報(bào)文數(shù)據(jù)完整性有很多辦法,常用的包括奇偶校驗(yàn)位拍嵌、摘要等 -
反饋接收
即發(fā)送方獲取接收方正確收到數(shù)據(jù)后的反饋 -
重發(fā)
當(dāng)接收方發(fā)送的反饋是數(shù)據(jù)錯(cuò)誤時(shí)則重發(fā)數(shù)據(jù)
增加這幾個(gè)功能后我們便可以解決比特差錯(cuò)的問題了
等等遭赂,反饋本身要是也出錯(cuò)了怎么辦?
所以横辆,還差一點(diǎn)撇他,那就是當(dāng)反饋本身也出錯(cuò)時(shí)(即發(fā)送方收到了‘含糊不清’的反饋)則也默認(rèn)重發(fā)數(shù)據(jù),但這又會(huì)有個(gè)問題,接收方萬一之前正確接收了困肩,現(xiàn)在又發(fā)送划纽,他又接收了怎么辦?解決辦法就是在發(fā)送報(bào)文中添加重傳標(biāo)記
锌畸,標(biāo)明數(shù)據(jù)為重發(fā)
至此勇劣,我們就有了更加健壯的rdt2.0了
會(huì)出現(xiàn)丟包、比特差錯(cuò)的信道
道高一尺潭枣,魔高一丈比默。真實(shí)的網(wǎng)絡(luò)環(huán)境中不僅數(shù)據(jù)會(huì)跳變,還會(huì)丟包盆犁。即發(fā)送方和接收方發(fā)送的任何報(bào)文段都可能丟失命咐。解決這個(gè)問題其實(shí)很簡單,只需要在發(fā)送方增加倒數(shù)計(jì)時(shí)器
即可蚣抗。當(dāng)發(fā)送方發(fā)送數(shù)據(jù)后便開始計(jì)時(shí)侈百,若超時(shí)未得到響應(yīng),則重發(fā)數(shù)據(jù)翰铡。至于這個(gè)超時(shí)如何確定钝域,一般會(huì)設(shè)置為報(bào)文段的一次往返時(shí)間。
rdt3.0完成锭魔。截止目前例证,我們已經(jīng)有了一個(gè)基本可以在真實(shí)網(wǎng)絡(luò)環(huán)境中工作的簡易TCP了
以流水線方式實(shí)現(xiàn)
rdt3.0其實(shí)已經(jīng)能夠真實(shí)運(yùn)行了,但還存在一個(gè)很大的缺陷迷捧,那就是性能很差织咧。因?yàn)榘l(fā)送方和接收方之間的每一步基本都是“停等”的。我們可以通過流水線的方式來加速數(shù)據(jù)傳輸漠秋,但一旦使用流水線笙蒙,那么發(fā)送和接收的模型都會(huì)更加復(fù)雜,他們必須得做到以下幾點(diǎn)
-
增加編號(hào)
即每個(gè)分組要增加一個(gè)唯一的序號(hào)庆锦,方便流水線管理分組 -
增加緩存
即發(fā)送方和接收方都要增加一個(gè)緩沖區(qū)捅位,用來緩存雙方尚未確認(rèn)的分組 -
解決差錯(cuò)
流水線方式的話,因?yàn)槭桥堪l(fā)送數(shù)據(jù)搂抒,出現(xiàn)錯(cuò)誤后處理難度會(huì)較之剛才更大艇搀,TCP使用回退N步
和選擇重傳
兩種策略解決這個(gè)問題- 回退N步
發(fā)送模型大概是發(fā)送方不斷的發(fā)送數(shù)據(jù),直至一個(gè)閾值(這也叫做發(fā)送窗口)求晶,然后向前滑動(dòng)并等待確認(rèn)反饋或超時(shí)重傳焰雕。這里有個(gè)約定就是接收方接收窗口為1,即只有序確定數(shù)據(jù)分組芳杏,并且只會(huì)反饋正確收到的最大分組序號(hào)
矩屁。所以假如發(fā)送方發(fā)送了1-100號(hào)分組辟宗,可能只收到了55、70的反饋档插,以及71失敗或者超時(shí)慢蜓,此時(shí)窗口回退到71重新發(fā)送 - 選擇重傳
選擇重傳是對(duì)回退N步策略的一種改進(jìn),發(fā)送方和接收方都會(huì)緩存一些數(shù)據(jù)郭膛,允許亂序確認(rèn)晨抡。即發(fā)送方當(dāng)收到2號(hào)出錯(cuò)時(shí),窗口并不回退则剃,而是單獨(dú)處理2號(hào)耘柱,同時(shí)接收方在收到亂序到達(dá)的分組后不會(huì)丟失不連續(xù)的,而是暫存起來棍现。這樣雖然增加了實(shí)現(xiàn)難度调煎,但卻大大提高了效率
- 回退N步
到這里,TCP是如何在不可靠的網(wǎng)絡(luò)上實(shí)現(xiàn)可靠傳輸?shù)姆椒☉?yīng)該有一個(gè)感性的認(rèn)識(shí)了吧
TCP連接管理
TCP是面向連接的己肮,直觀來說就是面向一個(gè)可靠有序的字節(jié)流士袄,那么TCP是如何建立并管理這個(gè)連接呢?
建立連接 三次握手
- 客戶端發(fā)送SYN分組谎僻、隨機(jī)序列號(hào)J娄柳,請求建立連接,狀態(tài)變?yōu)镾YNC_SENT艘绍。完成第一次握手
- 服務(wù)端初始狀態(tài)為LISTEN赤拒,收到SYN后,開辟所需的變量和緩沖區(qū)诱鞠,返回確認(rèn)分組ACK挎挖、ack=J+1、seq=K航夺,狀態(tài)變?yōu)镾YN_RCVD蕉朵,完成第二次握手
- 客戶端收到確認(rèn)分組,準(zhǔn)備變量和緩沖區(qū)阳掐,返回確認(rèn)ACK分組墓造,ack=K+1,狀態(tài)變?yōu)镋STABLISHED锚烦,完成第三次握手
- 服務(wù)端收到確認(rèn)請求,狀態(tài)變?yōu)镋STABLISHED
關(guān)閉連接 四次揮手
- 客戶端發(fā)送FIN分組帝雇、隨機(jī)序列號(hào)M涮俄,狀態(tài)變?yōu)閃AIT_FIN_1,表示不再發(fā)送數(shù)據(jù)尸闸,請求關(guān)閉連接彻亲,一次揮手
- 服務(wù)端開始清理變量孕锄、緩沖區(qū),返回確認(rèn)分組ACK苞尝,ack=M+1畸肆,隨機(jī)序列號(hào)N,狀態(tài)變?yōu)镃LOSE_WAIT宙址,二次揮手
- 服務(wù)端清理完畢轴脐,發(fā)送FIN分組、隨機(jī)序列號(hào)N抡砂,狀態(tài)變?yōu)長AST_ACK大咱,表示不再發(fā)送數(shù)據(jù),允許關(guān)閉連接注益,三次揮手
- 客戶端返回確認(rèn)分組ACK碴巾、ack=N+1,狀態(tài)變?yōu)門IME_WAIT丑搔,四次揮手
- 服務(wù)端收到確認(rèn)請求厦瓢,狀態(tài)變?yōu)镃LOSED
為什么建立連接要三次握手,關(guān)閉要四次揮手啤月?
這里首先要明白煮仇,TCP是全雙工,即服務(wù)端與客戶端都可以發(fā)送與接收數(shù)據(jù)顽冶,所以連接的建立和關(guān)閉其實(shí)都是圍繞雙方互相確認(rèn)對(duì)方具有發(fā)送與接收能力進(jìn)行的
建立連接時(shí)欺抗,第一次握手服務(wù)端確認(rèn)了客戶端的發(fā)送能力,第二次握手客戶端確認(rèn)了服務(wù)端的接收和發(fā)送能力强重,第三次握手服務(wù)端確認(rèn)了客戶端的接收能力绞呈。確認(rèn)完畢,連接便建立间景。這里要注意佃声,“能力”不僅指硬件設(shè)備正常,還有一層意思是假如客戶端的某一個(gè)SYN分組因?yàn)榫W(wǎng)絡(luò)延遲過了很久才到服務(wù)端倘要,雖然客戶端此時(shí)硬件沒問題圾亏,但可能已經(jīng)完成了數(shù)據(jù)交互,不再需要建立連接封拧,此時(shí)第三次握手的作用便能保證服務(wù)端不會(huì)白白等待
連接關(guān)閉時(shí)道理一樣志鹃。第一次揮手服務(wù)端確認(rèn)客戶端不再發(fā)送,第二次揮手客戶端確認(rèn)服務(wù)端不再接收泽西,第三次揮手客戶端確認(rèn)服務(wù)端不再發(fā)送曹铃,第四次揮手服務(wù)端確認(rèn)客戶端不再接收
半連接隊(duì)列
服務(wù)端收到SYN分組后便準(zhǔn)備建立連接,此時(shí)的socket數(shù)據(jù)半連接捧杉,操作系統(tǒng)維護(hù)了一個(gè)半連接隊(duì)列陕见,半連接隊(duì)列如果積壓的話服務(wù)端便無法建立新連接秘血。這其實(shí)也是SYN洪泛攻擊
的原理
三次握手期間能不能順便帶數(shù)據(jù)?
不能评甜。如果允許握手同時(shí)帶數(shù)據(jù)灰粮,則服務(wù)端要提前開辟緩沖區(qū)預(yù)先存儲(chǔ)數(shù)據(jù),這樣就非常容易受到攻擊忍坷。不過第三次握手時(shí)因?yàn)檫B接已經(jīng)確認(rèn)建立粘舟,是可以同時(shí)發(fā)送數(shù)據(jù)的
TIME_WAIT如何產(chǎn)生?什么危害承匣?怎么解決蓖乘?
主動(dòng)發(fā)起連接斷開的一方才會(huì)出現(xiàn)TIME_WAIT,它的作用是確保第四次揮手的分組被正確接收到韧骗,一般會(huì)等待2MST時(shí)間確認(rèn)是否會(huì)再收到FIN分組嘉抒,默認(rèn)為數(shù)分組。如果短時(shí)間內(nèi)大量短連接的斷開會(huì)導(dǎo)致出現(xiàn)大量TIME_WAIT袍暴,而處于TIME_WAIT的連接依然占用端口(防止其他連接占用該端口導(dǎo)致數(shù)據(jù)混亂)些侍,這樣就會(huì)導(dǎo)致端口耗盡為無法建立新連接
快速的解決辦法是手動(dòng)清理這些連接,也可以減小2MST時(shí)間政模,治本的辦法是找到短時(shí)間內(nèi)產(chǎn)生大量連接的原因
TCP擁塞控制
TCP的擁塞控制主要是面向整個(gè)互聯(lián)網(wǎng)的岗宣,因?yàn)樗闹饕饔帽闶歉鶕?jù)當(dāng)前網(wǎng)絡(luò)環(huán)境遏制自己的發(fā)送速度。這里我們只需要了解幾個(gè)簡單的概念即可淋样。注意擁塞控制和流量控制不同耗式,后者主要是為了匹配接收方與發(fā)送方處理速度,減少丟包趁猴,主要通過控制窗口滑動(dòng)速度實(shí)現(xiàn)刊咳。擁塞控制則主要是通過調(diào)整窗口大小實(shí)現(xiàn)
慢啟動(dòng)
即發(fā)送方在發(fā)送數(shù)據(jù)時(shí)首先發(fā)送1個(gè)分組進(jìn)行試探,成功后繼續(xù)發(fā)送2個(gè)儡司,然后依次類推娱挨。當(dāng)然不會(huì)這么一直翻倍下去,而是當(dāng)達(dá)到某個(gè)閾值后捕犬,變化為線性速度增加
加性增跷坝,乘性減
在線性增加過程中,若遇到擁塞碉碉,窗口大小按照幾何倍率減小柴钻,重新開始慢啟動(dòng)過程
快重傳
快重傳算法規(guī)定,發(fā)送方只要一連收到三個(gè)重傳確認(rèn)就應(yīng)當(dāng)立即重傳對(duì)方尚未收到的報(bào)文段垢粮,而不必繼續(xù)等待重傳計(jì)時(shí)器到顿颅。由于發(fā)送方盡早重傳未被確認(rèn)的報(bào)文段,因此采用快重傳后可以使整個(gè)網(wǎng)絡(luò)吞吐量提高約20%
快恢復(fù)
與快重傳配合使用的還有快恢復(fù)算法。當(dāng)在慢啟動(dòng)階段收到多個(gè)重傳確認(rèn)時(shí)粱腻,會(huì)觸發(fā)快恢復(fù)事件,發(fā)送窗口重新進(jìn)入加性增階段斩跌,避免翻倍導(dǎo)致網(wǎng)絡(luò)更加擁塞
TCP绍些、UDP的比較
- 連接方式。TCP是面向連接的耀鸦,在通信之前需要雙方建立連接柬批,初始化資源和同步序列號(hào);UDP是面向數(shù)據(jù)報(bào)袖订,只需要將數(shù)據(jù)根據(jù)ip發(fā)送出去即可
- 可靠性氮帐。TCP是可靠、有序洛姑,保證數(shù)據(jù)不錯(cuò)上沐、不丟、不亂楞艾;UDP則是不可靠参咙、不保證有序
- 發(fā)送方式。TCP是面向字節(jié)流硫眯;UDP是面向數(shù)據(jù)報(bào)
- 大小限制蕴侧。TCP因?yàn)槊嫦蜻B接字節(jié)流,所以無大小限制两入;UDP因?yàn)槊嫦驍?shù)據(jù)報(bào)净宵,單次發(fā)送受到這些限制:UDP協(xié)議最長單次65536字節(jié)、網(wǎng)絡(luò)最大傳輸單元MTU(Internet是576字節(jié))裹纳、socket緩沖區(qū)大小择葡。
由于發(fā)送數(shù)據(jù)超過單次大小限制,需要分包痊夭,會(huì)提高丟包率刁岸,所以一般保證單次發(fā)送數(shù)據(jù)在一個(gè)包內(nèi)
,MTU - UDP包頭 - IP包頭 - 使用場景她我。TCP適合通訊質(zhì)量有要求的場景虹曙,如郵件、文件下載番舆;UDP主要適用于實(shí)時(shí)性要求高酝碳、可靠性要求低的場景如視頻、語音恨狈,以及多點(diǎn)通信場景
- 性能疏哗。TCP雖然要維持連接,但由于經(jīng)過大量優(yōu)化禾怠,在網(wǎng)絡(luò)環(huán)境比較好的情況下返奉,性能并不輸于UDP贝搁。不過由于TCP設(shè)計(jì)過于冗余復(fù)雜,很難再進(jìn)行優(yōu)化芽偏;而UDP由于設(shè)計(jì)簡單雷逆,不少公司將UDP改造為可靠的協(xié)議,如谷歌的GUIC污尉,網(wǎng)絡(luò)傳輸冗余少膀哲、速度快,且數(shù)據(jù)可靠被碗。在整體網(wǎng)絡(luò)環(huán)境不斷改善的情況下某宪,UDP丟包率已經(jīng)低于5%,已經(jīng)在越來越多的場景如語音锐朴、視頻兴喂、游戲領(lǐng)域取代TCP
網(wǎng)絡(luò)層
之所以有網(wǎng)絡(luò)層,是因?yàn)樽畛醯幕ヂ?lián)網(wǎng)還只是一個(gè)局域網(wǎng)包颁,只有若干個(gè)網(wǎng)卡互相連接瞻想,通過mac地址就能完成數(shù)據(jù)交換。但后來由于局域網(wǎng)不斷擴(kuò)大娩嚼,確定mac地址的成本越來越高蘑险,直到上億個(gè)局域網(wǎng)構(gòu)成互聯(lián)網(wǎng)時(shí),mac地址來完成定位已經(jīng)無法實(shí)現(xiàn)岳悟,必須先有一個(gè)網(wǎng)絡(luò)層佃迄,來完成局域網(wǎng)的確定
IP
IP協(xié)議的作用便是完成局域網(wǎng)的確定,和局域網(wǎng)內(nèi)mac的確定贵少。大致的原理如下:
- IP地址中包含網(wǎng)絡(luò)位和地址位呵俏,網(wǎng)絡(luò)位用來確認(rèn)子網(wǎng)地址,地址位用來確認(rèn)mac
- IP轉(zhuǎn)發(fā)的時(shí)候先確認(rèn)是否為本地局域網(wǎng)滔灶,如果不是再轉(zhuǎn)發(fā)網(wǎng)關(guān)普碎,網(wǎng)關(guān)根據(jù)路由表繼續(xù)轉(zhuǎn)發(fā),直到找到目標(biāo)網(wǎng)絡(luò)
- 找到目標(biāo)網(wǎng)絡(luò)后录平,再講IP地址映射到mac地址麻车,將數(shù)據(jù)發(fā)送給指定mac
IPv4
目前使用最廣泛的是ipv4地址,由32個(gè)bit組成斗这,可以表示2^32個(gè)地址(約40億個(gè))动猬,為了方便書寫,一般記為4個(gè)0~255的十進(jìn)制數(shù)表箭,點(diǎn)號(hào)分開
子網(wǎng)
IP地址中的網(wǎng)絡(luò)位和地址位是通過子網(wǎng)掩碼
實(shí)現(xiàn)的赁咙,用IP地址和子網(wǎng)掩碼進(jìn)行與運(yùn)算則可以計(jì)算出子網(wǎng)號(hào)。之所以劃分子網(wǎng)是因?yàn)檫@樣可以實(shí)現(xiàn)地址聚合(或者路由聚合),能夠?qū)⑾嗤泳W(wǎng)的ip使用一個(gè)路由映射彼水,減少路由表的大小崔拥,提高路由效率
子網(wǎng)劃分為A、B猿涨、C握童、D、E五類叛赚,分別具有不同比特的前綴,這樣做的好處是規(guī)范子網(wǎng)號(hào)稽揭,實(shí)現(xiàn)ip復(fù)用俺附。比如一家大公司或者一個(gè)城市可以看做一個(gè)局域網(wǎng),他們可以在自己的局域網(wǎng)內(nèi)使用相同的A類地址溪掀,這些地址不會(huì)在公網(wǎng)中出現(xiàn)事镣,對(duì)外可以只有少量公網(wǎng)ip
TTL
最大轉(zhuǎn)發(fā)次數(shù)。網(wǎng)絡(luò)層的主要作用是轉(zhuǎn)發(fā)
和路由
揪胃。TTL控制了最大的轉(zhuǎn)發(fā)次數(shù)璃哟,8位組成,理論上最大256次喊递,但一般設(shè)置為32或64次
MAC
每一個(gè)網(wǎng)卡的唯一硬件標(biāo)識(shí)符随闪,由廠商寫在網(wǎng)卡的BIOS里。一般采用6字節(jié)骚勘,48位铐伴,用12個(gè)十六進(jìn)制數(shù)表示,每兩個(gè)之間使用:隔開俏讹,如08:00:20:0A:8C:6D
ARP当宴、RARP
在一個(gè)局域網(wǎng)內(nèi)通過ARP廣播協(xié)議,可以完成IP映射mac地址泽疆,同時(shí)也會(huì)使用高速緩存緩存ip與mac映射户矢。RARP實(shí)現(xiàn)mac與ip地址的映射
IP地址與mac可否互相取代?
前面說了在已經(jīng)mac地址的情況下殉疼,為什么還要發(fā)明IP地址概念(主要是mac地址無法體現(xiàn)網(wǎng)絡(luò))梯浪。那么已經(jīng)了有IP地址的概念是否可以替代mac呢?
我理解很難株依,因?yàn)閕p是設(shè)備接入互聯(lián)網(wǎng)后分配的虛擬地址驱证,此時(shí)是需要一個(gè)唯一id的(也就是mac)。假如我們給每臺(tái)設(shè)備生產(chǎn)時(shí)就寫死一個(gè)ip地址恋腕,那么就又回到最初的難題抹锄,設(shè)備可能不斷的更換網(wǎng)絡(luò),這個(gè)寫死的ip就無法體現(xiàn)子網(wǎng)這個(gè)概念,路由表也因?yàn)闊o法劃分子網(wǎng)而異常龐大伙单。除非哪天技術(shù)可以實(shí)現(xiàn)兩個(gè)設(shè)備id的唯一直連获高,這時(shí)候其實(shí)只有mac就夠了
ICMP
IP協(xié)議是最大努力交付,之所以TCP可以實(shí)現(xiàn)可靠交付吻育,主要還是依靠ICMP協(xié)議念秧,可以反饋IP數(shù)據(jù)報(bào)是否發(fā)送成功。Ping工具是其著名應(yīng)用
traceroute
這是一個(gè)工具布疼,可以看到一個(gè)路由到一個(gè)ip地址的中間各個(gè)環(huán)節(jié)摊趾。實(shí)現(xiàn)也非常巧妙,通過將TTL從1不斷調(diào)大游两,從而實(shí)現(xiàn)一步步的路由跳轉(zhuǎn)
DHCP
接入網(wǎng)絡(luò)要具有一個(gè)IP地址砾层,但我們經(jīng)常在各個(gè)時(shí)候、各個(gè)地點(diǎn)都需要接入網(wǎng)絡(luò)贱案,難道要不斷的設(shè)置IP地址嗎(包括子網(wǎng)掩碼肛炮、網(wǎng)關(guān)、DNS服務(wù)器)宝踪?
不需要的侨糟,DHCP協(xié)議可以給我們自動(dòng)分配臨時(shí)IP地址,過程大概是這樣
- DHCP服務(wù)器發(fā)現(xiàn)
- DHCP提供可用IP瘩燥,以及租用期
- 發(fā)送DHCP請求
- DHCP服務(wù)器發(fā)送響應(yīng)
NAT
考慮這個(gè)需求秕重,你們公司擁有上百臺(tái)機(jī)器缚去,但是只有一個(gè)對(duì)外IP带迟,同時(shí)因?yàn)轭A(yù)算和集群機(jī)器經(jīng)常進(jìn)進(jìn)出出(包括手機(jī)等移動(dòng)設(shè)備)那么如何解決這些設(shè)備的IP地址問題呢病袄?
一種流行的技術(shù)方案是NAT(地址轉(zhuǎn)換協(xié)議)
最铁,主要原理是這些設(shè)備在公司的內(nèi)網(wǎng)具有一個(gè)內(nèi)網(wǎng)IP地址喉酌,然后在對(duì)外網(wǎng)關(guān)那里利用端口來映射內(nèi)網(wǎng)機(jī)器和端口菩貌,這樣內(nèi)網(wǎng)的各個(gè)機(jī)器可以公用這個(gè)唯一IP的機(jī)器對(duì)外通信
這也會(huì)導(dǎo)致一個(gè)問題讽膏,即從內(nèi)網(wǎng)可以與外部IP建立連接粥烁,但反過來菱魔,外部IP想訪問內(nèi)部機(jī)器卻沒有辦法留荔,這主要是因?yàn)閺膬?nèi)網(wǎng)往外訪問時(shí)NAT轉(zhuǎn)換表中有記錄如何轉(zhuǎn)發(fā)數(shù)據(jù)報(bào),而直接從外往內(nèi)時(shí)卻無法察覺內(nèi)部機(jī)器
解決這個(gè)問題有個(gè)專用術(shù)語澜倦,NAT穿越
聚蝶。原理大致是利用一臺(tái)額外的主機(jī),內(nèi)網(wǎng)機(jī)器先與此機(jī)器建立連接藻治,然后該主機(jī)代理內(nèi)網(wǎng)機(jī)器對(duì)外接受連接碘勉,然后轉(zhuǎn)發(fā)給內(nèi)網(wǎng)機(jī)器。國內(nèi)的花生殼網(wǎng)就提供類似服務(wù)
RIP
RIP桩卵,Routing Information Protocol验靡,路由信息協(xié)議倍宾,即網(wǎng)絡(luò)系統(tǒng)如何構(gòu)建并維護(hù)路由表的
大致說一下原理便是,相鄰的路由器之間每個(gè)一段時(shí)間就會(huì)將自己所知道的網(wǎng)絡(luò)信息與相鄰的設(shè)備進(jìn)行交換胜嗓,經(jīng)過一定時(shí)間的交換后高职,某個(gè)IP便在網(wǎng)絡(luò)中“發(fā)布”了,然后當(dāng)路由器收到數(shù)據(jù)報(bào)后辞州,根據(jù)數(shù)據(jù)報(bào)的IP信息和自身路由表的信息決定如何轉(zhuǎn)發(fā)數(shù)據(jù)報(bào)
一般一個(gè)數(shù)據(jù)報(bào)會(huì)在15跳內(nèi)到達(dá)目的地怔锌,所以超過15跳會(huì)被設(shè)置為無效數(shù)據(jù)報(bào)
鏈路層
我們把沿著通信路徑連接相鄰節(jié)點(diǎn)的通信信道稱為鏈路
。鏈路層的主體在網(wǎng)絡(luò)適配器中實(shí)現(xiàn)(即網(wǎng)卡)变过,主要作用是將數(shù)據(jù)以幀為單位從一塊網(wǎng)卡發(fā)送給另一個(gè)網(wǎng)卡
但是可能有多個(gè)網(wǎng)卡同時(shí)向一個(gè)網(wǎng)卡發(fā)送數(shù)據(jù)埃元,就有可能出現(xiàn)碰撞
,當(dāng)出現(xiàn)數(shù)據(jù)碰撞時(shí)媚狰,碰撞的數(shù)據(jù)便損壞了(0亚情、1混在一起了),所以鏈路層另一個(gè)重要作用是控制流量哈雏,劃分信道
多路訪問協(xié)議
調(diào)度多個(gè)網(wǎng)卡向一塊網(wǎng)卡發(fā)送數(shù)據(jù)幀的協(xié)議叫做多路訪問協(xié)議,一共有幾十種衫生,常見的幾種如下
時(shí)分多路復(fù)用 TDM
即將信道的使用時(shí)間劃分為若干時(shí)間片裳瘪,然后分配給各個(gè)終端,每個(gè)終端依據(jù)所持有的時(shí)間片獨(dú)享信道
頻分多路復(fù)用 FDM
即將信道按照頻率劃分為多個(gè)子信道罪针,然后分配給各個(gè)終端彭羹,每個(gè)終端可以在獨(dú)自的子信道中傳輸數(shù)據(jù)
時(shí)隙ALOHA
簡單來說,就是發(fā)送數(shù)據(jù)前先進(jìn)行載波偵聽
泪酱,若發(fā)現(xiàn)其他終端使用信道則繼續(xù)等待派殷;同時(shí),如果在兩個(gè)終端同時(shí)使用信道墓阀,即發(fā)生了碰撞毡惜,則均停止發(fā)送,各自順延一個(gè)隨機(jī)時(shí)間
令牌傳遞
之前的幾種協(xié)議都有可能造成信道的浪費(fèi)斯撮,令牌傳遞是指信道對(duì)應(yīng)一個(gè)唯一的虛擬令牌经伙,拿到令牌的終端才能使用信道,令牌在各個(gè)終端之間傳遞勿锅,當(dāng)某個(gè)終端空閑時(shí)可以將令牌直接傳給下個(gè)終端帕膜,這樣信道就不需要空閑