[Note] 有關網路:Computer Networking – The Transport and Application Layers

此篇主要是紀錄 Coursera 平台上的課程 Google IT Support Professional Certificate 中 The Bits and Bytes of Computer Networking 的第三個星期的上課筆記,大致上是一些網路設備和網路模型的介紹。其他的預期要寫的筆記也一併附上,未來整理完成了下方文字可以直接連結到該筆記:


目錄


The Transport Layer

The Transport Layer

傳輸層負責網路的許多重要功能,包含建立長時間運行的連接以及透過錯誤檢查和驗證數據完整性等等。

傳輸層有多工(multiplex)和分工(demultiplex)的功能。多工是指網路上的節點可以將流量導向到許多不同的接收服務,從不同的 socket 收集資料片段,將每份資料片段與 header 資訊封裝在一起建立區段,再把區段交給網路層 ,而分工是將資料傳送給正確的 socket 的工作。

傳輸層透過 port 處理多工和分工,port 是一個 16-bit 數字。舉個例子,用於 http 或是未加密 web 流量的是 port 80,可以用冒號表示:10.1.1.100:80。這種寫法叫做插座位址 socket address 或是 socket number。

同一台機器可能託管內部網站、公司的郵件伺服器、共享檔案的檔案伺服器、網路印表機伺服器等等,因為多工和分工,讓這一切都變得可能。

Dissection of a TCP Segment

就像乙太影格封裝 IP datagram 一樣,IP datagram 封裝 TCP 區段。

TCP 區段由 TCP header 和資料所組成,TCP header 本身被分成許多包含大量訊息的字段。首先有 source port 和 destination port 字段。Destination port 是流量所針對的服務的 port,也就是目的地之 TCP port,而 source port 是來源之 TCP port。

再來是 sequence number,也就是該封包的順序編號。Acknowledge number,回應封包的確認號碼,也是希望傳送端下次發送封包的序號,用來確認以前的封包都正常簽收。

data offset 是資料偏移量,因為 TCP 的 Option 欄位長度並非固定,偏移量用來表示資料是在整個封包之起始位址。

接下來是 TCP window,用來控制封包流量,告訴對方目前本身還有多少緩衝器可以接收封包。如果 值為 0 表示緩衝器已滿,暫停傳送資料。TCP 是一種非常依賴確認的協定,這樣做是為了確保實際接收到所有預期的數據,並且發送設備不會浪費時間發送未接收到的數據。

下一個字段是 checksum 是 16 bits 長的檢查碼,接收方可依此 checksum 來確定收到的封包是否正確。一旦所有分段都被收件人收取,就會在整個分段中計算 checksum,並且和 header 中的 checksum 進行比較,確保沒在這個過程中沒有丟失資料或是損壞。

Urgent Point 用來指出可能比其他部分更重要的特定分段。下一個段落為 option,目前此只用於表示接收端能夠接收最大資料區段的大小。若不使用,則可以使用任意的資料區段大小,有時會用於更複雜的流量控制協定。這兩者都很少使用。

最後是 padding,全部都是 0 的數列,用來確保資料有效負載部分從預期位置開始。

TCP Control Flags and the Three-way Handshake

