網(wǎng)絡(luò)是怎樣連接的之探索協(xié)議棧和網(wǎng)卡讀書(shū)筆記(二)

寫(xiě)在前面的話(huà):在這里我們要學(xué)習(xí)整理的是協(xié)議棧和網(wǎng)卡探索的讀書(shū)筆記蜈亩,其中的TCP/IP,三次握手局劲,SYN勺拣,ACK奶赠,ARP,ICMP等等鱼填,希望在學(xué)習(xí)之后,大家都能對(duì)這些有一定的概念毅戈,知道是怎么回事苹丸!有道筆記之前寫(xiě)的居然沒(méi)有保存下來(lái)愤惰,坑啊W咐怼;卵浴!商模!

網(wǎng)絡(luò)是怎樣連接的腦圖.png

在上一篇中我們介紹了協(xié)議棧的調(diào)用流程是:

1.創(chuàng)建套接字(創(chuàng)建套接字階段)
2.將管道連接到服務(wù)器端的套接字上(連接階段)
3.收發(fā)數(shù)據(jù)(通信階段)
4.斷開(kāi)管道并刪除套接字(斷開(kāi)階段)

這里我們就用這個(gè)流程來(lái)整理奠旺,首先看一下協(xié)議棧的內(nèi)部結(jié)構(gòu):

TCPIP軟件采用分層結(jié)構(gòu).png

分為幾個(gè)部分,分別承擔(dān)不同的功能施流。 這張圖中的上下關(guān)系是有一定規(guī)則的响疚,上面的部分會(huì)向下面的部分委派工作,
下面的部分接受委派的工作并實(shí)際執(zhí)行瞪醋,這一點(diǎn)大家在看圖時(shí)可以參 考一下忿晕。這里不在展開(kāi)...

創(chuàng)建套接字

實(shí)際上套接字的實(shí)體就是通信控制信息。

在協(xié)議棧內(nèi)部有一塊用于存放控制信息的內(nèi)存空間银受,這里記錄了用于 控制通信操作的控制信息践盼,例如通信對(duì)象的 IP
地址、端口號(hào)宾巍、通信操作的 進(jìn)行狀態(tài)等咕幻。本來(lái)套接字就只是一個(gè)概念而已,并不存在實(shí)體顶霞,如果一定
要賦予它一個(gè)實(shí)體谅河,我們可以說(shuō)這些控制信息就是套接字的實(shí)體,或者說(shuō)
存放控制信息的內(nèi)存空間就是套接字的實(shí)體确丢。

協(xié)議棧是根據(jù)套接字中記錄的控制信息來(lái)工作的绷耍。

我們可以通過(guò)netstat -ano開(kāi)查看windows下的套接字信息,這里就不在展開(kāi)了...

創(chuàng)建套接字

創(chuàng)建套接字實(shí)際上就是調(diào)用下面代碼:

<描述符> = socket(<使用iPv4>,<使用TCP>);

創(chuàng)建套接字干的第一件事就是分配內(nèi)存空間鲜侥,然后向其寫(xiě)入初始狀態(tài)褂始。

描述符其實(shí)是用來(lái)區(qū)分協(xié)議棧中多個(gè)套接字用的號(hào)碼牌。

連接服務(wù)器

在這里連接服務(wù)器也需要一些準(zhǔn)備工作:

客戶(hù)端:

把服務(wù)器的IP地址和端口號(hào)等信息告知協(xié)議棧描函。

服務(wù)器:

創(chuàng)建套接字崎苗,等待連接。

連接實(shí)際上是通信雙方交換控制信息舀寓,在套接字中記錄這些必要信息并準(zhǔn)備數(shù)據(jù)收發(fā)的一連串操作胆数。
而所謂控制信息就是用來(lái)控制數(shù)據(jù)收發(fā)所需的一些信息,IP地址和端口號(hào)就是典型的例子互墓。

同時(shí)我們需要準(zhǔn)備一塊內(nèi)存空間作為數(shù)據(jù)的緩存區(qū)必尼,在數(shù)據(jù)收發(fā)操作時(shí)使用。

負(fù)責(zé)保存控制信息的頭部

第一類(lèi):是客戶(hù)端和服務(wù)器相互聯(lián)絡(luò)時(shí)交換的控制信息。這些信息不僅
連接時(shí)需要判莉,包括數(shù)據(jù)收發(fā)和斷開(kāi)連接操作在內(nèi)豆挽,整個(gè)通信過(guò)程中都需要, 這些內(nèi)容在 TCP
協(xié)議的規(guī)格中進(jìn)行了定義券盅。具體來(lái)說(shuō)帮哈,表 2.1 中的這些字 段就是 TCP 規(guī)格中定義的控制信息
A。這些字段是固定的锰镀,在連接娘侍、收發(fā)、 斷開(kāi)等各個(gè)階段中泳炉,每次客戶(hù)端和服務(wù)器之間進(jìn)行通信時(shí)私蕾,都需要提供這
些控制信息。

[圖片上傳失敗...(image-17ffc5-1527905991442)]

這些字段是固定的胡桃,在連接踩叭,收發(fā),斷開(kāi)等各個(gè)階段中翠胰,每次客戶(hù)端和服務(wù)器之間進(jìn)行通信時(shí)容贝,都需要提供這些控制信息。例如:
[圖片上傳失敗...(image-b653e5-1527905991442)]

如上圖a所示之景,這些信息會(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)頭部 B掂僵、IP 頭部。

第二類(lèi):那就是保存在套接字中顷歌,用來(lái)控制協(xié)議棧操 作的信息
A锰蓬。應(yīng)用程序傳遞來(lái)的信息以及從通信對(duì)象接收到的信息都會(huì)保存在這里,還有收發(fā)數(shù)據(jù)操作的執(zhí)行狀態(tài)等信息也會(huì)保存
在這里眯漩,協(xié)議棧會(huì) 根據(jù)這些信息來(lái)執(zhí)行每一步的操作芹扭。

連接操作的實(shí)際過(guò)程

實(shí)際上具體的連接操作時(shí)從調(diào)用Socket庫(kù)中的connect庫(kù)開(kāi)始的;

connect(< 描述符 >, < 服務(wù)器 IP 地址和端口號(hào) >, ...)

這里整體的描述都是書(shū)上的,描述的非常清晰:

