上一篇我們預告讀者,接下來將會介紹現今網路最重要的架構:TCP/IP,TCP/IP從ARPANet後期發展以來,直至今日仍是網路主要使用的架構,如果你今天要設計能夠連到網路上的產品,支援TCP/IP就對了。
分層的意義
在正式進入主題之前,先來了解為何網路使用分層結構,而非從頭到腳一手全包的設計。由於網路需考量許多實際應用上的困難,如傳輸不同種類的資訊、不同版本以及作業系統的交流需求,甚至牽扯到更廣大的範圍,如遠距微波傳送、跨洲海底電纜等不同傳輸媒介。如果要設計能夠包山包海、全部通吃的網路架構是件吃力不討好的事,況且也無法預測未來會出現什麼需求,於是需要個具有彈性的網路架構,還要能夠兼顧未來發展。

▲網路模型的4層架構,工作彼此獨立卻又需要它層的協助。

▲資料經過網路模型的處理方式,先將傳送端的資料一層層打包完畢之後,送到網路上傳送。接收端接受到東西之後,再依相反順序拆開。
網路架構模型分為4層,也就是經常聽到的DoD(Department of Defense)或是TCP/IP模型,如附圖所示,最上層為應用層(Application Layer),接下來依據為傳輸層(Transport Layer)、網路層(Internet Layer)、鏈結層(Link Layer)。這4層分工需要相互合作,卻又彼此獨立,好比寄信一般,需要郵局處理郵件,道路和交通工具負責運送,信才可送達目的地,但是你卻不用管郵局如何經營、交通工具如何設計、道路怎麼鋪設才會平坦又耐用。
將網路架構分層出來,便加入了許多可能性,只要符合這個網路模型,各層如何處理資訊的方式就各自獨立,不受其它外在條件的限制。舉個小小例子,筆電能夠透過有線和無線方式連上網路,但是這2種傳輸介質所看到的網頁有所差異嗎?應該不會發生有線介面看到Dream Girls,換成無線介面就變閃亮三姊妹這種情形。同時,分層模型所具備的向後相容性也可以在無線傳輸規格上看到,從現今的802.11 a/b/g/n,到未來的802.11 ac/ad,均能夠傳送網頁資料,讀者應該也沒有聽過換個傳輸規格,網頁就要重寫這種荒唐事。
在實際傳送資料時,資料的路徑也是由上至下傳送,最後包成一包貨物交給網路中稱為路由器(router)或是網關(gateway)的機器傳送;到達目的地之後,再由下而上,層層拆開。
對於這2台相互交流的電腦來說,只有最原始的那份資料才是最重要的,猶如寄送包裹,裡面所攜帶的東西才是我們最關心的,氣泡紙或是外箱、地址,僅是確保東西正確送達目的地的手段。接下來將逐層介紹這個網路模型,了解各層到底在做什麼事。
其它的網路模型
部分讀者或許在其它地方看過不同名稱、不同層級的網路模型,本文採用RFC 1122中定義的模型。如果讀者有意了解其它的網路模型,請至英文版維基百科,搜尋「Internet protocol suite」。
應用層(Application Layer)
網路模型的最上層,也是想要利用網路傳輸資料的程式,能夠直接碰觸到的層級。無論是收發郵件的POP3/SMTP/IMAP、或是網頁傳送標準HTTP、檔案傳輸協定FTP、現代網路不可或缺的網域/位址轉換伺服器DNS,還是近年興起的BitTorrent P2P(peer to peer)傳輸協定,均屬於這層的管轄範圍。
這層直接對應用程式開放,提供不同程式同一類型的服務,譬如你可以使用你所喜歡的程式開啟網頁,也可以使用Outlook或Thunderbird收發郵件。各種不同的應用層協定,會為該協定提供的服務提供必要的處理機制。同時也因為服務眾多,在這層的協定數量為4層之冠,光是想看個網頁,就可能有3種協定參與其中,包含取得私有IP的DHCP、網域與位址轉換的DNS、以及取得網頁資料的HTTP。
傳輸層(Transport Layer)
資料經過了應用層之後,下一層便是傳輸層,此層對應用層傳送過來的資料進行處理,建立2台電腦之間可靠的傳輸。在此層常見的2種協定為TCP與UDP,絕大多數應用層協定都會選擇TCP,因為TCP提供一連串偵錯、重送、資料順序、流量控管等實作,確保2台電腦之間的連線正常,不會產生投桃報李的狀況。
相較於TCP提供連線的可靠性,UDP則專注於資料的傳遞,從TCP(傳輸控制協定、Transmission Control Protocol)與UDP(使用者資料電報協定:User Datagram Protocol)的名稱可看出端倪,UDP幾乎不管資料是否正確送達,需要應用層自行處理。
但別認為UDP就是項垃圾,像是DNS查詢、DHCP請求與配發都是使用UDP協定,另外像是部分影音串流服務,講求大量且迅速的資料傳遞,偶爾丟掉資料不會造成太大影響(因為最終觀賞或聆聽的終端是人,不易察覺畫面或聲音細微的缺陷);即時通訊也是UDP的愛好者,因為人與人的溝通具時間性,上一句話漏掉的資訊,下一句話再傳來並沒有意義。除了上列2種常見的協定之外,前往中國旅遊出差,好用的翻牆方式PPTP,也住在這層喔。
TCP的三方交握
為了讓讀者有感體會TCP在建立穩定連線的努力,先偷渡TCP建立連線時的三方交握原理。當客戶端想向伺服器建立連線時,會先發出SYN資訊,接著伺服器回應SYN-ACK資訊,客戶端接受到之後,再回應ACK,此時客戶端和伺服器的連線就算是建立完畢,可以開始傳送資料了。
UDP則不進行此類手續,直接往對方送,途中就像是飛鴿傳書,小鳥變成焦仔巴也沒人知道。

