
術(shù)語
- Nodes:主機(jī)和路由器
- Links: 負(fù)責(zé)連接相鄰兩個節(jié)點的連接
- 有線網(wǎng)
- 無線網(wǎng)
- 局域網(wǎng)
- Packets: frame(鏈路層對包的表述),它主要封裝了上一層 datagram
每層的 Packet 形式
Packet 就是網(wǎng)絡(luò)中傳遞的信息,但在不同層它會被封裝成不同形式。下面舉例了 3 層。

鏈路層是干什么用的
鏈路層是網(wǎng)絡(luò)結(jié)構(gòu)中的倒數(shù)第二層,最后一層是物理層,一般屬于硬件部分,所以就從鏈路層開始說起。鏈路層提供了很多的服務(wù)(干了很多事)。
Framing
很重要的一個功能就是將上一層的 datagram (packet的一種形式) 封裝成 frame。并在這個信息前后添加了 Header 和 Tailer。這里的 Header 一般包含了兩臺正在溝通設(shè)置的 Source 和 Destination 地址。
Link Access
既然是“鏈”路層了,肯定也要提供鏈接服務(wù)嘛。這一層主要提供兩個:
- Point to Point,兩臺機(jī)器直接溝通
- Shared Medium,也就是我們所說的廣播,一個人在微信群里喊
Flow Control
想像一下家里的水管,如果突然供水太多,那就爆水管了,網(wǎng)絡(luò)也是這樣。信息傳遞的時候需要用一些機(jī)制去控制傳輸速度。這個機(jī)制就叫 Flow Control,具體方法可以使用 Buffer 來做一個緩沖器。
Reliable Delivery
除了節(jié)流,這一層還負(fù)責(zé)保持信息的穩(wěn)定傳輸。傳個信怎么會出錯呢?因為現(xiàn)在是在底層,所以很多因素都會影響傳輸質(zhì)量,如信號干擾,網(wǎng)絡(luò)不穩(wěn)定。想一想平時有沒有出現(xiàn)看視頻掉幀的情況,還有耳機(jī)出現(xiàn)的噪音,這都是對信息傳遞干擾。所以鏈路層提供一些服務(wù)來保證傳遞質(zhì)量,這些機(jī)制主要也是要使用于不同網(wǎng)絡(luò)的如有線或者無線。
鏈路層在哪
說了一堆鏈路層的作用,好像太過抽象,不如說說具體位置。其實鏈路層在每臺主機(jī)都有,它主要是在 Network Interface Card(NIC),也就是我們的網(wǎng)卡。