上面的調(diào)用提供了服務(wù)器的 IP 地址和端口號(hào)冯勉,這些信息會(huì)傳遞給協(xié)議 棧中的 TCP 模塊。然后摹芙,TCP 模塊會(huì)與該 IP
地址對(duì)應(yīng)的對(duì)象灼狰,也就是與 服務(wù)器的 TCP 模塊交換控制信息,這一交互過(guò)程包括下面幾個(gè)步驟浮禾。首
先交胚,客戶(hù)端先創(chuàng)建一個(gè)包含表示開(kāi)始數(shù)據(jù)收發(fā)操作的控制信息的頭部。如 表 2.1
所示盈电,頭部包含很多字段蝴簇,這里要關(guān)注的重點(diǎn)是發(fā)送方和接收方的
端口號(hào)。到這里匆帚,客戶(hù)端(發(fā)送方)的套接字就準(zhǔn)確找到了服務(wù)器(接收
方)的套接字熬词,也就是搞清楚了我應(yīng)該連接哪個(gè)套接字。然后吸重,我們將頭 部中的控制位的 SYN 比特設(shè)置為
1互拾,大家可以認(rèn)為它表示連接 A。此外還需 要設(shè)置適當(dāng)?shù)男蛱?hào)和窗口大小嚎幸,

當(dāng) TCP 頭部創(chuàng)建好之后颜矿,接下來(lái) TCP 模塊會(huì)將信息傳遞給 IP 模塊并 委托它進(jìn)行發(fā)送 A。IP
模塊執(zhí)行網(wǎng)絡(luò)包發(fā)送操作后嫉晶,網(wǎng)絡(luò)包就會(huì)通過(guò)網(wǎng)絡(luò)到 達(dá)服務(wù)器骑疆,然后服務(wù)器上的 IP 模塊會(huì)將接收到的數(shù)據(jù)傳遞給 TCP
模塊, 服務(wù)器的 TCP 模塊根據(jù) TCP 頭部中的信息找到端口號(hào)對(duì)應(yīng)的套接字替废,也
就是說(shuō)箍铭,從處于等待連接狀態(tài)的套接字中找到與 TCP 頭部中記錄的端口號(hào)
相同的套接字就可以了。當(dāng)找到對(duì)應(yīng)的套接字之后椎镣,套接字中會(huì)寫(xiě)入相應(yīng) 的信息坡疼,并將狀態(tài)改為正在連接
B。上述操作完成后衣陶,服務(wù)器的 TCP 模塊會(huì) 返回響應(yīng)柄瑰,這個(gè)過(guò)程和客戶(hù)端一樣,需要在 TCP 頭部中設(shè)置發(fā)送方和接收
方端口號(hào)以及 SYN 比特 C剪况。此外教沾,在返回響應(yīng)時(shí)還需要將 ACK 控制位設(shè)為
1D,這表示已經(jīng)接收到相應(yīng)的網(wǎng)絡(luò)包译断。網(wǎng)絡(luò)中經(jīng)常會(huì)發(fā)生錯(cuò)誤授翻,網(wǎng)絡(luò)包也會(huì)
發(fā)生丟失,因此雙方在通信時(shí)必須相互確認(rèn)網(wǎng)絡(luò)包是否已經(jīng)送達(dá) E,而設(shè)置 ACK
比特就是用來(lái)進(jìn)行這一確認(rèn)的堪唐。接下來(lái)巡语,服務(wù)器 TCP 模塊會(huì)將 TCP 頭部傳遞給 IP 模塊,并委托 IP
模塊向客戶(hù)端返回響應(yīng)淮菠。

然后男公,網(wǎng)絡(luò)包就會(huì)返回到客戶(hù)端,通過(guò) IP 模塊到達(dá) TCP 模塊合陵,并通 過(guò) TCP
頭部的信息確認(rèn)連接服務(wù)器的操作是否成功枢赔。如果 SYN 為 1 則表示連接成功,這時(shí)會(huì)向套接字中寫(xiě)入服務(wù)器的 IP
地址拥知、端口號(hào)等信息踏拜,同 時(shí)還會(huì)將狀態(tài)改為連接完畢。到這里低剔,客戶(hù)端的操作就已經(jīng)完成速梗,但其實(shí)還
剩下最后一個(gè)步驟。剛才服務(wù)器返回響應(yīng)時(shí)將 ACK 比特設(shè)置為 1襟齿,相應(yīng)地镀琉, 客戶(hù)端也需要將 ACK 比特設(shè)置為 1
并發(fā)回服務(wù)器,告訴服務(wù)器剛才的響應(yīng) 包已經(jīng)收到蕊唐。當(dāng)這個(gè)服務(wù)器收到這個(gè)返回包之后屋摔,連接操作才算全部完成。

現(xiàn)在替梨,套接字就已經(jīng)進(jìn)入隨時(shí)可以收發(fā)數(shù)據(jù)的狀態(tài)了钓试,大家可以認(rèn)為
這時(shí)有一根管子把兩個(gè)套接字連接了起來(lái)。當(dāng)然副瀑,實(shí)際上并不存在這么一
根管子弓熏,不過(guò)這樣想比較容易理解敬尺,網(wǎng)絡(luò)業(yè)界也習(xí)慣這樣來(lái)描述刻两。這根管 子,我們稱(chēng)之為連接
A漏隐。只要數(shù)據(jù)傳輸過(guò)程在持續(xù)狈孔,也就是在調(diào)用 close 斷 開(kāi)之前信认,連接是一直存在的。

建立連接之后均抽,協(xié)議棧的連接操作就結(jié)束了嫁赏,也就是說(shuō) connect 已經(jīng) 執(zhí)行完畢,控制流程被交回到應(yīng)用程序油挥。

收發(fā)數(shù)據(jù)

數(shù)據(jù)收發(fā)操作時(shí)從應(yīng)用程序調(diào)用write將要發(fā)送的數(shù)據(jù)交給協(xié)議棧開(kāi)始的潦蝇。協(xié)議棧收到數(shù)據(jù)后執(zhí)行發(fā)送操作款熬,有幾個(gè)要點(diǎn):

