引言
在之前的討論中,我們已經對HTTP和DNS協議進行了詳細的探討,這些協議主要用於應用層的通訊。然而,今天我們將把重點轉移到網路層和傳輸層的協議上,也就是TCP/IP協議。所以,我們將深入研究這些協議的工作原理和作用。
可靠傳輸-TCP
HTTP是一種基於TCP協議傳輸的協議。在TCP傳輸資料之前,需要進行三次握手來建立連線。如果HTTP請求訊息的長度超過了MSS(Maximum Segment Size)的限制,那麼TCP就需要將HTTP資料拆分成多個塊來傳送,而不是一次性傳送所有資料。
在網路中,MTU(Maximum Transmission Unit)指的是一個網路包的最大長度,例如乙太網中一般為1500位元組。而MSS則是在去除IP和TCP頭部之後,一個網路包所能容納的TCP資料的最大長度。
當資料長度超過MSS時,資料會被拆分成多個塊,每個塊的長度為MSS。每個被拆分的資料塊都會被放入單獨的網路包中,並在每個被拆分的資料塊中新增TCP頭資訊,然後由IP模組來傳送這些資料。
TCP 報文生成
TCP協議中涉及兩個埠,一個是瀏覽器監聽的埠(通常是隨機生成的),另一個是Web伺服器監聽的埠(HTTP預設埠號為80,HTTPS預設埠號為443)。
一旦建立了連線,TCP報文的資料部分就包含了HTTP頭部和資料。組裝好TCP報文後,就會交給下一層的網路層來處理。
因此,網路包的報文可以用下圖表示:
遠端定位-IP
在 TCP 模組執行連線、收發、斷開等操作的各個階段,都需要委託 IP 模組將資料封裝成網路包,併傳送給通訊物件。在 IP 協議中,需要包含源地址 IP 和目標地址 IP 兩個關鍵資訊:
- 源地址 IP 是指客戶端輸出的 IP 地址,它表示資料包的傳送方。
- 目標地址 IP 是透過 DNS 域名解析獲取的 Web 伺服器的 IP 地址。
在進行 TCP 傳輸時,由於 HTTP 是經過 TCP 傳輸的,因此在 IP 包頭的協議號欄位中需要填寫為 06(十六進位制),表示協議為 TCP。
當客戶端存在多個網路卡時,即有多個 IP 地址可供選擇時,需要根據具體情況來確定選用哪個 IP 地址作為源地址。這個選擇過程相當於在多個網路卡中判斷應該使用哪個網路卡來傳送資料包。
為了確定源地址 IP,需要根據路由表規則進行判斷。路由表規則可以指定特定的條件,如目標 IP 地址、介面優先順序等,從而決定使用哪個網路卡的 IP 地址作為源地址。根據路由表規則的判斷結果,就可以確定應該使用哪個網路卡的 IP 地址作為源地址 IP。
IP 報文生成
兩點傳輸-MAC
在生成 IP 頭部之後,接下來網路包還需要在 IP 頭部的前面新增 MAC 頭部。
MAC 頭部是乙太網使用的頭部格式,它包含了傳送方和接收方的 MAC 地址等重要資訊。MAC 頭部的格式包括目標 MAC 地址、源 MAC 地址、型別欄位等。
在傳送網路包之前,需要在 IP 頭部之前新增 MAC 頭部,以確保資料可以正確地在乙太網中傳輸。MAC 頭部的目標 MAC 地址指示了網路包應該傳輸到哪個裝置,源 MAC 地址指示了資料的來源。
在 MAC 包頭中,傳送方和接收方的 MAC 地址是必須包含的資訊,用於實現兩點之間的傳輸。通常在 TCP/IP 通訊中,MAC 包頭的協議型別只使用以下兩種:
- 0800:表示 IP 協議
- 0806:表示 ARP 協議
傳送方的 MAC 地址獲取相對簡單,因為 MAC 地址是在網路卡製造時寫入到 ROM 中的,只需要將這個值讀取出來,並寫入到 MAC 包頭中即可。
然而,接收方的 MAC 地址相對複雜一些。為了讓乙太網幫助我們將資料包傳送給正確的目標,我們需要提供對方的 MAC 地址。因此,我們需要先確定應該將資料包傳送給誰,這可以透過檢視路由表來獲得。在路由表中找到匹配的條目後,我們可以將資料包傳送給閘道器(Gateway)列中對應的 IP 地址。
當我們不知道對方的 MAC 地址時,可以透過使用 ARP(地址解析協議)來獲取。ARP 協議會以廣播的形式在乙太網中傳送一個請求,詢問所有裝置:“誰是擁有這個 IP 地址的裝置?請告訴我你的 MAC 地址。”然後,將會有一個裝置回答:“這個 IP 地址是我的,我的 MAC 地址是XXXX。”
如果對方裝置和我們在同一個子網中,透過上述操作就可以獲取到對方的 MAC 地址。然後,我們將這個 MAC 地址寫入 MAC 包頭部,這樣 MAC 包頭部就完成了。
需要注意的是,ARP 協議只在同一個子網中有效。如果目標裝置不在同一子網中,就需要藉助路由器來轉發資料。在這種情況下,我們需要找到閘道器的 MAC 地址,將其作為接收方的 MAC 地址,以便將資料包正確地傳送給閘道器,從而實現跨子網的通訊。
MAC 報文生成
出口-網路卡
IP 生成的網路包是存放在記憶體中的二進位制資料,無法直接傳送給對方。為了將資料在網路上傳輸,我們需要將其轉換為電訊號。這個過程由網路卡負責執行,而網路卡驅動程式則用於控制網路卡。
當網路卡驅動程式從IP模組獲取到網路包後,它會將其複製到網路卡內的快取區中。然後,在資料包的開頭新增報頭和起始幀分界符,並在末尾新增用於檢測錯誤的幀校驗序列。這樣,資料包就準備好可以透過網線傳送了。
在資料包的處理過程中,起始幀分界符起著重要的作用,它是一個特定的標記,用來表示包的起始位置。當網路卡驅動程式將資料包複製到網路卡的快取區後,新增起始幀分界符,這樣接收方就可以準確地確定資料包的開始位置。
另外,末尾的幀校驗序列(FCS)也是非常重要的。在資料包傳輸過程中,可能會發生噪聲、干擾或其他錯誤,導致資料包損壞。為了確保資料的完整性,網路卡在資料包的末尾新增了FCS。接收方在接收資料包時,會利用FCS對資料包進行校驗,以檢測是否有損壞或錯誤發生。如果校驗結果與FCS不匹配,接收方將知道資料包在傳輸過程中發生了錯誤。
最後,當資料包準備好之後,網路卡會將其轉換為電訊號,並透過網線傳送出去。這樣,資料包就能夠被目標裝置接收和處理。這個過程中,網路卡起到了關鍵的作用,確保了資料的有效傳輸。
總結
透過本文的探討,我們深入研究了TCP/IP協議在網路層和傳輸層的工作原理和作用。我們瞭解到,在TCP協議中,資料需要進行三次握手來建立連線,並且在傳輸過程中需要將資料拆分成多個塊來傳送。而在IP協議中,需要確定源地址和目標地址,並根據路由表規則來選擇合適的網路卡的IP地址作為源地址。在MAC協議中,需要新增MAC頭部來指定傳送方和接收方的MAC地址,以實現兩點之間的傳輸。最後,在網路卡的作用下,將資料轉換為電訊號併傳送出去,確保資料的有效傳輸。