淺談網路連線機制-計算機網路概論心得筆記

Ac Studio
Nov 12, 2023

--

2023.08.21 Venice

前言

我們每天都會瀏覽各種網頁,透過輸入網址,我們就可以看到網頁出現,那麼這個過程究竟發生了哪些事? 本文將會簡介網路連線的機制。

正文

在瀏覽器上輸入網址(URL)後,便會發送請求到網頁伺服器(Web Server)上,並把收到的資料顯示在網頁上。但是在網路上,我們必須有網頁伺服器的IP位址才能將請求送到對方手上。

如果把要送的資料想像成包裹,IP位址就是網路世界的門牌號碼。透過門牌號碼,我們才知道要將包裹送到什麼地方。因為IP位址就像網路世界的地址一樣,所以IP是獨一無二不重複的,否則就會不知道要將資料送到哪裡了。IP存在不同的版本,本文僅討論IPv4,在這個版本中IP位址有32位,通常會寫成四段,包含兩部分,第一部分是網路號,用來代表主機所在的網路,第二部分是主機編號。顧名思義,我們可以透過網路號和主機號來確認和管理IP。比如有一台裝置的網路號和另一台裝置相同,我們就能知道他們是位在同一個公司的不同計算機。網路和主機號的總和雖然是32位,但是分別有幾位是不固定的,因此需要一個媒介來判讀究竟哪塊是網路號,哪塊是主機號。這個媒介就叫做子網路遮罩(Subnet Mask),子網路遮罩是一串的1和0組成。表示形式可以是用二進位的方式列出一串的1和0,也可以用十進位的方式,如下圖:

同一個子網路遮罩分別以二進位和十進位表示

這兩種表示方式的意思完全一樣,將這32位和IP位址的32位對齊,子網路遮罩的1對應到的IP位址就是網路號,0對應到的Ip則是主機號。舉例來說,IP位址如果是192.168.1.1,子網路遮罩是255.255.255.0,那麼我們就可以把兩者都轉成二進位,再把前24位當成網路號,後8位當成主機號。

透過子網路遮罩的1和0可區分網路號和主機號

回到正題,如果我們要向網頁伺服器傳送請求,就必須先查到網頁伺服器的IP位址,因此要經過DNS(Domain Name Server)伺服器。DNS伺服器可以透過URL查詢並回傳相對應的IP位址。有了DNS的存在,我們就不需要記一串又臭又長又難記的IP了。

DNS有一張大表,裡面寫了許多域名對應的IP位址。這時有兩種情況,第一種是DNS伺服器在表中查到了該網頁伺服器的IP位址,它就回傳IP即可。第二種情形是DNS查表沒有查到該網頁伺服器,這時DNS伺服器就會向其他DNS伺服器查詢。查詢的方式並不是一個一個問,而是解析URL的結構,層層向上詢問。舉例而言,如果要查詢www.google.com.tw的IP位址,會先訪問本地的DNS伺服器,本地DNS伺服器查表查不到時,會去問一個名叫根伺服器的伺服器,並透過層層接力的方式找到目標IP位址,如下圖

本地DNS伺服器:我要查詢www.google.com.tw的IP位址

根伺服器:我不知道www.google.com.tw的IP位址,但是我知道.tw的DNS伺服器的IP位址,你去問它。

本地DNS伺服器:我要查詢www.google.com.tw的IP位址

負責.tw的伺服器:我不知道www.google.com.tw的IP位址,但是我知道.com.tw的DNS伺服器的IP位址,你去問它。

透過以上方式詢問目標的IP位址

知道網頁伺服器的IP後,我們就可以利用IP和網頁伺服器建立連線,透過UDP(User Datagram Protocal)或是TCP(Transmission Control Protocol)兩種協議收發數據。大部分的應用程式用的都是TCP,TCP具有可靠性,可以保證資料不會傳丟。TCP的連接機制稱為三向交握(Three-Way Handshake),透過這個機制,我們可以和網頁伺服器建立連接並開始發送數據,數據傳送的單位是封包(Packet),可以想像成一段一段的位元組。每種網路能夠傳輸的量是不一樣的,比如乙太網路最多可以一次傳送1500 Bytes,這個傳輸的極限稱為MTU (Maximum Transmission Unit),在發送數據時,如果要送的內容很多,數據會被切成好幾個封包來傳。因此,大家可以想像,數據並不是隨到隨傳的,而是會累積到接近MTU的大小才會傳送,這樣才可以避免每次傳送的封包都只有一點點資訊。TCP在切封包時,會記得每個封包的開頭是原始數據的第幾個Byte,然後將這項資訊一併傳出去。因此,接收方可以查看這個資訊來判斷有沒有漏傳的情形,並傳一項稱為ACK的資訊給發送方,表示自己確實收到封包了。反過來說,如果傳送方一直沒有收到ACK,就知道接收方沒有收到封包,因此便會重傳一次。資料傳送完成後,TCP會透過四次揮手(Four-Way Wavehand)來切斷連結。透過上述的機制,TCP能夠保證數據完好無缺的到對方手上。以下簡單放上三向交握和四次揮手的流程圖讓大家感受一下,由於TCP的機制細探十分複雜,我們會另外針對TCP寫另一篇文章來介紹,圖中的SYN、FIN、ACK這些專有名詞也會一併介紹。

三向交握的運作機制
四次揮手的運作機制

除了TCP以外,UDP也是一種收發數據的方式,相較於TCP單純很多,也無法保證數據傳輸的可靠性。即使如此,UDP還是有用到的時候,比如當我們要傳輸的資料很少時,比如一個封包就能裝下的話,如果資料傳丟了直接重傳一次即可,這時候如果用TCP還需要經過建立和結束連接的封包,反而耗費了許多資源。此外,有些影片和音樂也是透過UDP傳送的,因為如果用TCP傳送,必須要耗費很多時間檢查和重傳,反而會導致影像或聲音延遲,反過來說,使用UDP雖然可能會丟失一些資訊,但對整體的影響不會那麼大。

而資料在傳輸的過程中,會經過許多硬體設備,比如路由器(Router)、交換器(Switch)、集線器(Hub)等等,這些設備會層層接力,把數據傳送到目的地。

交換器內部有一張表,上面寫著不同的MAC地址以及該地址對應的埠口。當封包送入交換器時,就可以透過查表,將封包送到相對應的埠口。那麼,交換器的表是怎麼產生的呢? 當交換器收到一個新的封包時,會記錄這個發送方的MAC地址以及這個封包進入的埠口,久而久之就能累積出一張表了。如果交換器查表找不到要送到哪時,便會將封包送給所有的埠口,負責接收該封包的埠口將封包收下後,也會回傳資訊給交換器,讓交換器知道該MAC地址對應的埠口,下次遇到一樣的MAC地址就可以直接發送了。

路由器同樣也是查表,但是路由器的表紀錄的是IP地址和埠口,當封包進來時,路由器透過IP地址判斷要交封包送到哪一個埠口。不過路由器的詳細運作機制比較複雜,為了避免離題我們以後另外介紹。

結語

本文非常概略的解釋了網路連線的機制,當然其中的每個環節都有非常多的細節可以討論,因此本文僅以蜻蜓點水的形式簡單帶過,希望能作為一個大略的導覽供參考。如果有誤,還請不吝賜教。

--

--