1,協(xié)議棧不關(guān)心應(yīng)用程序傳來(lái)的數(shù)據(jù)是什么內(nèi)容攘乒,都是一堆二進(jìn)制字節(jié)序列而已贤牛。應(yīng)用程序調(diào)用write時(shí)會(huì)制定發(fā)送數(shù)據(jù)的長(zhǎng)度。
2.協(xié)議棧并不是已收到數(shù)據(jù)就馬上發(fā)送出去则酝,而是會(huì)將數(shù)據(jù)存放在內(nèi)部的發(fā)送緩沖區(qū)中殉簸,

那么需要積累多少才會(huì)把數(shù)據(jù)發(fā)送出去呢,這里需要根據(jù)以下幾個(gè)要素來(lái)判斷:

第一個(gè)是:判斷要素是每個(gè)網(wǎng)絡(luò)包容納的數(shù)據(jù)長(zhǎng)度堤魁,協(xié)議棧會(huì)根據(jù)一個(gè)叫做MTU的參數(shù)來(lái)進(jìn)行判斷喂链。

MTU:一個(gè)網(wǎng)絡(luò)包的長(zhǎng)度返十,以太網(wǎng)中一般為1500字節(jié)妥泉。頭部中包括了IP頭部和TCP頭部。
MSS:除去頭部之后洞坑,一個(gè)網(wǎng)絡(luò)包能容納的TCP數(shù)據(jù)的最大長(zhǎng)度盲链。頭部是40,MSS就是1460字節(jié)迟杂。

第二個(gè)是:時(shí)間刽沾。

當(dāng)應(yīng)用程序發(fā)送數(shù)據(jù)的頻率不高的時(shí)候,如 果每次都等到長(zhǎng)度接近 MSS
時(shí)再發(fā)送排拷,可能會(huì)因?yàn)榈却龝r(shí)間太長(zhǎng)而造成發(fā)這種情況下侧漓,即便緩沖區(qū)中的數(shù)據(jù)長(zhǎng)度沒(méi)有達(dá)到 MSS,也應(yīng)該果
斷發(fā)送出去监氢。為此布蔗,協(xié)議棧的內(nèi)部有一個(gè)計(jì)時(shí)器,當(dāng)經(jīng)過(guò)一定時(shí)間之后浪腐, 就會(huì)把網(wǎng)絡(luò)包發(fā)送出去纵揍。

上面兩個(gè)要素是互相矛盾的,所以協(xié)議棧也給了應(yīng)用程序一個(gè)選擇就是可以直接發(fā)送议街。

MTU和MSS.png

對(duì)較大數(shù)據(jù)進(jìn)行拆分

當(dāng)我們發(fā)送一個(gè)較大的數(shù)據(jù)時(shí)泽谨,發(fā)送緩存區(qū)中的數(shù)據(jù)會(huì)超過(guò)MSS的長(zhǎng)度,這個(gè)時(shí)候我們就不用在繼續(xù)等待了特漩,而是把數(shù)據(jù)進(jìn)行拆分以后直接發(fā)送吧雹。

數(shù)據(jù)拆分完畢以后,或者要準(zhǔn)備發(fā)送數(shù)據(jù)時(shí)涂身,我們給每一個(gè)數(shù)據(jù)前面加上TCP頭部吮炕,并根據(jù)套接字中記錄的控制信息標(biāo)記發(fā)送方和接收方的端口號(hào),然后交給IP模塊來(lái)執(zhí)行發(fā)送數(shù)據(jù)的操作访得。

應(yīng)用程序數(shù)據(jù)的拆分發(fā)送.png

使用ACK號(hào)確認(rèn)網(wǎng)絡(luò)包是否已收到

這里我們按著圖來(lái)說(shuō)明吧:

序號(hào)和ACK的用法.png

基本原理如下:

1.TCP拆分?jǐn)?shù)據(jù)龙亲,把每一塊的數(shù)據(jù)相當(dāng)于從頭開(kāi)始的第幾個(gè)字節(jié)算好陕凹,
2.在發(fā)送數(shù)據(jù)包,把算好的字節(jié)寫(xiě)在TCP頭部中鳄炉,也就是寫(xiě)在序號(hào)字段中杜耙。
3.發(fā)送數(shù)據(jù)的長(zhǎng)度也告知對(duì)方。(其實(shí)這里是接收方通過(guò)網(wǎng)絡(luò)包的長(zhǎng)度減去頭部的長(zhǎng)度計(jì)算得出的)拂盯,這樣就可以知道發(fā)送的
數(shù)據(jù)是從第幾個(gè)字節(jié)開(kāi)始的佑女,長(zhǎng)度是多少?同時(shí)接受放還能堅(jiān)持 收到的網(wǎng)絡(luò)包有沒(méi)有遺漏谈竿。
4.比如团驱,收到的是1460字節(jié),那么它下次收到的序號(hào)應(yīng)該是1461空凸,可是如果收到的是2921嚎花,那么就說(shuō)明以后了。
5.這里先說(shuō)沒(méi)有遺漏呀洲,接收方會(huì)將目前為止接收到的數(shù)據(jù)長(zhǎng)度加起來(lái)紊选,計(jì)算出一共收到了多少個(gè)字節(jié),然后將這個(gè)數(shù)值寫(xiě)入TCP頭部的ACK號(hào)中道逗,然后發(fā)送給發(fā)送方兵罢。
6.那么如果有遺漏呢? 它會(huì)計(jì)算已經(jīng)收到的連續(xù)的包滓窍,計(jì)算最后它的長(zhǎng)度是多少卖词,一共收到了多少個(gè)字節(jié),然后把它發(fā)送給發(fā)送方吏夯,而缺失的那部分因?yàn)槲覀儾](méi)有收到此蜈,所以我們并不會(huì)發(fā)送確認(rèn)ACK給發(fā)送方,而發(fā)送方如果沒(méi)有收到確認(rèn)的ACK號(hào)锦亦,就說(shuō)明這一個(gè)網(wǎng)絡(luò)包的數(shù)據(jù)接收方并沒(méi)有收到舶替,它就會(huì)從緩沖區(qū)取出這個(gè)包,重新發(fā)送杠园,直到收到確認(rèn)ACK為止顾瞪。

在實(shí)際通信中,序號(hào)不是從1開(kāi)始的抛蚁,而是一個(gè)隨機(jī)數(shù)計(jì)算出來(lái)的初始值陈醒,在我們連接的過(guò)程中,將SYN設(shè)置為1瞧甩,同時(shí)也設(shè)置了序號(hào)字段的值钉跷。這里就是代表需要的初始值。