鏈路層的信息溝通
發(fā)送方
- 將 datagram 封裝成 frame
- 添加 error bits, flow control, error recovery 等元信息
接收方
- 先看元信息,一然后做準(zhǔn)備工作,如:如果發(fā)現(xiàn)錯誤就把這個包扔了,讓發(fā)送方再發(fā)一次(retransmission)
- 然后將 frame 提取成 datagram,再向上傳遞
錯誤機(jī)制
就像剛剛說到的,傳遞信息過程中一定會出現(xiàn)錯誤的,鏈路層對此有兩種機(jī)制:
- Error Detection
- Error Recovery
Error Detection
接收方會去檢測錯誤率有多少,根據(jù)錯誤率去決定是否恢復(fù)數(shù)據(jù)還是讓發(fā)送方重傳。雖然說會檢測錯誤,但是不是所有錯誤都能檢測到的,有可能 miss 掉。其中EDC(Error Detection and Correction)越大,越容易檢測到。
Error Recovery
錯誤恢復(fù)機(jī)制一般是兩個
Correction
接收方會自己去改正對應(yīng)錯誤的 Bits,但是需要大量的 EDC bits,才能做到 Correction,畢竟更多的信息才能正確去改正嘛。一般用于那些不想等待 retransmit 的數(shù)據(jù)
Retransmission
接收方會丟掉一些包,發(fā)送方就會重傳。具體操作方法是直接超時,發(fā)送方得不到 ACK(就是一個接收完返回來的信號),發(fā)送方就得重傳?;蛘撸邮辗街苯影l(fā)一個 Netgative ACK,發(fā)送方也得重傳。
多路傳輸協(xié)議
不知道這讓翻譯對不對,英文是叫 Multiple access links protocol。在說這個協(xié)議有什么用之前,先說說以前的傳輸方式。
傳輸方式
- Point to Point,就是
發(fā)送方 <-> 接收方,這和微信找好友聊天是一樣的。一般是有線網(wǎng)絡(luò)或者無線網(wǎng)絡(luò)。 - Broadcast,就是
發(fā)送方 <-> 多個接收方,這和群聊是一樣的。一般是WIFI或者老的以太網(wǎng)使用。
這個協(xié)議有什么用
上面說的兩個傳輸方法都是在一個總線去完成消息傳遞的。所以總會出現(xiàn)同一個 Channel 中你在傳數(shù)據(jù)的同時,別人也在傳數(shù)據(jù)。不要想著什么多線程,這里只能一個一個來,所以就有了多路傳輸協(xié)議,主要是用于多人傳的時候決定誰先傳誰后傳的問題,最后做出一個任務(wù)表出來。
有人一聽到協(xié)議就不想看了,又要寫 C,C++搞協(xié)議,好難啊。嘿嘿,其實這個協(xié)議主要理念特別智障,細(xì)節(jié)很難(也就是寫C,C++那塊,好在我們了解一下就行了)。常用的有:
- Channel Partitioning
- 將 Channel 分成更小塊 (time slots, frequency, code)
- 分配某一塊給那個節(jié)點使用
- Random Access
- 不分配,允許沖突
- 但是會在沖突以后進(jìn)行恢復(fù)操作
- Taking Turns
- 節(jié)點會輪流發(fā)送信息,但是如果某個要發(fā)很多信息,就會占很長時間
CSMA
這里主要說說 Random Access 里的 CSMA 做法,為什么只拿這個來說呢,因為我們老師就講了這個啊。
主要理念很簡單:如果這個 Channel 空閑,我就傳輸,否則等到空閑再傳。是不是很智障?聽起來是的,細(xì)節(jié)反正不管了。
但是這個方法也有問題,如果兩個節(jié)點特別遠(yuǎn),自己想傳數(shù)據(jù)的時候別人已經(jīng)開始傳了,但是因為太遠(yuǎn)了我沒聽見別人說“我開始傳了,別人都不許動”,還以為這個 Channel 還是空閑的,所以我傳了數(shù)據(jù),這就造成沖突。當(dāng)沖突發(fā)生后,又要重傳??梢晕叶及岩粋€包的信息都發(fā)過去了呀,這整塊時間就白白浪費掉了。

上面的交集部分就是沖突后浪費掉的時間。
CSMA/CD (Collision Detection)
這個算是增強(qiáng)版的 CSMA。以前的 CSMA 是兩個人發(fā)完了再去重傳,現(xiàn)在這個不一樣了。在發(fā)送數(shù)據(jù)過程上,會去檢測是否有沖突,如果有就放棄傳輸,等待下一次。畢竟還是要等一段時間才能檢測出是否有沖突,所以依然有時間被浪費,但是會少一些。

關(guān)于怎么檢測是否有沖突,可以檢測信號的長度,對比傳輸和接收的信號(但是局限于距離和更小的 frame),可以在無線局域網(wǎng)比較難,接收信號距離太長。
下面再給出算法(算法???)的偽代碼:
NIC 接收從網(wǎng)絡(luò)層 datagram,并創(chuàng)建 frame
label: step2
if (channel Idle):
開始傳輸 frame
else if (channel busy):
等待直到 Idle
if (檢測是否有別的 transmission):
abort
wait K * 512 bit 的時間(K 是一個隨機(jī)數(shù))
goto step2
else
transmit
以太網(wǎng)
局域網(wǎng)里最出名也就是以太網(wǎng)了。電腦之間的聯(lián)系基本為下面兩種:
使用一條或幾條總線。

