IOS/OSI參考模型與TCP/IP模型對(duì)比
路由交換
路由是三層(網(wǎng)絡(luò)層)網(wǎng)絡(luò)技術(shù),交換是二層(數(shù)據(jù)鏈路層)技術(shù),三層路由技術(shù)其實(shí)就完成兩個(gè)很重要的功能,一個(gè)是選路,根據(jù)路由表、路由策略、選擇最佳路徑,二就是轉(zhuǎn)發(fā),根據(jù)選擇的路徑轉(zhuǎn)發(fā);交換技術(shù),二層交換機(jī)中維護(hù)著一張局域網(wǎng)主機(jī)MAC地址與交換機(jī)接口的對(duì)應(yīng)關(guān)系的表,交換機(jī)就是根據(jù)這張表負(fù)責(zé)將數(shù)據(jù)幀傳輸?shù)街付ǖ闹鳈C(jī)上的,這張表就是MAC表。
單播與廣播
當(dāng)交換機(jī)從某個(gè)端口收到一個(gè)數(shù)據(jù)幀以后,首先,讀取包頭中的源MAC地址,并且記錄源MAC地址的機(jī)器是連在哪個(gè)端口上;其次,再去讀取包頭中的目的MAC地址,并在地址表中查找相應(yīng)的端口,如表中有與這目的MAC地址對(duì)應(yīng)的端口,把數(shù)據(jù)幀直接發(fā)送到目的MAC地址對(duì)應(yīng)的端口上,其實(shí)這就是單播;再次,如果MAC表中找不到目的MAC相應(yīng)的端口,則直接把數(shù)據(jù)幀廣播到所有端口上,當(dāng)目標(biāo)服務(wù)器對(duì)源服務(wù)器回應(yīng)時(shí),交換機(jī)又可以學(xué)習(xí)目的MAC地址與交換機(jī)哪個(gè)端口對(duì)應(yīng),在下次傳送數(shù)據(jù)時(shí)就不再需要對(duì)所有端口進(jìn)行廣播了,這也就是廣播。
網(wǎng)卡
網(wǎng)卡是工作在數(shù)據(jù)鏈路層的網(wǎng)絡(luò)設(shè)備,是局域網(wǎng)中連接計(jì)算機(jī)和傳輸介質(zhì)的接口,不僅能實(shí)現(xiàn)與局域網(wǎng)傳輸介質(zhì)之間的物理連接、電信號(hào)匹配(模擬信號(hào)與電流信號(hào)轉(zhuǎn)換)、還涉及數(shù)據(jù)幀的封裝、拆封、介質(zhì)的訪問(wèn)控制、數(shù)據(jù)的編碼與解碼以及數(shù)據(jù)緩存、監(jiān)控上傳下載流量、控制網(wǎng)速等;
IP地址
IP地址有IPv4與IPv6之分,IPv6是為了解決IPv4地址不足而出現(xiàn)的,但目前IPv4還是主流,下面所有說(shuō)到的IP地址,默認(rèn)為IPv4,IP地址根據(jù)網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)來(lái)分,分為A、B、C三類基本類型及特殊地址D(多播)、E(保留)。
A類:(1.0.0.0-126.0.0.0)(子網(wǎng)掩碼:255.0.0.0)第一個(gè)字節(jié)為網(wǎng)絡(luò)號(hào),后三個(gè)字節(jié)為主機(jī)號(hào),一般用于大型網(wǎng)絡(luò);
B類:(128.0.0.0-191.255.0.0)(子網(wǎng)掩碼:255.255.0.0)前兩個(gè)字節(jié)為網(wǎng)絡(luò)號(hào),后兩個(gè)字節(jié)為主機(jī)號(hào),一般用于中等規(guī)模網(wǎng)絡(luò);
C類:(192.0.0.0-223.255.255.0)(子網(wǎng)掩碼:255.255.255.0)前三個(gè)字節(jié)為網(wǎng)絡(luò)號(hào),最后一個(gè)字節(jié)為主機(jī)號(hào),一般用于小型網(wǎng)絡(luò);
D類:是多播地址,地址的網(wǎng)絡(luò)號(hào)取值于224~239之間,一般用于多路廣播用戶;
E類:是保留地址,地址的網(wǎng)絡(luò)號(hào)取值于240~255之間,保留地址。
在IP地址3種基本類型里,各保留了3個(gè)區(qū)域作為私有地址,其地址范圍如下:
A類地址:10.0.0.0~10.255.255.255
B類地址:172.16.0.0~172.31.255.255
C類地址:192.168.0.0~192.168.255.255
劃分網(wǎng)絡(luò)時(shí),還應(yīng)該注意,主機(jī)號(hào)全0和全1的地址,都無(wú)法使用,主機(jī)號(hào)全0代表指向那個(gè)網(wǎng)段、主機(jī)號(hào)全1代表廣播地址,其它地址就是普通的IP地址了,特殊地址:127.0.0.1,也是本機(jī)地址,等效于localhost或本機(jī)IP。
IP協(xié)議
IP是面向無(wú)連接的,是無(wú)狀態(tài)協(xié)議,IP協(xié)議工作在網(wǎng)絡(luò)層,主要是定義網(wǎng)絡(luò)地址、區(qū)分網(wǎng)段、相同子網(wǎng)內(nèi)MAC尋址、對(duì)不同子網(wǎng)的數(shù)據(jù)包進(jìn)行路由,它主要就是在復(fù)雜的網(wǎng)絡(luò)環(huán)境中將數(shù)據(jù)包發(fā)給最終的目標(biāo)地址。
IP協(xié)議為什么設(shè)計(jì)成無(wú)狀態(tài)的?
1. 無(wú)狀態(tài)的協(xié)議處理相對(duì)簡(jiǎn)單;
2. 通信之前無(wú)需要建立連接;
3. TCP 已經(jīng)是面向連接服務(wù)了,IP層可委托TCP來(lái)解決面向連接的問(wèn)題;
4. 由于不帶有狀態(tài),互聯(lián)網(wǎng)路由起來(lái)更加自由、容錯(cuò)性也更強(qiáng);
值得注意的是,現(xiàn)實(shí)中的IP層往往都帶有安全過(guò)濾,甚至有些路由器,防火墻等中途設(shè)備還會(huì)干涉應(yīng)用,為了更好的做安全檢測(cè),IP層還增加了connection tracking,在無(wú)狀態(tài)協(xié)議上面來(lái)追蹤上層連接,這種方式提高了安全性,但有時(shí)也會(huì)帶來(lái)新的問(wèn)題。
在IP經(jīng)驗(yàn)知識(shí)方面,大致總結(jié)以下幾點(diǎn)
1. IP 數(shù)據(jù)包每次選擇路徑不是固定的,到達(dá)的順序很有可能是亂序的;
2. IP 數(shù)據(jù)包經(jīng)過(guò)的地方,中途設(shè)備不僅僅具備路由功能,而且還會(huì)干涉TCP會(huì)話,再有防火墻或其它安全過(guò)濾設(shè)備時(shí),還有可能會(huì)出現(xiàn)RST(RST表示復(fù)位,用來(lái)關(guān)閉異常的連接,異常斷鏈);
3. IP 協(xié)議是無(wú)狀態(tài)協(xié)議,簡(jiǎn)化互聯(lián)網(wǎng)架構(gòu),是互聯(lián)網(wǎng)大獲成功的關(guān)鍵因素之一;
4. IP層對(duì)TCP傳遞過(guò)來(lái)的數(shù)據(jù)包很少分片處理;
DNS協(xié)議
DNS域名系統(tǒng)協(xié)議,出現(xiàn)的目的是為了解決大家很難記住IP地址(像上面所列的知識(shí)點(diǎn)IP知識(shí)一樣),但大家都需要訪問(wèn)一個(gè)網(wǎng)站,所以后來(lái)出現(xiàn)了DNS域名服務(wù),主要是用于域名與IP地址的相互映射的一個(gè)分布式數(shù)據(jù)庫(kù),從而方便用戶瀏覽網(wǎng)頁(yè)。
圖 DNS遞歸迭代查詢
DNS查詢解析又分為兩種,一種是遞歸,還有一種迭代,這里簡(jiǎn)單說(shuō)下,遞歸是用戶只向本地DNS服務(wù)器發(fā)出請(qǐng)求后,就等待肯定或者否定的答案,而迭代是本地名稱服務(wù)器向根DNS服務(wù)器發(fā)出請(qǐng)求,而根服務(wù)器只是給出下一級(jí)DNS服務(wù)器的地址,然后本地服務(wù)器再向下一級(jí)DNS服務(wù)器請(qǐng)求,直至得到最終答案。
注意,客戶機(jī)與本地DNS服務(wù)器之間,一般是遞歸查詢,而DNS服務(wù)器與下一級(jí)DNS服務(wù)器之間,一般是迭代查詢,域名查詢優(yōu)先查詢?yōu)g覽器緩存,其次是本地/etc/hosts,最后訪問(wèn)本地DNS,如果本地有,或者本地緩存中有,直接返回,如果沒(méi)有,根據(jù)配置進(jìn)行遞歸或者迭代查詢。
ARP/RARP協(xié)議
ARP(Address Resolution Protocol)即地址解析協(xié)議,是根據(jù)IP地址獲取物理MAC地址的一個(gè)TCP/IP協(xié)議簇中的一員,ARP命令可用于查詢本機(jī)ARP緩存中IP地址和MAC地址的對(duì)應(yīng)關(guān)系、添加和刪除靜態(tài)對(duì)應(yīng)關(guān)系等;
RARP 即逆地址解析協(xié)議,功能和ARP協(xié)議相對(duì),其將局域網(wǎng)中某個(gè)主機(jī)的物理MAC地址轉(zhuǎn)換為IP地址;
互聯(lián)網(wǎng)中常說(shuō)的元組根據(jù)指的是什么
四元組:源IP、目的IP、源端口、目的端口;
五元組:源IP、目的IP、協(xié)議類型、源端口、目的端口;
七元組:源IP、目的IP、協(xié)議類型、源端口、目的端口、服務(wù)類型、接口索引;
socket 端口
當(dāng)我們?cè)L問(wèn)一個(gè)服務(wù)時(shí),或者通過(guò)瀏覽器訪問(wèn)一個(gè)網(wǎng)站,需要指明服務(wù)器域名(最終都會(huì)指向IP)及端口(只是默認(rèn)http使用80、https使用443),我們沒(méi)有自己輸入而已,但如果訪問(wèn)的端口不是80、443時(shí),就需要人為指定?因?yàn)橄到y(tǒng)服務(wù)是通過(guò)端口來(lái)區(qū)分不同應(yīng)用程序,TCP通過(guò)端口找到上層應(yīng)用,需要注意的是,端口號(hào)是有限的,端口號(hào)最大為65535,能夠利用的端口數(shù)量隨配置而定。例如在壓力測(cè)試過(guò)程中,一臺(tái)機(jī)器可以利用的TCP端口是有限的,能夠利用的連接(客戶端端口,客戶端IP,服務(wù)器應(yīng)用端口,服務(wù)器IP地址)是有限的。為了解決這個(gè)問(wèn)題,可以配置多IP地址來(lái)擴(kuò)大可用連接數(shù)量。系統(tǒng)支持同一個(gè)端口,不同的IP地址來(lái)綁定不同的應(yīng)用。Linux高版本系統(tǒng)下,在綁定同一個(gè)IP地址的情況下,我們還可以利用REUSEPORT機(jī)制使不同應(yīng)用程序共享同一個(gè)監(jiān)聽端口,這對(duì)高性能服務(wù)器開發(fā)是非常有用的。
TCP/IP協(xié)議概述
TCP和UDP協(xié)議是TCP/IP協(xié)議的核心,TCP(Transmission Control Protocol)傳輸控制協(xié)議和UDP(User Datagram Protocol)用戶數(shù)據(jù)報(bào)協(xié)議屬于傳輸層協(xié)議。其中TCP提供IP環(huán)境下的數(shù)據(jù)可靠傳輸,它提供的服務(wù)包括數(shù)據(jù)流傳送、可靠性、有效流控、全雙工操作和多路復(fù)用,通常是面向連接、端到端和可靠的數(shù)據(jù)段或數(shù)據(jù)報(bào)發(fā)送。通俗來(lái)講,就是事先為所發(fā)送的數(shù)據(jù)開辟出連接好的通道,然后再進(jìn)行數(shù)據(jù)發(fā)送;而UDP則不為IP提供可靠性、流控或差錯(cuò)恢復(fù)功能。一般來(lái)說(shuō),TCP對(duì)應(yīng)的是可靠性要求高、數(shù)據(jù)量大的應(yīng)用,而UDP對(duì)應(yīng)的則是可靠性要求低、傳輸經(jīng)濟(jì)的應(yīng)用。
TCP協(xié)議特性
TCP是一種面向連接、可靠的、基于字節(jié)流的通信協(xié)議,TCP的主要工作是定義端口標(biāo)識(shí)應(yīng)用程序身份,實(shí)現(xiàn)端對(duì)端的可靠通信,并進(jìn)行擁塞控制、防止阻塞,哪么TCP有哪些特性,支撐它這種功能呢?
一、面向連接:通信雙方傳輸數(shù)據(jù)前,需要連接一個(gè)連接,即需要三次握手,連接標(biāo)識(shí)即為四元組:源IP、源端口、目的IP、目的端口;
通信雙方傳輸完數(shù)據(jù)后,還需要四次或三次揮手;
二、雙向字節(jié)流:本地向遠(yuǎn)端和遠(yuǎn)端向本地,都使用字節(jié)流的方式進(jìn)行通信,每個(gè)方向都利用單獨(dú)的序列號(hào)對(duì)字節(jié)流進(jìn)行標(biāo)記;
三、有序傳輸:通過(guò)TCP header的sequence序號(hào)對(duì)不同數(shù)據(jù)包進(jìn)行排序;
四、通過(guò)ack確認(rèn)實(shí)現(xiàn)可靠性:通過(guò)對(duì)端的acknowlegment number和本地的緩存,實(shí)現(xiàn)重傳確保傳輸可靠性;
五、流量控制:發(fā)送的一方根據(jù)對(duì)方的接收窗口大小進(jìn)行數(shù)據(jù)傳遞,確保對(duì)方能夠接收下所發(fā)送的數(shù)據(jù),以免造成擁塞;
六、擁塞控制:不同于流量控制,擁塞控制是由發(fā)送者決定的,而擁塞窗口通過(guò)限制正在網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)大小、防止網(wǎng)絡(luò)擁塞;
后面會(huì)針對(duì)TCP中的每一項(xiàng)特性,分章節(jié),詳細(xì)總結(jié)。
TCP 使用經(jīng)驗(yàn)總結(jié)
1. 距離越遠(yuǎn),延遲越大,重傳概率越大;
2. 網(wǎng)絡(luò)狀況好壞,直接影響應(yīng)用程序性能;
3. 不同網(wǎng)絡(luò)環(huán)境,會(huì)采用不同的擁塞算法;
4. 擁塞控制算法是互聯(lián)網(wǎng)的精華,是互聯(lián)網(wǎng)大獲成功的關(guān)鍵因素之一;
5. TCP是有狀態(tài)協(xié)議,采用異步處理;
6. 使用tcpdump或wireshark抓包分析是找到TCP相關(guān)問(wèn)題根本原因的利器;
客戶端請(qǐng)求是如何到達(dá)服務(wù)器
這里我們以訪問(wèn)www.k8s.vip頁(yè)面為例,進(jìn)行簡(jiǎn)單總結(jié)下當(dāng)我們?cè)跒g覽器中輸入域名,按回車后,發(fā)生了什么。
圖 數(shù)據(jù)包傳輸
一、用戶在瀏覽器中輸入www.k8s.vip 回車;
1. 查詢本地瀏覽器緩存的域名解析記錄,如果存在,直接根據(jù)解析記錄進(jìn)行路由訪問(wèn);
2. 如果瀏覽器緩存記錄不存在,會(huì)查詢本地hosts文件,如果存在,直接根據(jù)配置的記錄去訪問(wèn);
3. 最后,如果瀏覽器緩存不存在,本地hosts也沒(méi)有,就會(huì)向DNS請(qǐng)求解析,得到A記錄的IP;
這里的A記錄中的IP,就是訪問(wèn)的目的地址,其實(shí)這里有可能解析出來(lái)多個(gè)IP,也會(huì)根據(jù)一定的算法選擇一個(gè)進(jìn)行訪問(wèn)。
二、此時(shí)用戶通過(guò)目的IP、目的端口,源IP(本地IP)、源端口,通過(guò)TCP協(xié)議去完成三次握手,建議TCP連接;
1. 用戶通過(guò) TCP socket 接口發(fā)送請(qǐng)求后,TCP協(xié)議接管了請(qǐng)求傳遞,TCP先把請(qǐng)求拆分成一個(gè)個(gè)更小的數(shù)據(jù)分段(假設(shè)TCP offload沒(méi)有開啟的情況下);
2. 由于網(wǎng)絡(luò)環(huán)境多變,還可能第二個(gè)數(shù)據(jù)包先到達(dá)服務(wù)器,這時(shí)TCP會(huì)負(fù)責(zé)處理TCP Out-Of-Order的情況;如果網(wǎng)絡(luò)傳遞過(guò)程中,某一個(gè)路由器由于過(guò)于繁忙,把第一個(gè)數(shù)據(jù)包丟了,那么客戶端的TCP會(huì)負(fù)責(zé)重傳第一個(gè)數(shù)據(jù)包,確保服務(wù)器端的TCP能夠不會(huì)因?yàn)閬G包而收不到第一個(gè)數(shù)據(jù)包;
3. 如果用戶請(qǐng)求內(nèi)容很大,如上傳一個(gè)大文件,就會(huì)被拆分成大量數(shù)據(jù)分段,而TCP傳輸這些數(shù)據(jù)分段的時(shí)候,往往還會(huì)考慮整個(gè)互聯(lián)網(wǎng)能夠接收的程度和對(duì)方能夠接收的程度,發(fā)送數(shù)據(jù)過(guò)于貪婪不僅會(huì)連累整個(gè)互聯(lián)網(wǎng),對(duì)方也未必能夠接收得了,而且還可能使自己速度更慢,這有點(diǎn)像道路駕駛一樣,不能過(guò)于自私,遵守一定的交通規(guī)則才能使道路通暢。在互聯(lián)網(wǎng)傳輸數(shù)據(jù)方面,這些交通規(guī)則算法就是赫赫有名的網(wǎng)絡(luò)擁塞控制算法,而對(duì)方能否接收得了,則通過(guò)發(fā)送窗口的方式進(jìn)行控制。總體來(lái)說(shuō),一次發(fā)送數(shù)據(jù)的大小是根據(jù)對(duì)方的接收窗口大小和擁塞控制算法來(lái)綜合決定的;
三、通過(guò)IP層發(fā)送出去,在IP層,這些數(shù)據(jù)分段會(huì)被封裝成IP數(shù)據(jù)包;
1. 通過(guò)計(jì)算本地IP與目標(biāo)IP的子網(wǎng)掩碼,決定是否為同一局域網(wǎng);
2. 如果A記錄是本地局域網(wǎng)內(nèi)的IP,通過(guò)ARP查詢是否有此主機(jī)的MAC,如果有,直接復(fù)制到數(shù)據(jù)鏈路層;
如果沒(méi)有,就會(huì)在此局域網(wǎng)內(nèi)廣播下這個(gè)IP,直到得到主機(jī)IP對(duì)應(yīng)的MAC,進(jìn)行轉(zhuǎn)發(fā)通信,然后進(jìn)入數(shù)據(jù)鏈路層;
3. 如果A記錄與本地IP不在同一局域網(wǎng),直接轉(zhuǎn)發(fā)到網(wǎng)關(guān),由網(wǎng)關(guān)再去路由,這些數(shù)據(jù)包經(jīng)過(guò)互聯(lián)網(wǎng)的多個(gè)路由器到達(dá)目的地,由于IP網(wǎng)絡(luò)是無(wú)狀態(tài)的協(xié)議,每一個(gè)數(shù)據(jù)包走的路徑可能不一樣,而且到達(dá)的順序也有可能不一樣,這就要求對(duì)端的TCP需要重新組裝數(shù)據(jù)包,以確保向應(yīng)用層傳遞的數(shù)據(jù)是用戶能夠識(shí)別的用戶請(qǐng)求,這樣服務(wù)器應(yīng)用程序就可以處理用戶發(fā)起的請(qǐng)求了。
四、通過(guò)數(shù)據(jù)鏈路層發(fā)送到NIC、進(jìn)行數(shù)模轉(zhuǎn)換發(fā)送到級(jí)連的NIC口,進(jìn)行交換再路由等;
五、客戶端收到客戶端response響應(yīng)后,就會(huì)進(jìn)入關(guān)閉環(huán)境,進(jìn)行tcp 四次揮手階段;
客戶機(jī)數(shù)據(jù)包經(jīng)過(guò)一層層的封包,最后通過(guò)bit流傳輸?shù)交ヂ?lián)網(wǎng),互聯(lián)網(wǎng)中的設(shè)備再經(jīng)過(guò)多次路由交換封包解包再轉(zhuǎn)發(fā),最終到達(dá)服務(wù)器網(wǎng)卡,再解包、重組、得到請(qǐng)求內(nèi)容,進(jìn)行處理;處理完成后,進(jìn)行響應(yīng),再把數(shù)據(jù)根據(jù)轉(zhuǎn)發(fā)出去。
每次的網(wǎng)絡(luò)請(qǐng)求可能涉及到的技術(shù)點(diǎn)有:緩存、DNS協(xié)議、TCP協(xié)議(流量控制、擁塞控制、窗口大小等)、IP協(xié)議、HTTP協(xié)議、ARP協(xié)議、ICMP協(xié)議、路由協(xié)議(ospf、RIP、BGP等)、交換、NAT技術(shù)、負(fù)載均衡等等;