柚子快報激活碼778899分享:【Linux】網(wǎng)絡(luò)新兵連
柚子快報激活碼778899分享:【Linux】網(wǎng)絡(luò)新兵連
歡迎來到?破曉的歷程的 博客
??不負(fù)時光,不負(fù)己??
文章目錄
引言1.網(wǎng)絡(luò)中的地址管理1.1ip地址1.1.1源IP和目的IP
1.2MAC地址1.3兩套地址體系的區(qū)別
2.端口號3.網(wǎng)絡(luò)字節(jié)序4.套接字
引言
在上一篇博客中,我們簡單的介紹了一些Linux網(wǎng)絡(luò)一些比較基本的概念。本篇博客我們將開始正式學(xué)習(xí)Linux網(wǎng)絡(luò)套接字的內(nèi)容,那么我們開始吧!
1.網(wǎng)絡(luò)中的地址管理
大家一定知道每一臺主機(jī)都會存在一個ip地址,其實(shí)并不是這么簡單,今天我們就來系統(tǒng)介紹一下。
1.1ip地址
IP協(xié)議有兩個版本, IPv4和IPv6. 我們整個的課程, 凡是提到IP協(xié)議, 沒有特殊說明的, 默認(rèn)都是指IPv4。IPv6其實(shí)是針對IPv4地址不足提出的解決方案,目前世界上IPV6做的比較好的國家就是我們。
IP地址是在IP協(xié)議中, 用來標(biāo)識網(wǎng)絡(luò)中不同主機(jī)的地址;具有唯一性。對于IPv4來說, IP地址是一個4字節(jié), 32位的整數(shù);對于IPv6來說,IP地址是一個16個字節(jié),128位的整數(shù)。我們通常也使用 “點(diǎn)分十進(jìn)制” 的字符串表示IP地址, 例如 192.168.0.1 ; 用點(diǎn)分割的每一個數(shù)字表示一個字節(jié), 范圍是 0 - 255;
1.1.1源IP和目的IP
在IP數(shù)據(jù)包頭部中, 有兩個IP地址, 分別叫做源IP地址, 和目的IP地址,用來表示這個數(shù)據(jù)是從哪臺主機(jī)發(fā)出來的,要發(fā)給哪一臺主機(jī)。
1.2MAC地址
每一臺連入網(wǎng)路的設(shè)備都必須需要網(wǎng)卡,每一張網(wǎng)卡在出廠時都有一個唯一性的編號,這個標(biāo)號就是MAC地址。MAC同樣具有全網(wǎng)內(nèi)唯一性,通常用于處于局域網(wǎng)中主機(jī)之間相互通信。
MAC地址長度為6個字節(jié),48個比特位。一般用16進(jìn)制加上冒號的形式來表示,例如: 08:00:27:33:fd:45。
1.3兩套地址體系的區(qū)別
在Linux下查看ip地址和MAC地址的命令為:
[user@VM-8-5-centos ~]$ ifconfig
在這張圖片中,展示的是Linux系統(tǒng)下通過ifconfig命令查看的網(wǎng)絡(luò)配置信息,特別是關(guān)于以太網(wǎng)接口eth0的詳細(xì)配置。接下來,我們分析一下這些內(nèi)容:
以太網(wǎng)接口eth0:
狀態(tài)標(biāo)志(flags): 4163
顯示了接口接收和發(fā)送的數(shù)據(jù)包數(shù)量、字節(jié)數(shù)以及相關(guān)的錯誤統(tǒng)計(如錯誤、丟棄、溢出等),這些信息對于診斷網(wǎng)絡(luò)性能問題非常有用。 環(huán)回接口(lo):
lo 是環(huán)回接口,用于本機(jī)內(nèi)部通信。它也有自己的IPv4和IPv6地址(127.0.0.1和::1),以及相應(yīng)的接收和發(fā)送統(tǒng)計。
錯誤消息:
圖片中并未直接顯示明顯的錯誤消息,但提到了“RX errors 0 dropped 0 overruns 0 frame 0”和“TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0”,這些值都為0,表示在接收和發(fā)送過程中沒有遇到錯誤、丟棄、溢出、幀錯誤、傳輸錯誤、丟棄、溢出、載波丟失或沖突。 接下來,張三又上場了。張三買了一輛自行車,他想挑戰(zhàn)一下自己,所以他覺定騎車從北京到上海。如圖: 北京是起點(diǎn),上海是終點(diǎn)。從北京到上海沿途要經(jīng)過很過地方,例如天津。 假如張三途中經(jīng)過了天津,然后然后不知道該往哪個方向走了,邊找個一個當(dāng)?shù)厝苏f:“你好,我從北京來,要騎自行車去上海,來到了咱們這里,不知道該怎么走了,你可以幫幫我嗎?”。這個當(dāng)當(dāng)?shù)厝吮銦崆榈膶埲f:“你應(yīng)該繼續(xù)往西走,然后二十公里處,你再找人問問”。就這樣張三又繼續(xù)向西走了二十公里。然后又找了一個人問路,路人得知他要去上海,從西邊來,就告訴他應(yīng)該轉(zhuǎn)彎向南走。 張三口中有幾套地址呢?從哪來,到哪去。到哪去是終極目標(biāo),就是目的IP。從哪來是源IP。:為我們未來的每個階段提供方向目標(biāo),方便路徑選擇。IP地址提供的是方向選擇。上一站從哪來,下一站到哪去。張三每到一處,這個地址就會發(fā)生變化。像這種從一個節(jié)點(diǎn),跳轉(zhuǎn)到下一個相鄰的節(jié)點(diǎn)的地址,我們稱之為MAC地址。
如圖所示,跨網(wǎng)絡(luò)數(shù)據(jù)進(jìn)行傳輸時,需要路由器。所以路由器必須要同時連接兩個甚至多個局域網(wǎng)。數(shù)據(jù)該往哪個方向傳輸由IP地址決定。但是數(shù)據(jù)在長距離傳輸?shù)倪^程中會經(jīng)過多個路由節(jié)點(diǎn),相鄰路由節(jié)點(diǎn)的選擇由MAC地址決定。
2.端口號
IP(公網(wǎng)IP)地址決定網(wǎng)絡(luò)中主機(jī)的唯一性。但是僅僅需要IP地址就可以實(shí)現(xiàn)數(shù)據(jù)的傳輸嗎? 打開快手刷視頻時,為什么視頻資源可以準(zhǔn)確的顯示在快手APP頁面,而不是出現(xiàn)在微信APP頁面呢? 我們把數(shù)據(jù)從主機(jī)A傳輸?shù)街鳈C(jī)B是目的嗎?真正通信的不是這兩個機(jī)器,而是這兩個機(jī)器上的應(yīng)用(人)。但是有可能主機(jī)A上不止一個應(yīng)用(進(jìn)程),可能同時還會有其他的進(jìn)程,例如快手打開的同時,微信也開著。那么用什么來標(biāo)識客戶端或者服務(wù)器主機(jī)進(jìn)程的唯一性呢?端口號 為了更好的表示一臺主機(jī)上,服務(wù)器進(jìn)程或者客戶端進(jìn)程的唯一性,我們采用端口號來標(biāo)識主機(jī)上的不同進(jìn)程。端口號保證主機(jī)唯一性即可,即一臺主機(jī)上一個端口號只能綁定一個進(jìn)程,不同主機(jī)上的相同端口號綁定的進(jìn)程可以不同。
公網(wǎng)IP地址(標(biāo)識主機(jī)全網(wǎng)唯一性)+主機(jī)上的端口號=表示該進(jìn)程在全網(wǎng)中的唯一性
所以,網(wǎng)絡(luò)通信的本質(zhì)就是進(jìn)程間通信嘛!其中的臨界資源就是網(wǎng)絡(luò)。 通信是在做什么?通信不就是IO的過程嘛。所以,我們所有的網(wǎng)絡(luò)行為只有兩種:①從網(wǎng)絡(luò)中接收數(shù)據(jù)②發(fā)送數(shù)據(jù)到網(wǎng)絡(luò)中。 IP保證全網(wǎng)唯一,port保證本機(jī)唯一。一個進(jìn)程可以綁定多個端口號。
進(jìn)程已經(jīng)有pid了,為什么還要有端口號呢? ①系統(tǒng)是系統(tǒng),網(wǎng)絡(luò)是網(wǎng)絡(luò)。做到互相解耦。維護(hù)成本低 ②一般都是客戶端主動向服務(wù)器發(fā)送請求。需要客戶端快速的找到服務(wù)器進(jìn)程。決定了服務(wù)器的IP和端口不能隨便改變。所以決定了不能使用輕易會改變的值。pid不太滿足這個條件。
所以,客戶端向服務(wù)器發(fā)送消息時,要不要把客戶端的ip和端口號發(fā)給服務(wù)器呢?要,因?yàn)榉?wù)器還有將消息發(fā)回給客戶端。這就決定了在發(fā)送數(shù)據(jù)時,一定會多發(fā)一部分?jǐn)?shù)據(jù)——以協(xié)議的形式呈現(xiàn)。
3.網(wǎng)絡(luò)字節(jié)序
我們已經(jīng)知道,內(nèi)存中的多字節(jié)數(shù)據(jù)相對于內(nèi)存地址有大端和小端之分, 磁盤文件中的多字節(jié)數(shù)據(jù)相對于文件中的偏移地址也有大端小端之分, 網(wǎng)絡(luò)數(shù)據(jù)流同樣有大端小端之分. 那么如何定義網(wǎng)絡(luò)數(shù)據(jù)流的地址呢?
發(fā)送主機(jī)通常將發(fā)送緩沖區(qū)中的數(shù)據(jù)按內(nèi)存地址從低到高的順序發(fā)出;接收主機(jī)把從網(wǎng)絡(luò)上接到的字節(jié)依次保存在接收緩沖區(qū)中,也是按內(nèi)存地址從低到高的順序保存;因此,網(wǎng)絡(luò)數(shù)據(jù)流的地址應(yīng)這樣規(guī)定:先發(fā)出的數(shù)據(jù)是低地址,后發(fā)出的數(shù)據(jù)是高地址.TCP/IP協(xié)議規(guī)定,網(wǎng)絡(luò)數(shù)據(jù)流應(yīng)采用大端字節(jié)序,即低地址高字節(jié).不管這臺主機(jī)是大端機(jī)還是小端機(jī), 都會按照這個TCP/IP規(guī)定的網(wǎng)絡(luò)字節(jié)序來發(fā)送/接收數(shù)據(jù);如果當(dāng)前發(fā)送主機(jī)是小端, 就需要先將數(shù)據(jù)轉(zhuǎn)成大端; 否則就忽略, 直接發(fā)送即可。
那么,如果需要轉(zhuǎn)化的話,轉(zhuǎn)化的過程需要誰來完成呢?需要程序員自己來完成轉(zhuǎn)換工作。當(dāng)然,操作系統(tǒng)也給我們提供了相應(yīng)的接口,我們調(diào)用即可。 接下來,我們簡單介紹一下這些接口
#include
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
這些函數(shù)名很好記,h表示host,n表示network,l表示32位長整數(shù),s表示16位短整數(shù)。 例如htonl表示將32位的長整數(shù)從主機(jī)字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序,例如將IP地址轉(zhuǎn)換后準(zhǔn)備發(fā)送。 如果主機(jī)是小端字節(jié)序,這些函數(shù)將參數(shù)做相應(yīng)的大小端轉(zhuǎn)換然后返回; 如果主機(jī)是大端字節(jié)序,這些 函數(shù)不做轉(zhuǎn)換,將參數(shù)原封不動地返回。
網(wǎng)絡(luò)套接字
4.套接字
IP+port就可以表示一臺主機(jī)的進(jìn)程在網(wǎng)絡(luò)中的唯一性,其中IP+Port合起來被稱為網(wǎng)絡(luò)套接字。 接下里,我們先見一下關(guān)于網(wǎng)絡(luò)套接字創(chuàng)建,綁定端口,使用的相關(guān)函數(shù)。
// 創(chuàng)建 socket 文件描述符 (TCP/UDP, 客戶端 + 服務(wù)器)
int socket(int domain, int type, int protocol);
// 綁定端口號 (TCP/UDP, 服務(wù)器)
int bind(int socket, const struct sockaddr *address,
socklen_t address_len);
// 開始監(jiān)聽socket (TCP, 服務(wù)器)
int listen(int socket, int backlog);
// 接收請求 (TCP, 服務(wù)器)
int accept(int socket, struct sockaddr* address,
socklen_t* address_len);
// 建立連接 (TCP, 客戶端)
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
套接字的種類其實(shí)是比較多的。有
網(wǎng)絡(luò)套接字:主要用于網(wǎng)絡(luò)跨主機(jī)之間通信,同時支持本地通信。原始套接字:我們一般的套接字訪問的都是傳輸層的接口,原始套接字可以繞過傳輸層訪問底層的數(shù)據(jù)和接口。Unix域間套接字:只能夠支持本地通信。
由于有三套不同的套接字,所以按理來說,操作系統(tǒng)要設(shè)計三套不同的接口分別對應(yīng)三套不同的套接字。但是這對使用者來說簡直是災(zāi)難,使用者要同時掌握三套接口。所以,為了方便使用,操作系統(tǒng)進(jìn)行了如下的設(shè)計: 我們發(fā)現(xiàn):struct sockaddr_in和struct sockaddr_un的接口不同,這使用起來就很麻煩。所以操作系統(tǒng)就設(shè)計了struct sockaddr結(jié)構(gòu)。在使用時,就必須進(jìn)行強(qiáng)制類型轉(zhuǎn)換。
寫到這里,本篇博客的內(nèi)容就結(jié)束了,我們下期博客再見!
柚子快報激活碼778899分享:【Linux】網(wǎng)絡(luò)新兵連
參考文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。