"黑客"的目的是尋找目標(biāo)漏洞淮腾,然后去發(fā)起攻擊或者提出解決方案修補(bǔ)漏洞,而尋找漏洞的過程,你就需要掌握很多知識(shí)谷朝,例如計(jì)算機(jī)原理洲押、計(jì)算機(jī)網(wǎng)絡(luò)、操作系統(tǒng)徘禁、計(jì)算機(jī)軟件诅诱、編程語言、數(shù)據(jù)結(jié)構(gòu)送朱、數(shù)據(jù)庫技術(shù)娘荡、前沿技術(shù)等等,在這么多要學(xué)習(xí)的內(nèi)容里驶沼,首先需要先學(xué)習(xí)"網(wǎng)絡(luò)通信原理"炮沐,為什么?因?yàn)榫W(wǎng)絡(luò)通信原理十分重要,根據(jù)他的原理可以判斷出許多貌似正確的理論其實(shí)是有很多漏洞的通信過程回怜,而很多黑客攻擊就是利用了這些漏洞大年,很多網(wǎng)絡(luò)安全解決方案也是用來解決這些漏洞問題的。
一玉雾、網(wǎng)絡(luò)的由來
互聯(lián)網(wǎng)的本質(zhì)就是一系列的網(wǎng)絡(luò)協(xié)議翔试。
一臺(tái)硬設(shè)有了操作系統(tǒng),然后裝上軟件你就可以正常使用了复旬,每個(gè)人都擁有一臺(tái)自己的機(jī)器垦缅,然而彼此孤立。
如何能讓大家一起玩耍驹碍,就有了初步的網(wǎng)絡(luò)壁涎,其實(shí)兩臺(tái)計(jì)算機(jī)之間通信與兩個(gè)人打電話之間通信的原理是一樣的,普通話屬于中國(guó)國(guó)內(nèi)人與人之間通信的標(biāo)準(zhǔn)志秃,那如果是兩個(gè)國(guó)家的人交流呢?問題是怔球,你不可能要求一個(gè)人/計(jì)算機(jī)掌握全世界的語言/標(biāo)準(zhǔn),于是有了世界統(tǒng)一的通信標(biāo)準(zhǔn):英語
結(jié)論:英語成為世界上所有人通信的統(tǒng)一標(biāo)準(zhǔn)浮还,如果把計(jì)算機(jī)看成分布于世界各地的人竟坛,那么連接兩臺(tái)計(jì)算機(jī)之間的internet實(shí)際上就是一系列統(tǒng)一的標(biāo)準(zhǔn),這些標(biāo)準(zhǔn)稱之為互聯(lián)網(wǎng)協(xié)議碑定,互聯(lián)網(wǎng)的本質(zhì)就是一系列的協(xié)議流码,總稱為'互聯(lián)網(wǎng)協(xié)議'(Internet Protocol Suite).
互聯(lián)網(wǎng)協(xié)議的功能:定義計(jì)算機(jī)如何接入internet,以及接入internet的計(jì)算機(jī)通信的標(biāo)準(zhǔn)延刘。
二漫试、網(wǎng)絡(luò)協(xié)議介紹
互聯(lián)網(wǎng)協(xié)議按照功能不同分為osi七層或tcp/ip五層
每層運(yùn)行常見物理設(shè)備
五層模型講解
我們將應(yīng)用層,表示層碘赖,會(huì)話層并作應(yīng)用層驾荣,從tcp/ip五層協(xié)議的角度來闡述每層的由來與功能外构,搞清楚了每層的主要協(xié)議,就理解了整個(gè)互聯(lián)網(wǎng)通信的原理播掷。
首先审编,用戶感知到的只是最上面一層應(yīng)用層,自上而下每層都依賴于下一層歧匈,所以我們從最下一層開始切入垒酬,比較好理解每層都運(yùn)行特定的協(xié)議,越往上越靠近用戶件炉,越往下越靠近硬件
1. 物理層:
上面提到勘究,孤立的計(jì)算機(jī)之間要想一起玩,就必須接入internet斟冕,言外之意就是計(jì)算機(jī)之間必須完成組網(wǎng)
物理層功能:主要是基于電器特性發(fā)送高低電壓(電信號(hào))口糕,高電壓對(duì)應(yīng)數(shù)字1,低電壓對(duì)應(yīng)數(shù)字0
2. 數(shù)據(jù)鏈路層:
單純的電信號(hào)0和1沒有任何意義磕蛇,必須規(guī)定電信號(hào)多少位一組景描,每組什么意思
數(shù)據(jù)鏈路層的功能:定義了電信號(hào)的分組方式
(1) 以太網(wǎng)協(xié)議:
早期的時(shí)候各個(gè)公司都有自己的分組方式,后來形成了統(tǒng)一的標(biāo)準(zhǔn)秀撇,即以太網(wǎng)協(xié)議ethernet超棺。
ethernet規(guī)定
一組電信號(hào)構(gòu)成一個(gè)數(shù)據(jù)包,叫做'幀'
每一數(shù)據(jù)幀分成:報(bào)頭head和數(shù)據(jù)data兩部分
head包含:(固定18個(gè)字節(jié))
發(fā)送者/源地址呵燕,6個(gè)字節(jié)
接收者/目標(biāo)地址说搅,6個(gè)字節(jié)
數(shù)據(jù)類型,6個(gè)字節(jié)
data包含:(最短46字節(jié)虏等,最長(zhǎng)1500字節(jié))
數(shù)據(jù)包的具體內(nèi)容
head長(zhǎng)度+data長(zhǎng)度=最短64字節(jié),最長(zhǎng)1518字節(jié)适肠,超過最大限制就分片發(fā)送
(2) mac地址:
head中包含的源和目標(biāo)地址由來:ethernet規(guī)定接入internet的設(shè)備都必須具備網(wǎng)卡霍衫,發(fā)送端和接收端的地址便是指網(wǎng)卡的地址,即mac地址侯养。
mac地址:每塊網(wǎng)卡出廠時(shí)都被燒制上一個(gè)世界唯一的mac地址敦跌,長(zhǎng)度為48位2進(jìn)制,通常由12位16進(jìn)制數(shù)表示(前六位是廠商編號(hào)逛揩,后六位是流水線號(hào))
(3) 廣播:
有了mac地址柠傍,同一網(wǎng)絡(luò)內(nèi)的兩臺(tái)主機(jī)就可以通信了(一臺(tái)主機(jī)通過arp協(xié)議獲取另外一臺(tái)主機(jī)的mac地址)ethernet采用最原始的方式,廣播的方式進(jìn)行通信辩稽,即計(jì)算機(jī)通信基本靠吼
3. 網(wǎng)絡(luò)層:
有了ethernet惧笛、mac地址、廣播的發(fā)送方式逞泄,世界上的計(jì)算機(jī)就可以彼此通信了患整,問題是世界范圍的互聯(lián)網(wǎng)是由一個(gè)個(gè)彼此隔離的小的局域網(wǎng)組成的拜效,那么如果所有的通信都采用以太網(wǎng)的廣播方式,那么一臺(tái)機(jī)器發(fā)送的包全世界都會(huì)收到各谚,這就不僅僅是效率低的問題了紧憾,這會(huì)是一種災(zāi)難
上圖結(jié)論:必須找出一種方法來區(qū)分哪些計(jì)算機(jī)屬于同一廣播域,哪些不是昌渤,如果是就采用廣播的方式發(fā)送赴穗,如果不是,就采用路由的方式(向不同廣播域/子網(wǎng)分發(fā)數(shù)據(jù)包)膀息,mac地址是無法區(qū)分的般眉,它只跟廠商有關(guān)。
網(wǎng)絡(luò)層功能:引入一套新的地址用來區(qū)分不同的廣播域/子網(wǎng)履婉,這套地址即網(wǎng)絡(luò)地址
(1) IP協(xié)議:
規(guī)定網(wǎng)絡(luò)地址的協(xié)議叫ip協(xié)議煤篙,它定義的地址稱之為ip地址,廣泛采用的v4版本即ipv4毁腿,它規(guī)定網(wǎng)絡(luò)地址由32位2進(jìn)制表示辑奈。
范圍0.0.0.0-255.255.255.255
一個(gè)ip地址通常寫成四段十進(jìn)制數(shù),例:172.16.10.1
ip地址分成兩部分
網(wǎng)絡(luò)部分:標(biāo)識(shí)子網(wǎng)
主機(jī)部分:標(biāo)識(shí)主機(jī)
注意:?jiǎn)渭兊膇p地址段只是標(biāo)識(shí)了ip地址的種類已烤,從網(wǎng)絡(luò)部分或主機(jī)部分都無法辨識(shí)一個(gè)ip所處的子網(wǎng)
例:172.16.10.1與172.16.10.2并不能確定二者處于同一子網(wǎng)
(2) 子網(wǎng)掩碼
所謂"子網(wǎng)掩碼"鸠窗,就是表示子網(wǎng)絡(luò)特征的一個(gè)參數(shù)。它在形式上等同于IP地址胯究,也是一個(gè)32位二進(jìn)制數(shù)字稍计,它的網(wǎng)絡(luò)部分全部為1,主機(jī)部分全部為0裕循。比如臣嚣,IP地址172.16.10.1,如果已知網(wǎng)絡(luò)部分是前24位剥哑,主機(jī)部分是后8位硅则,那么子網(wǎng)絡(luò)掩碼就是11111111.11111111.11111111.00000000,寫成十進(jìn)制就是255.255.255.0株婴。
知道"子網(wǎng)掩碼"怎虫,我們就能判斷,任意兩個(gè)IP地址是否處在同一個(gè)子網(wǎng)絡(luò)困介。方法是將兩個(gè)IP地址與子網(wǎng)掩碼分別進(jìn)行AND運(yùn)算(兩個(gè)數(shù)位都為1大审,運(yùn)算結(jié)果為1,否則為0)座哩,然后比較結(jié)果是否相同徒扶,如果是的話,就表明它們?cè)谕粋€(gè)子網(wǎng)絡(luò)中根穷,否則就不是酷愧。
比如驾诈,已知IP地址172.16.10.1和172.16.10.2的子網(wǎng)掩碼都是255.255.255.0,請(qǐng)問它們是否在同一個(gè)子網(wǎng)絡(luò)?兩者與子網(wǎng)掩碼分別進(jìn)行AND運(yùn)算溶浴,
172.16.10.1:10101100.00010000.00001010.000000001??
255255.255.255.0:11111111.11111111.11111111.00000000?
AND運(yùn)算得網(wǎng)絡(luò)地址結(jié)果:
10101100.00010000.00001010.000000001->172.16.10.0?
172.16.10.2:10101100.00010000.00001010.000000010?
255255.255.255.0:11111111.11111111.11111111.00000000?
AND運(yùn)算得網(wǎng)絡(luò)地址結(jié)果:
10101100.00010000.00001010.000000001->172.16.10.0?
結(jié)果都是172.16.10.0乍迄,因此它們?cè)谕粋€(gè)子網(wǎng)絡(luò)碘裕。
總結(jié)一下阶冈,IP協(xié)議的作用主要有兩個(gè)桅狠,一個(gè)是為每一臺(tái)計(jì)算機(jī)分配IP地址祖秒,另一個(gè)是確定哪些地址在同一個(gè)子網(wǎng)絡(luò)浮庐。
(3) ip數(shù)據(jù)包
ip數(shù)據(jù)包也分為head和data部分积暖,無須為ip包定義單獨(dú)的欄位乎婿,直接放入以太網(wǎng)包的data部分
head:長(zhǎng)度為20到60字節(jié)
data:最長(zhǎng)為65,515字節(jié)今阳。
而以太網(wǎng)數(shù)據(jù)包的"數(shù)據(jù)"部分饥臂,最長(zhǎng)只有1500字節(jié)逊躁。因此,如果IP數(shù)據(jù)包超過了1500字節(jié)隅熙,它就需要分割成幾個(gè)以太網(wǎng)數(shù)據(jù)包稽煤,分開發(fā)送了。
(4) ARP協(xié)議
arp協(xié)議由來:計(jì)算機(jī)通信基本靠吼囚戚,即廣播的方式酵熙,所有上層的包到最后都要封裝上以太網(wǎng)頭,然后通過以太網(wǎng)協(xié)議發(fā)送驰坊,在談及以太網(wǎng)協(xié)議時(shí)候匾二,我門了解到通信是基于mac的廣播方式實(shí)現(xiàn),計(jì)算機(jī)在發(fā)包時(shí)拳芙,獲取自身的mac是容易的察藐,如何獲取目標(biāo)主機(jī)的mac,就需要通過arp協(xié)議
arp協(xié)議功能:廣播的方式發(fā)送數(shù)據(jù)包舟扎,獲取目標(biāo)主機(jī)的mac地址
協(xié)議工作方式:每臺(tái)主機(jī)ip都是已知的
例如:主機(jī)172.16.10.10/24訪問172.16.10.11/24
首先通過ip地址和子網(wǎng)掩碼區(qū)分出自己所處的子網(wǎng)
分析172.16.10.10/24與172.16.10.11/24處于同一網(wǎng)絡(luò)(如果不是同一網(wǎng)絡(luò)转培,那么下表中目標(biāo)ip為172.16.10.1,通過arp獲取的是網(wǎng)關(guān)的mac)
這個(gè)包會(huì)以廣播的方式在發(fā)送端所處的自網(wǎng)內(nèi)傳輸,所有主機(jī)接收后拆開包浆竭,發(fā)現(xiàn)目標(biāo)ip為自己的,就響應(yīng)惨寿,返回自己的mac
4. 傳輸層:
網(wǎng)絡(luò)層的ip幫我們區(qū)分子網(wǎng)邦泄,以太網(wǎng)層的mac幫我們找到主機(jī),然后大家使用的都是應(yīng)用程序裂垦,你的電腦上可能同時(shí)開啟qq顺囊,暴風(fēng)影音,等多個(gè)應(yīng)用程序蕉拢,那么我們通過ip和mac找到了一臺(tái)特定的主機(jī)特碳,如何標(biāo)識(shí)這臺(tái)主機(jī)上的應(yīng)用程序诚亚,答案就是端口,端口即應(yīng)用程序與網(wǎng)卡關(guān)聯(lián)的編號(hào)午乓。
傳輸層功能:建立端口到端口的通信
補(bǔ)充:端口范圍0-65535站宗,0-1023為系統(tǒng)占用端口
tcp協(xié)議:可靠傳輸,TCP數(shù)據(jù)包沒有長(zhǎng)度限制益愈,理論上可以無限長(zhǎng)梢灭,但是為了保證網(wǎng)絡(luò)的效率,通常TCP數(shù)據(jù)包的長(zhǎng)度不會(huì)超過IP數(shù)據(jù)包的長(zhǎng)度蒸其,以確保單個(gè)TCP數(shù)據(jù)包不必再分割敏释。
udp協(xié)議:不可靠傳輸,"報(bào)頭"部分一共只有8個(gè)字節(jié)摸袁,總長(zhǎng)度不超過65,535字節(jié)钥顽,正好放進(jìn)一個(gè)IP數(shù)據(jù)包。
tcp報(bào)文
tcp三次握手和四次揮手
5. 應(yīng)用層:
用戶使用的都是應(yīng)用程序靠汁,均工作于應(yīng)用層蜂大,互聯(lián)網(wǎng)是開發(fā)的,大家都可以開發(fā)自己的應(yīng)用程序膀曾,數(shù)據(jù)多種多樣县爬,必須規(guī)定好數(shù)據(jù)的組織形式
應(yīng)用層功能:規(guī)定應(yīng)用程序的數(shù)據(jù)格式。
例:TCP協(xié)議可以為各種各樣的程序傳遞數(shù)據(jù)添谊,比如Email财喳、WWW、FTP等等斩狱。那么耳高,必須有不同協(xié)議規(guī)定電子郵件、網(wǎng)頁所踊、FTP數(shù)據(jù)的格式泌枪,這些應(yīng)用程序協(xié)議就構(gòu)成了"應(yīng)用層"。
6. Socket:
我們知道兩個(gè)進(jìn)程如果需要進(jìn)行通訊最基本的一個(gè)前提能能夠唯一的標(biāo)示一個(gè)進(jìn)程秕岛,在本地進(jìn)程通訊中我們可以使用PID來唯一標(biāo)示一個(gè)進(jìn)程碌燕,但PID只在本地唯一,網(wǎng)絡(luò)中的兩個(gè)進(jìn)程PID沖突幾率很大继薛,這時(shí)候我們需要另辟它徑了修壕,我們知道IP層的ip地址可以唯一標(biāo)示主機(jī),而TCP層協(xié)議和端口號(hào)可以唯一標(biāo)示主機(jī)的一個(gè)進(jìn)程遏考,這樣我們可以利用ip地址+協(xié)議+端口號(hào)唯一標(biāo)示網(wǎng)絡(luò)中的一個(gè)進(jìn)程慈鸠。
能夠唯一標(biāo)示網(wǎng)絡(luò)中的進(jìn)程后,它們就可以利用socket進(jìn)行通信了灌具,什么是socket呢?我們經(jīng)常把socket翻譯為套接字青团,socket是在應(yīng)用層和傳輸層之間的一個(gè)抽象層譬巫,它把TCP/IP層復(fù)雜的操作抽象為幾個(gè)簡(jiǎn)單的接口供應(yīng)用層調(diào)用已實(shí)現(xiàn)進(jìn)程在網(wǎng)絡(luò)中通信。
socket起源于UNIX督笆,在Unix一切皆文件哲學(xué)的思想下芦昔,socket是一種"打開—讀/寫—關(guān)閉"模式的實(shí)現(xiàn),服務(wù)器和客戶端各自維護(hù)一個(gè)"文件"胖腾,在建立連接打開后烟零,可以向自己文件寫入內(nèi)容供對(duì)方讀取或者讀取對(duì)方內(nèi)容,通訊結(jié)束時(shí)關(guān)閉文件咸作。
三锨阿、網(wǎng)絡(luò)通信實(shí)現(xiàn)
每臺(tái)主機(jī)實(shí)現(xiàn)網(wǎng)絡(luò)通信的基本四要素:
本機(jī)的IP地址
子網(wǎng)掩碼
網(wǎng)關(guān)的IP地址
DNS的IP地址
獲取這四要素分兩種方式:
(1) 靜態(tài)獲取:即手動(dòng)配置
(2) 動(dòng)態(tài)獲燃欠!:通過dhcp獲取
最前面的"以太網(wǎng)標(biāo)頭"墅诡,設(shè)置發(fā)出方(本機(jī))的MAC地址和接收方(DHCP服務(wù)器)的MAC地址。前者就是本機(jī)網(wǎng)卡的MAC地址桐智,后者這時(shí)不知道末早,就填入一個(gè)廣播地址:FF-FF-FF-FF-FF-FF。
后面的"IP標(biāo)頭"说庭,設(shè)置發(fā)出方的IP地址和接收方的IP地址然磷。這時(shí),對(duì)于這兩者刊驴,本機(jī)都不知道姿搜。于是,發(fā)出方的IP地址就設(shè)為0.0.0.0捆憎,接收方的IP地址設(shè)為255.255.255.255舅柜。
最后的"UDP標(biāo)頭",設(shè)置發(fā)出方的端口和接收方的端口躲惰。這一部分是DHCP協(xié)議規(guī)定好的致份,發(fā)出方是68端口,接收方是67端口础拨。
這個(gè)數(shù)據(jù)包構(gòu)造完成后氮块,就可以發(fā)出了。以太網(wǎng)是廣播發(fā)送诡宗,同一個(gè)子網(wǎng)絡(luò)的每臺(tái)計(jì)算機(jī)都收到了這個(gè)包滔蝉。因?yàn)榻邮辗降腗AC地址是FF-FF-FF-FF-FF-FF,看不出是發(fā)給誰的僚焦,所以每臺(tái)收到這個(gè)包的計(jì)算機(jī),還必須分析這個(gè)包的IP地址曙痘,才能確定是不是發(fā)給自己的芳悲。當(dāng)看到發(fā)出方IP地址是0.0.0.0立肘,接收方是255.255.255.255,于是DHCP服務(wù)器知道"這個(gè)包是發(fā)給我的"名扛,而其他計(jì)算機(jī)就可以丟棄這個(gè)包谅年。
接下來,DHCP服務(wù)器讀出這個(gè)包的數(shù)據(jù)內(nèi)容肮韧,分配好IP地址融蹂,發(fā)送回去一個(gè)"DHCP響應(yīng)"數(shù)據(jù)包。這個(gè)響應(yīng)包的結(jié)構(gòu)也是類似的弄企,以太網(wǎng)標(biāo)頭的MAC地址是雙方的網(wǎng)卡地址超燃,IP標(biāo)頭的IP地址是DHCP服務(wù)器的IP地址(發(fā)出方)和255.255.255.255(接收方),UDP標(biāo)頭的端口是67(發(fā)出方)和68(接收方)拘领,分配給請(qǐng)求端的IP地址和本網(wǎng)絡(luò)的具體參數(shù)則包含在Data部分意乓。
新加入的計(jì)算機(jī)收到這個(gè)響應(yīng)包,于是就知道了自己的IP地址约素、子網(wǎng)掩碼届良、網(wǎng)關(guān)地址、DNS服務(wù)器等等參數(shù)圣猎。
四士葫、例舉主機(jī)訪問網(wǎng)站的網(wǎng)絡(luò)通信過程
首先打開瀏覽器,在地址欄輸入U(xiǎn)RL送悔,回車慢显,出現(xiàn)網(wǎng)站內(nèi)容。這是我們幾乎每天都在做的事放祟,那這個(gè)過程中到底是什么原理呢?HTTP鳍怨、TCP、DNS跪妥、IP這些耳熟能詳?shù)拿~都在什么時(shí)候起著什么作用呢?在這里整體梳理一遍鞋喇。
1. 整個(gè)過程基本分做下面幾個(gè)部分:
域名解析成IP地址;
與目的主機(jī)進(jìn)行TCP連接(三次握手);
發(fā)送與收取數(shù)據(jù);
與目的主機(jī)斷開TCP連接(四次揮手);
下面分別進(jìn)行詳細(xì)說明。
2. 域名解析成IP地址
(1) 首先說什么是域名解析?
我們?cè)跒g覽器地址欄中輸入的都是類似"www.baidu.com"眉撵、"www.qq.com"等等容易記憶的英文域名侦香,但這些字母你直接交給整個(gè)網(wǎng)絡(luò)線路去尋找目的主機(jī)找得到嗎?找不到,因?yàn)槊總€(gè)主機(jī)在網(wǎng)絡(luò)中的位置都是以IP標(biāo)識(shí)的纽疟,IP才是主機(jī)在網(wǎng)絡(luò)中的位置罐韩,域名只是為了方便用戶記憶而已,這就要求瀏覽器能夠識(shí)別域名并且將其轉(zhuǎn)化為對(duì)應(yīng)的IP地址污朽。
所以瀏覽器會(huì)有一個(gè)DNS緩存散吵,其中記錄了一些域名與IP的對(duì)應(yīng)關(guān)系,供瀏覽器快速查找需要的IP。但是這個(gè)DNS緩存不可能存下所有的域名-IP地址矾睦,何況IP地址有時(shí)候還會(huì)變化晦款,因此當(dāng)在DNS緩存中沒有找到的時(shí)候,就要先向DNS服務(wù)器請(qǐng)求域名解析枚冗,我們常聽到的DNS服務(wù)器很大的作用就是進(jìn)行域名解析缓溅。
值得一提的是,DNS域名解析時(shí)用的是UDP協(xié)議赁温。
(2) 整個(gè)域名解析的過程如下:
瀏覽器向本機(jī)DNS模塊發(fā)出DNS請(qǐng)求坛怪,DNS模塊生成相關(guān)的DNS報(bào)文;
DNS模塊將生成的DNS報(bào)文傳遞給傳輸層的UDP協(xié)議單元;
UDP協(xié)議單元將該數(shù)據(jù)封裝成UDP數(shù)據(jù)報(bào),傳遞給網(wǎng)絡(luò)層的IP協(xié)議單元;
IP協(xié)議單元將該數(shù)據(jù)封裝成IP數(shù)據(jù)包股囊,其目的IP地址為DNS服務(wù)器的IP地址;
封裝好的IP數(shù)據(jù)包將傳遞給數(shù)據(jù)鏈路層的協(xié)議單元進(jìn)行發(fā)送;
發(fā)送時(shí)在ARP緩存中查詢相關(guān)數(shù)據(jù)袜匿,如果沒有,就發(fā)送ARP廣播(包含待查詢的IP地址毁涉,收到廣播的主機(jī)檢查自己的IP沉帮,符合條件的主機(jī)將含有自己MAC地址的ARP包發(fā)送給ARP廣播的主機(jī))請(qǐng)求,等待ARP回應(yīng);
得到ARP回應(yīng)后贫堰,將IP地址與路由的下一跳MAC地址對(duì)應(yīng)的信息寫入ARP緩存表;
寫入緩存后穆壕,以路由下一跳的地址填充目的MAC地址,以數(shù)據(jù)幀形式轉(zhuǎn)發(fā);
轉(zhuǎn)發(fā)可能進(jìn)行多次;
DNS請(qǐng)求到達(dá)DNS服務(wù)器的數(shù)據(jù)鏈路層協(xié)議單元;
DNS服務(wù)器的數(shù)據(jù)鏈路層協(xié)議單元解析數(shù)據(jù)幀其屏,將內(nèi)部的IP數(shù)據(jù)包傳遞給網(wǎng)絡(luò)層IP協(xié)議單元;
DNS服務(wù)器的IP協(xié)議單元解析IP數(shù)據(jù)包喇勋,將內(nèi)部的UDP數(shù)據(jù)報(bào)傳遞給傳輸層UDP協(xié)議單元;
DNS服務(wù)器的UDP協(xié)議單元解析收到的UDP數(shù)據(jù)報(bào),將內(nèi)部的DNS報(bào)文傳遞給DNS服務(wù)單元;
DNS服務(wù)單元將域名解析成對(duì)應(yīng)IP地址偎行,產(chǎn)生DNS回應(yīng)報(bào)文;
DNS回應(yīng)報(bào)文->UDP->IP->MAC->我的主機(jī);
我的主機(jī)收到數(shù)據(jù)幀川背,將數(shù)據(jù)幀->IP->UDP->瀏覽器;
將域名解析結(jié)果以域名和IP地址對(duì)應(yīng)的形式寫入DNS緩存表。
其中提到了一個(gè)ARP的概念蛤袒,類似于DNS將域名翻譯成IP熄云,ARP則是將IP翻譯成MAC地址,我們知道了IP后妙真,需要通過主機(jī)的MAC地址來更具體的找到主機(jī)缴允。同樣的也有一個(gè)ARP緩存,其中存儲(chǔ)了一些IP與MAC地址的對(duì)應(yīng)關(guān)系珍德,如果緩存中找不到练般,就會(huì)進(jìn)行廣播來查找MAC地址,收到廣播的主機(jī)會(huì)檢查自己的IP是否是待查找的IP锈候,是的話就返回自己的MAC地址薄料。
如果做開發(fā),往往還會(huì)接觸到端口這個(gè)概念泵琳,那端口是什么呢?這里是指TCP/IP協(xié)議中的端口摄职,端口號(hào)的范圍從0到65535誊役,比如用于瀏覽網(wǎng)頁服務(wù)的80端口,用于FTP服務(wù)的21端口等等谷市,都有一些固定的端口號(hào)势木,被占用后就不能被別的服務(wù)拿來傳輸數(shù)據(jù)了。
3. 與目的主機(jī)進(jìn)行TCP連接(三次握手)
得到域名對(duì)應(yīng)的IP地址后歌懒,也就表示可以將數(shù)據(jù)送達(dá)目的主機(jī)了,這時(shí)候才開始我們常說的三次握手建立連接溯壶。
HTTP的請(qǐng)求時(shí)使用TCP進(jìn)行傳輸?shù)募霸恚梢员WC可靠傳輸,并且有序且改,而TCP是有連接的傳輸验烧,也就是在傳輸數(shù)據(jù)之前,會(huì)建立我的主機(jī)與目的主機(jī)之間的連接又跛,然后才能傳輸數(shù)據(jù)碍拆,傳輸完成后,還有斷開連接慨蓝。這也就是TCP的三次握手和四次揮手感混,大致過程如下圖所示:
具體的三次握手建立連接的過程如下表述,其中數(shù)據(jù)包的傳輸過程類似上文請(qǐng)求DNS服務(wù)器時(shí)的過程礼烈,就簡(jiǎn)單的表示一下:
向目的主機(jī)發(fā)送TCP連接請(qǐng)求報(bào)文;
該TCP報(bào)文中SYN標(biāo)志位設(shè)為1弧满,表示連接請(qǐng)求;
該TCP報(bào)文通過IP(DNS)->MAC(ARP)->網(wǎng)關(guān)->目的主機(jī);
目的主機(jī)收到數(shù)據(jù)幀,通過IP->TCP此熬,TCP協(xié)議單元回應(yīng)請(qǐng)求應(yīng)答報(bào)文;
該報(bào)文中SYN和ACK標(biāo)志設(shè)為1庭呜,表示連接請(qǐng)求應(yīng)答;
該TCP報(bào)文通過IP(DNS)->MAC(ARP)->網(wǎng)關(guān)->我的主機(jī);
我的主機(jī)收到數(shù)據(jù)幀,通過IP->TCP犀忱,TCP協(xié)議單元回應(yīng)請(qǐng)求確認(rèn)報(bào)文;
該TCP報(bào)文通過IP(DNS)->MAC(ARP)->網(wǎng)關(guān)->目的主機(jī);
目的主機(jī)收到數(shù)據(jù)幀募谎,通過IP->TCP,連接建立完成阴汇。
三次握手的過程就是一去一回一去数冬,互相確認(rèn)一下,就建立連接啦鲫寄。這個(gè)過程中任何一個(gè)報(bào)文出錯(cuò)或者超時(shí)吉执,都要進(jìn)行重傳。
4. 發(fā)送與收取數(shù)據(jù)
如上所說地来,只有建立連接后才能開始傳輸數(shù)據(jù)戳玫,數(shù)據(jù)其實(shí)有多種傳輸方式,比如分段啊分組啊分時(shí)啊等等未斑。而一個(gè)數(shù)據(jù)包的傳輸過程如下所示咕宿,以HTTP的GET方法請(qǐng)求為例:
瀏覽器向域名發(fā)出GET方法報(bào)文;
該GET方法報(bào)文通過TCP->IP(DNS)->MAC(ARP)->網(wǎng)關(guān)->目的主機(jī);
目的主機(jī)收到數(shù)據(jù)幀,通過IP->TCP->HTTP,HTTP協(xié)議單元會(huì)回應(yīng)HTTP協(xié)議格式封裝好的HTML形式數(shù)據(jù);
該HTML數(shù)據(jù)通過TCP->IP(DNS)->MAC(ARP)->網(wǎng)關(guān)->我的主機(jī);
我的主機(jī)收到數(shù)據(jù)幀府阀,通過IP->TCP->HTTP->瀏覽器缆镣,瀏覽器以網(wǎng)頁形式顯示HTML內(nèi)容。
其他的HTTP方法在傳輸數(shù)據(jù)時(shí)方法都類似试浙,只是所攜帶的內(nèi)容不同董瞻。
5. 與目的主機(jī)斷開TCP連接(四次揮手)
數(shù)據(jù)傳輸完成后需要斷開連接,與建立時(shí)不同田巴,斷開連接需要多一次钠糊,有四次揮手,至于為什么壹哺,看完過程我們?cè)僦v抄伍。
看圖理解過程:
過程如下:
瀏覽器向目的主機(jī)發(fā)出TCP連接結(jié)束請(qǐng)求報(bào)文,此時(shí)進(jìn)入FIN WAIT狀態(tài);
該報(bào)文FIN標(biāo)志位設(shè)為1管宵,表示結(jié)束請(qǐng)求;
TCP結(jié)束請(qǐng)求報(bào)文通過IP(DNS)->MAC(ARP)->網(wǎng)關(guān)->目的主機(jī);
目的主機(jī)收到數(shù)據(jù)幀截珍,通過IP->TCP,TCP協(xié)議單元回應(yīng)結(jié)束應(yīng)答報(bào)文;
當(dāng)前只是進(jìn)行回應(yīng)箩朴,因?yàn)槟康闹鳈C(jī)可能還有數(shù)據(jù)要傳岗喉,并不急著斷開連接;
該報(bào)文中ACK標(biāo)志位設(shè)為1,表示收到結(jié)束請(qǐng)求;
目的數(shù)據(jù)發(fā)送完所有數(shù)據(jù)后炸庞,向我的主機(jī)發(fā)出TCP連接結(jié)束請(qǐng)求報(bào)文;
該報(bào)文FIN標(biāo)志位設(shè)為1沈堡,表示結(jié)束請(qǐng)求;
TCP結(jié)束請(qǐng)求報(bào)文通過IP(DNS)->MAC(ARP)->網(wǎng)關(guān)->我的主機(jī);
我的主機(jī)收到數(shù)據(jù)幀,通過IP->TCP燕雁,TCP協(xié)議單元回應(yīng)結(jié)束應(yīng)答報(bào)文诞丽,此時(shí)進(jìn)入TIME WAIT狀態(tài),因?yàn)椴幌嘈啪W(wǎng)絡(luò)是可靠的拐格,如果目的主機(jī)沒收到還可以重發(fā);
該報(bào)文中的FIN標(biāo)志位均設(shè)為1僧免,表示結(jié)束應(yīng)答;
該TCP回應(yīng)報(bào)文通過IP(DNS)->MAC(ARP)->網(wǎng)關(guān)->目的主機(jī);
目的主機(jī)關(guān)閉連接;
TIME WAIT等待結(jié)束后,沒有收到回復(fù)捏浊,說明目的正常關(guān)閉了懂衩,我的主機(jī)也關(guān)閉連接。
這里的過程是以我的主機(jī)主動(dòng)發(fā)起結(jié)束請(qǐng)求開始的金踪,實(shí)際上也可以由目的主機(jī)主動(dòng)發(fā)起浊洞,那么過程就會(huì)跟上面相反,但細(xì)節(jié)差不多胡岔。
FIN_WAIT狀態(tài)是主動(dòng)發(fā)起請(qǐng)求時(shí)等待確認(rèn)信息法希,而TIME_WAIT狀態(tài)是收到結(jié)束請(qǐng)求后發(fā)送確認(rèn)信息后等待看是否需要重發(fā)。
現(xiàn)在來說說為什么斷開連接時(shí)需要四次揮手呢?因?yàn)榻⑦B接時(shí)目的主機(jī)可以直接發(fā)送SYN(同步)+ACK(應(yīng)答)報(bào)文靶瘸。而當(dāng)斷開時(shí)苫亦,目的主機(jī)收到FIN后可能還有數(shù)據(jù)要發(fā)毛肋,并不一定直接斷開,所以先發(fā)送一次應(yīng)答屋剑,告知我的主機(jī)收到了請(qǐng)求润匙,等確認(rèn)所有數(shù)據(jù)都發(fā)完了,再發(fā)送FIN唉匾,同時(shí)等待我的主機(jī)應(yīng)答孕讳,這里的FIN和ACK就不能一起發(fā)送,所以需要四次巍膘。
6. 總結(jié)一下:
以上就是主機(jī)訪問網(wǎng)站時(shí)的網(wǎng)絡(luò)通信全過程卫病,歸納起來就是:
首先要通過域名找到IP,如果緩存里沒有就要請(qǐng)求DNS服務(wù)器;得到IP后開始于目的主機(jī)進(jìn)行三次握手來建立TCP連接;連接建立后進(jìn)行HTTP訪問典徘,傳輸并獲取網(wǎng)頁內(nèi)容;傳輸完后與目的主機(jī)四次揮手來斷開TCP連接。