前言
本文將我學習的計算機網絡相關知識做個匯總,以求備忘,形成體系以及將來能融會貫通。
什么是計算機網絡
簡單地說就是由多臺計算機(節(jié)點)相互連通(邊)形成的通信系統(tǒng)。相對于其他的通信網絡如無線電廣播和電視信號而言,計算機網絡傳輸?shù)男畔⑹嵌M制數(shù)字。
什么是網絡協(xié)議
兩個中國人之間交流需要雙方都懂得漢語普通話,一個中國人和一個美國人交流則需要雙方都懂英語。如果其中一人是聾啞人,雙方則需要手語來交流。人與人之間的想要交流信息需要雙方都接受的編碼方式以及這種編碼方式的格式和意義,我們把這種格式和意義叫做語言。計算機之間的交流也是一樣的道理,編碼方式為二進制數(shù)字,這些數(shù)字的格式和意義叫做協(xié)議。
OSI七層模型和TCP/IP五層模型
人類通過抽象來處理復雜的,無法一下子理解的事物。一個復雜的問題可以被分解成很多不同的抽象層次,每一個層次相對易于處理。計算機技術里也經常使用抽象的方法。比如在學習和理解計算機原理的時候,我們分別學習計算機體系結構,操作系統(tǒng),編譯原理,編程語言幾個層次的知識,最后再從上到下或者從下到上的融會貫通起來。計算機網絡也是一個復雜的系統(tǒng), 需要處理很多如數(shù)據傳輸介質,信號格式,可靠性,性能和安全等問題,所以也被分為幾個層次來設計和構建。
ISO提出了OSI七層模型并將其標準化,但由于其過于復雜不容易實現(xiàn),實際的網絡(如因特網)大多使用TCP/IP五層模型,即物理層,數(shù)據鏈路層,網絡層,傳輸層,和應用層。本文將主要討論五層模型。
上圖鏈接自selfimpr1991的CSDN博客(http://blog.csdn.net/wenqian1991/article/details/42467643)。此圖非常形象地表述了各層之間的關系。兩個主機,其用戶之間的通信是發(fā)送者主機從上至下,接收者主機從下往上。發(fā)送者用戶(應用層)的數(shù)據經由傳輸層、網絡層、鏈路層,然后通過物理層(媒介)連接到接收者的物理層,然后從下往上經鏈路層、網絡層、傳輸層再到應用層的接收者用戶。來回通信的話就是彼此交換發(fā)送者,接收者。需要注意的是,從上往下,數(shù)據報是越來越大,因為包含的地址信息越來越多,有效載荷(數(shù)據包)是不變的。傳輸層則添加了雙方的端口號,網絡層添加了雙方的IP地址,鏈路層首部包含雙方的MAC地址,層層添加,反過來,從下至上則是層層過濾。
接下來我們詳細了解每一層。
物理層 (Physical Layer)
物理層是最底層也叫做第一層,主要包括實現(xiàn)網絡系統(tǒng)的硬件。具體包括傳輸介質(如CAT5網線,電話線,無線電波等等),網絡設備(如交換機,路由器,網卡,調制解調器等)以及操作這些設備的軟件(如路由器軟件,計算機操作系統(tǒng)等)。
二進制信息傳輸
計算機網絡的信息傳輸在物理上是通過電流或電磁波實現(xiàn)的。當然機械波也可以傳輸信息只是比較低效,比如說話就是通過聲波在空氣中的傳播實現(xiàn)的;聲波也可以在固體傳播,比如在鐵皮管子上梆梆敲響也可以在緊急情況下傳遞信息,這些暫不討論。電流在導體上傳播, 或者電磁波在空氣中傳播時,根據其隨時間而變化的性質可以畫出波形圖,如下圖所示的典型正弦波:

X軸代表時間,Y軸代表信號強度。如果是電信號,Y軸為電壓,如果是電磁波,Y軸則為電場強度。無論物理意義如何,Y軸代表的信號強度變化范圍被稱為“振幅”。信號成周期性變化,一秒鐘內重復的周期個數(shù)稱為“頻率”。信號開始時可能處于一個周期內的任何位置,這個位置稱為“相位”。
模擬信號(Analog Signal)是指波形為連續(xù)變化的信號。比如電模擬信號展現(xiàn)出連續(xù)變化的電壓。上圖所示的正弦波就是模擬信號。
數(shù)字信號(Digital Signal)是指波形不連續(xù)而是離散地變化的信號。比如電數(shù)字信號展現(xiàn)出不連續(xù)的,突然變化的電壓,如下圖所示的方形波:
將原始二進制數(shù)據轉化為模擬/數(shù)字信號的設備就是調制解調器 (MODEM),戲稱為‘’貓”。調制解調器包括兩個主要組件,調制器(MOdulator)和解調器(DEModulator)。在計算機A發(fā)送信息給計算機B的過程中,A首先將二進制數(shù)字通過調制器轉化為信號,然后信號(比如電流)在介質上傳輸(比如導體),到達B后通過解調器轉換回二進制數(shù)字,完成傳輸過程。
模擬信號和數(shù)字信號都可以用來表示二進制數(shù)字(0和1)。只要對信號進行有規(guī)律的,事先規(guī)定好意義的變化就行了。比如上面的正弦波形圖,可以規(guī)定信號強度到達頂峰時為1, 到達最低谷時為0;也可以規(guī)定強度在X軸以上時為1, 以下時為0。而在方波圖里也可以做類似的規(guī)定。除了振幅,也可以變化頻率和相位來表示信息。調制的過程就是通過改變(調制)信號的振幅,頻率,相位或者任意的組合來使得波形發(fā)生有意義的變化,來表示信息。解調則是相反的過程。具體解釋參見此文。
物理層以信號的形式傳輸二進制數(shù)字,每一個二進制數(shù)字(0或者1)叫做比特(bit),即Binary Digit的縮寫。在物理層上傳輸?shù)男畔⑹窍?101001110011......這樣連續(xù)的比特流,并不能區(qū)分哪一段比特是代表具體什么意義,這是上一層(數(shù)據鏈路層)的工作。
傳輸介質和信道
傳輸介質是信號得以傳輸?shù)拿浇椋瑥V義上說可以是真空,空氣,水,金屬等等。信號發(fā)射端與接收端之間的介質形成的信號通道稱為信道。
有線網絡的典型介質以前是電話線,現(xiàn)在更多的是同軸電纜和光纖。無線網絡則可以使用不同頻率/波長的電磁波,如下圖所示:

電磁波的頻率與波長成反向變化的關系,頻率 X 波長=光速。電磁波的能量決定了它能在介質中傳輸多遠,在空氣中傳輸?shù)碾姶挪芰康乃p正比于傳輸距離的平方,是衰減很快的。頻率越高的電磁波波長越短,更傾向于沿直線傳播,更難進行衍射和反射,就像一頭紅了眼的公牛只知道朝著紅布方向沖過去,不管中間有什么障礙物都直接撞。不同材料的障礙物會對電磁波造成不同程度的能量損耗,比如光能輕易地穿透玻璃而無法穿透墻壁。所以頻率高的電磁波適合視距范圍內點到點的直接傳輸,發(fā)射端與接收端之間不能有障礙物。由于地球曲率的原因,高頻電磁波無法直接進行超視距傳輸,需要設置中繼站。相反,頻率低的電磁波很容易通過衍射或者反射繞過障礙物,更適合在復雜地形傳播。
最常見的IEEE 802 (也就是WIFI)使用2.4GHz 和 5GHz兩種頻率。頻譜上是在10的9次方,即廣播電視頻段和微波頻段的交界處。很多偏僻的島嶼會使用微波與大陸通信。
網絡工程師需要根據實際情況和需求,以及各種介質的性質來決定網絡的物理傳輸介質。
帶寬
單位時間內信道可以傳輸?shù)男畔⒘?。?shù)字信號的帶寬單位一般用千/兆/吉比特每秒(Kbps/Mbps/Gbps)。頻率越高的電磁波單位時間內波形變化越多,所以可以攜帶的信息越多,帶寬也就越大。目前常見的以太網局域網(LAN)帶寬是100Mbps。
單工,半雙工(Half Duplex),與全雙工(Full Duplex)通信
單工是指信號在介質上只能以一個方向流動,即A電腦只能發(fā)送信號給B電腦而無法收取信號。
半雙工是指信號在介質上可以雙向流動,但同一時刻只能單向流動。
全雙工是指信號在同一時刻可以在介質上雙向流動,介質利用率更高。
集線器(Hub)
最后來說一下(基本上)工作在物理層的設備,集線器。先上圖