什么是SYN?

我們?cè)谇懊嬷v連接操作的時(shí)候說(shuō)過(guò) SYN 為 1 表示進(jìn)行連接肚逸,這是因?yàn)閷?SYN 設(shè)為 1
并告知初始序號(hào)這一操作僅在連接過(guò)程中出現(xiàn)爷辙,因此發(fā)送 SYN 為 1
的網(wǎng)絡(luò)包就表示發(fā)起連接的意思彬坏。實(shí)際上,SYN 是 Synchronize
(同步)的縮寫(xiě)膝晾,意思是通過(guò)告知初始序號(hào)使通信雙方保持步調(diào)一致栓始,以便 完成后續(xù)的數(shù)據(jù)收發(fā)檢查,這才是 SYN
原本的含義血当。

孀居的傳輸是雙向的交互

數(shù)據(jù)雙向交互和序號(hào)與ACK號(hào)的交互.png

實(shí)際的工作過(guò)程:

首先幻赚,客戶(hù)端 在連接時(shí)需要計(jì)算出與從客戶(hù)端到服務(wù)器方向通信相關(guān)的序號(hào)初始值,并
將這個(gè)值發(fā)送給服務(wù)器(圖 2.9 1)臊旭。接下來(lái)落恼,服務(wù)器會(huì)通過(guò)這個(gè)初始值計(jì) 算出 ACK 號(hào)并返回給客戶(hù)端(圖 2.9
2)。初始值有可能在通信過(guò)程中丟 失离熏,因此當(dāng)服務(wù)器收到初始值后需要返回 ACK 號(hào)作為確認(rèn)佳谦。同時(shí),服務(wù)
器也需要計(jì)算出與從服務(wù)器到客戶(hù)端方向通信相關(guān)的序號(hào)初始值撤奸,并將這個(gè)值發(fā)送給客戶(hù)端(圖 2.9
2)吠昭。接下來(lái)像剛才一樣喊括,客戶(hù)端也需要根據(jù)服 務(wù)器發(fā)來(lái)的初始值計(jì)算出 ACK 號(hào)并返回給服務(wù)器(圖 2.9
3)胧瓜。到這里,序 號(hào)和 ACK 號(hào)都已經(jīng)準(zhǔn)備完成了郑什,接下來(lái)就可以進(jìn)入數(shù)據(jù)收發(fā)階段了府喳。數(shù)
據(jù)收發(fā)操作本身是可以雙向同時(shí)進(jìn)行的,但 Web 中是先由客戶(hù)端向服務(wù)器
發(fā)送請(qǐng)求蘑拯,序號(hào)也會(huì)跟隨數(shù)據(jù)一起發(fā)送(圖 2.9 4)钝满。然后,服務(wù)器收到數(shù) 據(jù)后再返回 ACK 號(hào)(圖 2.9
5)申窘。從服務(wù)器向客戶(hù)端發(fā)送數(shù)據(jù)的過(guò)程則正好 相反(圖 2.9 67)弯蚜。

通過(guò)“序號(hào)”和“ACK 號(hào)”可以確認(rèn)接收方是否收到了網(wǎng)絡(luò)包。

根據(jù)網(wǎng)絡(luò)包平均往返時(shí)間調(diào)整 ACK 號(hào)等待時(shí)間

TCP 采用了動(dòng)態(tài)調(diào)整等待時(shí)間的方法剃法,這個(gè)等待時(shí)間是 根據(jù) ACK 
號(hào)返回所需的時(shí)間來(lái)判斷的碎捺。具體來(lái)說(shuō),TCP
會(huì)在發(fā)送數(shù)據(jù) 的過(guò)程中持續(xù)測(cè)量 ACK 號(hào)的返回時(shí)間贷洲,如果 ACK 
號(hào)返回變慢收厨,則相應(yīng)
延長(zhǎng)等待時(shí)間;相對(duì)地,如果 ACK 號(hào)馬上就能返回优构,則相應(yīng)縮短等待 時(shí)間 B诵叁。

使用窗口有效管理 ACK 號(hào)

首先你要明白什么是窗口,其實(shí)它說(shuō)的窗口就是接收方的緩沖區(qū)大小钦椭,
在你發(fā)送的包和我處理的包的過(guò)程中拧额,接收方首先會(huì)把包放到緩沖區(qū)碑诉,
然后按個(gè)取出按個(gè)進(jìn)行處理,可是如果發(fā)送方發(fā)送了太多的網(wǎng)絡(luò)包侥锦,而
接收方來(lái)不及處理联贩,就會(huì)造成緩沖區(qū)溢出,所以我們?cè)谶B接的時(shí)候捎拯,接
收方會(huì)把窗口的大小也發(fā)給發(fā)送方泪幌,告訴發(fā)送方,你悠著點(diǎn)發(fā)署照,別發(fā)的超了祸泪。
滑動(dòng)窗口和接收緩沖區(qū).png

接收 HTTP 響應(yīng)消息

簡(jiǎn)單總結(jié):

首先,協(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ā)送窗 口更新 B。

從服務(wù)器斷開(kāi)并刪除套接字

完成數(shù)據(jù)發(fā)送的一方會(huì)發(fā)起斷開(kāi)過(guò)程邑退,這里我們以服
務(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ù)(圖 2.12 1)。同時(shí)趣苏,服務(wù)器的套接字
中也會(huì)記錄下斷開(kāi)操作的相關(guān)信息狡相。

斷開(kāi)連接的交互過(guò)程.png

