linux高級編程(OSI/UDP(用戶數據報))

OSI七層模型:

OSI 模型? --> 開放系統互聯模型? --> 分為7層:
? ? ? ?理想模型? --> 尚未實現

? ? ? ? 1.應用層 ?QQ
?? ??? ? ? ? ? ? ? ? ? 應用程序的接口
?? ??? ?2.表示層 ?加密解密 ?gzip
?? ??? ? ? ? ? ? ? ? ? 將接收的數據進行解釋(機器->人)
?? ??? ?3.會話層 ?網絡斷開,連接狀態,keep-close keep-alive
?? ??? ? ? ? ? ? ? ? ? 通信雙方管理會話
?? ??? ?4.傳輸層:tcp ?udp ?協議 ?文件 ? ?視頻,音頻
? ? ? ? ? ? ? ? ? ? ? ? (傳數據)
?? ??? ?5.網絡層ip ? NAT
?? ??? ??? ?實現數據從源經過多條鏈路到目的地的轉發(找主機)
?? ??? ?6.鏈路層 ?交換機 ?數據的格式化 ?幀 校驗
?? ??? ? ? ? ? ? ? ?將電信號封裝,建立數據鏈路,實現點對點數據傳輸
?? ??? ?7.物理層:100Mb/8 ?Gbits ? 100MB 同軸電纜 10Gb ? ?2.4G 5G
?? ??? ? ? ? ? ? ? ? 可通過物理介質傳播的電信號

TCP/IP模型:

? TCP/IP模型? --> 網際互聯模型? ?--> 分為4層:
? ?? ?實用模型? --> 工業標準

????????1.應用層 ?---> ?應用程序(用戶與應用程序的接口)(會話層+表示層+應用層)
?? ??? ?2.傳輸層 ?---> ?端口號tcp udp? (傳數據)
?? ??? ?3.網絡層 ?---> ?IP 地址(找主機)
?? ??? ?4.接口層 ?---> ?網卡 驅動 ?1GB(連結互聯網的基礎設施)(物理層+鏈路層)

網絡基礎

IP地址 = 網絡位 + 主機位
010 3333344444