集線器是最簡單,最底層的網絡設備。它的基本功能是對信號的放大和轉發(fā),也就是相當于多口的中繼器。電信號從任何端口流入,都會被放大并轉發(fā)給其他所有端口,也就是數(shù)據廣播。用集線器組成的網絡成為共享式網絡,因為網絡中的所有電腦會收到所有的數(shù)據,并且共享帶寬。共享式網絡的優(yōu)點是簡單低成本,缺點是安全性差(一臺電腦發(fā)送/接受的數(shù)據能被所有電腦收到,毫無隱私可言),性能差(很容易形成廣播風暴導致帶寬用盡)。另外集線器一般是半雙工的工作方式所以通信效率較低。
安全
攻擊集線器或者共享式網絡十分簡單,連接到網絡中后即可以發(fā)送大量數(shù)據造成廣播風暴,耗盡帶寬。
數(shù)據鏈路層 (Data Link Layer)
也簡稱為鏈路層。這一層在物理層的基礎上加入了邏輯控制的基本功能,來實現(xiàn)一小段數(shù)據(信息)從A到B的傳輸。
物理層以連續(xù)比特流的形式傳輸信息,此時我們還不能分辨那一段比特代表什么意義。鏈路層的最基本功能就是把連續(xù)的比特流切分為一段一段固定長度的0/1序列,叫做“幀”(Frame),并把每一個幀從發(fā)送者送達接收者。鏈路層關心的是每個幀的長度是多少,格式如何,包括什么內容,這些都是鏈路層協(xié)議要規(guī)定好的。它并不關心幀里面的數(shù)據是和含義。
在鏈路層中各個節(jié)點是以MAC地址為唯一標識的。MAC地址, 即Media Access Control Address, 共6個字節(jié)的二進制數(shù),是所有網絡設備出廠時設置的全球唯一的地址。其中前三個字節(jié)表示由IEEE分配給廠商的地址,將燒錄在每一塊網絡接口卡的ROM中。而制造商通常為其每一網絡接口卡分配后三個字節(jié)。所以得知一個MAC地址后,就可以在網上查找這塊網卡的生產商了。如這個網站https://aruljohn.com/mac/68A3C4A2C1E7。黑客則可以進一步查詢這家廠商生產網卡的已知BUG,然后利用BUG進行攻擊。
借用鄧義兵的博客上形象的比喻:幀就像信封,而鏈路層則像是社區(qū)里的郵差負責把信從A戶送到B戶。
常見的鏈路層協(xié)議包括IEEE802.3也就是俗稱的以太網協(xié)議(Ethernet),以及IEEE 802.11也就是俗稱的WIFI。以太網協(xié)議用于有線網絡傳輸,WIFI用于無線。不太常見的協(xié)議則包括令牌環(huán)網和SNAP。
以太網協(xié)議的具體介紹見http://blog.51cto.com/lbzxy/125527,這里我轉載并總結一下。
以太網
以太網這個術語通常是指由DEC,Intel和Xerox公司在1982年聯(lián)合公布的一個標準,它是當今TCP/IP采用的主要的局域網技術,它采用一種稱作CSMA/CD的媒體接入方法。幾年后,IEEE802委員會公布了一個稍有不同的標準集,其中802.3針對整個CSMA/CD網絡,802.4針對令牌總線網絡,802.5針對令牌環(huán)網絡;此三種幀的通用部分由802.2標準來定義。這里主要討論802.3。
以太網V2和IEEE802.3兩種以太網幀的格式如下圖所示:


圖片來自Wikipedia:https://en.wikipedia.org/wiki/Ethernet_frame
整個幀的大小根據其包含的數(shù)據大小而不定,主要分為以下部分:
前導信息(Premeable):在以太網V2中是8個字節(jié),IEEE802.3中是7個字節(jié)。內容為交替出現(xiàn)的1和0,即10101010?10101010?10101010?10101010?10101010?10101010?10101010?10101010 (注意我故意加入空格方便閱讀,實際比特流不包含空格)
幀起始定界符(Start Frame Delimiter, SFD):僅在802.3中有效,1個字節(jié),格式與前導信息基本相同,最后兩位都是1,即10101011
目標地址(Destination MAC Address): 接收方MAC地址。以太網V2支持6個字節(jié)的MAC地址,802.3則支持6個字節(jié)與2個字節(jié)(主要用于早期局域網,現(xiàn)已少見)兩種格式的MAC地址。
源地址(Source MAC Address): 發(fā)送方MAC地址。
類型字段(EtherType): 2個字節(jié)的類型字段僅用于Ethernet II幀。該字段用于標識數(shù)據字段中包含的高層協(xié)議,也就是說,該字段告訴接收設備如何解釋數(shù)據字段。在以太網中,多種協(xié)議可以在局域網中同時共存,例如:類型字段取值為十六進制0800的幀將被識別為IP協(xié)議幀,而類型字段取值為十六進制8137的幀將被識別為IPX和SPX傳輸協(xié)議幀。因此,在 Ethernet II的類型字段中設置相應的十六進制值提供了在局域網中支持多協(xié)議傳輸?shù)臋C制。在IEEE802.3標準中類型字段被替換為長度字段,因而Ethernet II幀和IEEE802.3幀之間不能兼容。
長度字段(Length):?用于IEEE802.3的兩字節(jié)長度字段定義了數(shù)據字段包含的字節(jié)數(shù)。不論是在Ethernet II還是IEEE 802.3標準中,從前序到FCS字段的幀長度最小必須是64字節(jié)。最小幀長度保證有足夠的傳輸時間用于以太網網絡接口卡精確地檢測沖突,這一最小時間是根據網絡的最大電纜長度和幀沿電纜長度傳播所要求的時間確定的?;谧钚L為64字節(jié)和使用六字節(jié)地址字段的要求,意味著每個數(shù)據字段的最小長度為46字節(jié)。唯一的例外是吉比特以太網。在1000Mbit/s的工作速率下,原來的802.3標準不可能提供足夠的幀持續(xù)時間使電纜長度達到100米。這是因為在1000Mbit/s的數(shù)據率下,一個工作站在發(fā)現(xiàn)網段另一端出現(xiàn)的任何沖突之前已經處在幀傳輸過程中的可能性很高。為解決這一問題,設計了將以太網最小幀長擴展為512字節(jié)的負載擴展方法。對除了吉比特以太網之外的所有以太網版本,如果傳輸數(shù)據少于46個字節(jié),應將數(shù)據字段填充至46字節(jié)。不過,填充字符的個數(shù)不包括在長度字段值中。
同時支持以太網和IEEE802.3幀格式的網絡接口卡通過這一字段的值區(qū)分這兩種幀。也就是說,因為數(shù)據字段的最大長度為1500字節(jié),所以超過十六進制數(shù) 05DC的值說明它不是長度字段(IEEE802.3).而是類型字段(Ethernet II)。
數(shù)據字段(Payload):46到1500字節(jié)不等。這是幀所包含的具體數(shù)據,一般是上一層(網絡層)協(xié)議所封裝的原始數(shù)據(比如IP數(shù)據包)。如前所述,數(shù)據字段的最小長度必須為46字節(jié)以保證幀長至少為64字節(jié),這意味著傳輸一字節(jié)信息也必須使用46字節(jié)的數(shù)據字段:如果填入該該字段的信息少于46字節(jié),該字段的其余部分也必須進行填充。數(shù)據字段的最大長度為1500字節(jié)。
校驗序列字段(Frame Check Sequence, FCS):?既可用于Ethernet II又可用于IEE802.3標準的幀校驗序列字段提供了一種錯誤檢測機制,用于確保接收到的數(shù)據與發(fā)送時的數(shù)據一樣。當源節(jié)點發(fā)送數(shù)據時,它執(zhí)行一種稱為循環(huán)冗余校驗(?C R C,Cyclical Redundancy Check)的算法。C R C利用幀中前面所有域的值生成一個惟一的4字節(jié)長的數(shù),即F C S。當目標節(jié)點接收數(shù)據幀時,它使用約定好的算法重新計算CRC值并與發(fā)送的CRC值進行比較。如果這種比較失敗,則接收節(jié)點認為幀已經在發(fā)送過程中被破壞并要求源節(jié)點重發(fā)該數(shù)據。CRC類似Hash算法但也有不同。相似之處在于二者都是用來檢驗數(shù)據在傳輸過程中是否被改變的。不同之處在于CRC雖然更快速但無法像Hash算法那樣保證不同數(shù)據的CRC碼一定不同,也就是唯一性。理論上數(shù)據可能被改變的同時CRC保持不變。這是因為CRC不像HASH一樣用來防范人為的惡意修改,而主要是為了檢測物理信號傳送過程中因受到干擾而造成的數(shù)據擾動或者丟失。這種自然形成的擾動和丟失恰好滿足CRC相等的概率微乎其微。但同時這種設計也為黑客在鏈路層進行攻擊提供了可能。
以太網幀在物理層進行傳輸時稱為以太包(packet),包中包含所有字段,各包之間間隔12字節(jié)。當目標設備接受到一個包之后,首先會去掉前導信息和幀起始定界符,然后對剩下的部分進行處理。
雖然IEEE802.3標準必然要取代Ethernet II,但由于二者的相似以及Ethernet II作為IEEE802.3的基礎這一事實,我們將這兩者均看作以太網。
工具
這里用最著名的網絡工具之一的Wireshark來進行實驗。
首先打開Wireshark, 選中一個正在工作的網卡開始抓包(Capture), 然后雙擊隨便打開一個包,如下圖所示