接下來(lái)輪到客戶(hù)端了。當(dāng)收到服務(wù)器發(fā)來(lái)的 FIN 為 1 的 TCP 頭部時(shí)食磕,
客戶(hù)端的協(xié)議棧會(huì)將自己的套接字標(biāo)記為進(jìn)入斷開(kāi)操作狀態(tài)尽棕。然后,為 了告知服務(wù)器已收到 FIN 為 1
的包彬伦,客戶(hù)端會(huì)向服務(wù)器返回一個(gè) ACK 號(hào)
(圖 2.12 2)滔悉。這些操作完成后伊诵,協(xié)議棧就可以等待應(yīng)用程序來(lái)取數(shù)據(jù)了。 過(guò)了一會(huì)兒回官,應(yīng)用程序就會(huì)調(diào)用 read
來(lái)讀取數(shù)據(jù) A曹宴。這時(shí),協(xié)議棧不會(huì)向應(yīng)用程序傳遞數(shù)據(jù) A歉提,而是會(huì)告知應(yīng)用程序(瀏覽器)來(lái)自服務(wù)器的數(shù)據(jù)
已經(jīng)全部收到了笛坦。根據(jù)規(guī)則,服務(wù)器返回請(qǐng)求之后苔巨,Web 通信操作就全部
結(jié)束了版扩,因此只要收到服務(wù)器返回的所有數(shù)據(jù),客戶(hù)端的操作也就隨之結(jié) 束了侄泽。因此礁芦,客戶(hù)端應(yīng)用程序會(huì)調(diào)用 close
來(lái)結(jié)束數(shù)據(jù)收發(fā)操作,這時(shí)客 戶(hù)端的協(xié)議棧也會(huì)和服務(wù)器一樣悼尾,生成一個(gè) FIN 比特為 1 的 TCP 包柿扣,然后 委托 IP
模塊發(fā)送給服務(wù)器(圖 2.12 3)。一段時(shí)間之后闺魏,服務(wù)器就會(huì)返回 ACK 號(hào)(圖 2.12
4)未状。到這里,客戶(hù)端和服務(wù)器的通信就全部結(jié)束了舷胜。

刪除套接字

不過(guò)娩践,套接字并不會(huì)立即被刪除活翩,而是 會(huì)等待一段時(shí)間之后再被刪除烹骨。

(1)客戶(hù)端發(fā)送 FIN
(2)服務(wù)器返回 ACK 號(hào) 
(3)服務(wù)器發(fā)送 FIN 
(4)客戶(hù)端返回 ACK 號(hào)

總結(jié)

這個(gè)是TCP連接的整體流程:

TCP的整體流程.png

數(shù)據(jù)收發(fā)操作的第一步是創(chuàng)建套接字。一般來(lái)說(shuō)材泄,服務(wù)器一方的應(yīng)用
程序在啟動(dòng)時(shí)就會(huì)創(chuàng)建好套接字并進(jìn)入等待連接的狀態(tài)沮焕。客戶(hù)端則一般是
在用戶(hù)觸發(fā)特定動(dòng)作拉宗,需要訪(fǎng)問(wèn)服務(wù)器的時(shí)候創(chuàng)建套接字峦树。在這個(gè)階段, 還沒(méi)有開(kāi)始傳輸網(wǎng)絡(luò)包旦事。
創(chuàng)建套接字之后魁巩,客戶(hù)端會(huì)向服務(wù)器發(fā)起連接操作。首先姐浮,客戶(hù)端會(huì) 生成一個(gè) SYN 為 1 的 TCP
包并發(fā)送給服務(wù)器(圖 2.13 1)谷遂。這個(gè) TCP 包
的頭部還包含了客戶(hù)端向服務(wù)器發(fā)送數(shù)據(jù)時(shí)使用的初始序號(hào),以及服務(wù)器 向客戶(hù)端發(fā)送數(shù)據(jù)時(shí)需要用到的窗口大小
A卖鲤。當(dāng)這個(gè)包到達(dá)服務(wù)器之后肾扰,服 務(wù)器會(huì)返回一個(gè) SYN 為 1 的 TCP 包(圖 2.13 2)畴嘶。和圖 2.13 1一樣,這個(gè)
包的頭部中也包含了序號(hào)和窗口大小集晚,此外還包含表示確認(rèn)已收到包1的 ACK 號(hào)
B窗悯。當(dāng)這個(gè)包到達(dá)客戶(hù)端時(shí),客戶(hù)端會(huì)向服務(wù)器返回一個(gè)包含表示確認(rèn)的 ACK 號(hào)的 TCP 包(圖 2.13
3)偷拔。到這里蒋院,連接操作就完成了,雙方進(jìn) 入數(shù)據(jù)收發(fā)階段莲绰。

數(shù)據(jù)收發(fā)階段的操作根據(jù)應(yīng)用程序的不同而有一些差異悦污,以 Web 為 例,首先客戶(hù)端會(huì)向服務(wù)器發(fā)送請(qǐng)求消息钉蒲。TCP
會(huì)將請(qǐng)求消息切分成一定大 小的塊切端,并在每一塊前面加上 TCP 頭部,然后發(fā)送給服務(wù)器(圖 2.13 4)顷啼。TCP
頭部中包含序號(hào)踏枣,它表示當(dāng)前發(fā)送的是第幾個(gè)字節(jié)的數(shù)據(jù)。當(dāng)服務(wù)器 收到數(shù)據(jù)時(shí)钙蒙,會(huì)向客戶(hù)端返回 ACK 號(hào)(圖 2.13
5)茵瀑。在最初的階段,服務(wù) 器只是不斷接收數(shù)據(jù)躬厌,隨著數(shù)據(jù)收發(fā)的進(jìn)行马昨,數(shù)據(jù)不斷傳遞給應(yīng)用程序,
接收緩沖區(qū)就會(huì)被逐步釋放扛施。這時(shí)鸿捧,服務(wù)器需要將新的窗口大小告知客戶(hù)
端。當(dāng)服務(wù)器收到客戶(hù)端的請(qǐng)求消息后疙渣,會(huì)向客戶(hù)端返回響應(yīng)消息匙奴,這個(gè) 過(guò)程和剛才的過(guò)程正好相反(圖 2.13 67)。
服務(wù)器的響應(yīng)消息發(fā)送完畢之后妄荔,數(shù)據(jù)收發(fā)操作就結(jié)束了泼菌,這時(shí)就會(huì) 開(kāi)始執(zhí)行斷開(kāi)操作。以 Web
為例啦租,服務(wù)器會(huì)先發(fā)起斷開(kāi)過(guò)程 A哗伯。在這個(gè)過(guò)程 中,服務(wù)器先發(fā)送一個(gè) FIN 為 1 的 TCP 包(圖 2.13
8)篷角,然后客戶(hù)端返回一 個(gè)表示確認(rèn)收到的 ACK 號(hào)(圖 2.13 9)焊刹。接下來(lái),雙方還會(huì)交換一組方向相 反的 FIN 為 1 的
TCP 包(圖 2.13 10)和包含 ACK 號(hào)的 TCP 包(圖 2.13k)。 最后伴澄,在等待一段時(shí)間后赋除,套接字會(huì)被刪除。