網路層(Transport Layer)
前文中舉了許多郵寄的例子,此層就相當是郵件或包裹上方的地址欄位,無論你想要寄去世界上任何一角落,只要將地址寫好,郵件或包裹便會到達目的地。
網路層能夠提供實體介面網路卡1個邏輯上的位置,也就是我們常聽到的IP位址,此IP位址是唯一的(或至少在同層級的網路中是如此),所以資訊才能夠傳輸到正確的目的地。此層會將資料的目的地和來源地寫入,如同我們在信件上填入收件人和寄件者。
除了賦予每個網路介面卡邏輯IP位址外,IP還定義了資料封包該如何繞送的規則,如同郵局有各地區的小據點,也有大型的轉運站,藉由這些規則,選擇較佳的傳送路徑,將東西正確傳遞。
網路層的IP協定,事實上並非完全可靠,有可能在途中因為某些原因(封包緩衝區溢位、TTL為0……),整個資料完全不見。IP協定基本上是以「盡可能去做」為宗旨,有多少運算資源做多少事,超過負荷的資料並不提供其它方式修補,丟掉就是掉了。所以才需要傳輸層做這類確保工作。
鏈結層(Link Level)
位於整個網路架構的最底層,負責制定資料傳輸的「實體」規格。所謂「實體」,就是我們眼睛看的到,手可以摸到的部分。以乙太網路來說,凡是接頭規格、傳輸線材種類、不同電壓代表何種資訊,都是鏈結層負責的內容。
除了目前常見,採用RJ-45以及4對雙絞線的乙太網路之外,古老的乙太網路使用類似於電視同軸纜線的線材相互連結。以及目前大家比較常聽到的光纖、VDSL,也包含在其中。
鏈結層的運作也包含不同實體網路的轉接,像是從家中電腦的乙太網路轉換為對外的光纖環境,負責的光電轉換機就會先把乙太網路的標頭拿掉,加入為光纖制定的標頭,在光線上傳送。當光電轉換機從光纖上收到資料時,也會先把光纖標頭拿掉,加入乙太網路的標頭,再將資料送到電腦上。
資料層層包的術語
資料從應用程式丟出之後,經由應用、傳輸、網路、鏈結4層處理之後才可以在網路上遨遊。這4層分別會在資料的外圍加料,裡面標示著各層處理所需的資訊,也就是說,從資料到網路上這段期間,所需傳送位元總數會漸漸地變大。在此也先向讀者說明,由於網路這種層層包的特性,網路的最大傳輸速度並不等於資料的淨傳輸量,所以別再怪ISP業者欺騙大眾,少給你頻寬。為了傳輸資料,這些標頭一定會佔去部分頻寬。
資料每經過1層,我們都歸給它名字,代表原始資料已經被這層處理過了,同時也可以藉由這些名稱,判斷目前東西在哪一層。
從應用程式傳來的資料,進入傳輸層,包入傳輸層表頭,此時整段東西稱為資料段(segment)。資料段進入網路層,包入表頭後稱為封包(packet)。進入鏈結層處理之後,會將封包前後分別加入表頭以及表尾,整個稱之為訊框(frame);鏈結層也是唯一的一層,同時在資料的前後加入資訊。
有一點須請讀者注意一下,如果我們說「封包的資料」,指的就是封包表頭之後所有的資訊,包含應用層的表頭以及資料。因為當我們在討論某層的資訊時,所關心的就是那層的表頭,後面跟著的東西就不理它了。
▲一段資料經過網路4層模型的傳輸情形,傳送端將資料一層層處理、打包;接收端則依相反順序拆開處理,最後得到傳送端所要傳送的訊息。

