linux -13-網(wǎng)絡(luò)編程-基礎(chǔ)及TCP/UDP

1.1 網(wǎng)絡(luò)常識(shí)

1)網(wǎng)絡(luò)的7層網(wǎng)絡(luò)協(xié)議

ISO按照邏輯劃分出來7層網(wǎng)絡(luò)協(xié)議

應(yīng)用層:和應(yīng)用程序打交道的,進(jìn)行數(shù)據(jù)的交互

表示層:將應(yīng)用程序中的數(shù)據(jù)按照規(guī)則封裝起來。

會(huì)話層:聊天,對(duì)話的意思,控制會(huì)話的開始和結(jié)束等

傳輸層:用于數(shù)據(jù)交換的通道

網(wǎng)絡(luò)層:通過具體的網(wǎng)絡(luò)傳送數(shù)據(jù)

數(shù)據(jù)鏈路層:對(duì)具體的信息進(jìn)行編碼轉(zhuǎn)換等等。

物理層:路由器和交換機(jī)等

2)常見的協(xié)議

TCP 傳輸控制協(xié)議,面向連接的協(xié)議

UDP 用戶數(shù)據(jù)報(bào)協(xié)議 ,面向無連接的協(xié)議

IP? 網(wǎng)絡(luò)協(xié)議 ,信息傳遞機(jī)制

3)IP地址

IP地址是Internet中唯一的地址標(biāo)識(shí),一般都是一個(gè)32位的整數(shù)(IPV4),也有128位整數(shù)(ipv6)

將ip地址中的每一個(gè)字節(jié)轉(zhuǎn)換為十進(jìn)制,采用.隔開,這種IP地址的表示方法叫做:點(diǎn)分十進(jìn)制表示法

IP地址分為網(wǎng)絡(luò)號(hào)和主機(jī)號(hào),將ip地址分為以下四類地址:

A類:0 + 7位網(wǎng)絡(luò)地址 + 24位本地地址

B類:10 +14位網(wǎng)絡(luò)地址 +16位本地地址

C類:110+21為網(wǎng)絡(luò)地址 +8位本地地址

D類:1110+28位多播地址

子網(wǎng)掩碼是采用點(diǎn)分十進(jìn)制表示法進(jìn)行表示,主要用于指名一個(gè)IP地址中哪些位表示網(wǎng)絡(luò)地址,以及哪些位表示主機(jī)地址,不能單獨(dú)使用,必須和IP地址搭配使用。

如:IP地址:192.168.182.48

子網(wǎng)掩碼:255.255.255.0? &

-------------------------------

192.168.182網(wǎng)絡(luò)地址

其中48表示主機(jī)號(hào)

可以判斷兩個(gè)不同的IP地址是否在同一個(gè)子網(wǎng)中

MAC地址:電腦上的網(wǎng)卡地址,物理地址

MAC地址也就是物理地址,也就是網(wǎng)卡的地址,可以通過綁定Mac地址來限制上網(wǎng)的設(shè)備

4)端口號(hào)

IP地址可以定位具體的主機(jī),端口號(hào)可以用于定位具體的某個(gè)進(jìn)程

端口號(hào)是unsigned short類型,范圍是 : 0 - 65535,其中0 - 1024的端口號(hào)一般被系統(tǒng)占用,比如:HTTP:80 FTP:21

如:

0x12345678

=> 按照內(nèi)存地址從低到高依次存放:

0x12??? 0x34 ? 0x56?? 0x78

低位內(nèi)存地址存放高位數(shù)據(jù):大端系統(tǒng)

低位內(nèi)存地址存放低位數(shù)據(jù):小端系統(tǒng)

字節(jié)序只要有兩種:網(wǎng)絡(luò)字節(jié)序 和 主機(jī)字節(jié)序

主機(jī)字節(jié)序一般表示當(dāng)前主機(jī)的字節(jié)順序

網(wǎng)絡(luò)字節(jié)序一般表示不同主機(jī)之間的統(tǒng)一字節(jié)序




2.0

使用socket進(jìn)行通信,soket -套接字,實(shí)際上就是一個(gè)邏輯通信載體

2.1一對(duì)一通信的模型

服務(wù)器端:

1)創(chuàng)建socket,使用socket函數(shù)

2)準(zhǔn)備一個(gè)通信地址,使用結(jié)構(gòu)體類型

3)將socket和通信地址進(jìn)行綁定,使用bind函數(shù)

4)進(jìn)行通信,使用read/write函數(shù)

5)關(guān)閉socket,使用close函數(shù)

客戶端:

1)創(chuàng)建socket,使用socket函數(shù)

2)準(zhǔn)備一個(gè)通信地址,使用結(jié)構(gòu)體類型

3)將socket和通信地址進(jìn)行連接,使用connect函數(shù)

4)進(jìn)行通信,使用read/write函數(shù)