IP 與以太網(wǎng)的包收發(fā)操作

包的基礎(chǔ)知識(shí)

包是由頭部和數(shù)據(jù)兩部分構(gòu)成的(圖 2.14(a)非凌。頭部包含目的
地址等控制信息举农,大家可以把它理解為快遞包裹的面單;頭部后面就是委
托方要發(fā)送給對(duì)方的數(shù)據(jù),也就相當(dāng)于快遞包裹里的貨物敞嗡。一個(gè)包發(fā)往目 的地的過(guò)程如圖 2.15 所示颁糟。
網(wǎng)絡(luò)包的結(jié)構(gòu).png
發(fā)送方接收方和轉(zhuǎn)發(fā)設(shè)備.png

在轉(zhuǎn)發(fā)設(shè)備路由器中有一張記錄了什么地址要往哪里發(fā)的表,根據(jù)頭部的信息查詢(xún)這張表喉悴,就可以判斷出包的發(fā)送方向棱貌,這樣一來(lái),
每個(gè)包的就都鞥被發(fā)到各自要去的地方了箕肃。

(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è)備

(a)MAC 頭部(用于以太網(wǎng)協(xié)議)
(b)IP 頭部(用于 IP 協(xié)議)

IP網(wǎng)絡(luò)包的傳輸方式.png

我們從上圖可以看出,在實(shí)際傳輸中吟宦,目標(biāo)地址的IP始終都沒(méi)有改變篮洁,而MAC地址卻一直改變,隨著路由器根據(jù)目標(biāo)網(wǎng)址找到下一個(gè)路由器的地址殃姓,修改MAC地址為下一個(gè)目標(biāo)路由器的MAC地址袁波。

IP模塊會(huì)添加IP頭部和MAC頭部這兩種頭部。IP頭部中包含了IP協(xié)議規(guī)定的蜗侈,根據(jù)IP地址將包發(fā)往目的地所需的控制信
篷牌;MAC頭部包含通過(guò)以太網(wǎng)的局域網(wǎng)將包傳輸至最近的路由器的所需的控制信息。

這里我們要認(rèn)識(shí)到一點(diǎn)宛篇,IP的職責(zé)是將委托的東西打包送到對(duì)方手里娃磺,或者是將對(duì)方發(fā)送來(lái)的包接收下來(lái)。僅此而已叫倍,
無(wú)論要收發(fā)的包是控制包還是數(shù)據(jù)包,IP對(duì)各種類(lèi)型的包的收發(fā)操作都是相同的豺瘤。

IP頭部格式.png

大家要知道吆倦,大部分計(jì)算機(jī)上只有一塊網(wǎng)卡,因此也只有一個(gè)IP地址坐求,這種情況下我們可以認(rèn)為這個(gè)Ip地址就是計(jì)算機(jī)的IP地址蚕泽,但是服務(wù)器就沒(méi)有那么簡(jiǎn)單了,服務(wù)器上有很多個(gè)網(wǎng)卡,情況就不是那么簡(jiǎn)單了须妻,
IP地址實(shí)際上并不是分配給計(jì)算機(jī)的仔蝌,而是分配給網(wǎng)卡的。所以當(dāng)計(jì)算機(jī)上存在很多網(wǎng)卡時(shí)荒吏,每一塊網(wǎng)卡都會(huì)自己的IP地址敛惊,在填寫(xiě)發(fā)送方的IP地址時(shí)應(yīng)該使用哪一塊網(wǎng)卡來(lái)發(fā)送這個(gè)包,也就相當(dāng)于判斷應(yīng)該把包發(fā)送到哪個(gè)路由器绰更,因此只要確定了目標(biāo)路由器瞧挤,也就確定了使用哪塊網(wǎng)卡,也就確定了發(fā)送方的IP地址儡湾。

IP 頭部的“接收方 IP 地址”填寫(xiě)通信對(duì)象的 IP 地址特恬。 發(fā)送方IP地址需要判斷發(fā)送所使用的網(wǎng)卡,并填寫(xiě)該網(wǎng)卡的 IP 地址徐钠。

那么癌刽,我們應(yīng)該如何判斷應(yīng)該把包交給哪塊網(wǎng)卡呢?尝丐?

帶著這個(gè)問(wèn)題妒穴,我們看下面的描述:

路由器使用IP表判斷下一個(gè)路由器位置的操作是一樣的。因?yàn)閰f(xié)議棧的IP 模塊與路由器中負(fù)責(zé)包收發(fā)的部分都是根據(jù)IP協(xié)議規(guī)則來(lái)進(jìn)行包收發(fā)操作
的摊崭,所以它們也都用相同的方法來(lái)判斷把包發(fā)送給誰(shuí)讼油。

這個(gè)IP表就是路由表(Routing Table,windows下的查看命令是route print),下面是書(shū)中的例子:

路由表示例.png

我們對(duì)照著這張圖來(lái)說(shuō)明:

首先:我們對(duì)套接字中記錄的目的地IP地址與路由表左側(cè)的Network Destination 欄進(jìn)行比較呢簸,找到對(duì)應(yīng)的一行矮台。例如目標(biāo)地址是
192.168.1.21那么對(duì)應(yīng)的就是192.168.1也就是第6行,如果目標(biāo)的IP地址是10.10.1.166根时,那么對(duì)應(yīng)的就是10.10.1瘦赫。所以,一次類(lèi)推蛤迎,我們需要找到IP地址與左邊部分相匹配的那一項(xiàng)确虱,
找到那一項(xiàng)后看右邊數(shù)第2列和第3列的內(nèi)容。右起第2列替裆,也就是Interface列校辩,表示網(wǎng)卡等網(wǎng)絡(luò)接口,這些網(wǎng)絡(luò)接口可以將包發(fā)送給通信對(duì)象辆童。此外宜咒,右起第3列,即GeteWay列表示下一個(gè)路由器的IP地址把鉴,將包發(fā)給這個(gè)IP地址故黑,該地址對(duì)應(yīng)的路由器就會(huì)將包轉(zhuǎn)發(fā)到目標(biāo)地址。路由表的第1行中,目標(biāo)地址和子網(wǎng)掩碼都是0.0.0.0场晶,這表示默認(rèn)網(wǎng)關(guān)混埠,如果其他所有條目都沒(méi)有匹配,就會(huì)自動(dòng)匹配這一樣诗轻。