IP地址的分類: 點分十進制 ? ipv4(4字節(32位)數據,42億個地址,已耗盡)?
?? ??? ? ? ? ? ? ipv6(16字節(128位)數據,地址很多,未耗盡

A類:?? ?超大規模性網絡
?? ??? ??? ??? ??? ?8?? ?8?? ?8?? ?8
?? ??? ?1.0.0.0 - 126.255.255.255 ?126.1.1.1?
?? ??? ??? ??? ??? ??? ??? ??? ??? ?126.1.1.2
?? ??? ?255.0.0.0 ? ?
?? ??? ?私有:
?? ??? ?10.0.0.0 - 10.255.255.255
?? ??? ?127.0.0.1
?? ?B類:?? ?大中規模型網絡
?? ??? ?128.0.0.0 - 191.255.255.255
?? ??? ?128.2.1.2 ?128.2.7.2
?? ??? ?255.255.0.0
?? ??? ?私有:
?? ??? ?172.16.0.0 - 172.31.255.255

?? ?C類:?? ?中小規模型網絡
?? ??? ?192.0.0.0 - 223.255.255.255
?? ??? ?255.255.255.0
?? ??? ?私有:
?? ??? ?192.168.0.0 - 192.168.255.255
?? ??? ?靜態路由
?? ??? ?192.168.0.0
?? ??? ?192.168.0.1 ?網關
?? ??? ?192.168.0.255?

?? ?D類:?? ?組播和廣播(廣播:所有用戶都能傳播,組播:某個小范圍組內能傳播)

? ? ? ? ? ? ?(無子網掩碼)
?? ??? ?224.0.0.0 - 239.255.255.255
?? ??? ?192.168.0.255 == ?255.255.255.255
?? ??? ?235.1.2.3
?? ??? ?192.168.1.0?
?? ??? ?192.168.0.1 ? 網關
?? ??? ?192.168.1.255 廣播?

?? ?E類:?? ?實驗

????????????(無子網掩碼)
?? ??? ?240.0.0.0 - 255.255.255.255

子網掩碼:1代表網絡部分,0代表主機部分

C 類網絡:
? ???ip地址的前三組是網絡地址,第四組是主機地址。
?? ?二進制的最高位必須是: 110xxxxx開頭
?? ?十進制表示范圍: 192.0.0.0 -223.255.255.255
?? ?默認網絡掩碼: ? 255.255.255.0
?? ?網絡個數: 2^24 個 約 209 萬個
?? ?主機個數: 2^8 ?個 254 個+2 --> 1個是網關(網絡地址.0 的下一個地址.1)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 另1個是廣播(.255最后一個地址)
?? ?私有地址: 192.168.x.x 局域網地址。

網絡接口(端口+ip -->?找到進程+找到主機)

1、socket ?套接字 --> BSD socket --> 用于網絡通信的一組接口函數。socket api ?application interface --> 進程到進程 --> 實現主機到主機通信

2、ip+port 地址+端口 --> 地址用來識別主機
?? ??? ??? ??? ??? ??? ? ? ? 端口用來識別應用程序

?? ??? ? ?port分為TCP port / UDP port ?范圍都是: 1-65535(2^16,兩個byte)
?? ??? ? ?約定1000 以內的端口為系統使用。

網絡字節序

--> 大端排序(高位數據放在高地址處)(高地址:值較大的地址)

--> 主機 --> 小端(高位數據放在低地址處)(從小往大走)

數字轉換函數:
? ? #include <arpa/inet.h>
?? ?主機轉網絡:uint32_t htonl(uint32_t hostlong);
?? ?ipv4 192.168.0.1 1~65535
?? ??? ??? ??? ?uint16_t htons(uint16_t hostshort);
?? ?網絡轉主機:host to net long?
?? ??? ??? ??? ?net to host?
?? ??? ??? ??? ?uint32_t ntohl(uint32_t netlong);? ?//對應16位轉換與32位轉換
?? ??? ??? ??? ?uint16_t ntohs(uint16_t netshort);

? ? 主機轉網絡:in_addr_t inet_addr(const char *cp);
? ? ? ? inet_addr("192.168.1.20");
? ? ? ? 網絡轉主機:char *inet_ntoa(struct in_addr in);

字符串轉換函數:
?? ?#include <sys/socket.h>
?? ?#include <netinet/in.h>
?? ?#include <arpa/inet.h>

?? ?主機轉網絡:in_addr_t inet_addr(const char *cp);
?? ? cli.sin_addr
?? ?inet_addr("192.168.1.20");
?? ?網絡轉主機:char *inet_ntoa(struct in_addr in);

收發數據(UDP)

UDP:半雙工,同一時刻要么收要么發

1、模式 ?C/S 模式 ?--> 服務器/客戶端模型(client/server)

server:socket()-->bind()--->listen()-->accept()-->recv()-->close()?
? ? ? ? ? ?創建套接字-->關聯接口地址-->-->收、發-->關閉
client:socket()-->connect()-->send()-->close();
? ? ? ? ? ? 創建套接字-->連接(客戶端可以不需要)-->收、發-->關閉

socket()

int socket(int domain, int type, int protocol);
功能:程序向內核提出創建一個基于內存的套接字描述符

參數:domain ?地址族,PF_INET(協議族) == AF_INET(地址族,IPv4) ==>互聯網程序
?? ??? ??? ??? ??? ? ?PF_UNIX == AF_UNIX ==>單機程序
?? ? ?type ? ?套接字類型:
?? ? ??? ??? ? ?SOCK_STREAM ?流式套接字 ===》TCP ??
?? ??? ??? ? ?SOCK_DGRAM ? 用戶數據報套接字===>UDP
?? ??? ??? ? ?SOCK_RAW ? ? 原始套接字 ?===》IP
?? ? ?protocol 協議 --> 0 表示自動適應應用層協議。

返回值:成功 返回申請的套接字id
?? ??? ?失敗 ?-1;

bind()

2、int bind(int sockfd, struct sockaddr *my_addr,?
? ? ? ? ? ? ?socklen_t addrlen);
功能:如果該函數在服務器端調用,則表示將參數1相關
?? ? ?的文件描述符文件與參數2 指定的接口地址關聯,
?? ? ?用于從該接口接受數據。

?? ? ?如果該函數在客戶端調用,則表示要將數據從
?? ? ?參數1所在的描述符中取出并從參數2所在的接口
?? ? ?設備上發送出去。

?? ? ?注意:如果是客戶端,則該函數可以省略,由默認
?? ? ? ? ? ?接口發送數據。
參數:sockfd 之前通過socket函數創建的文件描述符,套接字id
?? ? ?my_addr 是物理接口的結構體指針。表示該接口的信息。

?? ? ?struct sockaddr ? ? ?通用地址結構
?? ? ?{
?? ??? ? ?u_short sa_family; ?地址族
?? ??? ? ?char sa_data[14]; ? 地址信息
?? ? ?};

?? ? ?轉換成網絡地址結構如下:
?? ? ?struct _sockaddr_in ? ?///網絡地址結構
?? ? ?{
?? ??? ? ?u_short ?? ??? ? ?sin_family; 地址族
?? ??? ? ?u_short ?? ??? ? ?sin_port; ? ///地址端口
?? ??? ? ?struct in_addr ?sin_addr; ? ///地址IP
?? ??? ? ?char ?? ??? ??? ? ?sin_zero[8]; 占位
?? ? ?};

?? ? ?struct in_addr
?? ? ?{
?? ??? ? ?in_addr_t s_addr;
?? ? ?}

?? ? ?socklen_t addrlen: 參數2 的長度。
返回值:成功 ?0
? ? ? ? ? ? ?失敗 ?-1;

bind傳參要進行強轉,在實際使用中,struct sockaddr過于底層,不方便處理,而struct sockaddr_in專門用于IPv4地址,所以一般用struct sockaddr_in來定義

#typedef struct sockaddr * (SA);struct sockaddr_in ser;
int ret = bind(sockfd,(SA)&ser,sizeof(ser));

一般bind的操作為:

struct sockaddr_in ser,cli;
bzero(&ser,sizeof(ser));
bzero(&cli,sizeof(cli));
// 大小端轉化 host to net short 
ser.sin_port = htons(50000);
ser.sin_addr.s_addr = inet_addr("192.168.203.128");
int ret = bind(sockfd,(SA)&ser,sizeof(ser));
if(-1 == ret)
{perror("bind");exit(1);
}

接收函數/發送函數

??read()/write () ? ///通用文件讀寫,可以操作套接字。
??recv(,0) /send(,0) ? ? ?///TCP 常用套機字讀寫
??recvfrom()/sendto() ///UDP 常用套接字讀寫


ssize_t recv(int sockfd, void *buf, size_t len,
? ? ? ? ? ? ?int flags);
功能:從指定的sockfd套接字中以flags方式獲取長度
?? ? ?為len字節的數據到指定的buff內存中。
參數:sockfd ?
?? ??? ?如果服務器則是accept的返回值的新fd
?? ??? ?如果客戶端則是socket的返回值舊fd
?? ? ?buff 用來存儲數據的本地內存,一般是數組或者
?? ? ?動態內存。
?? ? ?len 要獲取的數據長度
?? ? ?flags 獲取數據的方式,0 表示阻塞接受。

返回值:成功 表示接受的數據長度,一般小于等于len
?? ??? ?失敗 ?-1;

close()

5、close() ?===>關閉指定的套接字id;

注意事項:

服務器:

需要先接收客戶端的地址(recvfrom),不然無法發送數據

typedef struct sockaddr *(SA);
socklen_t cli=sizeof(cli);
recvfrom(sockfd,buf_r,sizeof(buf_r),0,(SA)&cli,len_cli);

客戶端:

需要空發一下讓服務器拿到(對于收發先后沒有太大要求,recvfrom具有讀阻塞的作用)

char buf[128];
sendto(sockfd,buf,sizeof(buf),0,(SA)&ser,sizeof(ser));

客戶端recvfrom不需要最后兩個參數可以是NULL,因為本來就有父進程的端口號和ip

 recvfrom(sockfd,buf_r,sizeof(buf_r),0,NULL,NULL);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/43408.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/43408.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/43408.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【shell】—雙引號引用變量

文章目錄 一、舉例—單、雙引號引用變量的結果差異二、使用雙引號引用變量的場景1、使用雙引號—可以防止字符串被分割2、使用雙引號—特殊字符變為普通字符3、使用雙引號—保存原始命令的輸出格式4、使用雙引號—具有強約束的單引號變為普通單引號字符5、注意 一、舉例—單、雙…

挑戰杯 opencv python 深度學習垃圾圖像分類系統

0 前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分享的是 &#x1f6a9; opencv python 深度學習垃圾分類系統 &#x1f947;學長這里給一個題目綜合評分(每項滿分5分) 難度系數&#xff1a;3分工作量&#xff1a;3分創新點&#xff1a;4分 這是一個較為新穎的競…

昇思25天學習打卡營第13天|應用實踐之ResNet50遷移學習

基本介紹 今日的應用實踐的模型是計算機實踐領域中十分出名的模型----ResNet模型。ResNet是一種殘差網絡結構&#xff0c;它通過引入“殘差學習”的概念來解決隨著網絡深度增加時訓練困難的問題&#xff0c;從而能夠訓練更深的網絡結構。現很多網絡極深的模型或多或少都受此影響…

數據鏈路層(超詳細)

引言 數據鏈路層是計算機網絡協議棧中的第二層&#xff0c;位于物理層之上&#xff0c;負責在相鄰節點之間的可靠數據傳輸。數據鏈路層使用的信道主要有兩種類型&#xff1a;點對點信道和廣播信道。點對點信道是指一對一的通信方式&#xff0c;而廣播信道則是一對多的通信方式…

算法工程師第五天(● 哈希表理論基礎 ● 242.有效的字母異位詞 ● 349. 兩個數組的交集 ● 202. 快樂數● 1. 兩數之和 )

參考文獻 代碼隨想錄 一、有效的字母異位詞 給定兩個字符串 s 和 t &#xff0c;編寫一個函數來判斷 t 是否是 s 的字母異位詞。 注意&#xff1a;若 s 和 t 中每個字符出現的次數都相同&#xff0c;則稱 s 和 t 互為字母異位詞。 示例 1: 輸入: s "anagram", …

風險評估:Tomcat的安全配置,Tomcat安全基線檢查加固

「作者簡介」&#xff1a;冬奧會網絡安全中國代表隊&#xff0c;CSDN Top100&#xff0c;就職奇安信多年&#xff0c;以實戰工作為基礎著作 《網絡安全自學教程》&#xff0c;適合基礎薄弱的同學系統化的學習網絡安全&#xff0c;用最短的時間掌握最核心的技術。 這一章節我們需…

grafana數據展示

目錄 一、安裝步驟 二、如何添加喜歡的界面 三、自動添加注冊客戶端主機 一、安裝步驟 啟動成功后 可以查看端口3000是否啟動 如果啟動了就在瀏覽器輸入IP地址&#xff1a;3000 賬號密碼默認是admin 然后點擊 log in 第一次會讓你修改密碼 根據自定義密碼然后就能登錄到界面…

高職物聯網實訓室

一、高職物聯網實訓室建設背景 隨著《中華人民共和國國民經濟和社會發展第十四個五年規劃和2035年遠景目標綱要》的發布&#xff0c;中國正式步入加速數字化轉型的新時代。在數字化浪潮中&#xff0c;物聯網技術作為連接物理世界與數字世界的橋梁&#xff0c;其重要性日益凸顯…

Golang | Leetcode Golang題解之第224題基本計算器

題目&#xff1a; 題解&#xff1a; func calculate(s string) (ans int) {ops : []int{1}sign : 1n : len(s)for i : 0; i < n; {switch s[i] {case :icase :sign ops[len(ops)-1]icase -:sign -ops[len(ops)-1]icase (:ops append(ops, sign)icase ):ops ops[:len(o…

Knife4j的原理及應用詳解(三)

本系列文章簡介&#xff1a; 在當今快速發展的軟件開發領域&#xff0c;API&#xff08;Application Programming Interface&#xff0c;應用程序編程接口&#xff09;作為不同軟件應用之間通信的橋梁&#xff0c;其重要性日益凸顯。隨著微服務架構的興起&#xff0c;API的數量…

價值投資者什么時候賣出股票?

經常有人說&#xff0c;會買的只是徒弟&#xff0c;會賣的才是師傅。 在閱讀《戰勝華爾街》的過程中&#xff0c;也多次感受到林奇先生的賣出邏輯&#xff0c;當股票的價格充分體現了公司的價值的時候&#xff0c;就是該賣出股票的時候。但這只是理論上的&#xff0c;從林奇先…

數據中臺指標管理系統

您所描述的是一個數據中臺指標管理系統&#xff0c;它基于Spring Cloud技術棧構建。數據中臺是企業數據管理和應用的中心平臺&#xff0c;它整合了企業內外部的數據資源&#xff0c;提供數據服務和數據管理能力。以下是您提到的各個模塊的簡要概述&#xff1a; 1. **首頁**&am…

JSP WEB開發(四) MVC模式

MVC模式介紹 MVC&#xff08;Model-View-Controller&#xff09;是一種軟件設計模式&#xff0c;最早出現在Smalltalk語言中&#xff0c;后來在Java中得到廣泛應用&#xff0c;并被Sun公司推薦為Java EE平臺的設計模式。它把應用程序分成了三個核心模塊&#xff1a;模型層、視…

2024年有多少程序員轉行了?

疫情后大環境下行&#xff0c;各行各業的就業情況都是一言難盡。互聯網行業更是極不穩定&#xff0c;頻頻爆出裁員的消息。大家都說2024年程序員的就業很難&#xff0c;都很焦慮。 在許多人眼里&#xff0c;程序員可能是一群背著電腦、進入高大上寫字樓的職業&#xff0c;他們…

SVN 80道面試題及參考答案(2萬字長文)

目錄 解釋SVN的全稱和主要功能。 SVN與CVS相比,有哪些主要改進? 描述SVN的工作流程。 什么是版本庫(repository)?它存儲了什么? 解釋工作副本(working copy)的概念。 SVN如何處理文件的版本控制? SVN中的“commit”是什么意思? 解釋“update”操作的作用。 如何…

Datawhale AI 夏令營 機器學習挑戰賽

一、賽事背景 在當今科技日新月異的時代&#xff0c;人工智能&#xff08;AI&#xff09;技術正以前所未有的深度和廣度滲透到科研領域&#xff0c;特別是在化學及藥物研發中展現出了巨大潛力。精準預測分子性質有助于高效篩選出具有優異性能的候選藥物。以PROTACs為例&#x…

Hi3861 OpenHarmony嵌入式應用入門--MQTT

MQTT 是機器對機器(M2M)/物聯網(IoT)連接協議。它被設計為一個極其輕量級的發布/訂閱消息傳輸 協議。對于需要較小代碼占用空間和/或網絡帶寬非常寶貴的遠程連接非常有用&#xff0c;是專為受限設備和低帶寬、 高延遲或不可靠的網絡而設計。這些原則也使該協議成為新興的“機器…

AutoMQ 生態集成 Kafdrop-ui

Kafdrop [1] 是一個為 Kafka 設計的簡潔、直觀且功能強大的Web UI 工具。它允許開發者和管理員輕松地查看和管理 Kafka 集群的關鍵元數據&#xff0c;包括主題、分區、消費者組以及他們的偏移量等。通過提供一個用戶友好的界面&#xff0c;Kafdrop 大大簡化了 Kafka 集群的監控…

量產工具一一UI系統(四)

目錄 前言 一、按鈕數據結構抽象 1.ui.h 二、按鍵處理 1.button.c 2.disp_manager.c 3.disp_manager.h 三、單元測試 1.ui_test.c 2.上機測試 前言 前面我們實現了顯示系統框架&#xff0c;輸入系統框架和文字系統框架&#xff0c;鏈接&#xff1a; 量產工具一一顯…