5)關(guān)閉socket,使用close函數(shù)

2.2 相關(guān)函數(shù)的介紹1)socket函數(shù)

int socket(int domain,int type,int protocol)

第一個(gè)參數(shù):域/協(xié)議簇 AF_UNIX AF_LOCAL ----本地通信

AF_INET --使用IPV4進(jìn)行通信

AF_INET6 --使用IPV6進(jìn)行通信

第二個(gè)參數(shù):指定協(xié)議

SOCK_STREAM --使用數(shù)據(jù)流的形式通信,TCP協(xié)議

SOCK_DGRAM --使用數(shù)據(jù)報(bào)的形式通信,UDP協(xié)議

第三個(gè)參數(shù):指定特殊的協(xié)議,直接給0

返回值:成功會(huì)返回文件描述符,失敗會(huì)返回-1

函數(shù)功能:創(chuàng)建用于交流的端點(diǎn),通信載體

2)bind函數(shù)

int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen_);

第一個(gè)參數(shù):socket描述符

第二個(gè)參數(shù):準(zhǔn)備的通信地址

第三個(gè)參數(shù):通信地址的大小

返回值:成功返回0,失敗返回-1

函數(shù)功能:將準(zhǔn)備的通信地址和sockt進(jìn)行綁定

3)準(zhǔn)備的通信地址類型

//a 通用的通信地址s

struct sockaddr{

sa_family_t sa_family;//域,協(xié)議簇

char sa_data[14];//地址

};

注意:此結(jié)構(gòu)體一般很少直接使用,而絕大多數(shù)都是作為函數(shù)的參數(shù)去使用

//b 本地通信的結(jié)構(gòu)體類型#include

struct sockaddr_un

{??

sa_family sun_family;//協(xié)議簇?

char sun_path[];//socket文件的路徑};

//c 網(wǎng)絡(luò)通信的結(jié)構(gòu)體類型

struct sockaddr_in

{

? sa_family_t sin_family;//協(xié)議簇

AF_INETin_PORT_T sin_port;//端口號(hào)

struct in_addr sin_addr://ip地址}

struct in_addr

{

in_addr_t s_addr;//ip地}

4)connect函數(shù)

int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen);

函數(shù)的功能類似于bind函數(shù)

5)htons函數(shù)#includeuint32_t htonl(uint32_t hostlong);

unit32_t ntohl(uint32_t netlong);

unit16_t ntohs(uint16_t netshort);

unit16_t htons(uint16_t hostshort);

功能:htons函數(shù)表示將short類型參數(shù)的主機(jī)字節(jié)序,轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序,通過返回值返回轉(zhuǎn)換之后的結(jié)果

6)inet_addr函數(shù)

in_addr_t inet_addr(cons char *cp)

功能:將參數(shù)指定的點(diǎn)分十進(jìn)制形式的ip地址轉(zhuǎn)換網(wǎng)絡(luò)字節(jié)序的整數(shù)地址

---------------------------------------------------------------------------------------------------------

2.3基于TCP通信模型

服務(wù)器端:

1)創(chuàng)建socket,使用socket函數(shù),SOCK_STREAM

2)準(zhǔn)備通信地址,struct sockaddr_in結(jié)構(gòu)體

3)使用綁定,使用bind函數(shù)

4)監(jiān)聽,使用listen函數(shù)

5)接收客戶端的連接請(qǐng)求,使用accept函數(shù)

6)進(jìn)行通信,使用read/write函數(shù)

7)關(guān)閉socket,使用close函數(shù)

客戶端:

1)創(chuàng)建socket

2)準(zhǔn)備通信地址

3)進(jìn)行連接

4)進(jìn)行通信

5)關(guān)閉socket

2.4 相關(guān)函數(shù)

1)listen函數(shù)

int listen(int sockfd,int backlog);

第一個(gè)參數(shù):socket描述符

第二個(gè)參數(shù):允許訪問的最大連接數(shù),即將連接的隊(duì)列最大值

返回值:成功返回0,失敗返回-1

功能:監(jiān)聽socket上的連接請(qǐng)求

2)accept函數(shù)

int accept(int sockfd,struct sockaddr* addr,socken_t *addrlen);

第一個(gè)參數(shù):sockt描述符

第二個(gè)參數(shù):用于保存所接受的客戶端的地址

第三個(gè)參數(shù):地址的大小

返回值:成功返回新的文件描述符,失敗返回-1

函數(shù)功能:響應(yīng)客戶端的連接請(qǐng)求

注意:使用socket函數(shù)創(chuàng)建的描述符主要用于等待客戶端的連接,不參與信息的交互,而accept函數(shù)返回的描述符主要用于針對(duì)當(dāng)前客戶端的信息交互通道

3)inet_ntoa函數(shù)

char *inet_ntoa(struct in_addr in);

