Linux下的網絡編程
一、目的
? ? 不同主機,進程間通信。
二、解決的問題
1. 主機與主機之間物理層面必須互聯互通。
2. 進程與進程在軟件層面必須互聯互通。
? ? 物理層面的互聯互通流程圖如下:
? ? 其中:
????????IP地址:計算機的軟件地址,用來標識計算機設備
MAC地址:計算機的硬件地址(固定)
網絡的端口號:標記同一主機上的不同網絡進程
????????交換機:實現局域網內通信
路由器:負責數據的路徑規劃
廣域網:實現遠距離傳輸
三、網絡協議
? ? 網絡協議是網絡通信的標準。
1、OSI 七層模型
? ? OSI 七層模型:開放系統互聯模型(open system interconnect)是不同體系結構設備間,網絡通信的通信標準。
應用層:要傳輸的數據信息,如文件傳輸,電子郵件等
表示層:數據加密、解密操作,壓縮,解壓縮
會話層:建立數據傳輸通道, ? --->一個會話
傳輸層:傳輸的方式 ?UDP ?TCP ? 端口號
網絡層:實現數據路由,路徑規劃 ? ?路由器 ?ip
數據鏈路層:封裝成幀,點對點通信(局域網內通信),差錯檢測 ? 交換機 ?ARP
物理層:定義物理設備標準、電氣特性,比如網線,光纖等傳輸介質 ? 比特流 ?bit ?0 1
2、TCP/IP 模型
? ? TCP/IP 模型分為五層和四層兩種。每所表示的與 OSI 七層模型內容一致,只是將七層的 “ 應用層、表示層、會話層 ” 合并之后表示五層和四層的應用層,將五層的 “ 數據鏈路層、物理層 ” 合并表示四層中的網絡接口層。
? ? 五層結構及舉例說明:
應用層: | HTTP:超文本傳輸協議 TFTP:簡單文件傳輸協議(UDP) |
?傳輸層: | TCP :傳輸控制協議 UDP:用戶數據報協議 |
? ?網絡層: | IP協議: IPv4: IPv6: |
數據鏈路層: | ARP : 地址解析協議 |
?物理層: |
四、IP 協議
1、概念
? IP 協議位于網絡層,有?IPv4 (32位) 和 IPv6 (128位) 兩種,以IPv4 為主展開學習。?
192.168.1.140? ? (用戶表示形式) ? 點分十進制 ??
11000000 10101000 00000000 01000011?? ?(計算機存儲形式) 32bits
在 192.168.0.121/24 中,24表示網絡位的位數
2、IPv4 的地址
??IPv4 的?IP地址 = 網絡位 + 主機位?
網絡位:該IP地址位于哪個網段(局域網)內
主機位:這個網段(局域網)第幾臺主機
3、子網掩碼
??功能:用來區分IP地址的網絡位和主機位,搭配IP地址使用。
規則:子網掩碼是1的部分對應IP地址的網絡位
是0的部分對應IP地址的主機位
? 例如:子網掩碼如:255.255.255.0
11111111.11111111.11111111.00000000
?4、網段號
? ?規則:IP地址網絡位不變,主機位全為0,則為該IP地址的網段號
例如:IP地址:192.168.1.3
子網掩碼:255.255.0.0
網段號:192.168.0.0
網段內的IP能直接通信
5、廣播號
? ? 規則:IP地址網絡位不變,主機位全為1,則為該IP地址的廣播號
例如:IP地址:192.168.1.3
子網掩碼:255.255.255.0
廣播號:192.168.1.255
? ? ? 向廣播號發送信息,所有局域網內IP都能收到此信息
feiQ VNC
192.168.1.255
網關地址:
192.168.1.1
6、IP地址的劃分:
? ? 1)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 ? 回環地址
? ? 2)B類地址:
范圍:128.0.0.0 - 191.255.255.255
子網掩碼:255.255.0.0? ? ? 范圍:?2^16
管理大中規模網絡
私有IP地址:172.16.0.0 - 172.31.255.255
? ? 3)C類地址:
范圍:192.0.0.0 - 223.255.255.255
子網掩碼:255.255.255.0? ? ? ? 范圍:2^8
管理中小規模網絡
私有IP地址:192.168.0.0 - 192.168.255.255
? ? 4)D類地址:
224.0.0.0 - 239.255.255.255
組播和廣播使用
? ? 5)E類地址:
240.0.0.0 - 255.255.255.254
用來進行實驗
7、公有IP 和 私有IP
?? ??? ?公有IP:由電信公司直接分配,并需要付費的IP地址, 可以直接訪問internet
私有IP:不能直接訪問internet的ip地址? ? ? ??
節省ip地址
五、網絡端口號
1、概念
? ? 端口號:16位的整形數據(unsigned short)0-65535
端口號功能:標記同一主機上的不同網絡進程
2、分類
? ? 1)任何TCP/IP實現所提供的服務都用1-1023之間的端口號。
http : 80
FTP: 20/21
TFPT: 69
HTTPS: 443
2)端口號從1024-49151是被注冊的端口號,被IANA指定為特殊服務使用。
MQTT:1883/8883
3)從49152-65535是動態或私有端口號。
3、數據包的封裝和解封過程
六、網絡配置
1. ?ping ?ip地址/域名
? ? 查看當前主機和IP/域名所對應的這臺主機網絡是否聯通
例如,ping www.baidu.com
2. ifconfig?
? ? ifconfig 在Linux查看當前主機的IP地址
ipconfig 在Windows上查看當前主機的IP地址
3. 網絡配置
? ? 1)虛擬機-->設置-->網絡適配器-->橋接模式
2)編輯-->虛擬網絡編輯器-->更改設置-->VMnet0-->橋接至-->當前PC正在上網的網卡上-->應用-->確定
3)修改網絡配置文件
輸入指令:sudo vim /etc/network/interfaces
將內容更改為:
auto lo
iface lo inet loopback
auto ens33?
iface ens33 inet dhcp
4)重啟網絡服務
輸入指令:sudo /etc/init.d/networking restart
5) 測試
輸入指令:ping www.baidu.com
七、網絡協議 UDP
? ? UDP 位于傳輸層,用戶數據報協議(User Datagram Protocol)。
?1、網絡編程模型
?? ?1)B/S模型
????????browser/server(瀏覽器/服務器)
(1)客戶端是通用的客戶端(瀏覽器)
(2)一般只做服務器開發
(3)客戶端要加載的數據均來自服務器
? ? 2)C/S模型
? ? ? ? client/server(客戶端/服務端)
(1)客戶端是一個專用的客戶端
(2)服務器和客戶端都需開發
(3)客戶端可保存資源,本地加載,無需所有數據都請求服務器
2、UDP編程流程
? ? ? ? ? ?套接字:文件描述符
網絡通信時,應用層可操作的端口。
3、相關函數接口
? ? 1)socket() 函數
?int socket(int domain, int type, int protocol); |
功能:創建通信的套接字 參數: domain:網絡層使用什么協議族 AF_INET:IPv4 AF_INET6:IPv6 ype:規定傳輸層的協議 SOCK_DGRAM : UDP協議 SOCK_STREAM:TCP協議 SOCK_RAW :原始套接字 protocol:0 按照默認協議方式創建 返回值: 成功:套接字 失敗:-1 |
? ? 2)sendto() 函數
?ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen); |
功能:向網絡套接字發送數據 返回值: |
? ? ? ? 其中,IPv4 的地址信息存放在 struct sockaddr_in 中:
可使用 “ man 7 ip ” 指令查看程序員手冊 |
? ? ? ? ? ?struct sockaddr_in { ? ? ? ? ? ?/* Internet address. */ |
? ? 3)IP 地址形式轉換函數
? ? ? ? (1)inet_addr() 函數
in_addr_t inet_addr(const char *cp); |
功能: 將字符串IP地址轉換成二進制IP地址形式 |
? ? ? ? (2)inet_ntoa() 函數
char *inet_ntoa(struct in_addr in); |
功能: 將二進制ip轉換成字符串 |
? ? 4)bind() 函數
int bind(int sockfd, const struct sockaddr *addr,?socklen_t addrlen); |
功能:綁定自己的IP地址和端口號 參數: sockfd:套接字 addr:需要綁定的地址 addrlen:地址大小 返回值: 成功:0 失敗:-1 |
? ? 5)recvfrom() 函數
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen); |
功能:從套接字上接收數據 |
【END】