TCP 是使用 TCP control flag 透過非常特定的順序建立連接。以下先定義 6 個 TCP control flag:

  • URG (Urgent)
    若這裡的值是 1,表示該封包為緊急資料,並且在 urgent point 會有更多相關資訊。(並未廣泛採用,通常也看不到。
  • ACK (Acknowledge)
    若值為 1,表示應該檢查 acknowledgement number,確認欄位中所指定的順序號碼。
  • PSH (Push)
    要求對方立即傳送 send buffer 中的封包。Buffer 是一種技術,有一定程度的資料在發送到其他地方之前會保存在某個地方。
  • RST (Reset)
    要求對方立刻結束連線,且發送端已斷線,也就是強迫性地結束連線。意思是說,無法從丟失或格式錯誤的分段中正確地恢復,像是無法理解資訊所以從頭開始的意思。
  • SYN (Synchronous)
    通知對方要求建立連線,在首次建立 TCP 連線時使用,並確保接收端知道要檢查 sequence number。
  • FIN (Finish)
    通知對方資料已經傳輸完畢,是否同意斷線,等待對方回應。

假設現在 A 電腦和 B 電腦要連線,A 電腦向 B 電腦發送一個 TCP 區段,並發送一個 SYN flag,表示它們之間要建立連線,並且查看它的 sequence number,才知道對話要從哪裡開始。B 電腦接下來發送 SYN 以及 ACK flag 回應,也就是說,確認它們要建立連線,並且已確認 sequence number。A 電腦再次回應的時候,只發送 ACK flag,表示它確認了 B 電腦的確認,讓它們之間開始發送資料。

這些交涉過程因為在每次的 TCP 連線都會發生,所以有一個名稱叫做三向交握(three-way handshake)。交握是為了讓兩個機器確保他們使用相同的協定,並且能夠互相理解。一旦三向交握完成,TCP 連線就建立了。接下來 A 電腦就可以自由地和 B 電腦發送它想要傳輸的資料,反過來說也是一樣。

只要遇到其中一個電腦準備關閉連線,則會發生四向交握(four-way handshake),準備關閉連線的那台機器,會發送 FIN flag,另一台電腦用 ACK flag 確認,若這台也準備好關閉連線,也會發送一個 FIN,並且由原本要關閉連線的電腦再發送一個 ACK 回應。

TCP Socket States

Socket 是在 TCP 連線行程間資料串流的端點,也是一種作業系統提供的行程間通訊機制。我們可以將流量發送到您想要的任何 port,但只有當某個程式在該場打開了一個 socket 時,才會得到回應。

TCP sockets 可以以多種狀態存在。

  • LISTEN
    表示 TCP socket 已就緒並正在聆聽。(只會在 server 端看到)
  • SYN_SENT
    表示已發送同步請求,但尚未建立連接。 (只會在 client 端看到)
  • SYN_RECEIVED
    先前處於 LISTEN 狀態的 sockets 已收到同步請求並發回 SYN/ACK,尚未收到來自 client 的 ACK。(只會在 server 端看到)
  • ESTABLISHED
    TCP 連線處於工作狀態,雙方可以自由地傳送資料。
  • FIN_WAIT
    表示發送了一個 FIN,但是還沒有收到對方相應的 ACK。
  • CLOSE_WAIT
    這意味著連接已在 TCP 層關閉,但打開 sockets 的應用程式尚未釋放。
  • CLOSED
    連線已完全終止,無法進行下一步的通訊。

TCP socket 狀態還有其他的,甚至可能因操作系統而有不同。TCP 作為一種協定,在使用方式上是通用的,因為每個使用 TCP 協定的設備都必須以完全相同的方式執行此操作才能使通訊成功。在 TCP 層解決問題時,必須確保正在使用的系統的確切 socket 狀態定義。

Connection-oriented and Connectionless Protocols

到目前為止我們著重的是連接導向方式(connection-oriented),是一種建立連線並使用它來確保所有資料都已經正確傳輸的協定。傳輸層意義在於,每一段資料都得到確認,這樣連線的兩端總是知道哪些資料已經傳送到另外一端,哪些沒有。

連接導向的協議,像是 TCP,透過建立連線和持續不斷的確認,來防止出錯的狀況發生。這會產生大量開銷,我們必須建立連線,發送一連串的確認,再來要切斷連線,這些都佔用了很多額外流量。雖然重要,但只有我們肯定資料抵達目的地時,它才有用。

非連結導向協定(Connectionless Protocols)與上面的連接導向對比,最常見的協定為 UDP(User Datagram Protocol,使用者資料報協定)。和 TCP 不同,UDP 不依賴於連線,甚至不支援「確認」的概念。使用 UDP,只需設置目標 port 並發送封包。這對於不是非常重要的訊息很有用,像是串流媒體。假設每個 UDP 封包都是影片的單個影格,為了獲得最佳觀看體驗,我們可能希望每一個影格都能抵達觀看端,但其實過程中丟失幾個影格並不重要,除非丟失很多影格才會被影響。我們可以使用 UDP 傳送更高品質的影片,少了 TCP 建立連線和確認傳送的開銷,能夠為實際資料傳輸節省更多的可用頻寬。

Firewalls

防火牆(firewall)是阻止滿足特定條件流量的設備,也是網路安全的重要概念。防火牆也可以在網路的不同層進行,例如檢查應用層流量的防火牆、處理 IP 位址阻塞範圍的防火牆等等。其中防火牆最常使用於傳輸層,通常會藉由設定讓它們能夠阻止到某些 port 的流量,同時允許到其他 port 的流量。

防火牆有時候是獨立的網路設備,但通常視為在任何地方運作的程式。所有主要的作業系統都內建了防火牆功能,這樣我們就可以阻止或允許各種 port 的流量已集特定服務的流量。

The Application Layer

The Application Layer

就像其他所有層級一樣,TCP 區段也有一個通用資料部分。這個 payload 實際上是應用程式想要互相傳送的任何資料的全部內容,可以是網頁內容,也有可能是文字處理器正在傳送給影印機的內容等等。

在應用層(Application Layer)使用的協定非常多,可以不用一一介紹。但應用層協議有個概念是跨應用程式類型的標準化,例如不論使用 Chrome 或是 Safari,都需要相同的協定,才可以確保和任何伺服器進行通訊。

對於 Web 流量,應用層協定稱為 HTTP。所有不同的瀏覽器和伺服器都需要使用相同的 HTTP 協定,確保互操作性。大多數其他類別的應用程式也是如此,例如對於 FTP client,我們可能有很多種程式的選擇,但必須以相同的方式使用 FTP 協定。

The Application Layer and the OSI Model

我們先前一直在使用五層模型,但我們很可能遇到其他模型,一些模型可能會把物理層和資料連接層看作一層,只討論四層模型。

而 OSI 模型(Open System Interconnection Model,開放式系統互聯模型)也很重要,它算是定義上最嚴格的模型,經常用於學術環境或各種網路認證組織。OSI 模型一共有七層,在傳輸層以及應用層中,多了兩個層:會議層和表現層。

會議層(Session Layer)負責在數據傳輸中設定和維護電腦網路中兩台電腦之間的通訊連接,諸如促進實際應用和傳輸層之間的通訊之類的事情。它從它下面的所有層中獲取未封裝的應用層資料,並將其傳遞給 OSI 模型中的下一層-表現層。

表現層(Presentation Layer)把資料轉換為能與接收者的系統格式相容並適合傳輸的格式,確保未封裝的應用層資料實際上能夠被相關應用程序理解。但我們在過去的課程中發現沒有任何封裝在進行。 這就是為什麼在我們的模型中,我們將所有這些功能都集中到應用層中。

理解網路概念時,五層模型是最有用的,但七層 OSI 模型也很普遍。

All the Layers Working in Unison

想像一下三個網絡當作接下來的例子:
網絡 A 包含位址空間 10.1.1.0/24
網絡 B 包含位址空間 192.168.1.0/24
網絡 C 包含位址空間 172.16.1.0/24

假設我們坐在電腦 1 前面,打開瀏覽器並在網址列中輸入 172.16.1.100。

瀏覽器知道它被命令從 172.16.1.100 檢索網頁,瀏覽器和本地端網路堆疊通訊,解釋目前要建立到 172.16.1.100 port 80 的 TCP 連線。網路堆疊檢查自己的子網路,看到它位於網路 10.1.1.0/24 上,也就是說目標在另外一個網路上。

這時候電腦 1 知道必須將資料發送到閘道才可以路由到遠端網路,並且已經配置閘道 10.1.1.1。接下來,電腦 1 查看 ARP 表確定 10.1.1.1 的 MAC 位址是什麼,但沒有找到任何對應的項目,因此在 ARP 中請求 IP 位址 10.1.1.1,這個請求被發送到本地網絡上的每個節點。當路由器 A 收到此 ARP 訊息時,它會看到它是分配了 IP 地址 10.1.1.1 的電腦。它回應電腦 1,讓它知道自己的 MAC 地址是 00:11:22:33:44:55。

電腦 1 收到回應,現在已經知道 gateway 的地址,也就準備好開始將封包發出去。

電腦 1 知道瀏覽器要求它建立 TCP 連接,也就是說需要一個輸出 TCP 連接埠。作業系統將臨時 port 50000 識別為可用,並打開一個將瀏覽器連線到該 port 的 pocket。

網路堆疊開始建構 TCP 區段,填寫 header 中所有的字段,包括 50000 的 source port 和 80 的 destination port 等等。最後,設定 SYN flag。現在建立好的 TCP 區段傳遞到網路堆疊的 IP 層,這層建構一個 IP header,包含 source IP、the destination IP 和 TTL 64。接下來,插入 TCP 區段作為 IP 封包的數據 payload,並為整個資料計算 checksum。

現在已經構建了 IP datagram,電腦 1 需要將其發送到閘道,它現在知道 MAC 地址為 00:11:22:33:44:55。

乙太影格已經建構好,準備好通過物理層發送。連接到電腦 1 的網絡接口發送此數據作為電流電壓的調製,該電流流過連接在它和網絡交換機之間的 Cat 6 電纜。此交換機接收影格並檢查目標 MAC 位址。交換機知道這個 MAC 位址連接到它的哪個接口,並只通過連線到這個接口的電纜轉發影格。

這條鏈路的另一端是路由器 A,它接收乙太影格並將自己的硬體位址識別為目的地。路由器 A 知道這影格是為它自己準備的,所以它現在獲取整個影格並根據它計算 checksum。路由器 A 將會將 checksum 和乙太網路影格 header 中的 checksum 進行比較,發現它們確實相符。

路由器 A 脫離乙太網路影格,只留下 IP datagram,並再次對整個資料報進行 checksum 計算,再次發現它相符,也就是說所有資料都是正確的。

它檢查目標 IP 並在路由表中查找該目標,路由器 A 看到以便將封包傳送到 172.16.1.0/24 網路,最快的路徑是通過路由器 B。路由器 B 的 IP 為 192.168.1.1。

路由器 A 查看 IP datagram 中的所有資料,將 TTL 減一,計算新 TTL 值的新 checksum,並使用該資料生成新的 IP datagram。路由器 A 知道它需要將此封包發送到 IP 地址為 192.168.1.1 的路由器 B,查看 ARP 表,發現有一個 192.168.1.1 的項目,現在路由器 A 可以開始建立一個在網絡 B 上的接口的 MAC 位址為源頭、路由器 B 在網絡 B 上的接口的 MAC 地址為目的的乙太網路影格。一旦此影格中所有字段的值都已填寫,路由器 A 將新建立的 IP datagram 放入有效 payload 字段,計算 checksum 並將此放置到位置,然後將影格發送到網絡 B。

該影格通過網絡 B 並被路由器 B 接收。路由器 B 執行所有和先前相同的檢查,移除乙太網路影格封裝並對 IP 封包執行 checksum,然後它會檢查目標 IP 地址。查看路由表,路由器 B 發現電腦 2 的目標位址或 172.16.1.100 在本地連接的網絡上,因此它再次將 TTL 減 1,計算新的 checksum 並創建新的 IP datagram。這個新的 IP datagram 再次被一個新的乙太網路影格封裝。

這一個具有路由器 B 和電腦 2 的來源和目標 MAC 位址。最後一次重複整個過程,影格被發送到網絡 C,交換器確保它從電腦 2 連接的接口發送出去。電腦 2 接收到影格,將其自己的 MAC 地址標識為目的地,並知道它是為自己準備的,然後脫下影格,留下 IP datagram。它執行 CRC 並確認資料已完好無損地交付,它會檢查目標 IP 地址並將其識別為自己的。 接下來,計算機 2 剝離 IP datagram,只留下 TCP 區段。再次檢查該層的 checksum,檢查所有內容。

接下來,電腦 2 檢查目標 port,即 80。電腦 2 上的網絡堆疊檢查以確保 port 80 上有一個打開的 socket,確實存在。它處於 listen 狀態並透過 Apache Web 伺服器保持打開狀態。電腦 2 接著看到此封包設定了 SYN flag,它檢查 sequence number 並且儲存它。

之後,我們所做的就是從一台電腦到另一台電腦獲取一個包含 SYN 標誌的 TCP 段。電腦 2 向電腦 1 發送 SYN ACK 回應時,一切都必須重新來過。然後,電腦 1 向電腦 2 發送 ACK 時,一切都必須再次重新來過,依此類推。


參考資料

讓我知道你在想什麼!

Picture of ALEX

ALEX

藍白拖愛好者,一事無成話偏多

Recent Posts

C++

NLP