或者一個主機(jī),路由,現(xiàn)在一般是這種方式。

這里說一下 Switch 和 Hub 的區(qū)別。
- Switch: 節(jié)點傳輸不會有沖突,使用 Buffer 去做傳輸隊列
- Hub: 每個節(jié)點會 Broadcast 信息,不使用 Buffer,有可能出現(xiàn)沖突
以太網(wǎng)的信息結(jié)構(gòu)
我們知道在 HTTP 請求的時候總會有請求頭,以太網(wǎng)的傳輸也是一樣,也有頭部信息。

preamble: 用來同步接收方和發(fā)送方的 Clock Rates
addresses: Source 和 Destination 地址
type: 表示這個 frame 里最高層次是哪一層
CRC: 用于檢測錯誤
以太網(wǎng)的特性
兩個詞:unreliable, connectionless
- connectionless: 發(fā)送方和接收方?jīng)]有握手流程
- unreliable: 接收方的 NIC 不會發(fā)送 ACK 和 NACK
- 如果數(shù)據(jù)被丟了就不會做恢復(fù)
- 自己偷懶,更依賴于高層的數(shù)據(jù)傳輸
設(shè)備接口地址
啊,這是什么鬼東西,Device Interface Address 就是 IP 地址。
MAC 地址
我們可以會在家里的路由器看到這個詞,MAC 地址就是該設(shè)備唯一的編號,IP 只是網(wǎng)絡(luò)里的唯一編號。
這么說吧,IP 就像你的住址,你可以今天在北京買套房,你的IP就是北京了,明天去上海買套房搬去那邊住,IP 就變成了上海。雖然說能變,但是你沒有美國綠卡,再怎么變也不能逃不去中國,所以中國就是你所在的網(wǎng)絡(luò)。說不定日本也有叫北京的地方,但是你們處于兩個國家(兩個網(wǎng)絡(luò)),不會造成影響。
但是 MAC 就不一樣了,就你的身份證一樣,一直跟隨著你。
ARP
那這個 MAC 有什么用呢?可以用來標(biāo)記你在哪呀,別人發(fā)數(shù)據(jù)給你的時候是一定要不僅知道你的 IP,也要知道你的 MAC 的。你可能會問了,大哥我的 MAC 是寫在路由器上的,難道你來我家看嗎?電腦可不這么傻。
他會先廣播一個叫 ARP 的請求,大概意思是:“那個XXX,給我出來!”。XXX 聽到后就說:“我在YYY這呢,你有種過來干我?!?。
再給個具體的鴿子:
比如 A 想發(fā)信息給 B,下面是前提條件
- B 一定要在同一個局域網(wǎng)里,而且 A 知道 B 的 IP
- A 不知道 B 的 MAC 地址
具體操作:
- 首先 A 在本地網(wǎng)絡(luò)里去 Broadcast 一下,這個請求就是 ARP 請求包,其中包含了 B 的 IP
- 本地的全部節(jié)點都會接收到這個 ARP 請求,并處理
- 如果 B 此時也接收到這個請求,就會發(fā) ARP replay 給 A,同時會帶上 B’ 的 MAC 地址。
- 這個過程都是在 Link Layer 完成的

每一次都要發(fā)太麻煩了,所以設(shè)備自己會做一張 ARP 表示,里面 IP 對應(yīng)著已經(jīng)知道的設(shè)備的 MAC 地址。ARP 表結(jié)構(gòu)如下:

還有一些問題
問:如果給自己發(fā) ARP 會怎么樣?
答:不會怎么樣,一般是沒有響應(yīng)罷了。不過這樣可以檢測同一個網(wǎng)絡(luò)中是否存在別的主機(jī)的IP是否和自己一樣。
問:如果給不存在的主機(jī)發(fā) ARP 會怎么樣?
答:也不會怎么樣,最后就失敗唄