這是一個ARP協(xié)議的包。ARP協(xié)議是第三層網絡層的協(xié)議,所以Wireshark顯示了第三層以下所有層的協(xié)議包。
第一行說明了這是一個42字節(jié)的幀,在interface 0, 也就是剛剛選取的網卡上所捕獲。
第二行說明這是一個以太網V2格式的幀,以及源地址和目的地址。這里是一個ARP廣播,所以目的地址為ff:ff:ff:ff:ff:ff,意思是所有的MAC地址全部包括。
第三行說明這是一個ARP請求包。
下面的區(qū)域以16進制顯示了這個包中所有的42個字節(jié)。這里沒有顯示前導信息,幀起始定界符和FCS (因為我用的Windows系統(tǒng)不支持,Mac和Linux應該都可以捕捉到),所以以6字節(jié)的目標地址開頭,然后是6字節(jié)的源地址 68:a3:c4:a2:c1:e7, 接著是2字節(jié)的類型0x0806, 也就是ARP協(xié)議的類型值,最后是數(shù)據字段的28個字節(jié)。具體含義后面再講。
物理尋址
那么兩個網卡是如何通過MAC地址來找到對方的呢?畢竟電信號又沒長眼睛。有線網里的電流只會隨著導體往前流動不是嗎?
首先看看極端情況,兩個網卡(兩臺電腦)直接連接的情形。這需要一種特殊的網線叫做以太網交叉線(Ethernet crossover cable)來實現(xiàn)。插上兩張網卡后,網卡中Auto MDI-X技術就會自動識別網線的類型,同時知道這是兩張網卡直連的情形了。
更普遍的情形是3張及以上的網卡(電腦)連成網絡,形成局域網(LAN)。這時就需要額外的網絡設備了。工作在鏈路層的設備交換機(Switch)就出場了,來張?zhí)貙懀?/p>