A Gateway(網(wǎng)關(guān))在 TCP/IP 的世界里就是路由器的意思钳宪。
B 如果Gateway 和 Interface 列的IP 地址相同,就表示不需要路由器進(jìn)行轉(zhuǎn) 發(fā)概耻,可以直接將包發(fā)給接收方的 IP 地址使套。我們將在第 3 章詳細(xì)介紹。

這樣一來(lái)鞠柄,我們就可以判斷出應(yīng)該使用哪塊網(wǎng)卡來(lái)發(fā)送包了侦高,然后就可以在IP頭部的發(fā)送方IP地址中填上這塊網(wǎng)卡對(duì)應(yīng)的IP地址。

接下來(lái)還需要填寫(xiě)協(xié)議號(hào)厌杜。表示包的內(nèi)容來(lái)自哪個(gè)模塊奉呛。

TCP模塊委托的內(nèi)容:`06`(16進(jìn)制)
UDP模塊委托的內(nèi)容:`17`(16進(jìn)制)

現(xiàn)在我們使用的瀏覽器中,HTTP請(qǐng)求消息都是通過(guò)TCP來(lái)傳輸?shù)暮痪。虼诉@里會(huì)填寫(xiě)表示TCPd 06

生成以太網(wǎng)用的MAC頭部

生成IP頭部以后瞧壮,接下來(lái)IP模塊還需要在IP頭部的前面添加MAC頭部。我們介紹MAC頭部的知識(shí):

1.MAC頭 部是以太網(wǎng)使用的頭部匙握,它包含了接收方和發(fā)送方的MAC地址等信息咆槽。
2.IP地址的長(zhǎng)度是32比特,MAC地址的長(zhǎng)度為48比特圈纺。
3.以太類(lèi)型秦忿,就是使用的協(xié)議類(lèi)型,下面是一些常見(jiàn)的類(lèi)型蛾娶。大家看圖吧:

MAC頭部字段.png

知道了MAC頭部的知識(shí)以后灯谣,我們就知道了怎么生成MAC頭部了:

1:設(shè)置以太類(lèi)型,這里填寫(xiě)表示I協(xié)議的值0800十六進(jìn)制蛔琅。
2:設(shè)置發(fā)送發(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地址的方法 B莽囤。設(shè)置發(fā)送方IP地址時(shí)谬擦,
我們已經(jīng)判斷出了從哪塊網(wǎng)卡發(fā)送這個(gè)包,那么現(xiàn)在只要將這塊網(wǎng)卡對(duì)應(yīng)
的MAC地址填進(jìn)去就好了朽缎。     

3:設(shè)置接收方的IP地址:

這個(gè)不復(fù)雜了,因?yàn)檫@個(gè)時(shí)間點(diǎn)上,我們還沒(méi)有把包發(fā)送出去话肖,所以就得搞清楚接收方應(yīng)該把
包發(fā)送給誰(shuí)北秽,前面我們講路由表的時(shí)候,就知道了只要查一下路由表最筒,在路路由表中找到相匹
配的條目贺氓,然后把包發(fā)給`Gateway`列中IP地址就可以了。既然我們知道應(yīng)該把包發(fā)送給誰(shuí)床蜘,
那么只要將對(duì)方的MAC地址填上去 就好了辙培,但到這里為止根本沒(méi)有出現(xiàn)對(duì)方的MAC地址,

也就是說(shuō)我們現(xiàn)
在根本不知道對(duì)方的MAC地址是什么邢锯。因此扬蕊,我們還需要執(zhí)行根據(jù)IP地
址查詢(xún)MAC地址的操作。接下來(lái)就是查詢(xún)目標(biāo)路由器的MAC地址了丹擎。

IP 模塊根據(jù)路由表 Gateway 欄的內(nèi)容判斷應(yīng)該把包發(fā)送給誰(shuí)

通過(guò) ARP 查詢(xún)目標(biāo)路由器的 MAC 地址 (:Address Resolution Protocol尾抑,地址解析協(xié)議。

)
它的使用非常簡(jiǎn)單(書(shū)上這么說(shuō)):

在以太網(wǎng)中蒂培,有一種叫作 廣播的方法再愈,可以把包發(fā)給連接在同一以太網(wǎng)中的所有設(shè)備。ARP就是利
用廣播對(duì)所有設(shè)備提問(wèn):“×× 這個(gè)IP地址是誰(shuí)的护戳?請(qǐng)把你的MAC地址 告訴我翎冲。” 然后就會(huì)有人回答:“ 這個(gè)IP 地址是我的媳荒,我的MAC 地址是 ××××抗悍。”

如果對(duì)方和自己處于同一個(gè)子網(wǎng)中肺樟,那么通過(guò)上面的操作就可以得到 對(duì)方的MAC地址 B檐春。然后,我們將這個(gè)MAC地址寫(xiě)入MAC頭部么伯,MAC 頭部就完成了疟暖。

使用ARP查詢(xún)MAC地址.png

如果每次發(fā)送包都要這樣查詢(xún)一次,網(wǎng)絡(luò)中就會(huì)增加很多ARP
包田柔,因此我們會(huì)將查詢(xún)結(jié)果放到一塊叫作ARP緩存的內(nèi)存空間中留著以后
用俐巴。也就是說(shuō),在發(fā)送包時(shí)硬爆,先查詢(xún)一下ARP緩存欣舵,如果其中已經(jīng)保存
了對(duì)方的MAC地址,就不需要發(fā)送ARP查詢(xún)缀磕,直接使用ARP緩存中的
地址缘圈,而當(dāng)ARP緩存中不存在對(duì)方MAC地址時(shí)劣光,則發(fā)送ARP查詢(xún)。

關(guān)于ARP緩沖這里不在詳細(xì)描述糟把,大家可以看書(shū)的110頁(yè)绢涡。

以太網(wǎng)的基本知識(shí)

完成IP模塊的工作之后,下面就該輪到網(wǎng)卡了遣疯,不過(guò)在此之前雄可,我們 先來(lái)了解一些以太網(wǎng)的基本知識(shí)。

