1. 學習目的
實現 不同主機之間的進程間通信。
在 Linux 下,進程間通信(IPC)不僅可以發生在同一臺主機上,也可以通過網絡實現不同主機之間的通信。要做到這一點,必須同時滿足以下兩個條件:
物理層面:不同主機之間必須通過物理網絡互聯互通(如網線、交換機、路由器等)。
軟件層面:進程之間必須通過網絡協議進行通信。
2. 基礎概念
IP 地址
計算機的“軟件地址”,用來標識計算機設備MAC 地址
計算機網卡的“硬件地址”,唯一且固定。端口號
用來區分同一主機上的不同進程,保證多個網絡服務可以同時運行。
3. 網絡協議
網絡通信需要遵循統一的標準,即 網絡協議。
3.1 OSI 七層模型(理論模型)
OSI(Open System Interconnect)是一個通信標準框架,分為 7 層:
應用層:提供應用服務(如文件傳輸、電子郵件)。
表示層:數據加密/解密,壓縮/解壓縮。
會話層:建立數據傳輸通道, ? ---》會話
傳輸層:提供端到端的傳輸服務(傳輸的方式 ?UDP ?TCP ? 端口號)。
網絡層:實現數據路由,路徑規劃 ? ?路由器 ?ip。
數據鏈路層:封裝成幀,點對點通信(局域網內通信),差錯檢測 ? 交換機 ?ARP。
物理層:定義物理介質(網線、光纖),傳輸比特流(0/1)。
3.2 TCP/IP 模型(應用模型)
相比 OSI 七層,TCP/IP 模型更貼近實際應用。
五層模型
應用層:
HTTP:超文本傳輸協議
HTTPS:加密的 HTTP(SSL加密算法)
FTP:文件傳輸協議(TCP)
TFTP:簡單文件傳輸協議(UDP)
MQTT:物聯網協議
DNS:域名解析服務
傳輸層:
TCP(傳輸控制協議,可靠,面向連接)
UDP(用戶數據報協議,不可靠,面向無連接)
網絡層:
IP 協議(IPv4 / IPv6)
數據鏈路層:
ARP(地址解析協議)
物理層
四層模型
應用層
傳輸層
網絡層
網絡接口層
4. IP 協議
IPv4:32 位地址
IPv6:128 位地址
4.1 表示方式
點分十進制:
192.168.1.140? (用戶表示形式) ? 點分十進制 ??
二進制存儲:
11000000 10101000 00000000 10001100? ?(計算機存儲形式) 32bits
4.2 IP 地址組成
IP地址 = 網絡位 + 主機位
例:192.168.0.121/24
/24
:網絡位長度 24 位網絡位:表示屬于哪個網段
主機位:表示網段中(局域網)的哪一臺主機
4.3 子網掩碼
例:255.255.255.0
11111111.11111111.11111111.00000000
用來區分IP地址的網絡位和主機位,搭配IP地址使用。
子網掩碼是1的部分對應IP地址的網絡位
子網掩碼是0的部分對應IP地址的主機位
4.4 特殊地址
192.168.1.3
255.255.0.0
192.168.0.0
位于
192.168.1.0 網段內(網段內的IP能直接通信)
? ? ? ? ? ? ???192.168.1.255
IP地址網絡位不變,主機位全為1,則為該IP地址的廣播號
192.168.1.3
255.255.255.0
廣播號:
192.168.1.255(向廣播號發送信息,所有局域網內IP都能收到此信息)
網段號:主機位全為 0
廣播號:主機位全為 1,局域網內所有主機都能收到
網關地址:通常為
xxx.xxx.xxx.1
,用于不同網段間通信
4.5 IP 地址分類
A 類地址
范圍:1.0.0.0 - 126.255.255.255
子網掩碼:255.0.0.0 ? ? ? ? ?126*2^24 ? ? ? ?
用于管理大規模網絡
私有IP地址:10.0.0.0 - 10.255.255.255
127.0.0.0 ? 回環地址
B 類地址
范圍:128.0.0.0 - 191.255.255.255
子網掩碼:255.255.0.0 ? ? ? ? 2^16
管理大中規模網絡
私有IP地址:172.16.0.0 - 172.31.255.255
C 類地址
范圍:192.0.0.0 - 223.255.255.255
子網掩碼:255.255.255.0 ? ? ? ?2^8
管理中小規模網絡
私有IP地址:192.168.0.0 - 192.168.255.255
D 類地址
224.0.0.0 - 239.255.255.255
組播和廣播使用
E 類地址
240.0.0.0 - 255.255.255.254
用來進行實驗
? ? ? ?公有IP:由電信公司直接分配,并需要付費的IP地址, 可以直接訪問internet
私有IP:不能直接訪問internet的ip地址
節省ip地址
5. 網絡端口號
端口號:16 位無符號整數(0 - 65535)
功能:區分同一主機上的不同網絡進程
分類
系統端口(0-1023)
HTTP:80
FTP:20/21
TFTP:69
HTTPS:443
注冊端口(1024-49151)
MQTT:1883 / 8883
動態端口(49152-65535)
私有、臨時使用
6. Linux 網絡配置
常用命令
ping ip/域名
測試與目標主機是否連通ping www.baidu.com
ifconfig
(Linux)
查看當前主機 IP 地址ipconfig
(Windows)
查看 Windows 主機 IP 地址
虛擬機配置
虛擬機 → 設置 → 網絡適配器 → 橋接模式
編輯 → 虛擬網絡編輯器 → VMnet0 → 橋接至當前 PC 網卡
修改網絡配置文件(示例)
sudo vim /etc/network/interfaces
auto lo
iface lo inet loopback
auto ens33
iface ens33 inet dhcp
重啟網絡服務
sudo /etc/init.d/networking restart
測試
ping www.baidu.com
7. UDP 協議與編程
UDP(User Datagram Protocol)屬于傳輸層協議。
?用戶數據報協議(User Datagram Protocol)
特點:無連接、不可靠、效率高,適合實時性強的應用(如視頻、語音)。
7.1 網絡編程模型
B/S 模型(Browser / Server)
客戶端通用(瀏覽器)
一般只開發服務器端
客戶端的數據均來自服務器
C/S 模型(Client / Server)
專用客戶端
服務器和客戶端都需開發
客戶端可保存部分資源,本地加載
7.2 UDP 編程流程
基本概念
套接字(socket):一個文件描述符,應用層與網絡通信的接口。
編程步驟
客戶端:
創建 socket
填寫服務器地址結構
發送數據
sendto
接收數據
recvfrom
關閉 socket
服務器:
創建 socket
綁定端口
bind
循環接收數據
recvfrom
可選擇回應客戶端
sendto
關閉 socket
#include <sys/types.h> ? ? ? ? ?/* See NOTES */
#include <sys/socket.h>? ? ? ?int socket(int domain, int type, int protocol);
功能:創建通信的套接字
參數:
domain:網絡層使用什么協議族
AF_INET:IPv4
AF_INET6:IPv6
type:規定傳輸層的協議
SOCK_DGRAM : UDP協議
SOCK_STREAM:TCP協議
SOCK_RAW :原始套接字
protocol :0 按照默認協議方式創建
返回值:
成功:套接字
失敗:-1? ? ? ?ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
功能:向網絡套接字發送數據
參數:
sockfd:套接字
buf: 要發送的數據的首地址
len:要發送的字節數
flags: 0:按照默認方式發送
dest_addr:接收方的地址信息(IP+端口號)
addrlen:接收方地址的大小
返回值:
成功:實際發送的字節數
失敗:-1? ? ? ?man 7 ip
struct sockaddr_in {
sa_family_t ? ?sin_family; /* address family: AF_INET */
in_port_t ? ? ?sin_port; ? /* port in network byte order */
struct in_addr sin_addr; ? /* internet address */
};? ? ? ? ? ?/* Internet address. */
struct in_addr {
uint32_t ? ? ? s_addr; ? ? /* address in network byte order */
};
網絡字節序:大端 ? ? ? ? ? ? ? ?network
主機字節序:小端 ?50000 ? host0x1234
小端:0x34
0x12
大端:
0x12
0x34uint32_t htonl(uint32_t hostlong); ? ? ? ? ?主機轉網絡
uint16_t htons(uint16_t hostshort); ? ? ? ? 主機轉網絡
uint32_t ntohl(uint32_t netlong); ? ? ? ? ? 網絡轉主機
uint16_t ntohs(uint16_t netshort); ? ? ? ? ?網絡轉主機?in_addr_t inet_addr(const char *cp);
功能:
將字符串IP地址轉換成二進制IP地址形式?char *inet_ntoa(struct in_addr in);
功能:
將二進制ip轉換成字符串
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:綁定自己的IP地址和端口號
參數:
sockfd:套接字
addr:需要綁定的地址
addrlen:地址大小
返回值:
成功:0
失敗:-1
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
功能:從套接字上接收數據
參數:
sockfd:套接字
buf:存放接收數據的內存首地址
len:希望接收的字節數
flags:0 :按照默認方式接收(阻塞)
src_addr:發送方的地址信息
addrlen:發送發地址的指針
功能:
成功:實際接收到的字節數
失敗:-1