書名: RTC程序設計:實時音視頻權威指南作者名: 戴維本章字數: 2070字更新時間: 2024-05-14 10:03:27
1.4.1 網絡協議
網絡上傳遞的二進制數據是分層的。經典的模型有TCP/IP的四層網絡協議、OSI的七層網絡協議[16]。
網絡協議分層的結果,是在應用層數據包前面,附加若干協議頭,如圖1-16所示,括號內數字為該部分通常所占的字節數。

圖1-16 網絡協議分層
MAC地址與MAC頭
互聯網由主機(Host)、路由器(Router)和網關(Gateway)等設備連接而成。
計算機和手機終端通過自帶的網卡連接到某個路由器,從而獲得與互聯網的物理連接。
有線網卡使用有線連接路由器,最常見的物理層協議為802.3以太網協議。
無線網卡使用無線電信號(Wi-Fi),最常見的物理層協議為802.11協議族。
為了區分每個物理層的網卡設備,在鏈路層,為每個網卡都定義了一個MAC(Media Access Control)地址,又叫網卡的物理地址。
MAC地址是一個6字節的數值,前3字節定義了廠商,后3字節由廠商定義設備。
一個典型的MAC地址為00-01-6C-06-A6-29。
任意網絡包的最前面通常都包含一個MAC頭,這是一個14字節的數據。
MAC頭定義了一對物理連接主機,同時定義了上層協議的類型,如表1-6所示。
表1-6 MAC頭的格式

IP地址與IP頭
MAC頭標識了相鄰主機之間的傳輸,我們需要解決的是互聯網上任意兩臺主機之間的傳輸。如何定義互聯網上任意的機器地址呢?這就是IP(Internet Protocol)層要解決的問題。我們為每個網絡中的主機都分配一個IP地址。
早期的IP地址是4字節的,通常稱為IPv4。一個典型的IPv4地址為:10.83.241.172,每個部分為0~255的數字。
根據適用網絡的大小,IP地址可分為A~E共5類,比如C類地址可有254臺主機。
IP頭通常是一個20字節的數據塊,IP頭的格式如表1-7所示。
表1-7 IP頭的格式

在局域網中,已知對方的IP地址,想知道其MAC地址,需要查詢本機上的ARP(Ad dress Resolution Protocol)表。
在Windows上使用命令arp-a;在macOS/UNIX上使用命令arp-n。
若ARP表為空,則該工具會發送ARP廣播收集各個主機的MAC地址。

如果已知MAC地址,想要反查其IP地址,也可以通過此表實現。
若要查看本機的IP地址,在Windows上使用ipconfig命令,在macOS/UNIX上使用ifconfig命令。這個命令在macOS下也可以看到MTU(Maxinum Trasnsmission Unit)值,當MTU值為1500的時候,IP層是不需要分段(Fragment)的。
IP層有兩個有用的工具,都基于ICMP(Internet Control Message Protocol)包實現。
·想要看到一個IP網絡是否通暢,可以使用ping命令。
·想要看到一個IP路徑上會經過哪幾個路由器,可以使用tracert命令。它實際上是從步長1開始,連續發TTL=1,2,3,…的ICMP包,讓沿路節點返回TTL過期的回應,從而得到對應的IP地址。
隨著IPv4地址的枯竭,IPv6技術應運而生。每個IPv6地址都使用128位16字節表示。一個典型的IPv6地址為ff1:ce00:1285:869:2052:be84:e6e0。
UDP和TCP
IP層解決了任意兩臺主機之間的連通性問題,然而兩臺主機之間應該會有很多要通信的內容類型,有的涉及網絡診斷,有的涉及應用數據。在傳輸層,我們通過定義2字節的端口(Port)來區分服務,端口號的范圍是0~65535。
最簡單的傳輸層是UDP(User Datagram Protocol),它只有8字節,如表1-8所示。
表1-8 UDP頭的格式

UDP只保證包能發出,并不確保對方一定能收到。發出去的UDP包,只會層層路由到目的地址,不會有任何回應。
為了保證應用層的可靠傳輸,人們設計了TCP(Transmission Control Protocol)。TCP的協議頭至少有20字節,如表1-9所示。
表1-9 TCP頭的格式

為了確保對方一定能收到包,TCP做了以下3件事。
(1)每個發出去的包都有一個編號SEQ,對方收到后會回應ACK=SEQ+1的回包。
(2)如果長時間(具體見下文)沒有收到回應包,則TCP會選擇超時重發。
(3)如果超時重發還是沒收到回應包,則TCP會將等待時長翻倍,并再次重發。
TCP將一個包從發出到收到回應的時間,定義為往返時間(Round Trip Time,RTT)。
每個TCP連接都會動態維護一個RTT數值。每新收到一個回包,就用式(1.1)更新。

其中,0≤α<1,且α越小,對延遲變化越靈敏,通常取α=0.125。
對于超時重發時間(Retransmission Time Out,RTO),有RTO=β×RTT,通常取β=2。
例如,如果RTT=0.5s,則超時重發時間點通常為2×RTT=1s,之后每次翻倍,為2s,4s,8s,…這里采用指數級退避算法,是為了保證網絡不被擁堵。
TCP使用三次握手,提前為通信雙方保留必要的資源。包類型為SYN包、SYN+ACK包和ACK包。在斷開連接時,雙方分別發送FIN包,響應FIN+ACK包,共四次揮手。
TCP使用了滑動窗口,來對每個發出去待確認的包進行加窗式隊列管理,這增大了同時等待回包的并發數。
為了提高數據包的負載效率,TCP會使用Nagle算法,等若干包積累一段時間后再一起發送,可以使用TCP_NODELAY選項關閉該特性。
加密與解密
網絡中未加密的數據都是明文傳輸的,想要保密就必須加密。常見的加密算法分為兩類:對稱加密和非對稱加密,如圖1-17所示。

圖1-17 加密與解密
所謂對稱加密,就是加密用的密鑰(Key)和解密用的密鑰是同一個。密鑰通常是一個很短的字節碼,比如16字節或32字節,它是加密算法得到不同加密結果的關鍵。
非對稱加密則使用不同的公鑰和私鑰。公鑰是公開的,人人都可以獲取使用;私鑰只有自己知道。
由于非對稱加密比較慢,在SSL或TLS之類的加密方法中,通常使用非對稱加密來傳遞對稱加密的密鑰,再進行對稱加密傳輸。
常見的非對稱加密算法有RSA、DSA、ECDSA等。
常見的對稱加密算法有DES、3DES、AES等。
另外有一類消息摘要算法,它們將輸入的任意長度字節轉換為固定長度字節。如MD5固定輸出16字節,SHA-1固定輸出20字節。這種轉換是不可逆的,我們常用這類算法來提取一段字節的特征,用作密鑰生成、內容校驗等。
接下來,我們將介紹如何進行UDP和TCP編程。
- Boost C++ Application Development Cookbook(Second Edition)
- AIRAndroid應用開發實戰
- Learn Swift by Building Applications
- YARN Essentials
- 基于Swift語言的iOS App 商業實戰教程
- 概率成形編碼調制技術理論及應用
- C語言程序設計同步訓練與上機指導(第三版)
- WordPress 4.0 Site Blueprints(Second Edition)
- Java Web從入門到精通(第3版)
- Cocos2d-x by Example:Beginner's Guide(Second Edition)
- Java EE Web應用開發基礎
- 玩轉.NET Micro Framework移植:基于STM32F10x處理器
- Python預測之美:數據分析與算法實戰(雙色)
- C# 7.0本質論
- 微信公眾平臺開發最佳實踐