以太網(wǎng)是一種為多臺(tái)計(jì)算機(jī)能夠彼此自由和廉價(jià)地相互通信而設(shè)計(jì)的
通信技術(shù)缠犀,它的原型如圖2.22(a)所示数苫。從圖上不難看出,這種網(wǎng)絡(luò)的本
質(zhì)其實(shí)就是一根網(wǎng)線(xiàn)辨液。圖上還有一種叫作收發(fā)器的小設(shè)備虐急,它的功能只是
將不同網(wǎng)線(xiàn)之間的信號(hào)連接起來(lái)而已。因此室梅,當(dāng)一臺(tái)計(jì)算機(jī)發(fā)送信號(hào)時(shí)戏仓,
信號(hào)就會(huì)通過(guò)網(wǎng)線(xiàn)流過(guò)整個(gè)網(wǎng)絡(luò),最終到達(dá)所有的設(shè)備亡鼠。

以太網(wǎng)的基本結(jié)構(gòu).png

這就好像所有人待在一個(gè)大房間里赏殃,任何一個(gè)人說(shuō)話(huà),所有人都能夠聽(tīng)到间涵,同樣地仁热,這種 網(wǎng)絡(luò)中任何一臺(tái)設(shè)備發(fā)送的信號(hào)所有設(shè)備都能接收到。不過(guò)勾哩,我們無(wú)法判
斷一個(gè)信號(hào)到底是發(fā)給誰(shuí)的抗蠢,因此需要在信號(hào)的開(kāi)頭加上接收者的信息,
也就是地址思劳。這樣一來(lái)就能夠判斷信號(hào)的接收者了迅矛,與接收者地址匹配的
設(shè)備就接收這個(gè)包,其他的設(shè)備則丟棄這個(gè)包潜叛,這樣我們的包就送到指定
的目的地了秽褒。為了控制這一操作,我們就需要使用表2.3中列出的MAC頭
部威兜。通過(guò)MAC頭部中的接收方MAC地址销斟,就能夠知道包是發(fā)給誰(shuí)的;而
通過(guò)發(fā)送方MAC地址椒舵,就能夠知道包是誰(shuí)發(fā)出的蚂踊;此外,通過(guò)以太類(lèi)型
就可以判斷包里面裝了什么類(lèi)型的內(nèi)容笔宿。以太網(wǎng)其實(shí)就這么簡(jiǎn)單 A犁钟。

這個(gè)原型后來(lái)變成了圖2.22(b)中的結(jié)構(gòu)棱诱。這個(gè)結(jié)構(gòu)是將主干網(wǎng)線(xiàn)替 換成了一個(gè)中繼式集線(xiàn)器 B,將收發(fā)器網(wǎng)線(xiàn)替換成了雙絞線(xiàn) C特纤。不過(guò)军俊,雖然網(wǎng) 絡(luò)的結(jié)構(gòu)有所變化侥加,但信號(hào)會(huì)發(fā)送給所有設(shè)備這一基本性質(zhì)并沒(méi)有改變捧存。

后來(lái),圖2.22(c)這樣的使用交換式集線(xiàn)器 D 的結(jié)構(gòu)普及開(kāi)來(lái)担败,現(xiàn)在我
們說(shuō)的以太網(wǎng)指的都是這樣的結(jié)構(gòu)毫目。這個(gè)結(jié)構(gòu)看上去和(b)很像膛壹,但其實(shí)里
面有一個(gè)重要的變化,即信號(hào)會(huì)發(fā)送給所有設(shè)備這一性質(zhì)變了,現(xiàn)在信號(hào)只 會(huì)流到根據(jù)MAC 地址指定的設(shè)備维雇,而不會(huì)到達(dá)其他設(shè)備了。當(dāng)然宅广,根據(jù)
MAC地址來(lái)傳輸包這一點(diǎn)并沒(méi)有變饶碘,因此MAC頭部的設(shè)計(jì)也得以保留。

盡管以太網(wǎng)經(jīng)歷了數(shù)次變遷拓哺,但其基本的3個(gè)性質(zhì)至今仍未改變勇垛,即
將包發(fā)送到MAC頭部的接收方MAC地址代表的目的地,用發(fā)送方MAC
地址識(shí)別發(fā)送方士鸥,用以太類(lèi)型識(shí)別包的內(nèi)容闲孤。因此,大家可以認(rèn)為具備這
3個(gè)性質(zhì)的網(wǎng)絡(luò)就是以太網(wǎng) E烤礁。

后續(xù)還有好幾個(gè)主題的介紹:

將 IP 包轉(zhuǎn)換成電或光信號(hào)發(fā)送出去 
給網(wǎng)絡(luò)包再加 3 個(gè)控制數(shù)據(jù)
向集線(xiàn)器發(fā)送網(wǎng)絡(luò)包
接收返回包
將服務(wù)器的響應(yīng)包從 IP 傳遞給 TCP 
ICMP
UDP 協(xié)議的收發(fā)操作

后續(xù)主題之后會(huì)陸續(xù)添加讼积,Over...

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市脚仔,隨后出現(xiàn)的幾起案子勤众,更是在濱河造成了極大的恐慌,老刑警劉巖鲤脏,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件们颜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡凑兰,警方通過(guò)查閱死者的電腦和手機(jī)掌桩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)姑食,“玉大人波岛,你說(shuō)我怎么就攤上這事∫舭耄” “怎么了则拷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵贡蓖,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我煌茬,道長(zhǎng)斥铺,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任坛善,我火速辦了婚禮晾蜘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘眠屎。我一直安慰自己剔交,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布改衩。 她就那樣靜靜地躺著岖常,像睡著了一般。 火紅的嫁衣襯著肌膚如雪葫督。 梳的紋絲不亂的頭發(fā)上竭鞍,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音橄镜,去河邊找鬼偎快。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蛉鹿,可吹牛的內(nèi)容都是我干的滨砍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼妖异,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼惋戏!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起他膳,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤响逢,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后棕孙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體舔亭,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年蟀俊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了钦铺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肢预,死狀恐怖矛洞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情烫映,我是刑警寧澤沼本,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布噩峦,位于F島的核電站,受9級(jí)特大地震影響抽兆,放射性物質(zhì)發(fā)生泄漏识补。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一辫红、第九天 我趴在偏房一處隱蔽的房頂上張望凭涂。 院中可真熱鬧,春花似錦厉熟、人聲如沸导盅。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至乍炉,卻和暖如春绢片,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背岛琼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工底循, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人槐瑞。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓熙涤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親困檩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子祠挫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容