交換機都有多個端口用以將多條網線連接起來。交換機內部的內存中有張MAC地址表,可以將多個MAC地址映射到其中一個端口上。所以交換機工作流程就是:
(1) 當交換機從某個端口收到一個數(shù)據包,它先讀取包頭中的源MAC地址,這樣它就知道源MAC地址的機器是連在哪個端口上的; 如果這個MAC沒有在表中,則它會更新表格;
(2) 再去讀取包頭中的目的MAC地址,并在地址表中查找相應的端口;?
(3) 如表中有與這目的MAC地址對應的端口,把數(shù)據包直接復制到這端口上;?
(4) 如表中找不到相應的端口則把數(shù)據包廣播到所有端口上,當目的機器對源機器回應時,交換機又可以學習一目的MAC地址與哪個端口對應,在下次傳送數(shù)據時就不再需要對所有端口進行廣播了。
用交換機可以組成局域網并在鏈路層工作。這個網絡沒有也不需要IP地址,因為MAC地址可以用來定位。計算機A在連入這個網絡后,并不知道網絡中還有哪些其他計算機,也不知道她們的MAC地址。這些需要人(網管)為地在網絡應用程序里面設置好。當A知道MAC 12:34:56:78:9A:bc 地址是隔壁美女的電腦后,就可以對其發(fā)送信息了。
多臺交換機可以互相聯(lián)通形成更大的網絡,假設交換機A收到消息后查詢MAC地址表得知12:34:56:78:9A:bc對應著5號端口,于是將幀轉發(fā)給5號端口,5號的網線連到另一臺交換機B,她再查詢MAC地址表繼續(xù)轉發(fā),直到幀送達美女的計算機。
交換機各個端口之間是獨立的,不共享帶寬也不共享數(shù)據。相較于集線器,交換機更加高效,安全。
由交換機組成的網絡叫做交換式網絡。
安全問題
地址泛洪,也叫做廣播風暴,是針對交換機工作機制的一種拒絕服務攻擊手段。具體方法就是構造大量的幀,其中的源地址和目標地址都設置為不存在的MAC地址。這樣交換機每次都無法在地址表中查詢到條目,則會
1. 向整個網絡不停地廣播幀。
2.不停更新地址表中的源地址和端口對應關系,最終造成地址表空間全部用完。
網絡層 (Network Layer)
在組建局域網時要先選定物理介質和鏈路層協(xié)議。但世界上那么多局域網,肯定會使用不同的介質和協(xié)議,比如有的是WIFI無線網而有的是有線以太網,有的有線網使用Ethernet V2協(xié)議而有的使用IEEE802.3等等。這些不同的網絡就像是說不同語言的人群,互相如何通信呢?首先大家需要郵局來轉發(fā)信件,其次大家要使用同一種語言。這里的郵局就是工作在網絡層的設備路由器,而這同一種語言就是網絡層協(xié)議(IP協(xié)議)。
假設WIFI網絡里的A電腦想給另一個以太網里的B電腦發(fā)送信息,那么A首先要把信息發(fā)送給能夠理解接收WIFI信號并理解WIFI協(xié)議的無線路由器,無線路由器再把消息轉發(fā)給另一臺懂得以太網協(xié)議的有線路由器,最后有線路由器把消息轉發(fā)給B電腦。這個過程中,A電腦,兩臺路由器和B電腦都要使用IP協(xié)議中規(guī)定的格式來處理數(shù)據。
Internet Protocol (IP) 協(xié)議
https://zhangbinalan.gitbooks.io/protocol/content/ipxie_yi_tou_bu.html
IP協(xié)議中的數(shù)據成為Datagram,中文譯為數(shù)據報,真是個奇怪的名字。RFC791規(guī)定了IP協(xié)議的格式,如下圖所示

版本號(Version):長度4個比特,標識此數(shù)據報遵循的IP協(xié)議版本號。一般為0100(IPv4)或0110 (IPv6)。
IP包頭長度(Internet Header Length, IHL): 長度4個比特,描述IP包頭長度,單位為4個字節(jié),最大長度為1111=15,即15*4字節(jié)=60字節(jié);最小長度為0101=5, 即5*4字節(jié)=20字節(jié)。因為IP包頭中有長度可變部分,所以需要IHL。