文章首發(fā)于個(gè)人blog
歡迎指正補(bǔ)充赂弓,可聯(lián)系lionsom_lin@qq.com
目錄
- 前序
- 一、生成HTTP請(qǐng)求消息
- 二哪轿、向DNS服務(wù)器查詢(xún)Web服務(wù)器的IP地址
- 三盈魁、瀏覽器委托協(xié)議棧發(fā)送消息
- 四、IP與以太網(wǎng)的包收發(fā)操作
- 五窃诉、集線(xiàn)器杨耙、交換機(jī)、路由器
- 六褐奴、探索接入網(wǎng)和網(wǎng)絡(luò)運(yùn)營(yíng)商(沒(méi)有深入了解)
- 七按脚、服務(wù)器端的局域網(wǎng)中有什么玄機(jī)
- 八、請(qǐng)求到達(dá)Web服務(wù)器敦冬,響應(yīng)返回瀏覽器
macOS Sierra: 網(wǎng)絡(luò)實(shí)用工具幫助
前序
為什么會(huì)讀這本書(shū)辅搬?作為一名普通的iOS開(kāi)發(fā)者,在iOS開(kāi)發(fā)過(guò)程中一般使用三方庫(kù)AFNetworking來(lái)進(jìn)行網(wǎng)絡(luò)請(qǐng)求脖旱,很少使用到系統(tǒng)的網(wǎng)絡(luò)請(qǐng)求接口NSURLSession堪遂,頂多頂多使用過(guò)socket套接字進(jìn)行網(wǎng)絡(luò)請(qǐng)求,這里是我用socket與FastDFS文件服務(wù)器進(jìn)行交互的一個(gè)demo萌庆。所以我們作為上層開(kāi)發(fā)者一般只會(huì)使用規(guī)定好的接口溶褪,根本不會(huì)在意網(wǎng)絡(luò)請(qǐng)求底層是如何實(shí)現(xiàn)或者說(shuō)是如何傳遞數(shù)據(jù)的,基于這種情況践险,我也就很好奇網(wǎng)絡(luò)請(qǐng)求底層是如何如何的猿妈。
于是我也就在亞馬遜上挑選了這本《網(wǎng)絡(luò)是怎樣連接的》書(shū)籍來(lái)進(jìn)行閱讀,希望能從中得到些許啟發(fā)巍虫,借此文章來(lái)記錄一些我對(duì)網(wǎng)絡(luò)的理解彭则。
整體結(jié)構(gòu)
快速溫習(xí)
一、生成HTTP請(qǐng)求消息
1.1占遥、瀏覽器輸入U(xiǎn)RL
1.2俯抖、首先根據(jù)HTTP的規(guī)則,解析URL
1.3瓦胎、URL省略文件名的幾種情況
a)芬萍、http://www.baidu.com/dir/
在
/dir/
后面省略了訪問(wèn)的文件名庇茫,服務(wù)器已經(jīng)默認(rèn)設(shè)置在省略文件名情況下要訪問(wèn)的默認(rèn)文件名馋袜,一般都會(huì)訪問(wèn)/dir/index.html
或者/dir/default.html
。
一般處理方案:如果web服務(wù)器上存在dir文件负芋,則將dir當(dāng)作文件名來(lái)處理瓶盛;如果web服務(wù)器上存在名為dir的目錄,則將dir當(dāng)作目錄來(lái)處理。
這個(gè)URL表示:它訪問(wèn)一個(gè)名叫
/
的目錄芝硬。由于省略了文件名,所以根據(jù)上一種情況轧房,它訪問(wèn)的文件也就是/index.html
或者/default.html
拌阴。
注釋?zhuān)?code>/目錄表示的是目錄層級(jí)中最頂級(jí)的『根目錄』。
d)奶镶、http://www.baidu.com
沒(méi)有路徑時(shí)迟赃,表示訪問(wèn)
根目錄
下事先設(shè)置的默認(rèn)文件夾,也就是/index.html
或者/default.html
厂镇。
1.4纤壁、HTTP的基本思路
HTTP協(xié)議:它定義了客戶(hù)端與服務(wù)器之間交互信息的內(nèi)容和步驟
HTTP請(qǐng)求消息包含『對(duì)什么』和『進(jìn)行怎樣的操作』兩個(gè)部分。
其中相當(dāng)于『對(duì)什么』的部分稱(chēng)為URI捺信。一般來(lái)說(shuō)URI的內(nèi)容是一個(gè)存放網(wǎng)頁(yè)的文件名或者是一個(gè)CGI程序的文件名酌媒,例如"/dir/file.html"、"/dir/program.cgi"等迄靠。
其中『進(jìn)行怎樣的操作』的部分稱(chēng)為方法秒咨。方法表示需要讓web服務(wù)器完成怎樣的工作,其中典型的例子包括讀取URI表示的數(shù)據(jù)掌挚、將客戶(hù)端輸入的數(shù)據(jù)傳遞給CGI程序等雨席。
URI:Uniform Resource Identifier,統(tǒng)一資源標(biāo)識(shí)符
CGI程序:對(duì)web服務(wù)器程序調(diào)用其他程序的規(guī)則所做的定義就是CGI吠式,安裝這個(gè)規(guī)則來(lái)工作的程序就是CGI程序陡厘。
HTTP的主要方法
方法 | 含義 |
---|---|
GET | 獲取URI指定的信息,如果URI指定的文件特占,則返回文件的內(nèi)容糙置;如果URI指定的是CGI程序,則返回該程序的輸出數(shù)據(jù) |
POST | 從客戶(hù)端向服務(wù)器發(fā)送數(shù)據(jù)摩钙。一般用于發(fā)送表單中填寫(xiě)的數(shù)據(jù)等情況下罢低。 |
1.5查辩、生成HTTP請(qǐng)求消息
HTTP消息在格式上是有嚴(yán)格規(guī)定的胖笛,因此瀏覽器會(huì)按照規(guī)定的格式來(lái)生成請(qǐng)求消息。
1.6宜岛、發(fā)送請(qǐng)求后收到響應(yīng)消息
響應(yīng)狀態(tài)碼
1.7长踊、請(qǐng)求網(wǎng)頁(yè)中包含圖片
1條請(qǐng)求消息中只能寫(xiě)一個(gè)URI,如果需要獲取多個(gè)文件萍倡,必須對(duì)每個(gè)文件單獨(dú)發(fā)送1條請(qǐng)求
二身弊、向DNS服務(wù)器查詢(xún)Web服務(wù)器的IP地址
瀏覽器能夠解析網(wǎng)址并生成HTTP消息,但它本身不具備將消息發(fā)送到網(wǎng)絡(luò)的功能,因此這一功能需要委托操作系統(tǒng)來(lái)實(shí)現(xiàn)阱佛。在委托操作系統(tǒng)發(fā)送消息時(shí)帖汞,必須提供通訊對(duì)象的IP地址,而不是域名凑术,因此在HTTP消息之后翩蘸,我們需要根據(jù)域名查詢(xún)IP地址。
2.1淮逊、TCP/IP網(wǎng)絡(luò)
互聯(lián)網(wǎng)和公司內(nèi)部的局域網(wǎng)都是基于TCP/IP的思路來(lái)設(shè)計(jì)的催首,TCP/IP的結(jié)構(gòu)就是由一些小的子網(wǎng),通過(guò)路由器連接起來(lái)組成一個(gè)大的網(wǎng)絡(luò)泄鹏,這里的子網(wǎng)可以理解為用集線(xiàn)器連接起來(lái)的幾臺(tái)計(jì)算機(jī)郎任,我們將它看成一個(gè)單位,稱(chēng)為子網(wǎng)备籽,將子網(wǎng)通過(guò)路由器連接起來(lái)舶治,就形成一個(gè)網(wǎng)絡(luò)。
2.2胶台、IP地址
在網(wǎng)絡(luò)中歼疮,所有的設(shè)備都會(huì)被分配一個(gè)地址,這個(gè)地址就相當(dāng)于顯示中某一條路上的"XX號(hào)XX室"诈唬,其中"號(hào)"對(duì)應(yīng)的號(hào)碼是分配給整個(gè)子網(wǎng)的韩脏,而"室"對(duì)應(yīng)的號(hào)碼是分配給子網(wǎng)中的計(jì)算機(jī)的,這就是網(wǎng)絡(luò)中的地址铸磅。"號(hào)"稱(chēng)為網(wǎng)絡(luò)號(hào)赡矢,"室"稱(chēng)為主機(jī)號(hào),整個(gè)地址稱(chēng)為
IP地址
阅仔。
IP地址 = 網(wǎng)絡(luò)號(hào) + 主機(jī)號(hào)
預(yù)熱:數(shù)據(jù)傳遞過(guò)程
通過(guò)IP地址我們可以判斷出訪問(wèn)對(duì)象服務(wù)器的位置吹散,從而將消息發(fā)送到服務(wù)器。消息傳送的具體過(guò)程在后面的章節(jié)有詳細(xì)講解八酒,不過(guò)現(xiàn)在我們先簡(jiǎn)單了解一下空民。發(fā)送者發(fā)出的消息首先經(jīng)過(guò)子網(wǎng)中的集線(xiàn)器,轉(zhuǎn)發(fā)到距離發(fā)送者最近的路由器上(上圖①)羞迷。接下來(lái)界轩,路由器會(huì)根據(jù)消息的目的地判斷下一個(gè)路由器的位置,然后將消息發(fā)送到下一個(gè)路由器衔瓮,即消息再次經(jīng)過(guò)子網(wǎng)內(nèi)的集線(xiàn)器被轉(zhuǎn)發(fā)到下一個(gè)路由器(上圖②)浊猾。前面的過(guò)程不斷重復(fù),最終消息就被傳送到了目的地热鞍。
2.3葫慎、IP地址結(jié)構(gòu)
實(shí)際的IP地址是一串32比特(bit)的數(shù)字衔彻,按照8bit=1byte(字節(jié))為一組分成4組,分別用十進(jìn)制表示偷办。這就是我們常見(jiàn)的IP地址格式艰额,但僅憑這一串?dāng)?shù)字我們無(wú)法區(qū)分哪部分是網(wǎng)絡(luò)號(hào),哪部分是主機(jī)號(hào)椒涯。在IP地址的規(guī)則中悴晰,網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)連起來(lái)總共是32比特,但這兩部分的具體結(jié)構(gòu)是不固定的逐工。在組建網(wǎng)絡(luò)時(shí)铡溪,用戶(hù)可以自行決定它們之間的分配關(guān)系,因此泪喊,我們還需要另外的附加信息來(lái)表示IP地址的內(nèi)部結(jié)構(gòu)棕硫。
IP地址的主機(jī)號(hào):
全0:表示
整個(gè)子網(wǎng)
全1:表示向子網(wǎng)上所有設(shè)備發(fā)送包,即
『廣播』
【拓展】
問(wèn):有了 IP 地址袒啼,為什么還要用 MAC 地址哈扮?
答:知乎-有了 IP 地址,為什么還要用 MAC 地址蚓再?
2.4滑肉、瀏覽器如何向DNS服務(wù)器發(fā)出查詢(xún)的呢?
DNS解析器
向 DNS服務(wù)器發(fā)出查詢(xún)摘仅,也就是向DNS服務(wù)器發(fā)送查詢(xún)消息靶庙,并接收服務(wù)器返回的響應(yīng)消息。換句話(huà)說(shuō)娃属,對(duì)于 DNS服務(wù)器六荒,我們的計(jì)算機(jī)上一定有相應(yīng)的 DNS客戶(hù)端,而相當(dāng)于 DNS客戶(hù)端的部分稱(chēng)為
DNS解析器
矾端,或者簡(jiǎn)稱(chēng)解析器
掏击。通過(guò) DNS查詢(xún) IP地址的操作稱(chēng)為域名解析
,因此負(fù)責(zé)執(zhí)行解析( resolution)這一操作的就叫解析器( resolver)了秩铆。解析器實(shí)際上是一段程序砚亭,它包含在操作系統(tǒng)的 Socket庫(kù)中。
庫(kù)
首先殴玛,庫(kù)到底是什么東西呢捅膘?庫(kù)就是一堆通用程序組件的集合,其他的應(yīng)用程序都需要使用其中的組件族阅。庫(kù)有很多好處篓跛。首先膝捞,使用現(xiàn)成的組件搭建應(yīng)用程序可以節(jié)省編程工作量坦刀;其次愧沟,多個(gè)程序使用相同的組件可以實(shí)現(xiàn)程序的標(biāo)準(zhǔn)化。除此之外還有很多其他的好處鲤遥,因此使用庫(kù)來(lái)進(jìn)行軟件開(kāi)發(fā)的思路已經(jīng)非常普及沐寺,庫(kù)的種類(lèi)和數(shù)量也非常之多。
Socket庫(kù)
Socket庫(kù)也是一種庫(kù)盖奈,是用于調(diào)用網(wǎng)絡(luò)功能的程序組件集合混坞。其中包含的程序組件可以讓其他的應(yīng)用程序調(diào)用操作系統(tǒng)的網(wǎng)絡(luò)功能 ,而
解析器
就是這個(gè)庫(kù)中的其中一種程序組件钢坦。
2.5究孕、如何通過(guò)解析器向DNS服務(wù)器發(fā)出查詢(xún)
根據(jù)域名查詢(xún) IP地址時(shí),瀏覽器會(huì)使用 Socket庫(kù)中的解析器爹凹。
調(diào)用解析器后厨诸,解析器會(huì)向 DNS服務(wù)器發(fā)送查詢(xún)消息,然后DNS服務(wù)器會(huì)返回響應(yīng)消息禾酱。響應(yīng)消息中包含查詢(xún)到的IP地址微酬,解析器會(huì)取出 IP地址,并將其寫(xiě)入瀏覽器指定的內(nèi)存地址中颤陶。只要運(yùn)行圖 1.11中的這一行程序颗管,就可以完成前面所有這些工作,我們也就完成了IP地址的查詢(xún)滓走。接下來(lái)垦江,瀏覽器在向 Web服務(wù)器發(fā)送消息時(shí),只要從該內(nèi)存地址取出 IP地址搅方,并將它與HTTP請(qǐng)求消息一起交給操作系統(tǒng)就可以了疫粥。
2.6、如何獲取DNS服務(wù)器IP地址论泛?(Domain Name System散劫,域名系統(tǒng))
向 DNS服務(wù)器發(fā)送消息時(shí),我們當(dāng)然也需要知道 DNS服務(wù)器的 IP地址慷彤。只不過(guò)這個(gè) IP地址是作為 TCP/ IP的一個(gè)設(shè)置項(xiàng)目事先設(shè)置好的,不需要再去查詢(xún)了怖喻。不同的操作系統(tǒng)中 TCP/ IP的設(shè)置方法也有差異底哗, MAC中的設(shè)置如下圖所示,解析器會(huì)根據(jù)這里設(shè)置的 DNS服務(wù)器 IP地址來(lái)發(fā)送消息锚沸。
2.7跋选、DNS服務(wù)器是如何工作的
DNS服務(wù)器會(huì)從域名與 IP地址的對(duì)照表中查找相應(yīng)的記錄,并返回 IP地址哗蜈。
域名
服務(wù)器前标、郵件服務(wù)器(郵件地址中 @后面的部分)的名稱(chēng)
Class
在最早設(shè)計(jì) DNS方案時(shí)坠韩, DNS在互聯(lián)網(wǎng)以外的其他網(wǎng)絡(luò)中的應(yīng)用也被考慮到了,而 Class就是用來(lái)識(shí)別網(wǎng)絡(luò)的信息炼列。不過(guò)只搁,如今除了互聯(lián)網(wǎng)并沒(méi)有其他的網(wǎng)絡(luò)了,因此 Class的值永遠(yuǎn)是代表互聯(lián)網(wǎng)的 IN
記錄類(lèi)型
例如:A = IP地址
MX = 郵件服務(wù)器
CNAME = 域名相關(guān)的別名
表示域名對(duì)應(yīng)何種類(lèi)型的記錄俭尖。例如氢惋,當(dāng)類(lèi)型為 A時(shí),表示域名對(duì)應(yīng)的是 IP地址稽犁;當(dāng)類(lèi)型為 MX時(shí)焰望,表示域名對(duì)應(yīng)的是郵件服務(wù)器。對(duì)于不同的記錄類(lèi)型已亥,服務(wù)器向客戶(hù)端返回的信息也會(huì)不同
2.8柿估、如何在數(shù)萬(wàn)DNS服務(wù)器中找到目標(biāo)DNS服務(wù)器
域名層次結(jié)構(gòu)
DNS中的域名都是用句點(diǎn)來(lái)分隔的,比如 www.lab.glasscom.com陷猫,這里的句點(diǎn)代表了不同層次之間的界限秫舌,就相當(dāng)于公司里面的組織結(jié)構(gòu)不用部、科之類(lèi)的名稱(chēng)來(lái)劃分绣檬,只是用句點(diǎn)來(lái)分隔而已 足陨。
在域名中,越靠右的位置表示其層級(jí)越高
娇未,比如 www. lab. glasscom. com這個(gè)域名如果按照公司里的組織結(jié)構(gòu)來(lái)說(shuō)墨缘,大概就是“ com事業(yè)集團(tuán) glasscom部 lab科的 www”這樣。其中零抬,相當(dāng)于一個(gè)層級(jí)的部分稱(chēng)為域镊讼。因此, com域的下一層是 glasscom域平夜,再下一層是 lab域蝶棋,再下面才是 www這個(gè)名字。
根域
com忽妒、jp玩裙、cn這些域(稱(chēng)為頂級(jí)域)就是最頂層了,它們各自負(fù)責(zé)保存下級(jí)DNS服務(wù)器的信息段直,但實(shí)際上并非如此吃溅。在互聯(lián)網(wǎng)中,com和 jp的上面還有一級(jí)域鸯檬,稱(chēng)為根域决侈。根域不像 com、 jp那樣有自己的名字喧务,因此在一般書(shū)寫(xiě)域名時(shí)經(jīng)常被省略赖歌,如果要明確表示根域枉圃,應(yīng)該像 www. lab. glasscom. com.這樣在域名的最后再加上一個(gè)句點(diǎn),而這個(gè)最后的句點(diǎn)就代表根域俏站。不過(guò),一般都不寫(xiě)最后那個(gè)句點(diǎn)痊土,因此根域的存在往往被忽略肄扎,但根域畢竟是真實(shí)存在的,根域的 DNS服務(wù)器中保管著 com赁酝、 jp等的 DNS服務(wù)器的信息犯祠。由于上級(jí) DNS服務(wù)器保管著所有下級(jí) DNS服務(wù)器的信息,所以我們可以從根域開(kāi)始一路往下順藤摸瓜找到任意一個(gè)域的 DNS服務(wù)器酌呆。
通過(guò)根域找到目標(biāo)DNS服務(wù)器
還需要完成另一項(xiàng)工作衡载,那就是將根域的 DNS服務(wù)器信息保存在互聯(lián)網(wǎng)中所有的 DNS服務(wù)器中。這樣一來(lái)隙袁,任何 DNS服務(wù)器就都可以找到并訪問(wèn)根域 DNS服務(wù)器了痰娱。因此,客戶(hù)端只要能夠找到任意一臺(tái) DNS服務(wù)器菩收,就可以通過(guò)它找到根域 DNS服務(wù)器梨睁,然后再一路順藤摸瓜找到位于下層的某臺(tái)目標(biāo) DNS服務(wù)器。分配給根域 DNS服務(wù)器的 IP地址在全世界僅有 13個(gè)娜饵,而且這些地址幾乎不發(fā)生變化坡贺,因此將這些地址保存在所有的 DNS服務(wù)器中也并不是一件難事。實(shí)際上箱舞,根域 DNS服務(wù)器的相關(guān)信息已經(jīng)包含在 DNS服務(wù)器程序的配置文件中了遍坟,因此只要安裝了 DNS服務(wù)器程序,這些信息也就被自動(dòng)配置好了晴股。
三愿伴、瀏覽器委托協(xié)議棧發(fā)送消息
整體流程一覽圖
3.1、創(chuàng)建套接字
<描述符> = socket(<使用IPv4>,<使用TCP>,...)
瀏覽器調(diào)用Socket庫(kù)中socket程序組件电湘,和調(diào)用解析器一樣公般,調(diào)用socket之后,控制流程會(huì)轉(zhuǎn)移到socket內(nèi)部并執(zhí)行創(chuàng)建套接字的操作胡桨,完成之后控制流程又會(huì)被移交回應(yīng)用程序官帘。
應(yīng)用程序調(diào)用 socket申請(qǐng)創(chuàng)建套接字,協(xié)議棧根據(jù)應(yīng)用程序的申請(qǐng)執(zhí)行創(chuàng)建套接字的操作昧谊。在這個(gè)過(guò)程中刽虹,協(xié)議棧首先會(huì)分配用于存放一個(gè)套接字所需的內(nèi)存空間,然后寫(xiě)入初始狀態(tài)呢诬。此內(nèi)存空間用于記錄套接字的控制信息涌哲。
套接字 創(chuàng)建成功后胖缤,協(xié)議棧會(huì)返回一個(gè)描述符,應(yīng)用程序會(huì)將收到的描述符存放在內(nèi)存中阀圾。
描述符
應(yīng)用程序是通過(guò)“描述符”這一類(lèi) 似號(hào)碼牌的東西來(lái)識(shí)別套接字的哪廓。
描述符是用來(lái)識(shí)別不同的套接字的,大家可以作如下理解初烘。我們現(xiàn)在只關(guān)注了瀏覽器訪問(wèn) Web服務(wù)器的過(guò)程涡真,但實(shí)際上計(jì)算機(jī)中會(huì)同時(shí)進(jìn)行多個(gè)數(shù)據(jù)的通信操作,比如可以打開(kāi)兩個(gè)瀏覽器窗口肾筐,同時(shí)訪問(wèn)兩臺(tái) Web服務(wù)器哆料。這時(shí),有兩個(gè)數(shù)據(jù)收發(fā)操作在同時(shí)進(jìn)行吗铐,也就需要?jiǎng)?chuàng)建兩個(gè)不同的套接字东亦。這個(gè)例子說(shuō)明,同一臺(tái)計(jì)算機(jī)上可能同時(shí)存在多個(gè)套接字唬渗,在這樣的情況下典阵,我們就需要一種方法來(lái)識(shí)別出某個(gè)特定的套接字,這種方法就是描述符镊逝。我們可以將描述符理解成給某個(gè)套接字分配的編號(hào)萄喳。也許光說(shuō)編號(hào)還不夠形象,大家可以想象一下在酒店寄存行李時(shí)的場(chǎng)景蹋半,酒店服務(wù)人員會(huì)給你一個(gè)號(hào)碼牌他巨,向服務(wù)人員出示號(hào)碼牌,就可以取回自己寄存的行李减江,描述符的原理和這個(gè)差不多染突。當(dāng)創(chuàng)建套接字后,我們就可以使用這個(gè)套接字來(lái)執(zhí)行收發(fā)數(shù)據(jù)的操作了辈灼。這時(shí)份企,只要我們出示描述符,協(xié)議棧就能夠判斷出我們希望用哪一個(gè)套接字來(lái)連接或者收發(fā)數(shù)據(jù)了巡莹。
由于套接字中記錄了通信雙方的信息以及通信處于怎樣的狀態(tài)司志,所以只要通過(guò)描述符確定了相應(yīng)的套接字,協(xié)議棧就能夠獲取所有的相關(guān)信息降宅,這樣一來(lái)骂远,應(yīng)用程序就不需要每次都告訴協(xié)議棧應(yīng)該和誰(shuí)進(jìn)行通信了。
套接字
socket本質(zhì)是編程接口(API)腰根,對(duì)TCP/IP的封裝激才,TCP/IP也要提供可供程序員做網(wǎng)絡(luò)開(kāi)發(fā)所用的接口,這就是Socket編程接口。
套接字是網(wǎng)絡(luò)通信過(guò)程中端點(diǎn)的抽象表示瘸恼,包含進(jìn)行網(wǎng)絡(luò)通信必需的五種信息:連接使用的協(xié)議劣挫,本地主機(jī)的IP地址,本地進(jìn)程的協(xié)議端口东帅,遠(yuǎn)地主機(jī)的IP地址压固,遠(yuǎn)地進(jìn)程的協(xié)議端口。
socket = IP address + TCP/UDP + port靠闭。
Mac查看實(shí)際的套接字
協(xié)議棧
操作系統(tǒng)中的網(wǎng)絡(luò)控制軟件也就是協(xié)議棧帐我,網(wǎng)絡(luò)硬件是網(wǎng)卡。
套接字與協(xié)議棧之間的關(guān)系
套接字中記錄了用于控制通信操作的各種控制信息阎毅,協(xié)議棧則需要根據(jù)這些信息判斷下一步的行動(dòng)焚刚,這就是套接字的作用点弯。
協(xié)議棧是根據(jù)套接字中記錄的控制信息來(lái)工作的扇调。
網(wǎng)絡(luò)協(xié)議
OSI七層網(wǎng)絡(luò)模型(Open System Interconnect) | TCP/IP網(wǎng)絡(luò)模型 | 對(duì)應(yīng)網(wǎng)絡(luò)協(xié)議 |
---|---|---|
應(yīng)用層(Application) | HTTP、FTP抢肛、TFTP狼钮、SMTP、NFS | |
表示層(Presentation) | 應(yīng)用層 | |
會(huì)話(huà)層(Session) | SMTP捡絮、DNS | |
傳輸層(Transport) | 傳輸層 | TCP熬芜、UDP |
網(wǎng)絡(luò)層(Network) | 網(wǎng)絡(luò)層 | IP、ARP福稳、ICMP |
數(shù)據(jù)鏈路層(Data Link) | 數(shù)據(jù)鏈路層 | |
物理層(Physical) | 物理層 |
3.2涎拉、連接服務(wù)器
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr* servaddr, socklen_t addrlen); // 返回:成功為0,出錯(cuò)-1
應(yīng)用程序通過(guò)調(diào)用 Socket庫(kù)中的名為 connect的程序組件來(lái)完成這一操作的圆。
第一個(gè)參數(shù):即描述符鼓拧,connect會(huì)將應(yīng)用程序指定的描述符告知協(xié)議棧,然后協(xié)議棧根據(jù)這個(gè)描述符來(lái)判斷到底使用哪一個(gè)套接字去和服務(wù)器端的套接字進(jìn)行連接越妈,并執(zhí)行連接的操作
第二個(gè)參數(shù)萍聊,即服務(wù)器 IP地址笤闯,就是通過(guò) DNS服務(wù)器查詢(xún)得到的我們要訪問(wèn)的服務(wù)器的 IP地址。
第三個(gè)參數(shù),即端口號(hào)墨微,IP地址是為了區(qū)分網(wǎng)絡(luò)中的各個(gè)計(jì)算機(jī)而分配的數(shù)值。因此沦辙,只要知道了 IP地址司浪,我們就可以識(shí)別出網(wǎng)絡(luò)上的某臺(tái)計(jì)算機(jī)。但是且叁,連接操作的對(duì)象是某個(gè)具體的套接字祭示,因此必須要識(shí)別到具體的套接字才行,而僅憑IP地址是無(wú)法做到這一點(diǎn)的。
如果說(shuō)描述符是用來(lái)在一臺(tái)計(jì)算機(jī)內(nèi)部識(shí)別套接字的機(jī)制质涛,那么端口號(hào)就是用來(lái)讓通信的另一方能夠識(shí)別出套接字的機(jī)制稠歉。
服務(wù)器上所使用的端口號(hào)是根據(jù)應(yīng)用的種類(lèi)事先規(guī)定好的,僅此而已汇陆。
Web是 80號(hào)端口怒炸,電子郵件是 25號(hào)端口 65
問(wèn)題:我們知道了服務(wù)器的端口號(hào),但是服務(wù)器不知道客戶(hù)端的端口號(hào)毡代?
既然確定連接對(duì)象的套接字需要使用端口號(hào)阅羹,那么服務(wù)器也得知道客戶(hù)端的套接字號(hào)碼才行吧,這個(gè)問(wèn)題是怎么解決的呢教寂?
事情是這樣的捏鱼,首先,客戶(hù)端在創(chuàng)建套接字時(shí)酪耕,協(xié)議棧會(huì)為這個(gè)套接字隨便分配一個(gè)端口號(hào)导梆。接下來(lái),當(dāng)協(xié)議棧執(zhí)行連接操作時(shí)看尼,會(huì)將這個(gè)隨便分配的端口號(hào)通知給服務(wù)器。
連接服務(wù)器本質(zhì)
連接實(shí)際上是通信雙方交換控制信息
控制信息
通信操作中使用的控制信息分為兩類(lèi)盟步。
(1)頭部中記錄的信息
(2)套接字(協(xié)議棧中的內(nèi)存空間)中記錄的信息
控制信息一:頭部中記錄的信息
他們是客戶(hù)端和服務(wù)器相互聯(lián)絡(luò)時(shí)交換的控制信息藏斩。這些字段是固定的,在連接却盘、收發(fā)狰域、斷開(kāi)等各個(gè)階段中,每次客戶(hù)端和服務(wù)器之間進(jìn)行通信時(shí)黄橘,都需要提供這些控制信息兆览。具體來(lái)說(shuō),這些信息會(huì)被添加在客戶(hù)端與服務(wù)器之間傳遞的網(wǎng)絡(luò)包的開(kāi)頭旬陡。在連接階段拓颓,由于數(shù)據(jù)收發(fā)還沒(méi)有開(kāi)始驶睦,網(wǎng)絡(luò)包中沒(méi)有實(shí)際的數(shù)據(jù)溉痢,只有控制信息镀娶。這些控制信息位于網(wǎng)絡(luò)包的開(kāi)頭轩娶,因此被稱(chēng)為頭部嘁酿。此外游桩,以太網(wǎng)和IP協(xié)議也有自己的控制信息铐刘,這些信息也叫 頭部,為了避免各種不同的頭部發(fā)生混淆,我們一般會(huì)記作 TCP頭部、以太網(wǎng)頭部、 IP頭部。
控制信息二:套接字(協(xié)議棧中的內(nèi)存空間)中記錄的信息
那就是保存在套接字中功偿,用來(lái)控制協(xié)議棧操作的信息痹兜。應(yīng)用程序傳遞來(lái)的信息以及從通信對(duì)象接收到的信息都會(huì)保存在這里遗淳,還有收發(fā)數(shù)據(jù)操作的執(zhí)行狀態(tài)等信息也會(huì)保存在這里,協(xié)議棧會(huì)根據(jù)這些信息來(lái)執(zhí)行每一步的操作堕油。
3.2.1艰毒、連接操作的實(shí)際過(guò)程
這個(gè)過(guò)程是從應(yīng)用程序調(diào)用 Socket庫(kù)的connect開(kāi)始的(看上圖『整體流程一覽圖』中②)。 >
connect(<描述符>,<服務(wù)器IP地址和端口號(hào)>, …)
連接操作的第一步是在 TCP模塊處創(chuàng)建表示連接控制信息的頭部狐榔。
通過(guò) TCP頭部中的發(fā)送方和接收方端口號(hào)可以找到要連接的套接字。
TCP建立連接要進(jìn)行“三次握手”
- 客戶(hù)端向服務(wù)器發(fā)送一個(gè)SYN J
- 服務(wù)器向客戶(hù)端響應(yīng)一個(gè)SYN K球碉,并對(duì)SYN J進(jìn)行確認(rèn)ACK J+1
- 客戶(hù)端再向服務(wù)器發(fā)一個(gè)確認(rèn)ACK K+1
從圖中可以看出能庆,當(dāng)客戶(hù)端調(diào)用connect時(shí)船逮,觸發(fā)了連接請(qǐng)求,向服務(wù)器發(fā)送了SYN J包粤铭,這時(shí)connect進(jìn)入阻塞狀態(tài)挖胃;服務(wù)器監(jiān)聽(tīng)到連接請(qǐng)求,即收到SYN J包,調(diào)用accept函數(shù)接收請(qǐng)求向客戶(hù)端發(fā)送SYN K 寿谴,ACK J+1瓢姻,這時(shí)accept進(jìn)入阻塞狀態(tài);客戶(hù)端收到服務(wù)器的SYN K ,ACK J+1之后,這時(shí)connect返回蔓罚,并對(duì)SYN K進(jìn)行確認(rèn)萄唇;服務(wù)器收到ACK K+1時(shí),accept返回移国,至此三次握手完畢,連接建立寞酿。
建立連接之后秦踪,協(xié)議棧的連接操作就結(jié)束了,也就是說(shuō) connect已經(jīng)執(zhí)行完畢掸茅,控制流程被交回到應(yīng)用程序椅邓。
3.3、收發(fā)數(shù)據(jù)
3.3.1昧狮、將HTTP請(qǐng)求消息交給協(xié)議棧
接下來(lái)就進(jìn)入數(shù)據(jù)收發(fā)階段了景馁。數(shù)據(jù)收發(fā)操作是從應(yīng)用程序調(diào)用 write將要發(fā)送的數(shù)據(jù)交給協(xié)議棧開(kāi)始的(看上圖『整體流程一覽圖』中③),協(xié)議棧收到數(shù)據(jù)后執(zhí)行發(fā)送操作逗鸣。
MTU: Maximum Transmission Unit合住,最大傳輸單元。一個(gè)網(wǎng)絡(luò)包的最大長(zhǎng)度撒璧,以太網(wǎng)中一般為 1500字節(jié)透葛。
MSS: Maximum Segment Size,最大分段大小卿樱。除去頭部之后僚害,一個(gè)網(wǎng)絡(luò)包所能容納的 TCP數(shù)據(jù)的最大長(zhǎng)度。TCP和 IP的頭部加起來(lái)一般是 40字節(jié)繁调,因此 MTU減去這個(gè)長(zhǎng)度就是 MSS萨蚕。例如,在以太網(wǎng)中蹄胰, MTU為 1500岳遥,因此 MSS就是 1460。 TCP/ IP可以使用一些可選參數(shù)( protocol option)裕寨,如加密等浩蓉,這時(shí)頭部的長(zhǎng)度會(huì)增加,那么 MSS就會(huì)隨著頭部長(zhǎng)度增加而相應(yīng)縮短宾袜。
3.3.2捻艳、對(duì)較大數(shù)據(jù)進(jìn)行拆分
應(yīng)用程序的數(shù)據(jù)一般都比較大,因此 TCP會(huì)按照網(wǎng)絡(luò)包的大小對(duì)數(shù)據(jù)進(jìn)行拆分试和。
3.3.3讯泣、TCP通過(guò)ACK號(hào)確保網(wǎng)絡(luò)包是否收到
通過(guò)“序號(hào)”和“ ACK號(hào)”可以確認(rèn)接收方是否收到了網(wǎng)絡(luò)包。
3.3.4阅悍、接受HTTP響應(yīng)消息
首先好渠,瀏覽器在委托協(xié)議棧發(fā)送請(qǐng)求消息之后,會(huì)調(diào)用read程序(看上圖『整體流程一覽圖』中④)來(lái)獲取響應(yīng)消息节视。然后拳锚,控制流程會(huì)通過(guò)read轉(zhuǎn)移到協(xié)議棧,然后協(xié)議棧會(huì)執(zhí)行接下來(lái)
的操作寻行。和發(fā)送數(shù)據(jù)一樣霍掺,接收數(shù)據(jù)也需要將數(shù)據(jù)暫存到接收緩沖區(qū)中,這里的操作過(guò)程如下。首先杆烁,協(xié)議棧嘗試從接收緩沖區(qū)中取出數(shù)據(jù)并傳遞給應(yīng)用程序牙丽,但這個(gè)時(shí)候請(qǐng)求消息剛剛發(fā)送出去,響應(yīng)消息可能還沒(méi)返回兔魂。響應(yīng)消息的返回還需要等待一段時(shí)間烤芦,因此這時(shí)接收緩沖區(qū)中并沒(méi)有數(shù)據(jù),那么接收數(shù)據(jù)的操作也就無(wú)法繼續(xù)析校。這時(shí)构罗,協(xié)議棧會(huì)將應(yīng)用程序的委托,也就是從接收緩沖區(qū)中取出數(shù)據(jù)并傳遞給應(yīng)用程序的工作暫時(shí)掛起智玻,等服務(wù)器返回的響應(yīng)消息到達(dá)之后再繼續(xù)執(zhí)行接收操作遂唧。
協(xié)議棧會(huì)檢查收到的數(shù)據(jù)塊和 TCP頭部的內(nèi)容,判斷是否有數(shù)據(jù)丟失吊奢,如果沒(méi)有問(wèn)題則返回 ACK號(hào)盖彭。然后,協(xié)議棧將數(shù)據(jù)塊暫存到接收緩沖區(qū)中事甜,并將數(shù)據(jù)塊按順序連接起來(lái)還原出原始的數(shù)據(jù)谬泌,最后將數(shù)據(jù)交給應(yīng)用程序。具體來(lái)說(shuō)逻谦,協(xié)議棧會(huì)將接收到的數(shù)據(jù)復(fù)制到應(yīng)用程序指定的內(nèi)存地址中掌实,然后將控制流程交回應(yīng)用程序。將數(shù)據(jù)交給應(yīng)用程序之后邦马,協(xié)議棧還需要找到合適的時(shí)機(jī)向發(fā)送方發(fā)送窗口更新贱鼻。
3.4、斷開(kāi)連接滋将,并刪除套接字
3.4.1邻悬、從服務(wù)器端斷開(kāi)連接
這里我們以服務(wù)器一方發(fā)起斷開(kāi)過(guò)程為例來(lái)進(jìn)行講解。
首先随闽,服務(wù)器一方的應(yīng)用程序會(huì)調(diào)用Socket庫(kù)的close程序父丰。然后,服務(wù)器的協(xié)議棧會(huì)生成包含斷開(kāi)信息的 TCP頭部掘宪,具體來(lái)說(shuō)就是將控制位中的 FIN比特設(shè)為 1蛾扇。接下來(lái),協(xié)議棧會(huì)委托 IP模塊向客戶(hù)端發(fā)送數(shù)據(jù)魏滚。同時(shí)镀首,服務(wù)器的套接字中也會(huì)記錄下斷開(kāi)操作的相關(guān)信息。
3.4.2鼠次、從客戶(hù)端斷開(kāi)連接
- 應(yīng)用進(jìn)程首先調(diào)用close主動(dòng)關(guān)閉連接更哄,這時(shí)TCP發(fā)送一個(gè)FIN M芋齿;
- 另一端接收到FIN M之后,執(zhí)行被動(dòng)關(guān)閉成翩,對(duì)這個(gè)FIN進(jìn)行確認(rèn)觅捆。它的接收也作為文件結(jié)束符傳遞給應(yīng)用進(jìn)程,因?yàn)镕IN的接收意味著應(yīng)用進(jìn)程在相應(yīng)的連接上再也接收不到額外數(shù)據(jù)捕传;
- 一段時(shí)間之后惠拭,接收到文件結(jié)束符的應(yīng)用進(jìn)程調(diào)用close關(guān)閉它的socket扩劝。這導(dǎo)致它的TCP也發(fā)送一個(gè)FIN N庸论;
- 接收到這個(gè)FIN的源發(fā)送端TCP對(duì)它進(jìn)行確認(rèn)。
3.4.3棒呛、刪除套接字
和服務(wù)器的通信結(jié)束之后聂示,用來(lái)通信的套接字也就不會(huì)再使用了,這時(shí)我們就可以刪除這個(gè)套接字了簇秒。不過(guò)鱼喉,套接字并不會(huì)立即被刪除,而是會(huì)等待一段時(shí)間之后再被刪除趋观。等待這段時(shí)間是為了防止誤操作扛禽。
誤操作舉例:如果最后客戶(hù)端返回的 ACK號(hào)丟失了,結(jié)果會(huì)如何呢皱坛?這時(shí)编曼,服務(wù)器沒(méi)有接收到 ACK號(hào),可能會(huì)重發(fā)一次 FIN剩辟。如果這時(shí)客戶(hù)端的套接字已經(jīng)刪除了掐场,會(huì)發(fā)生什么事呢?套接字被刪除贩猎,那么套接字中保存的控制信息也就跟著消失了熊户,套接字對(duì)應(yīng)的端口號(hào)就會(huì)被釋放出來(lái)。這時(shí)吭服,如果別的應(yīng)用程序要?jiǎng)?chuàng)建套接字嚷堡,新套接字碰巧又被分配了同一個(gè)端口號(hào),而服務(wù)器重發(fā)的 FIN正好到達(dá)艇棕,會(huì)怎么樣呢蝌戒?本來(lái)這個(gè) FIN是要發(fā)給剛剛刪除的那個(gè)套接字的抱究,但新套接字具有相同的端口號(hào)检眯,于是這個(gè) FIN就會(huì)錯(cuò)誤地跑到新套接字里面,新套接字就開(kāi)始執(zhí)行斷開(kāi)操作了痛垛。之所以不馬上刪除套接字刺桃,就是為了防止這樣的誤操作粹淋。
TCP整個(gè)流程一覽
四、IP與以太網(wǎng)的包收發(fā)操作
4.1、包的基本知識(shí)
TCP模塊在執(zhí)行連接桃移、收發(fā)屋匕、斷開(kāi)等各階段操作時(shí),都需要委托 IP模塊將數(shù)據(jù)封裝成包發(fā)送給通信對(duì)象借杰。我們?cè)?TCP的講解中也經(jīng)常提到 IP过吻,下面就來(lái)討論一下 IP模塊是如何將包發(fā)送給對(duì)方的。
正式開(kāi)始這個(gè)話(huà)題之前蔗衡,我們先來(lái)介紹一下關(guān)于網(wǎng)絡(luò)包的一些基本知識(shí)纤虽。首先,包是由頭部和數(shù)據(jù)兩部分構(gòu)成的(下圖(a))绞惦。頭部包含目的地址等控制信息逼纸,大家可以把它理解為快遞包裹的面單;頭部后面就是委托方要發(fā)送給對(duì)方的數(shù)據(jù)济蝉,也就相當(dāng)于快遞包裹里的貨物杰刽。一個(gè)包發(fā)往目的地的過(guò)程如圖 2. 15所示。
4.2王滤、IP模塊的作用
4.2.1贺嫂、發(fā)送包的時(shí)候,IP模塊工作
收到委托后雁乡, IP模塊會(huì)將包的內(nèi)容當(dāng)作一整塊數(shù)據(jù)第喳,在前面加上包含控制信息的頭部。
IP模塊負(fù)責(zé)添加如下兩個(gè)頭部:
(1)IP頭部: IP用的頭部蔗怠,包含 IP地址墩弯。IP頭部中包含 IP協(xié)議規(guī)定的、根據(jù) IP地址將包發(fā)往目的地所需的控制信息寞射;
(2)MAC頭部:以太網(wǎng)用的頭部渔工,包含 MAC地址。MAC頭部包含通過(guò)以太網(wǎng)的局域網(wǎng)將包傳輸至最近的路由器所需的控制信息桥温。
總之引矩,加上這兩個(gè)頭部之后,一個(gè)包就封裝好了侵浸,這些就是 IP模塊負(fù)責(zé)的工作旺韭。
4.2.2、接收包的時(shí)候掏觉,IP模塊工作
返回的包也會(huì)通過(guò)轉(zhuǎn)發(fā)設(shè)備發(fā)送回來(lái)区端,然后我們需要接收這個(gè)包。接收的過(guò)程和發(fā)送的過(guò)程是相反的澳腹,信息先以電信號(hào)的形式從網(wǎng)線(xiàn)傳輸進(jìn)來(lái)织盼,然后由網(wǎng)卡將其轉(zhuǎn)換為數(shù)字信息并傳遞給 IP模塊(下圖中的“ ③接收”)杨何。接下來(lái), IP模塊會(huì)將 MAC頭部和 IP頭部后面的內(nèi)容沥邻,也就是 TCP頭部加上數(shù)據(jù)塊危虱,傳遞給 TCP模塊。接下來(lái)的操作就是我們之前講過(guò)的 TCP模塊負(fù)責(zé)的部分了唐全。
4.3埃跷、生成包含接收方IP地址的IP頭部
IP頭部的“接收方 IP地址”填寫(xiě)通信對(duì)象的 IP地址。
發(fā)送方 IP地址需要判斷發(fā)送所使用的網(wǎng)卡邮利,并填寫(xiě)該網(wǎng)卡的 IP地址弥雹。
問(wèn)題來(lái)了:一臺(tái)計(jì)算機(jī)多個(gè)網(wǎng)卡,如何設(shè)置發(fā)送方IP地址近弟?
很多服務(wù)器上都會(huì)安裝多塊網(wǎng)卡缅糟,這時(shí)一臺(tái)計(jì)算機(jī)就有多個(gè) IP地址,在填寫(xiě)發(fā)送方 IP地址時(shí)就需要判斷到底應(yīng)該填寫(xiě)哪個(gè)地址祷愉。這個(gè)判斷相當(dāng)于在多塊網(wǎng)卡中判斷應(yīng)該使用哪一塊網(wǎng)卡來(lái)發(fā)送這個(gè)包,也就相當(dāng)于判斷應(yīng)該把包發(fā)往哪個(gè)路由器赦颇,因此只要確定了目標(biāo)路由器二鳄,也就確定了應(yīng)該使用哪塊網(wǎng)卡,也就確定了發(fā)送方的 IP地址媒怯。
那么订讼,我們應(yīng)該如何判斷應(yīng)該把包交給哪塊網(wǎng)卡呢?其實(shí)和路由器使用 IP表(也叫路由表)判斷下一個(gè)路由器位置的操作是一樣的扇苞。因?yàn)閰f(xié)議棧的 IP模塊與路由器中負(fù)責(zé)包收發(fā)的部分都是根據(jù) IP協(xié)議規(guī)則來(lái)進(jìn)行包收發(fā)操作的欺殿,所以它們也都用相同的方法來(lái)判斷把包發(fā)送給誰(shuí)。
(路由器收發(fā)下一章節(jié)具體說(shuō))
查看Mac本機(jī)的路由表Route Table
查看Windows本機(jī)的路由表Route Table
4.4鳖敷、生成以太網(wǎng)用的MAC頭部
- 發(fā)送方 MAC地址
發(fā)送方 MAC地址脖苏,這里填寫(xiě)網(wǎng)卡本身的 MAC地址。 MAC地址是在網(wǎng)卡生產(chǎn)時(shí)寫(xiě)入 ROM里的定踱,只要將這個(gè)值讀取出來(lái)寫(xiě)入 MAC頭部就可以了棍潘。對(duì)于多塊網(wǎng)卡的情況,請(qǐng)大家回想一下設(shè)置發(fā)送方 IP地址的方法 崖媚。設(shè)置發(fā)送方 IP地址時(shí)亦歉,我們已經(jīng)判斷出了從哪塊網(wǎng)卡發(fā)送這個(gè)包,那么現(xiàn)在只要將這塊網(wǎng)卡對(duì)應(yīng)的 MAC地址填進(jìn)去就好了畅哑。
- 接收方MAC地址
只要告訴以太網(wǎng)對(duì)方的 MAC的地址肴楷,以太網(wǎng)就會(huì)幫我們把包發(fā)送過(guò)去,那么很顯然這里應(yīng)該填寫(xiě)對(duì)方的 MAC地址荠呐。然而赛蔫,在這個(gè)時(shí)間點(diǎn)上绷杜,我們還沒(méi)有把包發(fā)送出去,所以先得搞清楚應(yīng)該把包發(fā)給誰(shuí)濒募,這個(gè)只要查一下路由表就知道了鞭盟。在路由表中找到相匹配的條目,然后把包發(fā)給 Gateway列中的 IP地址就可以了瑰剃。既然已經(jīng)知道了包應(yīng)該發(fā)給誰(shuí)齿诉,那么只要將對(duì)方的 MAC地址填上去就好了,但到這里為止根本沒(méi)有出現(xiàn)對(duì)方的 MAC地址晌姚,也就是說(shuō)我們現(xiàn)在根本不知道對(duì)方的 MAC地址是什么粤剧。因此,我們還需要執(zhí)行根據(jù) IP地址查詢(xún) MAC地址的操作挥唠。詳情看 4.4.1抵恋、通過(guò) ARP查詢(xún)目標(biāo)路由器的 MAC地址
IP模塊根據(jù)路由表 Gateway欄的內(nèi)容判斷應(yīng)該把包發(fā)送給誰(shuí)。
4.4.1宝磨、通過(guò) ARP查詢(xún)目標(biāo)路由器的 MAC地址
這里我們需要使用 ARP協(xié)議(網(wǎng)絡(luò)層協(xié)議)弧关,它其實(shí)非常簡(jiǎn)單。在以太網(wǎng)中唤锉,有一種叫作廣播的方法世囊,可以把包發(fā)給連接在同一以太網(wǎng)中的所有設(shè)備。 ARP就是利用廣播對(duì)所有設(shè)備提問(wèn):“ × ×這個(gè) IP地址是誰(shuí)的窿祥?請(qǐng)把你的 MAC地址告訴我株憾。”然后就會(huì)有人回答:“這個(gè) IP地址是我的晒衩,我的 MAC地址是 × × × ×嗤瞎。” (下圖)
ARP: Address Resolution Protocol听系,地址解析協(xié)議贝奇。
通過(guò)ARP緩存提升效率,避免每次發(fā)送
Mac查看ARP緩存
Windows查看ARP緩存
MAC地址
MAC: Media Access Control的縮寫(xiě)跛锌。 MAC頭部弃秆、 MAC地址中的 MAC也是這個(gè)意思。也就是說(shuō)髓帽,通過(guò) MAC模塊控制包收發(fā)操作時(shí)所使用的頭部和地址就叫作 MAC頭部和 MAC地址菠赚。
4.5、網(wǎng)卡-將IP包轉(zhuǎn)換成電或光信號(hào)發(fā)送出去
IP生成的網(wǎng)絡(luò)包只是存放在內(nèi)存中的一串?dāng)?shù)字信息郑藏,沒(méi)有辦法直接發(fā)送給對(duì)方衡查。因此,我們需要將數(shù)字信息轉(zhuǎn)換為電或光信號(hào)必盖,才能在網(wǎng)線(xiàn)上傳輸拌牲,也就是說(shuō)俱饿,這才是真正的數(shù)據(jù)發(fā)送過(guò)程。負(fù)責(zé)執(zhí)行這一操作的是網(wǎng)卡塌忽,但網(wǎng)卡也無(wú)法單獨(dú)工作拍埠,要控制網(wǎng)卡還需要網(wǎng)卡驅(qū)動(dòng)程序。驅(qū)動(dòng)程序不只有網(wǎng)卡才有土居,鍵盤(pán)枣购、鼠標(biāo)、顯卡擦耀、聲卡等各種硬件設(shè)備都有棉圈。當(dāng)然,不同廠商和型號(hào)的網(wǎng)卡在結(jié)構(gòu)上有所不同眷蜓,因此網(wǎng)卡驅(qū)動(dòng)程序也是廠商開(kāi)發(fā)的專(zhuān)用程序分瘾。
網(wǎng)卡
網(wǎng)卡的 ROM中保存著全世界唯一的 MAC地址,這是在生產(chǎn)網(wǎng)卡時(shí)寫(xiě)入的吁系。
網(wǎng)卡是如何將包轉(zhuǎn)換成電信號(hào)并發(fā)送到網(wǎng)線(xiàn)中的
網(wǎng)卡驅(qū)動(dòng)從 IP模塊獲取包之后德召,會(huì)將其復(fù)制到網(wǎng)卡內(nèi)的緩沖區(qū)中,然后向 MAC模塊發(fā)送發(fā)送包的命令垮抗。接下來(lái)就輪到 MAC模塊進(jìn)行工作了氏捞。首先, MAC模塊會(huì)將包從緩沖區(qū)中取出冒版,并在開(kāi)頭加上報(bào)頭和起始幀分界符,在末尾加上用于檢測(cè)錯(cuò)誤的幀校驗(yàn)序列
給網(wǎng)絡(luò)包再加 3個(gè)控制數(shù)據(jù)
網(wǎng)卡MAC模塊將包從緩沖區(qū)中取出逞姿,并在開(kāi)頭加上 報(bào)頭 和 起始幀分界符辞嗡,在末尾加上用于檢測(cè)錯(cuò)誤的 幀校驗(yàn)序列。
4.5.1滞造、報(bào)頭
報(bào)頭作用
報(bào)頭是一串像 10101010…這樣 1和 0交替出現(xiàn)的比特序列续室,長(zhǎng)度為 56比特,它的作用是確定包的讀取時(shí)機(jī)谒养。當(dāng)這些 1010的比特序列被轉(zhuǎn)換成電信號(hào)后挺狰,會(huì)形成如圖這樣的波形。接收方在收到信號(hào)時(shí)买窟,遇到這樣的波形就可以判斷讀取數(shù)據(jù)的時(shí)機(jī)丰泊。
如何通過(guò)電信號(hào)來(lái)讀取數(shù)據(jù)
用電信號(hào)來(lái)表達(dá)數(shù)字信息時(shí),我們需要讓 0和 1兩種比特分別對(duì)應(yīng)特定的電壓和電流始绍,例如下圖( a)這樣的電信號(hào)就可以表達(dá)數(shù)字信息瞳购。通過(guò)電信號(hào)來(lái)讀取數(shù)據(jù)的過(guò)程就是將這種對(duì)應(yīng)關(guān)系顛倒過(guò)來(lái)。也就是說(shuō)亏推,通過(guò)測(cè)量信號(hào)中的電壓和電流變化学赛,還原出 0和 1兩種比特的值年堆。然而,實(shí)際的信號(hào)并不像下圖所示的那樣有分隔每個(gè)比特的輔助線(xiàn)盏浇,因此在測(cè)量電壓和電流時(shí)必須先判斷出每個(gè)比特的界限在哪里变丧。但是,像下圖( a)右邊這種 1和 0連續(xù)出現(xiàn)的信號(hào)绢掰,由于電壓和電流沒(méi)有變化痒蓬,我們就沒(méi)辦法判斷出其中每個(gè)比特到底應(yīng)該從哪里去切分。
通過(guò)時(shí)鐘測(cè)量讀取信號(hào)的時(shí)機(jī)
如何判斷出其中每個(gè)比特到底應(yīng)該從哪里去切分曼月?
要解決這個(gè)問(wèn)題谊却,最簡(jiǎn)單的方法就是在數(shù)據(jù)信號(hào)之外再發(fā)送一組用來(lái)區(qū)分比特間隔的時(shí)鐘信號(hào)。如圖( b)所示哑芹,當(dāng)時(shí)鐘信號(hào)從下往上變化時(shí)讀取電壓和電流的值炎辨,然后和 0或 1進(jìn)行對(duì)應(yīng)就可以了。但是這種方法存在問(wèn)題聪姿。當(dāng)距離較遠(yuǎn)碴萧,網(wǎng)線(xiàn)較長(zhǎng)時(shí),兩條線(xiàn)路的長(zhǎng)度會(huì)發(fā)生差異末购,數(shù)據(jù)信號(hào)和時(shí)鐘信號(hào)的傳輸會(huì)產(chǎn)生時(shí)間差破喻,時(shí)鐘就會(huì)發(fā)生偏移。
數(shù)據(jù)信號(hào)和時(shí)鐘信號(hào)的傳輸會(huì)產(chǎn)生時(shí)間差盟榴,時(shí)鐘就會(huì)發(fā)生偏移曹质。
另外一種方法是當(dāng)時(shí)鐘信號(hào)從上往下變化時(shí)進(jìn)行讀取。要解決這個(gè)問(wèn)題擎场,可以采用將數(shù)據(jù)信號(hào)和時(shí)鐘信號(hào)疊加在一起的方法羽德。這樣的信號(hào)如圖( c)所示,發(fā)送方將這樣的信號(hào)發(fā)給接收方迅办。由于時(shí)鐘信號(hào)是像圖( b)這樣按固定頻率進(jìn)行變化的宅静,只要能夠找到這個(gè)變化的周期,就可以從接收到的信號(hào)( c)中提取出時(shí)鐘信號(hào)( b)站欺,進(jìn)而通過(guò)接收信號(hào)( c)和時(shí)鐘信號(hào)( b)計(jì)算出數(shù)據(jù)信號(hào)( a)姨夹,這和發(fā)送方將數(shù)據(jù)信號(hào)和時(shí)鐘信號(hào)進(jìn)行疊加的過(guò)程正好相反。然后矾策,只要根據(jù)時(shí)鐘信號(hào)( b)的變化周期磷账,我們就可以從數(shù)據(jù)信號(hào)( a)中讀取相應(yīng)的電壓和電流值,并將其還原為 0或 1的比特了蝴韭。
4.5.2够颠、起始幀分界符
起始幀分界符,它的末尾比特排列有少許變化榄鉴。接收方以這一變化作為標(biāo)記履磨,從這里開(kāi)始提取網(wǎng)絡(luò)包數(shù)據(jù)蛉抓。也就是說(shuō)躺枕,起始幀分界符是一個(gè)用來(lái)表示包起始位置的標(biāo)記蝙场。
4.5.3、幀校驗(yàn)序列
末尾的 FCS(幀校驗(yàn)序列)用來(lái)檢查包傳輸過(guò)程中因噪聲導(dǎo)致的波形紊亂擂仍、數(shù)據(jù)錯(cuò)誤矛辕,它是一串 32比特的序列笑跛,是通過(guò)一個(gè)公式對(duì)包中從頭到尾的所有內(nèi)容進(jìn)行計(jì)算而得出來(lái)的。具體的計(jì)算公式在此省略聊品,它和磁盤(pán)等設(shè)備中使用的 CRC錯(cuò)誤校驗(yàn)碼是同一種東西飞蹂,當(dāng)原始數(shù)據(jù)中某一個(gè)比特發(fā)生變化時(shí),計(jì)算出來(lái)的結(jié)果就會(huì)發(fā)生變化翻屈。在包傳輸過(guò)程中陈哑,如果受到噪聲的干擾而導(dǎo)致其中的數(shù)據(jù)發(fā)生了變化,那么接收方計(jì)算出的 FCS和發(fā)送方計(jì)算出的 FCS就會(huì)不同伸眶,這樣我們就可以判斷出數(shù)據(jù)有沒(méi)有錯(cuò)誤惊窖。
4.5.4、向集線(xiàn)器發(fā)送網(wǎng)絡(luò)包
網(wǎng)卡的 MAC模塊生成通用信號(hào)厘贼,然后由 PHY( MAU)模塊轉(zhuǎn)換成可在網(wǎng)線(xiàn)中傳輸?shù)母袷浇缇疲⑼ㄟ^(guò)網(wǎng)線(xiàn)發(fā)送出去。
4.6嘴秸、接收返回包
網(wǎng)卡接收網(wǎng)絡(luò)包
接收操作的第一步就是不管三七二十一把這些信號(hào)全都收進(jìn)來(lái)再說(shuō)毁欣。信號(hào)的開(kāi)頭是報(bào)頭,通過(guò)報(bào)頭的波形同步時(shí)鐘岳掐,然后遇到起始幀分界符時(shí)開(kāi)始將后面的信號(hào)轉(zhuǎn)換成數(shù)字信息署辉。這個(gè)操作和發(fā)送時(shí)是相反的,即 PHY( MAU)模塊先開(kāi)始工作岩四,然后再輪到 MAC模塊。首先哥攘, PHY( MAU)模塊會(huì)將信號(hào)轉(zhuǎn)換成通用格式并發(fā)送給 MAC模塊剖煌, MAC模塊再?gòu)念^開(kāi)始將信號(hào)轉(zhuǎn)換為數(shù)字信息,并存放到緩沖區(qū)中逝淹。當(dāng)?shù)竭_(dá)信號(hào)的末尾時(shí)耕姊,還需要檢查 FCS。具體來(lái)說(shuō)栅葡,就是將從包開(kāi)頭到結(jié)尾的所有比特套用到公式中計(jì)算出 FCS茉兰,然后和包末尾的 FCS進(jìn)行對(duì)比,正常情況下兩者應(yīng)該是一致的欣簇,如果中途受到噪聲干擾而導(dǎo)致波形發(fā)生紊亂规脸,則兩者的值會(huì)產(chǎn)生差異坯约,這時(shí)這個(gè)包就會(huì)被當(dāng)作錯(cuò)誤包而被丟棄。如果 FCS校驗(yàn)沒(méi)有問(wèn)題莫鸭,接下來(lái)就要看一下 MAC頭部中接收方 MAC地址與網(wǎng)卡在初始化時(shí)分配給自己的 MAC地址是否一致闹丐,以判斷這個(gè)包是不是發(fā)給自己的。我們沒(méi)必要去接收發(fā)給別人的包被因,因此如果不是自己的包就直接丟棄卿拴,如果接收方 MAC地址和自己 MAC地址一致,則將包放入緩沖區(qū)中 梨与。到這里堕花, MAC模塊的工作就完成了,接下來(lái)網(wǎng)卡會(huì)通知計(jì)算機(jī)收到了一個(gè)包粥鞋。
網(wǎng)卡中斷計(jì)算機(jī)缘挽,網(wǎng)卡驅(qū)動(dòng)從網(wǎng)卡緩存中讀取數(shù)據(jù)
通知計(jì)算機(jī)的操作會(huì)使用一個(gè)叫作中斷的機(jī)制。在網(wǎng)卡執(zhí)行接收包的操作的過(guò)程中陷虎,計(jì)算機(jī)并不是一直監(jiān)控著網(wǎng)卡的活動(dòng)到踏,而是去繼續(xù)執(zhí)行其他的任務(wù)。因此尚猿,如果網(wǎng)卡不通知計(jì)算機(jī)窝稿,計(jì)算機(jī)是不知道包已經(jīng)收到了這件事的。網(wǎng)卡驅(qū)動(dòng)也是在計(jì)算機(jī)中運(yùn)行的一個(gè)程序凿掂,因此它也不知道包到達(dá)的狀態(tài)伴榔。在這種情況下,我們需要一種機(jī)制能夠打斷計(jì)算機(jī)正在執(zhí)行的任務(wù)庄萎,讓計(jì)算機(jī)注意到網(wǎng)卡中發(fā)生的事情踪少,這種機(jī)制就是中斷。具體來(lái)說(shuō)糠涛,中斷的工作過(guò)程是這樣的援奢。首先,網(wǎng)卡向擴(kuò)展總線(xiàn)中的中斷信號(hào)線(xiàn)發(fā)送信號(hào)忍捡,該信號(hào)線(xiàn)通過(guò)計(jì)算機(jī)中的中斷控制器連接到 CPU集漾。當(dāng)產(chǎn)生中斷信號(hào)時(shí), CPU會(huì)暫時(shí)掛起正在處理的任務(wù)砸脊,切換到操作系統(tǒng)中的中斷處理程序 具篇。然后,中斷處理程序會(huì)調(diào)用網(wǎng)卡驅(qū)動(dòng)凌埂,控制網(wǎng)卡執(zhí)行相應(yīng)的接收操作驱显。
網(wǎng)卡驅(qū)動(dòng)被中斷處理程序調(diào)用后,會(huì)從網(wǎng)卡的緩沖區(qū)中取出收到的包,并通過(guò) MAC頭部中的以太類(lèi)型字段判斷協(xié)議的類(lèi)型“R撸現(xiàn)在我們?cè)诖蠖鄶?shù)情況下都是使用 TCP/ IP協(xié)議伏恐,但除了 TCP/ IP之外還有很多其他類(lèi)型的協(xié)議,例如 NetWare中使用的 IPX/ SPX熔恢,以及 Mac電腦中使用的 AppleTalk等協(xié)議脐湾。這些協(xié)議都被分配了不同的以太類(lèi)型,如 0080(十六進(jìn)制)代表 IP協(xié)議叙淌,網(wǎng)卡驅(qū)動(dòng)就會(huì)把這樣的包交給 TCP/ IP協(xié)議棧秤掌;如果是 809B則表示 AppleTalk協(xié)議,就把包交給 AppleTalk協(xié)議棧鹰霍,以此類(lèi)推闻鉴。
4.7、將服務(wù)器的響應(yīng)包從 IP傳遞給 TCP
下面我們假設(shè) Web服務(wù)器返回了一個(gè)網(wǎng)絡(luò)包茂洒,那么協(xié)議棧會(huì)進(jìn)行哪些處理呢 100孟岛?服務(wù)器返回的包的以太類(lèi)型應(yīng)該是 0800,因此網(wǎng)卡驅(qū)動(dòng)會(huì)將其交給 TCP/ IP協(xié)議棧來(lái)進(jìn)行處理督勺。接下來(lái)就輪到 IP模塊先開(kāi)始工作了渠羞,第一步是檢查 IP頭部,確認(rèn)格式是否正確智哀。如果格式?jīng)]有問(wèn)題次询,下一步就是查看接收方 IP地址。如果接收網(wǎng)絡(luò)包的設(shè)備是一臺(tái) Windows客戶(hù)端計(jì)算機(jī)瓷叫,那么服務(wù)器返回的包的接收方 IP地址應(yīng)該與客戶(hù)端網(wǎng)卡的地址一致屯吊,檢查確認(rèn)之后我們就可以接收這個(gè)包了。
IP模塊檢查IP頭部摹菠,如果接收方 IP地址不是自己的地址盒卸,通過(guò)ICMP反饋回去
如果接收方 IP地址不是自己的地址,那一定是發(fā)生了什么錯(cuò)誤次氨”谓椋客戶(hù)端計(jì)算機(jī)不負(fù)責(zé)對(duì)包進(jìn)行轉(zhuǎn)發(fā),因此不應(yīng)該收到不是發(fā)給自己的包 101煮寡。當(dāng)發(fā)生這樣的錯(cuò)誤時(shí)屉佳, IP模塊會(huì)通過(guò) ICMP消息將錯(cuò)誤告知發(fā)送方(圖 2. 1)。 ICMP規(guī)定了各種類(lèi)型的消息洲押,如表所示。當(dāng)我們遇到這個(gè)錯(cuò)誤時(shí)圆凰, IP模塊會(huì)通過(guò)表中的 Destination unreachable消息通知對(duì)方杈帐。從這張表的內(nèi)容中我們可以看到在包的接收和轉(zhuǎn)發(fā)過(guò)程中能夠遇到的各種錯(cuò)誤,因此希望大家看一看這張表。
IP模塊檢查IP頭部挑童,如果接收方 IP地址是自己的地址累铅,進(jìn)行分片重組
如果接收方 IP地址正確,則這個(gè)包會(huì)被接收下來(lái)站叼,這時(shí)還需要完成另一項(xiàng)工作娃兽。 IP協(xié)議有一個(gè)叫作分片的功能。簡(jiǎn)單來(lái)說(shuō)尽楔,網(wǎng)線(xiàn)和局域網(wǎng)中只能傳輸小包投储,因此需要將大的包切分成多個(gè)小包。如果接收到的包是經(jīng)過(guò)分片的阔馋,那么 IP模塊會(huì)將它們還原成原始的包玛荞。分片的包會(huì)在 IP頭部的標(biāo)志字段中進(jìn)行標(biāo)記,當(dāng)收到分片的包時(shí)呕寝, IP模塊會(huì)將其暫存在內(nèi)部的內(nèi)存空間中勋眯,然后等待 IP頭部中具有相同 ID的包全部到達(dá),這是因?yàn)橥粋€(gè)包的所有分片都具有相同的 ID下梢。此外客蹋, IP頭部還有一個(gè)分片偏移量( fragment offset)字段,它表示當(dāng)前分片在整個(gè)包中所處的位置孽江。根據(jù)這些信息讶坯,在所有分片全部收到之后,就可以將它們還原成原始的包竟坛,這個(gè)操作叫作分片重組闽巩。
TCP模塊接收包
接下來(lái)包會(huì)被交給 TCP模塊。 TCP模塊會(huì)根據(jù) IP頭部中的接收方和發(fā)送方 IP地址担汤,以及 TCP頭部中的接收方和發(fā)送方端口號(hào)來(lái)查找對(duì)應(yīng)的套接字涎跨。找到對(duì)應(yīng)的套接字之后,就可以根據(jù)套接字中記錄的通信狀態(tài)崭歧,執(zhí)行相應(yīng)的操作了隅很。例如,如果包的內(nèi)容是應(yīng)用程序數(shù)據(jù)率碾,則返回確認(rèn)接收的包叔营,并將數(shù)據(jù)放入緩沖區(qū),等待應(yīng)用程序
五所宰、集線(xiàn)器绒尊、交換機(jī)、路由器
(1)路由器根據(jù)目標(biāo)地址判斷下一個(gè)路由器的位置
(2)集線(xiàn)器在子網(wǎng)中將網(wǎng)絡(luò)包傳輸?shù)较乱粋€(gè)路由
實(shí)際上仔粥,集線(xiàn)器是按照以太網(wǎng)規(guī)則傳輸包的設(shè)備婴谱,而路由器是按照 IP規(guī)則傳輸包的設(shè)備蟹但,因此我們也可以作如下理解。
(1)IP協(xié)議根據(jù)目標(biāo)地址判斷下一個(gè) IP轉(zhuǎn)發(fā)設(shè)備的位置
(2)子網(wǎng)中的以太網(wǎng)協(xié)議將包傳輸?shù)较乱粋€(gè)轉(zhuǎn)發(fā)設(shè)備
場(chǎng)景設(shè)定:網(wǎng)絡(luò)包在進(jìn)入互聯(lián)網(wǎng)之前經(jīng)歷的傳輸過(guò)程谭羔。這里我們假設(shè)客戶(hù)端計(jì)算機(jī)連接的局域網(wǎng)結(jié)構(gòu)是像下圖這樣的华糖。也就是說(shuō),網(wǎng)絡(luò)包從客戶(hù)端計(jì)算機(jī)發(fā)出之后瘟裸,要經(jīng)過(guò)集線(xiàn)器客叉、交換機(jī)和路由器最終進(jìn)入互聯(lián)網(wǎng)。實(shí)際上话告,我們家里用的路由器已經(jīng)集成了集線(xiàn)器和交換機(jī)的功能兼搏,像圖上這樣使用獨(dú)立設(shè)備的情況很少見(jiàn)。
5.1超棺、信號(hào)在網(wǎng)線(xiàn)中傳播
網(wǎng)卡 -> 網(wǎng)線(xiàn) -> 集線(xiàn)器
從信號(hào)流出網(wǎng)卡進(jìn)入網(wǎng)線(xiàn)開(kāi)始向族。網(wǎng)卡中的 PHY( MAU) 2模塊負(fù)責(zé)將包轉(zhuǎn)換成電信號(hào),信號(hào)通過(guò) RJ-45接口進(jìn)入雙絞線(xiàn)棠绘,這部分的放大圖如下圖的右側(cè)部分所示件相。以太網(wǎng)信號(hào)的本質(zhì)是正負(fù)變化的電壓,大家可以認(rèn)為網(wǎng)卡的 PHY( MAU)模塊就是一個(gè)從正負(fù)兩個(gè)信號(hào)端子輸出信號(hào)的電路氧苍。
網(wǎng)卡與集線(xiàn)器用雙絞線(xiàn)連接的形態(tài)
問(wèn)題來(lái)了:信號(hào)衰減
信號(hào)在網(wǎng)線(xiàn)的傳輸過(guò)程中夜矗,能量會(huì)逐漸損失。網(wǎng)線(xiàn)越長(zhǎng)让虐,信號(hào)衰減就越嚴(yán)重紊撕。集線(xiàn)器收到的信號(hào)有時(shí)會(huì)出現(xiàn)衰減。如下圖赡突。
“雙絞”是為了抑制噪聲
局域網(wǎng)網(wǎng)線(xiàn)使用的是雙絞線(xiàn)对扶,其中“雙絞”的意思就是以?xún)筛盘?hào)線(xiàn)為一組纏繞在一起,這種擰麻花一樣的設(shè)計(jì)是為了抑制噪聲的影響惭缰。
噪聲是如何產(chǎn)生的
首先浪南,我們來(lái)看看噪聲是如何產(chǎn)生的。產(chǎn)生噪聲的原因是網(wǎng)線(xiàn)周?chē)碾姶挪ㄊ埽?dāng)電磁波接觸到金屬等導(dǎo)體時(shí)络凿,在其中就會(huì)產(chǎn)生電流。因此昂羡,如果網(wǎng)線(xiàn)周?chē)嬖陔姶挪ㄐ跫牵蜁?huì)在網(wǎng)線(xiàn)中產(chǎn)生和原本的信號(hào)不同的電流。由于信號(hào)本身也是一種帶有電壓變化的電流虐先,其本質(zhì)和噪聲產(chǎn)生的電流是一樣的怨愤,所以信號(hào)和噪聲的電流就會(huì)混雜在一起,導(dǎo)致信號(hào)的波形發(fā)生失真蛹批,這就是噪聲的影響憔四。
電磁波來(lái)源有兩種:外部和內(nèi)部
影響網(wǎng)線(xiàn)的電磁波分為兩種:
一種是由電機(jī)膀息、熒光燈、 CRT顯示器等設(shè)備泄漏出來(lái)的電磁波了赵,這種電磁波來(lái)自網(wǎng)線(xiàn)之外的其他設(shè)備,
另一種電磁波是從網(wǎng)線(xiàn)中相鄰的信號(hào)線(xiàn)泄漏出來(lái)的甸赃。由于傳輸?shù)男盘?hào)本身就是一種電流柿汛,當(dāng)電流流過(guò)時(shí)就會(huì)向周?chē)l(fā)出電磁波,這些電磁波對(duì)于其他信號(hào)線(xiàn)來(lái)說(shuō)就成了噪聲埠对。這種內(nèi)部產(chǎn)生的噪聲稱(chēng)為串?dāng)_( crosstalk)络断。
雙絞線(xiàn)對(duì)噪聲的抑制
a)通過(guò)兩根信號(hào)線(xiàn)的纏繞抵消外源性噪聲;
b)通過(guò)改變節(jié)距抑制內(nèi)源性噪聲项玛。
5.2貌笨、集線(xiàn)器將信號(hào)發(fā)往所有設(shè)備
集線(xiàn)器的作用?
集線(xiàn)器將信號(hào)發(fā)送給所有連接在它上面的線(xiàn)路。
信號(hào)到達(dá)集線(xiàn)器的 PHY( MAU)模塊后襟沮,會(huì)進(jìn)入中繼電路锥惋。中繼電路的基本功能就是將輸入的信號(hào)廣播到集線(xiàn)器的所有端口上。當(dāng)然开伏,也有一些產(chǎn)品具有信號(hào)整形膀跌、錯(cuò)誤抑制等功能,但基本上就是將輸入的信號(hào)原封不動(dòng)地輸出到網(wǎng)線(xiàn)接口固灵。接下來(lái)捅伤,信號(hào)從所有接口流出,到達(dá)連接在集線(xiàn)器上的所有設(shè)備巫玻。然后丛忆,這些設(shè)備在收到信號(hào)之后會(huì)通過(guò) MAC頭部中的接收方 MAC地址判斷是不是發(fā)給自己的,如果是發(fā)給自己的就接受仍秤,否則就忽略熄诡。這樣,網(wǎng)絡(luò)包就能夠到達(dá)指定 MAC地址的接收方了徒扶。
由于集線(xiàn)器只是原封不動(dòng)地將信號(hào)廣播出去粮彤,所以即便信號(hào)受到噪聲的干擾發(fā)生了失真芋肠,也會(huì)原樣發(fā)送到目的地荡碾。這時(shí)暇仲,接收信號(hào)的設(shè)備配椭,也就是交換機(jī)其做、路由器咱揍、服務(wù)器等钥勋,會(huì)在將信號(hào)轉(zhuǎn)換成數(shù)字信息后通過(guò) FCS8校驗(yàn)發(fā)現(xiàn)錯(cuò)誤惭适,并將出錯(cuò)的包丟棄康栈。當(dāng)然递递,丟棄包并不會(huì)影響數(shù)據(jù)的傳輸喷橙,因?yàn)閬G棄的包不會(huì)觸發(fā)確認(rèn)響應(yīng)。因此協(xié)議棧的 TCP模塊會(huì)檢測(cè)到丟包登舞,并對(duì)該包進(jìn)行重傳贰逾。
5.3、交換機(jī)的包轉(zhuǎn)發(fā)操作
對(duì)于交換機(jī)暫時(shí)理解不深刻
5.4菠秒、路由器的包轉(zhuǎn)發(fā)操作
5.4.1疙剑、路由器內(nèi)部結(jié)構(gòu)
大家只要看明白路由器包括轉(zhuǎn)發(fā)模塊和端口模塊兩部分就可以了。其中轉(zhuǎn)發(fā)模塊負(fù)責(zé)判斷包的轉(zhuǎn)發(fā)目的地践叠,端口模塊負(fù)責(zé)包的收發(fā)操作言缤。換句話(huà)說(shuō),路由器轉(zhuǎn)發(fā)模塊和端口模塊的關(guān)系禁灼,就相當(dāng)于協(xié)議棧的 IP模塊和網(wǎng)卡之間的關(guān)系管挟。
路由器的各個(gè)端口都具有 MAC地址和 IP地址。
5.4.2弄捕、路由器的工作原理
路由器在轉(zhuǎn)發(fā)包時(shí)僻孝,首先會(huì)通過(guò)端口將發(fā)過(guò)來(lái)的包接收進(jìn)來(lái),這一步的工作過(guò)程取決于端口對(duì)應(yīng)的通信技術(shù)察藐。對(duì)于以太網(wǎng)端口來(lái)說(shuō)皮璧,就是按照以太網(wǎng)規(guī)范進(jìn)行工作,而無(wú)線(xiàn)局域網(wǎng)端口則按照無(wú)線(xiàn)局域網(wǎng)的規(guī)范工作分飞,總之就是委托端口的硬件將包接收進(jìn)來(lái)悴务。接下來(lái),轉(zhuǎn)發(fā)模塊會(huì)根據(jù)接收到的包的 IP頭部中記錄的接收方 IP地址譬猫,在路由表中進(jìn)行查詢(xún)讯檐,以此判斷轉(zhuǎn)發(fā)目標(biāo)。然后染服,轉(zhuǎn)發(fā)模塊將包轉(zhuǎn)移到轉(zhuǎn)發(fā)目標(biāo)對(duì)應(yīng)的端口别洪,端口再按照硬件的規(guī)則將包發(fā)送出去,也就是轉(zhuǎn)發(fā)模塊委托端口模塊將包發(fā)送出去的意思柳刮。
5.4.3挖垛、路由器根據(jù)路由表對(duì)包進(jìn)行轉(zhuǎn)發(fā)
交換機(jī)是通過(guò) MAC頭部中的接收方 MAC地址來(lái)判斷轉(zhuǎn)發(fā)目標(biāo)的,而路由器則是根據(jù) IP頭部中的 IP地址來(lái)判斷的秉颗。
交換機(jī)在地址表中只匹配完全一致的記錄痢毒,而 路由器則會(huì)忽略主機(jī)號(hào)部分,只匹配網(wǎng)絡(luò)號(hào)部分蚕甥。打個(gè)比方哪替,路由器在轉(zhuǎn)發(fā)包的時(shí)候只看接收方地址屬于哪個(gè)區(qū), × ×區(qū)發(fā)往這一邊菇怀, × ×區(qū)發(fā)往那一邊凭舶。
5.4.4晌块、路由器的包接收操作
路由器的整個(gè)工作過(guò)程。首先帅霜,路由器會(huì)接收網(wǎng)絡(luò)包匆背。路由器的端口有各種不同的類(lèi)型,這里我們只介紹以太網(wǎng)端口是如何接收包的身冀。以太網(wǎng)端口的結(jié)構(gòu)和計(jì)算機(jī)的網(wǎng)卡基本相同靠汁,接收包并存放到緩沖區(qū)中的過(guò)程也和網(wǎng)卡幾乎沒(méi)有區(qū)別。首先闽铐,信號(hào)到達(dá)網(wǎng)線(xiàn)接口部分,其中的 PHY( MAU)模塊和 MAC模塊將信號(hào)轉(zhuǎn)換為數(shù)字信息奶浦,然后通過(guò)包末尾的 FCS進(jìn)行錯(cuò)誤校驗(yàn)兄墅,如果沒(méi)問(wèn)題則檢查 MAC頭部中的接收方 MAC地址,看看是不是發(fā)給自己的包澳叉,如果是就放到接收緩沖區(qū)中隙咸,否則就丟棄這個(gè)包。如果包的接收方 MAC地址不是自己成洗,說(shuō)明這個(gè)包是發(fā)給其他設(shè)備的五督,如果接收這個(gè)包就違反了以太網(wǎng)的規(guī)則。
路由器的端口都具有 MAC地址瓶殃,只接收與自身地址匹配的包充包,遇到不匹配的包則直接丟棄。
5.4.5遥椿、查詢(xún)路由表確定輸出端口
MAC頭部作用
完成包接收操作之后基矮,路由器就會(huì)丟棄包開(kāi)頭的 MAC頭部。 MAC頭部的作用就是將包送達(dá)路由器冠场,其中的接收方 MAC地址就是路由器端口的 MAC地址家浇。因此,當(dāng)包到達(dá)路由器之后碴裙, MAC頭部的任務(wù)就完成了钢悲,于是 MAC頭部就會(huì)被丟棄。
通過(guò)路由器轉(zhuǎn)發(fā)的網(wǎng)絡(luò)包舔株,其接收方 MAC地址為路由器端口的 MAC地址莺琳。
路由器會(huì)根據(jù) IP頭部中的內(nèi)容進(jìn)行包的轉(zhuǎn)發(fā)操作
- a)查詢(xún)路由表判斷轉(zhuǎn)發(fā)目標(biāo)
關(guān)于具體的工作過(guò)程,我們還是來(lái)看一個(gè)實(shí)際的例子督笆,如上圖的情況芦昔,假設(shè)地址為 10. 10. 1. 101的計(jì)算機(jī)要向地址為 192. 168. 1. 10的服務(wù)器發(fā)送一個(gè)包,這個(gè)包先到達(dá)圖中的路由器娃肿。判斷轉(zhuǎn)發(fā)目標(biāo)的第一步咕缎,就是根據(jù)包的接收方 IP地址查詢(xún)路由表中的目標(biāo)地址欄珠十,以找到相匹配的記錄。就像前面講過(guò)的一樣凭豪,這個(gè)匹配并不是匹配全部 32個(gè)比特焙蹭,而是根據(jù)子網(wǎng)掩碼列中的值判斷網(wǎng)絡(luò)號(hào)的比特?cái)?shù),并匹配相應(yīng)數(shù)量的比特 33嫂伞。例如孔厉,上圖的第 3行,子網(wǎng)掩碼列為 255. 255. 255. 0帖努,就表示需要匹配從左起 24個(gè)比特撰豺。網(wǎng)絡(luò)包的接收方 IP地址和路由表中的目標(biāo)地址左起 24個(gè)比特的內(nèi)容都是 192. 168. 1,因此兩者是匹配的拼余,該行記錄就是候選轉(zhuǎn)發(fā)目標(biāo)之一污桦。
- b)路由器修改包的有效期
- c)路由器通過(guò)分片功能拆分大網(wǎng)絡(luò)包
- d)路由器的發(fā)送操作
這一步操作取決于輸出端口的類(lèi)型。如果是以太網(wǎng)端口匙监,則按照以太網(wǎng)的規(guī)則將包轉(zhuǎn)換為電信號(hào)發(fā)送出去凡橱;如果是 ADSL則按照 ADSL的規(guī)則來(lái)轉(zhuǎn)換,以此類(lèi)推亭姥。在家庭網(wǎng)絡(luò)中稼钩,路由器后面一般連接 ADSL等線(xiàn)路接入互聯(lián)網(wǎng),因此路由器會(huì)根據(jù)接入網(wǎng)的規(guī)則來(lái)發(fā)送包达罗。不過(guò)坝撑,要理解具體的操作過(guò)程,需要先理解相應(yīng)的通信線(xiàn)路 氮块,比較復(fù)雜绍载,因此我們留到下一章探索互聯(lián)網(wǎng)內(nèi)部時(shí)再講解。這里滔蝉,我們假設(shè)路由器位于公司等局域網(wǎng)的內(nèi)部击儡,即輸出端口也是以太網(wǎng),看看這種情況是如何操作的蝠引。
以太網(wǎng)的包發(fā)送操作是根據(jù)以太網(wǎng)規(guī)則來(lái)進(jìn)行的阳谍,即便設(shè)備種類(lèi)不同,規(guī)則也是相同的螃概。也就是說(shuō)矫夯,其基本過(guò)程和協(xié)議棧中的 IP模塊發(fā)送包的過(guò)程是相同的,即在包前面加上 MAC頭部吊洼,
設(shè)置其中的一些字段训貌,然后將完成的包轉(zhuǎn)換成電信號(hào)并發(fā)送出去。下面來(lái)簡(jiǎn)單復(fù)習(xí)一下這個(gè)過(guò)程。首先递沪,為了判斷 MAC頭部中的 MAC地址應(yīng)該填寫(xiě)什么值豺鼻,我們需要根據(jù)路由表的網(wǎng)關(guān)列判斷對(duì)方的地址。如果網(wǎng)關(guān)是一個(gè) IP地址款慨,則這個(gè) IP地址就是我們要轉(zhuǎn)發(fā)到的目標(biāo)地址儒飒;如果網(wǎng)關(guān)為空,則 IP頭部中的接收方 IP地址就是要轉(zhuǎn)發(fā)到的目標(biāo)地址檩奠。知道對(duì)方的 IP地址之后桩了,接下來(lái)需要通過(guò) ARP根據(jù) IP地址查詢(xún) MAC地址,并將查詢(xún)的結(jié)果作為接收方 MAC地址埠戳。路由器也有 ARP緩存井誉,因此首先會(huì)在 ARP緩存中查詢(xún),如果找不到則發(fā)送 ARP查詢(xún)請(qǐng)求整胃。
路由器判斷下一個(gè)轉(zhuǎn)發(fā)目標(biāo)的方法如下送悔。
- 如果路由表的網(wǎng)關(guān)列內(nèi)容為 IP地址,則該地址就是下一個(gè)轉(zhuǎn)發(fā)目標(biāo)爪模。
- 如果路由表的網(wǎng)關(guān)列內(nèi)容為空,則 IP頭部中的接收方 IP地址就是下一個(gè)轉(zhuǎn)發(fā)目標(biāo)荚藻。
路由器也會(huì)使用 ARP來(lái)查詢(xún)下一個(gè)轉(zhuǎn)發(fā)目標(biāo)的 MAC地址屋灌。
網(wǎng)絡(luò)包完成后,接下來(lái)會(huì)將其轉(zhuǎn)換成電信號(hào)并通過(guò)端口發(fā)送出去应狱。這一步的工作過(guò)程和計(jì)算機(jī)也是相同的共郭。例如,當(dāng)以太網(wǎng)工作在半雙工模式時(shí)疾呻,需要先確認(rèn)線(xiàn)路中沒(méi)有其他信號(hào)后才能發(fā)送除嘹,如果檢測(cè)到碰撞,則需要等待一段時(shí)間后重發(fā)岸蜗。如果以太網(wǎng)工作在全雙工模式尉咕,則不需要確認(rèn)線(xiàn)路中的信號(hào),可以直接發(fā)送璃岳。如果輸出端口為以太網(wǎng)年缎,則發(fā)送出去的網(wǎng)絡(luò)包會(huì)通過(guò)交換機(jī)到達(dá)下一個(gè)路由器。由于接收方 MAC地址就是下一個(gè)路由器的地址铃慷,所以交換機(jī)會(huì)根據(jù)這一地址將包傳輸?shù)较乱粋€(gè)路由器单芜。接下來(lái),下一個(gè)路由器會(huì)將包轉(zhuǎn)發(fā)給再下一個(gè)路由器犁柜,經(jīng)過(guò)層層轉(zhuǎn)發(fā)之后洲鸠,網(wǎng)絡(luò)包就到達(dá)了最終的目的地。
5.5馋缅、路由器與交換機(jī)的關(guān)系
IP協(xié)議本身沒(méi)有傳輸包的功能扒腕,因此包的實(shí)際傳輸要委托以太網(wǎng)來(lái)進(jìn)行绢淀。
路由器是基于 IP設(shè)計(jì)的,而交換機(jī)是基于以太網(wǎng)設(shè)計(jì)的袜匿,因此 IP與以太網(wǎng)的關(guān)系也就是路由器與交換機(jī)的關(guān)系更啄。換句話(huà)說(shuō),路由器將包的傳輸工作委托給交換機(jī)來(lái)進(jìn)行
IP(路由器)負(fù)責(zé)將包送達(dá)通信對(duì)象這一整體過(guò)程居灯,而其中將包傳輸?shù)较乱粋€(gè)路由器的過(guò)程則是由以太網(wǎng)(交換機(jī))來(lái)負(fù)責(zé)的祭务。
六、探索接入網(wǎng)和網(wǎng)絡(luò)運(yùn)營(yíng)商
此章節(jié)沒(méi)啥好說(shuō)的怪嫌,了解下即可义锥!
七、服務(wù)器端的局域網(wǎng)中有什么玄機(jī)
7.1岩灭、防火墻
防火墻的基本思路
防火墻的基本思路拌倍,即只允許發(fā)往特定服務(wù)器中的特定應(yīng)用程序的包通過(guò),然后屏蔽其他的包噪径。
主流的是包過(guò)濾方式的防火墻
包過(guò)濾方式的防火墻可根據(jù)接收方 IP地址柱恤、發(fā)送方 IP地址、接收方端口號(hào)找爱、發(fā)送方端口號(hào)梗顺、控制位等信息來(lái)判斷是否允許某個(gè)包通過(guò)。
防火墻的不足
防火墻無(wú)法抵御的攻擊
防火墻可以根據(jù)包的起點(diǎn)和終點(diǎn)來(lái)判斷是否允許其通過(guò)车摄,但僅憑起點(diǎn)和終點(diǎn)并不能篩選出所有有風(fēng)險(xiǎn)的包寺谤。
比如,假設(shè) Web服務(wù)器在收到含有特定數(shù)據(jù)的包時(shí)會(huì)引起宕機(jī)吮播。但是防火墻只關(guān)心包的起點(diǎn)和終點(diǎn)变屁,因此即便包中含有特定數(shù)據(jù),防火墻也無(wú)法發(fā)現(xiàn)意狠,于是包就被放行了粟关。然后,當(dāng)包到達(dá) Web服務(wù)器時(shí)环戈,就會(huì)引發(fā)服務(wù)器宕機(jī)誊役。通過(guò)這個(gè)例子大家可以看出,只有檢查包的內(nèi)容才能識(shí)別這種風(fēng)險(xiǎn)谷市,因此防火墻對(duì)這種情況無(wú)能為力蛔垢。
對(duì)防火墻無(wú)法抵御攻擊的應(yīng)對(duì)方法
a)方法一:這個(gè)問(wèn)題的根源在于 Web服務(wù)器程序的 Bug,因此修復(fù) Bug防止宕機(jī)就是其中一種方法迫悠。這類(lèi) Bug中鹏漆,危險(xiǎn)性較高的會(huì)作為安全漏洞公布出來(lái),開(kāi)發(fā)者會(huì)很快發(fā)布修復(fù)了 Bug的新版本,因此持續(xù)關(guān)注安全漏洞信息并更新軟件的版本是非常重要的艺玲。
b)另一種方法就是在防火墻之外部署用來(lái)檢查包的內(nèi)容并阻止有害包的設(shè)備或軟件括蝠。
7.2、負(fù)載均衡
7.2.1饭聚、多臺(tái)服務(wù)器 -- 分布式架構(gòu)
使用多臺(tái)服務(wù)器來(lái)分擔(dān)負(fù)載的方法更有效忌警。這種架構(gòu)統(tǒng)稱(chēng)為分布式架構(gòu)。
- DNS輪詢(xún)分配服務(wù)器IP地址
最簡(jiǎn)單的一種是通過(guò) DNS服務(wù)器來(lái)分配秒梳。當(dāng)訪問(wèn)服務(wù)器時(shí)法绵,客戶(hù)端需要先向 DNS服務(wù)器查詢(xún)服務(wù)器的 IP地址,如果在 DNS服務(wù)器中填寫(xiě)多個(gè)名稱(chēng)相同的記錄酪碘,則每次查詢(xún)時(shí) DNS服務(wù)器都會(huì)按順序返回不同的 IP地址朋譬。
DNS輪詢(xún)不足之處
例如:假如多臺(tái) Web服務(wù)器中有一臺(tái)出現(xiàn)了故障,這時(shí)我們希望在返回 IP地址時(shí)能夠跳過(guò)故障的 Web服務(wù)器兴垦,然而普通的 DNS服務(wù)器并不能確認(rèn) Web服務(wù)器是否正常工作徙赢,因此即便 Web服務(wù)器宕機(jī)了,它依然可能會(huì)返回這臺(tái)服務(wù)器的 IP地址探越。
- 使用負(fù)載均衡器分配訪問(wèn)
7.2.2狡赐、緩存服務(wù)器
臨時(shí)保存內(nèi)容并代替 Web服務(wù)器返回內(nèi)容的緩存服務(wù)器
緩存服務(wù)器三種部署
7.3、內(nèi)容分發(fā)服務(wù)
根據(jù)緩存服務(wù)器分布第三種方式钦幔,進(jìn)行布局阴汇。
八、請(qǐng)求到達(dá)Web服務(wù)器节槐,響應(yīng)返回瀏覽器
8.1、服務(wù)器概覽
8.2拐纱、服務(wù)器的接收操作
8.2.1铜异、 網(wǎng)卡將接收到的信號(hào)轉(zhuǎn)換成數(shù)字信息
服務(wù)器將接收到的電信號(hào)還原數(shù)字信息
根據(jù)信號(hào)還原的數(shù)字信息
網(wǎng)卡的 MAC模塊將網(wǎng)絡(luò)包從信號(hào)還原為數(shù)字信息,校驗(yàn) FCS并存入緩沖區(qū)秸架。
在這個(gè)過(guò)程中揍庄,服務(wù)器的 CPU并不是一直在監(jiān)控網(wǎng)絡(luò)包的到達(dá),而是在執(zhí)行其他的任務(wù)东抹,因此 CPU并不知道此時(shí)網(wǎng)絡(luò)包已經(jīng)到達(dá)了蚂子。但接下來(lái)的接收操作需要 CPU來(lái)參與,因此網(wǎng)卡需要通過(guò) 中斷 將網(wǎng)絡(luò)包到達(dá)的事件通知給 CPU缭黔。接下來(lái), CPU就會(huì)暫停當(dāng)前的工作,并切換到網(wǎng)卡的任務(wù)肢藐。然后楣黍,網(wǎng)卡驅(qū)動(dòng)會(huì)開(kāi)始運(yùn)行,從網(wǎng)卡緩沖區(qū)中將接收到的包讀取出來(lái),根據(jù) MAC頭部的以太類(lèi)型字段判斷協(xié)議的種類(lèi)哎媚,并調(diào)用負(fù)責(zé)處理該協(xié)議的軟件喇伯。這里,以太類(lèi)型的值應(yīng)該是表示 IP協(xié)議拨与,因此會(huì)調(diào)用 TCP/ IP協(xié)議棧稻据,并將包轉(zhuǎn)交給它。
網(wǎng)卡驅(qū)動(dòng)會(huì)根據(jù) MAC頭部判斷協(xié)議類(lèi)型买喧,并將包交給相應(yīng)的協(xié)議棧捻悯。
8.2.2、IP模塊接收操作
( 1)IP模塊首先會(huì)檢查 IP頭部的格式是否符合規(guī)范岗喉,然后檢查接收方 IP地址秋度,看包是不是發(fā)給自己的;
( 2)判斷網(wǎng)絡(luò)包是否經(jīng)過(guò)分片钱床;
( 3)需要檢查 IP頭部的協(xié)議號(hào)字段荚斯,并將包轉(zhuǎn)交給相應(yīng)的模塊。例如查牌,如果協(xié)議號(hào)為 06(十六進(jìn)制)事期,則將包轉(zhuǎn)交給 TCP模塊;如果是 11(十六進(jìn)制)纸颜,則轉(zhuǎn)交給 UDP模塊兽泣。
8.2.3、TCP模塊如何處理連接包
第一步:當(dāng) TCP頭部中的控制位 SYN為 1時(shí)胁孙,表示這是一個(gè)發(fā)起連接的包唠倦。這時(shí), TCP模塊會(huì)執(zhí)行接受連接的操作涮较,不過(guò)在此之前稠鼻,需要先檢查包的接收方端口號(hào),并確認(rèn)在該端口上有沒(méi)有與接收方端口號(hào)相同且正在處于等待連接狀態(tài)的套接字狂票。如果指定端口號(hào)沒(méi)有等待連接的套接字候齿,則向客戶(hù)端返回錯(cuò)誤通知的包。向客戶(hù)端返回一個(gè)表示接收方端口不存在等待連接的套接字的 ICMP消息闺属。
第二步:如果存在等待連接的套接字慌盯,則為這個(gè)套接字復(fù)制一個(gè)新的副本,并將發(fā)送方 IP地址掂器、端口號(hào)亚皂、序號(hào)初始值、窗口大小等必要的參數(shù)寫(xiě)入這個(gè)套接字中国瓮,同時(shí)分配用于發(fā)送緩沖區(qū)和接收緩沖區(qū)的內(nèi)存空間孕讳。然后生成代表接收確認(rèn)的 ACK號(hào)匠楚,用于從服務(wù)器向客戶(hù)端發(fā)送數(shù)據(jù)的序號(hào)初始值,表示接收緩沖區(qū)剩余容量的窗口大小厂财,并用這些信息生成 TCP頭部芋簿,委托 IP模塊發(fā)送給客戶(hù)端。
第三步:這個(gè)包到達(dá)客戶(hù)端之后璃饱,客戶(hù)端會(huì)返回表示接收確認(rèn)的 ACK號(hào)与斤,當(dāng)這個(gè) ACK號(hào)返回服務(wù)器后,連接操作就完成了荚恶。這時(shí)撩穿,服務(wù)器端的程序應(yīng)該進(jìn)入調(diào)用 accept的暫停狀態(tài),當(dāng)將新套接字的描述符轉(zhuǎn)交給服務(wù)器程序之后谒撼,服務(wù)器程序就會(huì)恢復(fù)運(yùn)行食寡。
8.2.4、TCP模塊如何處理數(shù)據(jù)包
( 1)收到數(shù)據(jù)包時(shí)廓潜, TCP模塊會(huì)根據(jù)收到的包的發(fā)送方 IP地址抵皱、發(fā)送方端口號(hào)、接收方 IP地址辩蛋、接收方端口號(hào)找到相對(duì)應(yīng)的套接字呻畸;
( 2)將數(shù)據(jù)塊拼合起來(lái)并保存在接收緩沖區(qū)中;
( 3)向客戶(hù)端返回 ACK悼院。
8.2.5伤为、TCP模塊的斷開(kāi)操作
在TCP協(xié)議的規(guī)則中,斷開(kāi)操作可以由客戶(hù)端或服務(wù)器任何一方發(fā)起据途,具體的順序是由應(yīng)用層協(xié)議決定的绞愚。Web中,這一順序隨HTTP協(xié)議版本不同而不同颖医,在HTTP1.0中位衩,是服務(wù)器先發(fā)起斷開(kāi)操作。
(1)服務(wù)器會(huì)調(diào)用Socket庫(kù)的socket便脊,TCP模塊會(huì)生成一個(gè) FIN為 1的 TCP頭部,并委托 IP模塊發(fā)送給客戶(hù)端
(2)當(dāng)客戶(hù)端收到這個(gè)包后光戈,會(huì)返回一個(gè)ACK號(hào)哪痰,
(3)接下來(lái)客戶(hù)端會(huì)調(diào)用close,生成一個(gè) FIN為 1的 TCP頭部發(fā)給服務(wù)器久妆,
(4)服務(wù)器再返回一個(gè) ACK號(hào)晌杰。