計算機網絡基礎知識分享
發送一個http請求,從客戶端到服務器端,都經歷了什么?
**Ⅰ,瀏覽器生成消息 **
(1)瀏覽器輸入網址
我們的探索之旅從在瀏覽器中輸入網址開始,網址,準確來說應該叫 URL。常見的就是以 http:// 開頭的那一串東西,但實際 上除了“http:”,網址還可以以其他一些文字開頭,例如“ftp:”“file:” “mailto:”等。
幾種常見的URL
盡管 URL 有各種不同的寫法,但它們有一個共同點,那就是 URL 開 頭的文字,即“http:”“ftp:”“file:”“mailto:”這部分文字都表示瀏覽器應 當使用的訪問方法。比如當訪問 Web 服務器時應該使用 HTTP 協議,而 訪問 FTP 服務器時則應該使用 FTP 協議。因此,我們可以把這部分理解為 訪問時使用的協議類型 。盡管后面部分的寫法各不相同,但開頭部分的內容決定了后面部分的寫法,因此并不會造成混亂。
(2)瀏覽器解析URL
特殊情況: index.html 或者 default.htm
(a)http://www.lab.glasscom.com/dir/
(b)http://www.lab.glasscom.com/
(c)http://www.lab.glasscom.com
(d)http://www.lab.glasscom.com/whatisthis
解析完 URL 之后,我們就知道應該要訪問的目標在哪里了。接下來看看瀏覽器使用 HTTP 協議來訪問 Web 服務器
(3)HTTP協議
HTTP協議的基本思路:
首先,客戶端會向服務器發送請求消息。請求 消息中包含的內容是“對什么”和“進行怎樣的操作”兩個部分。
對什么:URI
進行怎樣的操作:方法
對 URL 進行解析之后,瀏覽器確定了 Web 服務器和文件名,接下 來就是根據這些信息來生成 HTTP 請求消息了。
生成HTTP請求消息
HTTP 消息在 格式上是有嚴格規定的,因此瀏覽器會按照規定的格式來生成請求消息
(4)向 DNS 服務器查詢 Web 服務器的 IP 地址
生成 HTTP 消息之后,盡管瀏覽器能夠解析網址并生成 HTTP 消息,但它本身并不具備將消息發送到網絡中的功能,因此這一功能需要委托操作系統來實現。在進行這一操作時,我們還需要查詢網址中服務器域名對應的 IP 地址。因為在網絡中需要通過IP地址才能判斷出訪問對象服務器的位置。IP地址基本思路圖
棟:網絡號
號:主機號
實際的 IP 地址是一串32 比特的數字,按照 8 比特(1 字節)為一組分成 4 組,分別用十進制表示然后再用圓點隔開。這就是我們平常經常見到的 IP 地址格式。如:10.11.12.13
但僅憑這一串數字我們無法區分哪部分是網絡號,哪部分是主機號。在 IP 地址的規則中,網絡號和主機號連起來總共是 32 比特,但這兩部分的具體結構是不固定的。在組建網絡時,用戶可以自行決定它們之間的分配關系,因此,我們還需要另外的附加信息來表示 IP 地址的內部結構。
這一附加信息稱為子網掩碼。是一串與 IP 地址長度相同的 32 比特數字,其左邊一半都是 1,右邊一半都是0。其中,子網掩碼為 1 的部分表示網絡號,子網掩碼為 0 的部分表示主機號。
?
通過IP地址和子網掩碼確定網絡號和主機號
?
這種子網掩碼寫法太長,我們也可以把 1 的部分的比特數用十進制表示
?
IP 地址的主機號
全 0:表示整個子網
全 1:表示向子網上所有設備發送包,即“廣播”
現在我們知道了通過ip地址可以查找到目標服務器,但是ip地址是一串數字,記憶起來都是比較困難。所以我們可以通過服務器名稱來表示IP地址。
需要有一個機制能夠通過名稱來查詢 IP 地址,或者通過 IP 地址來查詢名稱,這個機制就是 DNS
DNS基本查詢原理
DNS 服務器的基本工作就是接收來自客戶端的查詢消息,然后根據消息的內容返回響應。
其中,來自客戶端的查詢消息包含以下 3 種信息。
(a)域名
? 服務器、郵件服務器(郵件地址中 @ 后面的部分)的名稱
(b) Class
? 在最早設計 DNS 方案時,DNS 在互聯網以外的其他網絡中的應用也被考慮到了,而 Class 就是用來識別網絡的信息。不過,如今除了互聯網并沒有其他的網絡了,因此 Class 的值永遠是代表互聯網的 IN
(c)記錄類型
? 表示域名對應何種類型的記錄。例如,當類型為 A 時,表示域名對應的是 IP 地址;當類型為 MX 時,表示域名對應的是郵件服務 器。對于不同的記錄類型,服務器向客戶端返回的信息也會不同。
DNS 服務器上事先保存有前面這 3 種信息對應的記錄數據,如下圖(例如,對于一個郵件地址 tone@glasscom.com,當需要知道這個地址對應的郵件服務器時,我們需要提供 @ 后面的那一串名稱。查詢消息的內容如下。)
尋找相應的DNS服務器并獲取IP地址
我們已經知道了從DNS服務器可以查詢到域名的相關ip信息,所以我們現在來探究如何找到某個域名對應的DNS服務器。
互聯網中有數萬臺 DNS 服務器,肯定不能一臺一臺挨個去找。我們可以采用下面的辦法。首先,將負責管理下級域的 DNS 服務器的 IP 地址注冊到它們的上級 DNS 服務器中,然后上級 DNS 服務器的 IP 地址再注冊到 更上一級的 DNS 服務器中,以此類推。
例如:lab.glasscom.com
lab.glasscom.com 這個域的 DNS 服務器的 IP 地址需要注冊到 glasscom.com 域的 DNS 服務器中,
而 glasscom.com 域的 DNS 服務器的 IP 地址又需要注冊到 com 域的 DNS 服務器中。
我們就可以通過上級 DNS 服務器查詢出下級 DNS 服務器的 IP 地址.
似乎 com、jp 這些域(稱為頂級域)就是最頂層了,但實際上并非如此。在互聯網中,com 和 jp 的上面還有一級域,稱為根域。根域不像 com、jp 那樣有自己的名字,因此在一般書寫域名時經常被省略,如果要明確表示根域,應該像 www.lab.glasscom.com**.** 這樣在域名的最后再加上一個句點,而這個最后的句點就代表根域。不過,一般都不寫最后那個句點,因此根域的存在往往被忽略,但根域畢竟是真實存在的,根域的 DNS 服務器中保管著 com、jp 等的 DNS 服務器的信息。
根域的 DNS 服務器信息保存在互聯網中所有的 DNS 服務器中。這樣一來,任何 DNS 服務器就都可以找到并訪問根域 DNS 服務器了.分配給根域 DNS 服務器 的 IP 地址在全世界僅有13 個 ,而且這些地址幾乎不發生變化,因此將這些地址保存在所有的 DNS 服務器中也并不是一件難事。實際上,根域 DNS 服務器的相關信息已經包含在 DNS 服務器程序的配置文件中了,因此只要安裝了 DNS 服務器程序,這些信息也就被自動配置好了。
www.lab.glasscom.com
在真實的互聯網中,一臺 DNS 服務器可以管理多個域的信息。上級域和下級域有可能共享同一 臺 DNS 服務器。在這種情況下,訪問上級 DNS 服務器時就可以向下跳過一級 DNS 服務器,直接返回再下一級 DNS 服務器的相關信息。而且 DNS 服務器有一個緩存功能,可以記住之前查詢過的域名。如果要查詢的域名和相關信息已經在緩存中,那么就可以直接返回響應。
(5)委托協議棧發送消息
知道了 IP 地址之后,就可以委托操作系統內部的協議棧向這個目標 IP 地址發送消息了。要發送給 Web服務器的 HTTP消息是一種數字信息(digital data),因此也可以說是委托協議棧來發送數字信息。
收發數據是使用Socket 庫中的程序組件來實現的,簡單來說,收發數據的兩臺計算機之間連接了一條數據通道,數據沿著這條通道流動,最終到達目的地。我們可以把數據通道想象成一條管道,將數據從一端送入管道,數據就會到達管道的另一端然后被取出。數據可以從任何一端被送入管道,數據的流動是雙向的。
建立管道的關鍵在于管道兩端的數據出入口,這些出入口稱為套接字。我們需要先創建套接字,然后再將套接字連接起來形成管道。
收發數據的操作可分為4個階段。
(1)創建套接字(創建套接字階段)
(2)將管道連接到服務器端的套接字上(連接階段)
(3)收發數據(通信階段)
(4)斷開管道并刪除套接字(斷開階段)
Ⅱ,電信號傳輸TCP/IP數據
我們從解析瀏覽器中輸入的網址開始,探索了生成 HTTP 請求消息、委托操作系統發送消息等步驟。 現在,我們將講解操作系統中的協議棧是如何處理數據發送請求的。
(應用程序那一層,Socket庫用來收發數據,而解析器用于向DNS服務器發出查詢)。
接下來我們看看操作系統部分,其中包括協議棧。協議棧的上半部分有兩塊,分別是負責用 TCP 協議收發數據的部分和負責用 UDP 協議收發數據的部分,它們會接受應用程序的委托執行收發數據的操作。
下面一半是用 IP 協議控制網絡包收發操作的部分。在互聯網上傳送數據時,數據會被切分成一個一個的網絡包,而將網絡包發送給通信對象的操作就是由 IP 來負責的。此外,IP 中還包括 ICMP 協議和 ARP 協議。 ICMP 用于告知網絡包傳送過程中產生的錯誤以及各種控制消息,ARP 用于根據 IP 地址查詢相應的以太網 MAC 地址 。 IP下面的網卡驅動程序負責控制網卡硬件,而最下面的網卡則負責完成實際的收發操作,也就是對網線中的信號執行發送和接收的操作。
(1)套接字
在協議棧內部有一塊用于存放控制信息的內存空間,這里記錄了用于控制通信操作的控制信息,例如通信對象的 IP 地址、端口號、通信操作的進行狀態等。本來套接字就只是一個概念而已,我們可以說這些控制信息就是套接字的實體,或者說存放控制信息的內存空間就是套接字的實體。
協議棧是根據套接字中記錄的控制信息來工作的.
(2)連接服務器
在連接階段,由于數據收發還沒有開始,網絡包中沒有實際的數據,只有控制信息。這些控制信息位于網絡包的開頭,因此被稱為頭部。客戶端和服務器在通信中會將必要的信息記錄在頭部并相互確認。此外,以太網和 IP 協議也有自己的控制信息,這些信息也叫頭部,為了避免各種不同的頭部發生混淆, 我們一般會記作 TCP 頭部、以太網頭部(MAC頭部)、IP 頭部。
TCP頭部格式
連接操作過程,從從應用程序調用 Socket 庫的 connect 開始的
connect(< 描述符 >, < 服務器 IP 地址和端口號 >, …)
connect中的套接字會傳遞給協議棧中的 TCP 模塊。然后TCP 模塊會與服務器的 TCP模塊交換控制信息,這一交互過程包括下面幾個步驟
三次握手
(3)收發數據
當控制流程從 connect 回到應用程序之后,接下來調用 write 將要發送的數據交給協議棧。協議棧并不關心應用程序傳來的數據是什么內容。在協議棧看來,要發送的數據就是 一定長度的二進制字節序列而已。
協議棧并不是一收到數據就馬上發送出去,而是會將數據存放在內部的發送緩沖區中,并等待應用程序的下一段數據。在數據積累到一定量時再發送出去。判斷要素是每個網絡包能容納的數據長度,協議棧會根據一個叫作 MTU 的參數來進行判斷。
MTU 表示一個網絡包的最大長度,在以太 網中一般是 1500 字節。MTU 是包含頭部的總長度,因此需要從 MTU 減去頭部的長度,然后得到的長度就是一個網絡包中所能容納的最大數據長度,這一長度叫作 MSS。
發送緩沖區中的數據會被以 MSS 長度為單位進行拆分,拆分出來的每塊數據會被放進單獨的網絡包中。在每一塊數據前面加上 TCP 頭部,并根據套接字中記錄的控制信息標記發送方和接收方的端口號,然后交給 IP 模塊來執行發送數據的操作。
1,ACK號
到這里,網絡包已經裝好數據并發往服務器了,但數據發送操作還沒有結束。TCP 具備確認對方是否成功收到網絡包,以及當對方沒收到時進行重發的功能。(首先,TCP 模塊在拆分數據時, 會先算好每一塊數據相當于從頭開始的第幾個字節,接下來在發送這一塊 數據時,將算好的字節數寫在 TCP 頭部中,“序號”字段就是派在這個用場上的。然后,發送數據的長度也需要告知接收方,不過這個并不是放在 TCP 頭部里面的,因為用整個網絡包的長度減去頭部的長度就可以得到數據的長度,所以接收方可以用這種方法來進行計算。有了上面兩個數值, 我們就可以知道發送的數據是從第幾個字節開始,長度是多少了。)
具體流程看下圖:
在實際的通信中, 序號并不是從 1 開始的,而是需要用隨機數計算出一個初始值,這是因為如果序號都從 1 開始,通信過程就會非常容易預測,有人會利用這一點來發動攻擊。
如果對方沒有返回某些包對應 的 ACK 號,那么就重新發送這些包。通過這一機制,我們可以確認接收方有沒有收到某個包,如果沒有收到則重新發送,這樣一來,無論網絡中發生任何錯誤, 我們都可以發現并采取補救措施(重傳網絡包)。
并且TCP會在發送數據的過程中持續測量 ACK 號的返回時間,如果 ACK 號返回變慢,則相應延長等待時間;相對地,如果 ACK號馬上就能返回,則相應縮短等待時間(動態跳轉等待時間)。
使用窗口有效管理ACK號
(每發送一個包就等到ACK,這樣子的傳輸效率太慢了),TCP采用滑動窗口的方式來解決這個問題,如下圖
并且為了防止數據到達的速率比處理這些數據并傳遞給應用程序的速率還要快的情況,接收方會通過 TCP 頭部中的窗口字段將自己能接收的數據量告知發送方,發送發會根據窗口字段動態跳轉發送數據量。
ACK 與窗口的合并
接收方在發送 ACK 號和窗口更新時,并不會馬上把包發送出去,而是會等待一段時間,在這個過程中很有可能會出現其他的通知操作, 這樣就可以把兩種通知合并在一個包里面發送了。
舉個例子,在等待發送 ACK 號的時候正好需要更新窗口,這時就可以把 ACK 號和窗口更新放在 一個包里發送,從而減少包的數量。
當需要連續發送多個 ACK 號時,也可以減少包的數量,這是因為 ACK 號表示的是已收到的數據量,也就是說,它是告訴發送方目前已接收的數據的最后位置在哪里,因此當需要連續發送 ACK 號時,只要發送最后一個ACK 號就可以了,中間的可以全部省略。
當需要連續發生窗口更新說明應用程序連續請求了數據,接收緩沖區的剩余空間連續增加。這種情況和 ACK號一樣,可以省略中間過程,只要發送最終的結果就可以了。
總結:
首先,協議棧會檢查收到的數據塊和 TCP 頭 部的內容,判斷是否有數據丟失,如果沒有問題則返回 ACK號。然后, 協議棧將數據塊暫存到接收緩沖區中,并將數據塊按順序連接起來還原出 原始的數據,最后將數據交給應用程序。
(4)斷開連接
首先,斷開連接的一方的應用程序(假設是服務器)會調用 Socket 庫的 close 程序。然后,服務器的協議棧會生成包含斷開信息的 TCP 頭部,具體來說就是將控制位中的 FIN 比特設為 1。接下來,協議棧會委托 IP 模塊向客戶端發送數據。同時,服務器的套接字中也會記錄下斷開操作的相關信息。
接下來輪到客戶端了。當收到服務器發來的 FIN 為 1 的 TCP 頭部時, 客戶端的協議棧會將自己的套接字標記為進入斷開操作狀態。客戶端會向服務器返回一個 ACK 號 ,用于告知服務器已收到 FIN 為 1 的包。
過了一會兒,應用程序就會調用 read 來讀取數據 。這時,協議棧不會向應用程序傳遞數據 ,而是會告知應用程序(瀏覽器)來自服務器的數據已經全部收到了。因此,客戶端應用程序會調用 close 來結束數據收發操作,這時客戶端的協議棧也會和服務器一樣,生成一個 FIN 比特為 1 的 TCP 包,然后委托 IP 模塊發送給服務器。
一段時間之后,服務器就會返回 ACK 號。到這里,客戶端和服務器的通信就全部結束了。
總結:TCP整體流程
TCP 模塊在執行連接、收發、斷開等各階段操作時,都需要委托 IP 模 塊將數據封裝成包發送給通信對象。我們在 TCP 的講解中也經常提到 IP, 下面就來討論一下 IP 模塊是如何將包發送給對方的。
過網絡中有路由器和集線器兩種不同的轉發設備,它們在傳輸網絡包時有著各自的分工。
1,路由器根據目標地址判斷下一個路由器的位置,IP 協議根據目標地址判斷下一個 IP 轉發設備的位置(IP頭)。
2,集線器在子網中將網絡包傳輸到下一個路由。子網中的以太網協議將包傳輸到下一個轉發設備(MAC頭)。
首先,發送方將包的目的地,也就是要訪問的服務器的 IP 地址寫入 IP 頭部中。接下來,IP 協議會委托以太網協議將包傳輸過去。
這時,IP 協議會查找下一個路由器的以太網地址(MAC 地址),并將這個地址寫入 MAC 頭部中。這樣一來,以太 網協議就知道要將這個包發到哪一個路由器上了。
接下來,包會到達下一個路由器。路由器中有一張 IP 協議的路由表,可根據這張表以及 IP 頭部中記錄的目的地信息查出接下來應該發往哪個路由器。為了將包發到下一個路由器,我們還需要查出下一個路由器的MAC 地址,并記錄到 MAC 頭部中,大家可以理解為改寫了 MAC 頭部 。這樣,網絡包就又被發往下一個節點了。
ARP協議
IP 協議會查找下一個路由器的以太網地址(MAC 地址),并將這個地址寫入 MAC 頭部中。 IP協議通過 ARP 查詢目標路由器的 MAC地址。
如果對方和自己處于同一個子網中(如果路由表的設置正確,那么對方應該在同一子網,否則對方無法作出 ARP 響應,這時只能認為對方不存在,包的發送操作就會失敗。),ARP協議廣播發送ARP請求對所有設備提問:“×× 這個 IP 地址是誰的?請把你的 MAC 地址告訴我。”然后就會有人回答:“這個 IP 地址是我的,我的 MAC 地址是××”。然后,我們將這個 MAC地址寫入 MAC 頭部,MAC頭部就完成了。
相應地,如果每次都要發廣播,那就會增加很多包,所以ARP也有緩存,如果其中已經保存了對方的 MAC 地址,就不需要發送 ARP 查詢。
IP協議 生成了網絡包,但只是存放在內存中 的一串數字信息,沒有辦法直接發送給對方。接下來,網卡將將數字信息轉換為電或光信號,才能在網線上傳輸。現在整個一條線路差不多都通了。
Ⅲ,網線和網絡設備
- 雙絞線(Twisted Pair):雙絞線是最常見的網絡連接介質,用于以太網(Ethernet)和電話線路。它包括兩對絕緣的銅線,通常被繞在一起,以減少干擾和電磁干擾。雙絞線通常分為不同等級,如Cat 5、Cat 6和Cat 7,以支持不同的數據傳輸速度和距離。
- 同軸電纜(Coaxial Cable):同軸電纜由中心導體、絕緣層、屏蔽層和外部絕緣層組成。它通常用于有線電視、衛星電視和一些寬帶互聯網連接。
- 光纖(Fiber Optic):光纖是一種通過光脈沖傳輸數據的介質。它由玻璃或塑料纖維組成,具有高帶寬和長距離傳輸的能力。光纖常用于高速互聯網、數據中心互連和長距離通信。
- 無線連接:無線連接使用無線電波或微波信號來傳輸數據,而不需要物理電纜。這包括Wi-Fi、藍牙、移動網絡(如4G和5G)等。無線連接不依賴于物理介質,而是通過無線傳輸信號進行通信。
- 電力線通信(Power Line Communication,PLC):電力線通信使用電力線路來傳輸數據信號。這通常用于在家庭或辦公室中利用電力線路建立網絡連接。
- 衛星通信:衛星通信利用衛星傳輸數據信號,適用于遠程地區或需要全球范圍覆蓋的通信。
集線器
集線器是一個簡單的物理層設備,廣播數據包到所有設備。集線器不理解數據包的內容,它只是物理層的轉發設備。
交換機管理器(Managed Switch):
- 管理型交換機允許網絡管理員對網絡流量和端口進行配置和管理,支持更復雜的網絡設置。
交換機
交換機是一個數據鏈路層設備,根據MAC地址精確地將數據包轉發到目標設備;
- 交換機根據數據包中的目標MAC地址將數據包從發送端口轉發到目標設備的端口,而不是廣播到所有端口。這提高了網絡效率。
- 交換機通常具有MAC地址表,用于跟蹤網絡上各設備的MAC地址。
光貓
光貓是用戶家庭或企業網絡與光纖接入網絡之間的關鍵接口。它將光纖提供的高速光信號轉換為電信號,以便連接到用戶的路由器、計算機或其他網絡設備。
路由器
路由器是一個網絡層設備,用于跨越不同網絡并根據IP地址路由數據包。在路由器中也要維護一張表格,叫做路由條目表,用來反映如何到達某個 IP 地址網段(查找路由的下一跳),同時在路由器中也有 ARP 高速緩存,反映了該路由器各直接網段的 IP 地址和 MAC 地址的對應關系。
接入點(Access Point):
接入點用于擴展無線網絡覆蓋范圍,允許設備通過Wi-Fi接入網絡。
無線路由器(Wireless Router)
無線路由器連接有線網絡和無線網絡,允許設備通過Wi-Fi連接到網絡。
防火墻(Firewall)
防火墻用于保護網絡免受未經授權的訪問和網絡攻擊,它可以過濾入站和出站流量,控制訪問權限。
網關(Gateway)
網關是連接不同網絡協議和技術的設備,充當不同網絡之間的橋梁。
負載均衡器(Load Balancer)
負載均衡器用于平衡多臺服務器之間的流量,以提高性能和可用性。
VPN集線器(VPN Hub)
VPN集線器用于建立虛擬私人網絡(VPN)連接,以提供遠程訪問和安全通信。
網絡存儲設備(Network Attached Storage,NAS)
NAS設備用于存儲和共享文件,允許多個設備訪問共享文件。