▲身處不同階段的對應名稱
4大層級的協定解析
如果前面的東西已經讓你頭昏腦脹、昏昏欲睡,筆者建議改天再來看下半段的內容;如果反而覺得精神抖擻,就請你把點心和飲料準備好,因為接下來是更難的東西,實際進入網路資料傳輸的過程,並了解有些什麼欄位,這些東西又是依據什麼製造出來的。
▲DNS的訊息格式
應用層
應用層的協定非常多,像是網頁HTTP、郵件POP3、檔案FTP……接下來將舉幾個常用的協定說明,避免腦袋超載燒毀。
DNS
在我們實際和網頁伺服器連結之前,都必須先向DNS伺服器發送出請求,詢問www.techbang.com這個網址的實際IP位址,才能夠獲得60.199.208.218這串數字,網頁瀏覽器才能向正確的伺服器請求網頁資料。
DNS的訊息長度可變,主要分為5個區段:header、question、answer、authority、additional。其中header標明了其後4個區段相關的資訊,question有自行的格式,而其後3個區段的格式相同。
header長度固定為12 Byte,其中包含ID 16 bit,讓這個問題有個號碼,之後回傳過來的答案也會包含相同的號碼,讓電腦知道回傳的答案是對應哪個問題。QR欄位僅1 bit,數值為0時表示這個訊息為問題,為1時表示答案。OPCode(4 bit)為問題的型態,0為標準查詢、1為反向查詢、2為要求伺服器狀態、4為通知、5為更新,剩餘的值為空白或是未定義。
AA(1 bit)為1時表示給予回應的DNS伺服器,有獲得網域擁有者的授權。TC表示資料是否太大遭到截斷,RD為請求以遞回方式查詢,RA為回傳可以遞回方式查詢,Z部分有3個位元保留不使用。RCode為回應訊息的狀態,0表示正常、1表示問題有錯誤、2為DNS伺服器發生問題、3表示所查詢的網域不存在、5表示DNS伺服器因為設定策略的緣故,不回應問題,其它數值還有其它意義,或是保留未定義。QDCount、ANCount、NSCount、ARCount各為16 bit,分別代表後面有幾個問題/答案/管轄/額外資訊。
question欄位較為簡單,僅包含question name、QType、QClass 3種,question name就是想要查詢的網域名稱、QType表示回應的格式、QClass為問題的等級,大部分設為1。
剩下的3種欄位格式皆相同,name擺放詢問的網域、type指出RData的類型、class為RData的等級、TTL為此答覆有效的時間,電腦便可建立此DNS查詢快取的有效時間、RData length為RData的資料長度、RData當然就是存放回覆的答案啦。
DNS查詢欄位內容,除header之外,並沒有固定的長度,但name會在結尾處加入0定位,其它3種欄位使用RData length得知資料長度。
DHCP
DHCP的發明給了網管莫大的好處,不必再逐台電腦設定IP位址這種煩人的東西。當有新電腦加入網路時,會向1個廣播位置發送查詢訊息,在此網路中的DHCP伺服器撈到這個查詢時,會回傳1個提供訊息(內含相關IP位址設定資料),表示我能夠提供IP位址給你。之後這台新加入網路的電腦繼續向廣播位址發送請求(因為可能不只1台DHCP伺服器可提供IP位址,所以要以廣播的方式告知沒被選中的DHCP伺服器),DHCP再回應1個確認訊息,至此新電腦獲取IP位址的流程宣告結束。
OP為封包傳遞方向,1表示由客戶端傳給伺服器端,相反傳遞方向時為2。HType表示網路類型,常用的Ethernet為1。HL定義網路硬體位址(MAC)的長度,在Ethernet環境下,其MAC長度為6 Byte,所以值為6。
hops開始由客戶端發送時的值為0,但若是需要跨不同子網路,每經過1個路由器,此值就加1。transsaction ID是個隨機數字,用戶端發送時會任意填入,伺服器回應時便把此號碼照抄,用戶端便可得知回應的封包是針對哪個要求封包。seconds丟出DHCP請求後經歷的時間,可讓伺服器在接收到大量請求後決定先回應誰(經過時間越久可能優先回覆)。flags為1時表示此封包利用廣播方式傳送,其餘皆未定義。Ciaddr、Yiaddr、Siaddr、Giaddr、Chaddr欄位都是填入位址,若是用戶端希望繼續使用上次的IP位址,則在Ciaddr中填入,Yiaddr則是填入伺服器欲分配給用戶端的位址。Siaddr為DHCP伺服器的自身IP位址,Giaddr則是在跨網域時,路由器的位址,Chadder則是用來填入用戶端網卡的MAC位址。
SName放入DHCP伺服器的名稱,File則是當用戶端需要經由網路開機時,等會兒將傳送的開機檔案名稱。options是選用欄位,包含DHCP用戶端可接受的DHCP封包長度,或是用戶端租用IP位址的期限……
▲DHCP的欄位資料
改變埠號逃過網管過濾
絕大多數的應用程式,都喜歡使用特定的埠號,因此網管人員可在防火牆中設立黑名單,將部分封包擋下(如BitTorrent、Live Messenger、Skype⋯⋯),便可達到阻止用戶使用這些程式的目的,因此我們可以手動更改埠號,繞過這些限制。
如果網管人員比較狠,只在防火牆裡使用白名單,僅允許HTTP常用的80埠,那麼換埠號也無濟於事。
HTTP
HTTP超文本傳輸協定(HyperText Transfer Protocol),是現今網頁最常使用的協定。HTTP的格式並不像DNS有欄位可以填,而是直接以文字方式要求、回應,像是人與人溝通的模式。但這並不代表電腦能夠識別自然語言,HTTP還是有制定句型格式,以及什麼指令該做什麼事,整體來說偏向高階程式語言的感覺。HTTP使用method(方法)、path(路徑)、protocol(協定)下面就是1個簡單的HTTP協定範例:
GET /image/image001 HTTP/1.1
GET是HTTP中經常使用的指令,代表向伺服器要求某件檔案,而這檔案就是在image資料夾之下的image001。HTTP/1.1代表所使用的HTTP協定版本,在網路中有著1.0和1.1版,其它指令還有HEAD(不傳回整個資料,僅傳回header的訊息),DELETE(刪除特定檔案),POST(上傳資料請伺服器處理)等。
除了向伺服器發送檔案請求之外,還會附加一些header上去,例如下面這個例子:
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
User-Agent代表之後跟著的字串為目前網頁瀏覽器使用的版本,在此例中為Mozilla 4.0,還與Microsoft公司的Internet Explorer 5.5相容,以及使用Windows NT 5.0作業系統。所以以後遇到網頁上顯示你正在使用的網頁瀏覽器版本以及作業系統,不用再那麼訝異,以為自己的電腦被入侵了,其實是網頁瀏覽器發送出去的訊息。
以上列舉3個應用層的協定,若讀者對其它協定有興趣,可查閱TCP/IP相關書籍。
傳輸層
傳輸層負責打包由應用層傳來的資料,或是拆解由網路層傳來的東西,協定不若應用層那麼多,甚至可以說是網路4層模型中最少的,絕大多數僅使用其中2種傳輸協定:TCP和UDP。
UDP
使用者資料電報協定(User Datagram Protocol)的表頭格式相當簡單,僅包含4個部分:來源連接埠、目的連接埠、資料長度、校驗,全部只有8 Byte的長度。
當使用者的電腦使用許多網路應用程式時,便需要連接埠的幫忙,每個單一的連接埠負責服務單一應用程式,讓資料不混淆。由於埠的欄位有2 Byte,數值可從0~65535,其中有幾個埠是大家公認,提供給特定服務的專用埠,如DNS服務的53、網路時間協定的123……。當然,這只是公認,並非絕對,你想要使用這些埠也可以,但若發生連線問題可就怨不得人。
資料長度就是此份UDP資料的大小,最小8 Byte(僅有UDP標頭),校驗碼負責檢查所攜帶的資料是否正確。UDP和TCP的校驗計算中,有使用到「虛擬表頭」的功能,也就是將有關IP位址的資訊也加入計算之中,但實際上這些資訊並不隨UDP和TCP傳送,而是由更下1層的網路層獲得。
▲UDP的表頭欄位定義
TCP
傳輸控制協定(Transmission Control Protocol)是現今網路主要的傳輸協定,重要性甚至與下1層的IP協定共稱為TCP/IP,想要網路產品順暢傳輸資料,選擇這2種協定就對了。
TCP的表頭比起UDP複雜得多,因為TCP擁有更多控制以及復原功能,包含確認連線的3方交握程序、回傳確認封包(ACK)、限制流量的視窗大小。TCP也有公認埠號的存在,FTP資料埠20、FTP控制埠21、SMTP的25、HTTP的80等。
首先是來源埠與目的地埠,原理和UDP相同。sequence number在傳送方首次連線時會設定隨機亂數,之後會逐漸加上已傳輸的資料量(以位元組為單位)。acknowledge number主要是給接收方使用,將sequence number和接收位元組相加,傳回給發送方。以上的流程操作確認了TCP不會有遺失封包的情形發生,因為當發送方在一定時間內沒有收到接收方回傳的ACK,就判斷封包傳送有問題無法送達,會將資料再傳送1次。
data offset標明資料的起始處在哪裡,因為受到TCP表頭尾端有個option欄位,長度不固定所致。reservation欄目保留未使用,而code bit長度僅6 bit,但每個bit都有其實際意義。
code bit的第一個bit為UGR,此值設為1時,將中斷目前的資料傳輸,優先傳輸此資料。第二個bit為ACK,表示acknowledge number有效。第三個為PSH,一般來說,TCP的資料會先進入傳送緩衝區,累積到一定的量時才傳送,但當PSH設為1時,緩衝區內的資料就會立即送出。第四個為RST,可要求立即中斷連線,不經過確認斷線步驟。第五、第六個分別為SYN和FIN,分別在請求連線和請求斷線時設定為1。
window可告知目前的接收緩衝區還有多少的空間,對方傳送資料時便不會送出超過此數值的資料,避免緩衝區溢位導致資料流失需要重傳,浪費頻寬。checksum用來檢查資料是否正確,也有使用虛擬表頭的功能,將其它的資訊一同放入運算。urgent pointer在UGR設定為1時,標出緊急資料的位置。option則是選用欄位,可表示接收方能夠支援的最大資料區段大小,如果選用欄位的資料長度不是32 bit的整數時,會在其後填入0,對齊邊界。
▲TCP的表頭欄位定義
網路層(Internet Layer)
在網路層中,應用最廣的就是IP協定,然而IP協定存在著許多版本,目前世界上應用最廣的是第四版,第六版也已制定完成、實作,由於IPv4位址在可預見的未來中一定會配發完畢,各地也已開始佈建支援IPv6的硬體設施和軟體服務。
IPv4
IPv4的表頭最小為20 Byte,其中包含了IP位址、服務類型、存活時間等重要參數。首先由4 bit的version開頭,由於是IPv4版本,所以填入的值為4。IHL標出表頭大小,由於有option欄位,數值從5~15不定。DSField欄位一開始為type of service,但在RFC 2474中重新定義,前6 bit為DSCP,標出這個資料的優先權,後2 bit目前保留未使用。total length為IP封包長度(含標頭),identification提供1個序列號,讓接收端能夠依照號碼,重組出原始的資料。flag提供封包是否分段的訊息,而fragment offset就是用來指出目前這個資料分段在原始資料中的位置。
TTL控制此封包能夠經過的網路節點數,每經過網路節點此值就減1,數值為0時,網路裝置就捨棄此封包。protocol指出需要由何種傳輸層協定處理,如TCP就設定為6,UDP設定為17。header checksum負責檢查IP表頭部分有沒有問題,若檢驗不合,此封包會被直接丟棄。source address和destination address如同字面解釋,分別填入來源位址和目的地位址。最後的選項欄位並不一定要存在,但長度一定是32 bit的整數倍,不足的部分填入0。
▲IPv4的表頭欄位定義
鏈結層(Link Layer)
終於到了最後1層,鏈結層終於要把資料,實際在媒體上傳輸、存取。下面這個例子就是目前比較常用的Ethernet範例:
Ethernet的表頭相當簡單,只有目的地位址、來源位址、網路協定型態。目的地位址來源位址的長度都是6 Byte,裡面放的是實際網路介面卡的MAC位址。type指的是後面跟著的資料為何種網路協定,一般採用TCP/IP的協定,此欄就填入2048,此外像是Apple Talk協定,就填入32923。
最前端有個preamble的部分,主要是給接收端使用,讓接收端和發送端能夠同步。前7 Byte為10101010,最後1Byte為10101011。鏈結層也是唯一一層在資料尾端加入額外資訊,Ethernet在尾端加入4 Byte CRC檢查碼。
▲Ethernet的欄位定義

