目錄
1. 計算機網絡背景
1.1 局域網
1.1.2 局域網的組成
1.2 廣域網
1.1.2 廣域網的組成
2. 初始網絡協議
2.1 網絡協議的定義和作用
2.2 網絡協議的分層結構
2.2.1 OSI七層模型
2.2.2?TCP/IP 五層(四層)模型
3. 再識網絡協議
3.1 為什么要有 TCP/IP 協議
3.2 TCP/IP 協議與操作系統的關系
4. 網絡傳輸基本流程
4.1 局域網網絡傳輸流程圖
4.1.1 認識 MAC 地址
4.1.2 局域網通信原理(以太網為例)?
4.1.3?TCP/IP 協議通訊過程
4.1.3.1?網絡協議棧
4.1.3.2 數據包封裝和分用
4.2 跨網絡傳輸流程
4.2.1 網絡種的地址管理 -- 認識 IP 地址
5. Socket 編程預備
5.1 認識端口號
5.2 傳輸層的典型代表
5.2.1 簡單介紹 TCP 協議和 UDP 協議
5.3 網絡字節序
5.4 socket 編程接口
5.4.1 socket 常見 API
5.4.2 sockaddr 結構
1. 計算機網絡背景
? ? ? ? 計算機一開始是相互獨立的,是用于處理一些數據計算任務的。數據處理的過程一般都需要很多步驟,所以當人使用計算機進行數據的協作處理的時候,就需要進行數據間的傳輸。但是再沒有網絡的時代,只能通過人使用軟盤在各個計算機之間進行拷貝,效率極低。
? ? ? ? 為了提高數據信息傳輸的效率,就產生了網絡,使人們能遠距離且高效的傳輸數據信息。
1.1 局域網
? ? ? ??局域網(Local Area Network,LAN)是指在某一區域內由多臺計算機及相關設備(路由器、交換機)相互連接而成的計算機網絡。
1.1.2 局域網的組成
? ? ? ? (1)計算機設備:包括服務器和客戶端計算機。服務器是局域網中的核心設備,用于存儲和管理共享資源,如文件、數據庫、打印機等,并為客戶端提供服務;客戶端計算機是用戶直接使用的設備,通過網絡連接到服務器獲取服務和資源。
? ? ? ? (2)網絡連接設備:如交換機、路由器、集線器等。交換機用于連接多臺計算機,實現數據幀的轉發和交換,提高網絡的性能和效率;路由器主要用于連接不同的局域網,實現網絡之間的數據路由和通信;集線器則將多個計算機連接在一起,形成一個共享的網絡環境,但它的性能相對較低。
? ? ? ? (3)傳輸介質:負責在計算機和網絡設備之間傳輸數據,常見的傳輸介質有雙絞線、光纖和無線信號。雙絞線成本較低,適用于短距離傳輸;光纖具有高帶寬、低損耗、抗干擾能力強等優點,常用于長距離和高速網絡傳輸;無線信號則為移動設備提供了便捷的網絡接入方式,使用戶可以在一定范圍內自由移動并保持網絡連接。
? ? ? ? 上圖左右分別是兩個局域網,通過路由器來連接。?
1.2 廣域網
????????廣域網(Wide Area Network,WAN)是一種覆蓋范圍廣泛的計算機網絡,通常用于連接不同城市、地區甚至不同國家的計算機系統和局域網。
1.1.2 廣域網的組成
? ? ? ? (1)通信子網:主要負責數據的傳輸和交換,由通信線路和通信設備組成。通信線路包括電話線、光纖、衛星鏈路等,通信設備有路由器、交換機、調制解調器等。這些設備用于將不同的局域網或計算機連接起來,實現數據在廣域范圍內的傳輸。
? ? ? ? (2)資源子網:由連接在廣域網上的各種計算機系統和終端設備組成,負責提供各種網絡資源和服務,如服務器上的文件、數據庫、應用程序等,以及用戶使用的個人計算機、工作站等終端設備。
? ? ? ? 上圖就是將各個地區的局域網通過路由器連接起來,形成了一個更大的局域網,把這種大的局域網稱為廣域網。所謂的局域網和廣域網只是一個相對的概念。?
2. 初始網絡協議
2.1 網絡協議的定義和作用
? ? ? ? 協議本質就是一種約定。網絡協議是指為計算機網絡中進行數據交換而建立的規則、標準或約定的集合。
? ? ? ? 網絡協議的作用:如同人類社會中的交通規則或語言規范,網絡協議確保了不同設備之間能夠準確、高效地進行數據通信。它規定了數據的格式、傳輸順序、錯誤處理方式以及通信雙方如何進行交互等內容,使得各種計算機設備和網絡系統能夠相互理解和協同工作。
2.2 網絡協議的分層結構
????????為了更好的進行模塊化以及解耦合,網絡協議的設計和實現通常采用分層的體系結構,常見的有 OSI(Open System Interconnection,開放系統互連)七層模型(物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層)和 TCP/IP 四層模型(網絡接口層、網際層、傳輸層、應用層)。每一層都有其特定的功能和任務,并且通過層與層之間的接口進行通信。例如,物理層負責處理物理介質上的信號傳輸,數據鏈路層則負責將物理層接收到的信號轉換為數據幀,并進行差錯檢測和糾正等。
2.2.1 OSI七層模型
????????OSI(Open System Interconnection,開放系統互連)七層網絡模型稱為開放式系統互聯參考模型,是一個邏輯上的定義和規范。
? ? ? ? 其實在網絡角度,ISO(國際標準化組織)?定義的協議7層模型非常完善,但是在實際操作的過程中,會話層、表示層是不可能接入到操作系統中的,既復雜又不實用,所以在工程實踐中,最終落地的 TCP/IP? 五層(四層)模型。
2.2.2?TCP/IP 五層(四層)模型
????????TCP/IP 是一組協議的代名詞,它還包括許多協議,組成了 TCP/IP 協議簇。TCP/IP 通訊協議采用了 5 層的層級結構。
? ? ? (1)應用層: 負責應用程序間溝通,如簡單電子郵件傳輸(SMTP)、文件傳輸協議(FTP)、網絡遠程訪問協議(Telnet)等。我們的網絡編程主要就是針對應用層。
? ? ? ? (2)傳輸層:負責兩臺主機之間的數據傳輸. 如傳輸控制協議 (TCP),?能夠確保數據可靠的從源主機發送到目標主機。
? ? ? ? (3)網絡層:?負責地址管理和路由選擇。例如在 IP 協議中, 通過 IP 地址來標識一臺主機,?并通過路由表的方式規劃出兩臺主機之間的數據傳輸的線(路由)。路由器(Router)工作在網路層。
? ? ? ? (4)數據鏈路層: 負責設備之間的數據幀的傳送和識別。例如網卡設備的驅動、幀同步(就是說從網線上檢測到什么信號算作新幀的開始)、沖突檢測(如果檢測到沖突就自動重發)、數據差錯校驗等工作。有以太網、令牌環網, 無線 LAN 等標準。交換機(Switch)工作在數據鏈路層。
? ? ? ? (5)物理層:負責光/電信號的傳遞方式。比如現在以太網通用的網線(雙絞線)、早期以太網采用的的同軸電纜(現在主要用于有線電視)、光纖, 現在的 wifi 無線網使用電磁波等都屬于物理層的概念。物理層的能力決定了最大傳輸速率、傳輸距離、抗干擾性等. 集線器(Hub)工作在物理層。
?????????物理層我們考慮的比較少,我們只考慮軟件相關的內容。因此很多時候我們直接稱為 TCP/IP 四層模型。
3. 再識網絡協議
3.1 為什么要有 TCP/IP 協議
? ? ? ? 首先,即便是單臺主機,計算機內部也是存在協議的,比如:其他設備和內存通信,會有內存相關的協議;其他設備和磁盤通信,會有磁盤相關的協議。這些協議都是在本地主機各自的硬件中,通信的成本、問題比較少。
? ? ? ? 其次,網絡通信最大的特點就是主機之間距離變遠了。任何通信特征的變化一定會帶來新的問題。比如當距離變遠了之后,數據在傳輸的過程中丟失的問題,怎么定位目標主機的問題,怎么等等。
? ? ? ? 所以TCP/IP 協議本質就是通信主機的距離變遠了,為了解決距離變遠產生的問題而誕生的解決方案。
3.2 TCP/IP 協議與操作系統的關系
? ? ? ? (1)所有主機上的操作系統可以不同,但是主機上的網絡協議棧的實現必須按照標準進行相同的實現,這也是不同操作系統的主機可以進行網絡通信的原因。
? ? ? ? (2)網卡就是網絡通信的底層硬件,處于物理層;數據鏈路層在網卡的驅動程序中進行實現;網絡層和傳輸層被集成在內核中,在操作系統中進行實現;應用層在操作系統之上,由用戶進行實現。
? ? ? ? (3)整個網絡協議棧涉及到硬件、驅動、操作系統以及用戶,所以協議一定是需要IT各行各業都進行支持和配合。
? ? ? ? (4)傳輸層最著名的協議就是 TCP,網絡層最著名的協議就是 IP,而這兩層都處于操作系統中,網絡是操作系統的一部分,所有不同的操作系統在 TCP/IP 的實現上一樣。
? ? ? ? 所謂協議,樸素的可以理解為,就是通信雙方都認識的結構化數據類型,也就是不同操作系統在網絡部分實現時具有相同的網絡協議相關的結構體。當進行網絡傳輸時,發過來的數據能夠使用相同的方式進行解析。因為協議棧是分層的,所以每層雙方都有協議,同層之間互相可以認識對方的協議。
????????就像快遞單子一樣,發貨方和收貨方都能看懂,約定使用快遞單來傳遞信息,快遞單就對應著結構體。
4. 網絡傳輸基本流程
4.1 局域網網絡傳輸流程圖
4.1.1 認識 MAC 地址
? ? ? ? MAC 地址用來識別數據鏈路層中相連的節點,長度為 48 位(6字節)。一般用 16 進制數字加冒號的形式來表示(例如:08:00:27:03:fb:19)。
? ? ? ? 在網卡出廠時就確定了,不能修改。MAC 地址通常是唯一的(虛擬機中的 MAC 地址不是真實的 MAC 地址,可能會沖突;也有些網卡支持用戶配置 MAC 地址)。MAC 地址在一個子網中唯一就夠用了。
? ? ? ? 可是使用命令 ifconfig 進行查看:
4.1.2 局域網通信原理(以太網為例)?
? ? ? ? 如上圖所示,當主機 A 向主機 E 發送數據包時,該數據包會被子網中的所有主機所看到,但是當其他主機看到數據包發現目標地址不是自己,就不會進行理會,當主機 E 識別到該數據包是發給自己的,就會進行接收。?
? ? ? ? (1)以太網中,任何時刻只允許一臺機器向網絡中發送數據(以太網的本質就是共享的資源)。
? ? ? ? (2)如果有多臺同時發送,會發生數據干擾,我們稱之為數據碰撞(這也是為什么一個子網用的人多了之后網速降低了,因為人多之后,數據碰撞的概率增加了,單位時間發出去的報文就減少了)。
? ? ? ? (3)沒有交換機的情況下,一個以太網就是一個碰撞域。
? ? ? ? (4)所有發送數據的主機要進行碰撞檢測和碰撞避免(碰撞檢測和碰撞避免用于維持使用該以太網主機的互斥關系)。
? ? ? ? (5)局域網通信的過程中,主機對收到的報文確認是否是發給自己的,是通過目標 MAC?地址判定。
4.1.3?TCP/IP 協議通訊過程
4.1.3.1?網絡協議棧
? ? ? ? 如上圖所示,兩臺主機之間進行通信,用戶進行網絡通信的時候,要貫穿每層的協議,每一臺主機從上到下的所有網絡協議稱為網絡協議棧。而所以當進行上述傳輸流程的時候,每層都要進行封裝和解包。如下圖所示:
? ? ? ? (1)報頭:對應協議層的結構體字段。
? ? ? ? (2)有效載荷:該數據包傳輸的有效字段。
? ? ? ? (3)報文:報頭 + 有效載荷。
? ? ? ? 明確一下不同層完整報文的叫法:在傳輸層叫做段(segment),在網絡層叫做數據報(datagram),在鏈路層叫做幀(frame)。
知識點1:
? ? ? ? 任何協議必須要做到以下兩點:(a)將有效載荷進行分離。(b)將自己的有效載荷交付給具體的上層協議。知識點2:
? ? ? ? 在數據鏈路層,收到報文之后對其進行解包,發現該報文不是發給目標主機的則在數據鏈路層直接丟棄。
4.1.3.2 數據包封裝和分用
? ? ? ? 如下圖所示:自頂向下將報頭和有效載荷合在一起的過程叫做封裝。
? ? ? ? 如下圖所示:通過網卡接收到數據包之后,自底向上依次解包并傳遞到上層對應的某一種協議的過程叫做分用。
4.2 跨網絡傳輸流程
4.2.1 網絡種的地址管理 -- 認識 IP 地址
? ? ? ? IP 協議有兩個版本,IPv4 和 IPv6。沒有特殊說明,默認都是指的 IPv4。
? ? ? ? IP 地址是 IP 協議中,IP 地址是一個 4 字節,32 位的整數;我們通常也使用 "點分十進制" 的字符串表示 IP 地址, 例如 192.168.0.1 ; 用點分割的每一個數字表示一個字節, 范圍是 0 - 255;
????????跨網段的主機的數據傳輸. 數據從一臺計算機到另一臺計算機傳輸過程中要經過一個或多個路由器。
? ? ? ? 下圖是一張兩臺主機跨局域網通信的示意圖,路由器也可以近似看作一臺主機,目的 IP 地址表示最終的主機地址,而 MAC 地址表示的是當前時刻要去到的下一個節點的地址。
? ? ? ? 如下圖所示,用戶 A 和路由器在第一個子網中,用戶 B 和路由器在第二個子網中,在同一個子網中,里面主機的 IP 地址前半部分都是相同的,當 IP 為 192.168.2.2 的主機要發送數據給 IP 為 172.168.2.2 的主機時,發現該 IP 地址不屬于當前局域網,然后就先給到 IP 為 192.168.2.1 的路由器,然后在路由器中進行 IP 地址的轉換,轉換為第二個子網中的 IP 地址 172.168.2.1,再傳輸到目標主機。?
? ? ? ? 結合封裝與解包,體現路由器解包和重新封裝的特點。如下圖所示,在網絡層發現不是傳給第一個局域網中的主機時,進行 MAC 幀的封裝,傳給下一個節點(也就是路由器),路由器拿到數據幀之后向上交付對鏈路報文進行解包,發現對應的目的 IP 地址在第二個子網中,然后向下交付重新封裝 MAC 幀,傳送給用戶 B。
? ? ? ? 路由的過程中,數據幀中的 IP 地址不變,MAC 地址一直在變,所以 MAC 地址只會在本局域網內有效。
? ? ? ? 如下圖所示,就是跨網絡傳輸的整個宏觀的流程圖:?
? ? ? ? IP 網絡層存在的意義:提供網絡虛擬層,?讓世界的所有網絡都是 IP 網絡,屏蔽最底層網絡的差異。
5. Socket 編程預備
5.1 認識端口號
? ? ? ? IP 在網絡中,用來標識主機的唯一性。
? ? ? ? 使用網絡進行數據的傳輸并不是目的,是兩臺主機進行數據交互的手段。但是數據傳輸到主機是沒有用的,要將數據傳遞到目標進程,讓進程使用數據才是目的。所以網絡通信的本質就是兩臺主機中兩個進程的進程間通信。
? ? ? ? 進程是人在系統中的代表,只要把數據給到進程,就相當于人拿到了數據。
? ? ? ? 但是系統中同時會存在非常多的進程,當數據到達目標主機之后,怎么轉發給目標進程呢?這時候就需要引入端口號。
? ? ? ? 端口號(port)是傳輸層協議的內容。端口號是一個 2 字節 16位的整數。
? ? ? ? 一臺計算機可能同時運行多個網絡應用程序,僅僅依靠 IP 地址只能確定目標計算機,而端口號則用于進一步區分該計算機上的不同應用程序或服務,確保數據能夠準確的交付到對應的程序或服務中。
? ? ? ? IP 地址 + 端口號 用于標識網絡上的某一臺主機的某一個進程,一個端口號只能被一個進程占用。
? ? ? ? 端口號是 16 位的整數:
? ? ? ? 0 - 1023:?知名端口號, HTTP, FTP, SSH 等這些廣為使用的應用層協議, 他們的端口號都是固定的。
? ? ? ? 1024 - 65535:操作系統動態分配的端口號. 客戶端程序的端口號, 就是由操作系統從這個范圍分配的。
? ? ? ? 傳輸層協議(TCP 和 UDP )的數據段中有兩個端口號,分別叫做源端口號和目的端口號,描述數據是誰發的和發給誰的。
知識點1:
? ? ? ? 端口號和進程 PID 都是用于標識進程唯一性的,為什么還要使用端口號。主要是因為不是所以的進程都是網絡進程,其次是將網絡部分與系統部分進行解耦。比如身份證號(PID)和學號(端口號),當身份證系統進行改變的時候,在學校對于一個學生的標識還是使用的學號,實現了解耦。
? ? ? ? 另外,一個進程可以綁定多個端口號,但是一個端口號不能被多個進程綁定。
? ? ? ? IP 地址用來標識互聯網中唯一的一臺主機,port 用來標識該主機上唯一的一個網絡進程,所以 IP + port 就能標識互聯網中唯一的一個網絡進程。IP + port 叫做套接字 socket。?
5.2 傳輸層的典型代表
? ? ? ? 傳輸層是屬于操作系統內核的,那么要通過網絡協議棧進行通信,必定調用的是傳輸層提供的系統調用來進行的網絡通信,如下圖所示:
5.2.1 簡單介紹 TCP 協議和 UDP 協議
? ? ? ? TCP(Transmission Control Protocol 傳輸控制協議)和 UDP(Transmission Control Protocol 傳輸控制協議) 都是傳輸層的協議。
? ? ? ? TCP協議的特點:
? ? ? ? (1)連接特性:TCP 是面向連接的協議。在數據傳輸之前,需要在發送方和接收方之間建立一條連接,就像打電話時先撥號建立連接一樣。連接建立后,雙方才能進行數據傳輸,傳輸完成后再釋放連接。
? ? ? ? (2)可靠性:TCP 提供可靠的數據傳輸服務。它通過序列號、確認應答、重傳機制等保證數據無差錯、按順序到達接收方。如果發送方發送的數據在規定時間內沒有收到接收方的確認應答,就會重新發送數據,以確保數據的完整性。
? ? ? ? (3)流量控制與擁塞控制:TCP 具有流量控制和擁塞控制機制。流量控制可以防止發送方發送數據過快,導致接收方處理不過來而丟失數據。擁塞控制則是當網絡出現擁塞時,通過調整發送方的發送速率,避免網絡進一步擁塞,保證網絡的穩定性和可靠性。
? ? ? ? (4)數據傳輸單位:TCP 以字節流的方式傳輸數據,將應用程序交下來的數據看成是一連串的字節流,沒有明確的消息邊界。接收方在接收數據時,需要根據應用層的協議來解析數據的邊界和含義。
? ? ? ? UDP協議的特點:
? ? ? ? (1)連接特性:UDP 是無連接的協議。發送方在發送數據時不需要與接收方建立連接,就像寫信一樣,直接將數據報發送出去,不管接收方是否準備好接收。
? ? ? ? (2)不可靠性:UDP 不保證數據的可靠傳輸,它沒有確認應答、重傳等機制。數據報可能會在傳輸過程中丟失、重復或亂序到達接收方,但 UDP 也因此具有較低的延遲和較小的開銷。
? ? ? ? (3)數據傳輸單位:UDP 以數據報的形式傳輸數據,每個數據報都是獨立的,有明確的邊界。UDP 對數據報的長度有一定限制,一般不超過 64KB。
? ? ? ? (4)應用場景:UDP 適用于對實時性要求較高,而對數據準確性要求相對較低的應用,如視頻會議、在線游戲、音頻流等。這些應用可以容忍少量的數據丟失或錯誤,更注重數據的實時性和流暢性。
5.3 網絡字節序
? ? ? ? 內存中的多字節數據相對于內存地址有大端和小端之分,磁盤文件中的多字節數據相對于文件中的偏移地址也有大端和小端之分,網絡數據流同樣有大端和小端之分。
? ? ? ? 發送主機通常發送緩沖區中的數據按內存地址從低到高的順序發送;接收主機把網絡上街道的字節依次保存在接收緩沖區中,也是按內存地址從低到高的順序保存。
? ? ? ? 因此,網絡數據流的地址這樣規定:先發出的數據是低地址,后發出的數據是高地址。TCP/IP 協議規定,網絡數據流應采用大端字節序,即低地址存高權值位。
????????如果當前發送主機是小端,就需要先將數據轉成大端;否則就忽略,直接發送。
? ? ? ? 為了網絡程序具有可移植性,使同樣的 C 代碼在大端和小端計算機上編譯后都能正常運行,可以調用以下庫函數做網絡字節序和主機字節序的轉換。
? ? ? ? h 表示 host ,n 表示 network,l 表示 32 位長整數,s 表示 16位短整數。
? ? ? ? htonl 表示將 32 位長整數從主機字節序轉換為網絡字節序。
????????如果主機是小端字節序,這些函數將參數做相應的大小端轉換然后返回;如果主機是大端字節序,這些函數不做轉換,將參數原封不動地返回。
5.4 socket 編程接口
5.4.1 socket 常見 API
// 創建 socket 文件描述符 (TCP/UDP, 客戶端 + 服務器)
int socket(int domain, int type, int protocol);// 綁定端口號 (TCP/UDP, 服務器)
int bind(int socket, const struct sockaddr *address, socklen_t address_len);// 開始監聽 socket (TCP, 服務器)
int listen(int socket, int backlog);// 接收請求 (TCP, 服務器)
int accept(int socket, struct sockaddr* address, socklen_t* address_len);// 建立連接 (TCP, 客戶端)
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
5.4.2 sockaddr 結構
? ? ? ? socket API 是一層抽象的網絡編程接口,適用于各種底層網絡協議,如 IPv4,IPv6以及 UNIX Domain Socket。?
????????IPv4 和 IPv6 的地址格式定義在 netinet/in.h 中,IPv4 地址用 sockaddr_in 結構體表示,包括 16 位地址類型,16 位端口號和 32 位 IP 地址。
????????IPv4、IPv6 地址類型分別定義為常數 AF_INET、AF_INET6。這樣只要取得某種 sockaddr 結構體的首地址,不需要知道具體是哪種類型的 sockaddr 結構體,就可以根據地址類型字段確定結構體中的內容。
? ? ? ? 地址類型為 AF_UNIX 是用于本地進程通信的結構體。
?????????socket API 可以都用 struct sockaddr *類型表示,在使用的時候需要強制轉化成sockaddr_in; 這樣的好處是程序的通用性, 可以接收 IPv4, IPv6, 以及 UNIX DomainSocket 各種類型的 sockaddr 結構體指針做為參數。
? ? ? ? 上述就好比 C++ 中,sockaddr 作為基類,而sockaddr_in 和 sockaddr_un 是其子類,是一種 C 風格的繼承和多態。