功能:將網(wǎng)絡(luò)通信結(jié)構(gòu)體中的第三個(gè)成功類型的ip地址 轉(zhuǎn)換 字符串形式的ip地址

------------------------------------------------------------------------------------------------------

UDP

1.1概念

TCP 傳輸控制協(xié)議 ,面向連接的協(xié)議

UCP 用戶數(shù)據(jù)報(bào)協(xié)議 非面向連接的協(xié)議

1.2區(qū)別

1)TCP是一種面向連接的協(xié)議,在通信的全程保持連接

優(yōu)點(diǎn):可以保證數(shù)據(jù)的完整性和安全性以及準(zhǔn)確性,并且可以重發(fā)一切數(shù)據(jù)

缺點(diǎn):服務(wù)器壓力比較大,資源占用率比較高

2)UDP是一種非面向連接的協(xié)議,在發(fā)送數(shù)據(jù)時(shí)連一下,不包吃全程連接

優(yōu)點(diǎn)是:服務(wù)器壓力比較小,資源占用率比較低

缺點(diǎn)是:不保證數(shù)據(jù)的安全性和完整性以及準(zhǔn)確性

1.3 基于UDP通信的模型:

服務(wù)器:

1)創(chuàng)建socket,使用socket函數(shù)

2)準(zhǔn)備通信地址,使用struct sockaddr_in結(jié)構(gòu)體

3)綁定socket和通信地址,使用bind函數(shù)

4)通信,使用read/write/sendto/recvfrom函數(shù)

5)關(guān)閉socket函數(shù),使用close函數(shù)

客戶端:

1)創(chuàng)建socket,使用socket函數(shù)

2)準(zhǔn)備通信地址,使用struct sockaddr_in結(jié)構(gòu)體

3)進(jìn)行通信,使用read/write/recvfrom/sendto函數(shù)

4)關(guān)閉socket,使用close函數(shù)

1.4相關(guān)函數(shù)的介紹1)sendto函數(shù)

ssize_t send(int sockfd,const voif *buf,size_t len,int flags);

ssize_t sendto(int sockfd,const void *buf,size_t len,int flags,const struct sockaddr *dest_addr,socklen_t addrlen);

第一個(gè)參數(shù):socket描述符

第二個(gè)參數(shù):將要發(fā)送的數(shù)據(jù)的首地址

第三個(gè)參數(shù):發(fā)送的數(shù)據(jù)大小

第四個(gè)參數(shù):發(fā)送的方式,默認(rèn)給0

第五個(gè)參數(shù):發(fā)送到的目標(biāo)地址

第六個(gè)參數(shù):目標(biāo)地址的大小

返回值:成功返回發(fā)送的數(shù)據(jù)大小,失敗返回-1

函數(shù)功能:向指定的目標(biāo)地址發(fā)送數(shù)據(jù)

注意:send函數(shù)相對(duì)于sendto少了目標(biāo)地址參數(shù),一般用于tcp通信中

2)recvfrom函數(shù)

ssize_t recv(int sockfd,void *buf,size_t len,int flags);

ssize_t recvfrom(int sockfd,void *buf,size_t len,int flags,struct sockaddr *src_addr,socklen_t *addrlen);

第一個(gè)參數(shù):socket描述符

第二個(gè)參數(shù):存放數(shù)據(jù)的緩沖區(qū)首地址

第三個(gè)參數(shù):讀取的數(shù)據(jù)大小

第四個(gè)參數(shù):默認(rèn)給0即可

第五個(gè)參數(shù):存放客戶端地址信息的

第六個(gè)參數(shù):客戶端地址的大小

返回值:成功返回讀取的數(shù)據(jù)大小,失敗返回-1

函數(shù)功能:接受指定的消息

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 研究IPv6 socket編程原因: Supporting IPv6 in iOS 9 WWDC2015蘋果宣布在...
    li大鵬閱讀 7,624評(píng)論 7 15
  • 什么是TCP/IP、UDP? TCP/IP(Transmission Control Protocol/Inter...
    liuboxx1閱讀 1,053評(píng)論 0 1
  • 一、基本socket函數(shù)Linux系統(tǒng)是通過提供套接字(socket)來進(jìn)行網(wǎng)絡(luò)編程的。網(wǎng)絡(luò)的socket數(shù)據(jù)傳輸...
    WB莫遙燚閱讀 1,556評(píng)論 0 0
  • Linux下的Socket編程(主要包括TCP部分) 轉(zhuǎn)載麻煩注明原文地址本文是Linux下基本的Socket編程...
    Bugfix閱讀 3,008評(píng)論 0 8
  • 這么多年,總幻想有一天能夢(mèng)到你。 然而我并不知道你的長相,即便是夢(mèng)到你,也許并不曉得那就是你。 總在入夢(mèng)前,腦海中...
    5f1bf6779a96閱讀 221評(píng)論 0 0

友情鏈接更多精彩內(nèi)容