▲MAC(媒體存取控制,media access control)位址,每個網路介面都會有的獨立編號
OSI 7層與網路4層對應
國際標準組織ISO提出OSI(Open System Interconnection)參考模型,將網路分為7層,與網路模型比較起來,OSI的定義較為細小,拆出更多層,但發展較晚,許多網路開發人員已習慣TCP/IP的分類方式。
不過OSI模型也不是一無是處,網路模型較常在實作方面被人提出,而OSI模型較常在觀念上提出。我們也利用OSI模型把網路設備分類,例如最簡單的集線器為L1設備、交換器為L2設備、路由器為L3設備,如果是更為強大的路由器,能夠過濾不同應用程式的封包,則為L7的路由器。
▲OSI 7層與網路4層的對應關係
L7應用層(Application Layer)
提供應用程式與其它主機上程式溝通的介面,也提供使用者應用程式存取網路上資源服務
L6展示層(Presentation Layer)
定義與轉換資料格式,如ASCII和EDCBIC文字編碼的轉換,我們才能夠在不同的電腦上看到相同的資訊,加解密動作也由OSI指定在此層中處理。
L5會議層(Session Layer)
負責交談如何開始、控制、結束。就像是有個會議主持人負責招集,制定開會流程,開會完後宣布散會。
L4傳輸層(Transport Layer)
確保會議層與網路層之間傳遞的資料沒有遺失、重複,還有錯誤復原以及流量控管等功能。
L3網路層(Network Layer)
邏輯定址、繞送、傳輸路徑選擇,維護2端點之間的連線。基本上就是IP協定所執行的工作。
L2資料鏈結層(Data Link Layer)
決定何時資料可由實體傳輸媒介發送,也包含錯誤偵測機制。
L1實體層(Physical Layer)
定義實際在媒介上的傳輸標準,大多直接拿取其它相關組織的規格直接使用,如IEEE電機電子工程師協會制定的一系列802標準。
到此為止,讀者應已了解為何網路模型需要分層,而各層之間又分別發揮什麼功能;內文也帶領大家走過1遍資料的包裝流程,理解資料經過網路傳輸需要哪些步驟,下一篇應該是介紹IP的分類以及繞送方式。
本文同步刊載於電腦王雜誌

歡迎加入電腦王雜誌粉絲團
加入T客邦Facebook粉絲團