B/S :瀏覽器和服務(wù)器
C/S :客戶機和服務(wù)器
網(wǎng)絡(luò)的體系結(jié)構(gòu):
網(wǎng)絡(luò)的層次結(jié)構(gòu)和每層所使用協(xié)議的集合
網(wǎng)絡(luò)采用分層管理的方法,將網(wǎng)絡(luò)的功能劃分為不同的模塊
OSI模型:
共7種:
應(yīng)用層:接收用戶的數(shù)據(jù),面向的應(yīng)用程序
? 表示層:邏輯語言轉(zhuǎn)為機器語言,翻譯,加密
? 會話層:針對傳輸?shù)拿恳环N數(shù)據(jù)建立一條虛連接
高層
? 傳輸層:作用 1.區(qū)分流量 2.定義數(shù)據(jù)傳輸方式
? 網(wǎng)絡(luò)層:network 編址 尋址
? 數(shù)據(jù)鏈路層:數(shù)據(jù)鏈路層分為LLC層(邏輯鏈路控制子層)和MAC層(介質(zhì)訪問控制子層)
二層地址:MAC地址(介質(zhì)訪問控制)- -物理/硬件/燒錄地址
? 物理層:傳輸介質(zhì)(有線、無線)
地層
TCP/IP協(xié)議:傳輸控制協(xié)議 / 網(wǎng)絡(luò)協(xié)議
用戶模式
應(yīng)用層:使用相應(yīng)的協(xié)議,將封裝好的數(shù)據(jù)提交給傳輸層,或是傳輸層接收數(shù)據(jù)并處理。 FTP頭信息
內(nèi)核模式:
傳輸層:負(fù)責(zé)實現(xiàn)應(yīng)用程序之間的通信服務(wù),又稱端對端通信 TCP頭信息
網(wǎng)絡(luò)層:負(fù)責(zé)主機間的通信,傳輸數(shù)據(jù)包 IP頭信息
網(wǎng)絡(luò)接口層:將二進制轉(zhuǎn)化為數(shù)據(jù)幀,并進行數(shù)據(jù)幀的發(fā)送和接受
數(shù)據(jù)的封裝與傳遞過程:
網(wǎng)絡(luò)傳輸數(shù)據(jù)大小user data: 6~1460
網(wǎng)絡(luò)傳輸中容易發(fā)生拆包和粘包,所以接收和發(fā)送的字節(jié)數(shù)要對齊,否則容易傳輸不上
TCP和UDP協(xié)議
共同點:傳輸層,全雙工的
不同點:TCP有連接可靠的,UDP無連接不可靠數(shù)據(jù)容易丟
TCP
是一種面向連接的傳輸層協(xié)議,它能提供高可靠性通信(即數(shù)據(jù)無誤、數(shù)據(jù)無丟失、數(shù)據(jù)無失序、數(shù)據(jù)無重復(fù)到達的通信)
傳輸質(zhì)量較高,輸出大量數(shù)據(jù)
傳輸需要賬號,一對一
傳輸數(shù)據(jù)時較慢
UDP
(User Datagram Protocol)用戶數(shù)據(jù)報協(xié)議,是不可靠的無連接的協(xié)議。在數(shù)據(jù)發(fā)送前,因為不需要進行連接,所以可以進行高效率的數(shù)據(jù)傳輸。
發(fā)送小尺寸數(shù)據(jù),無線網(wǎng)絡(luò)
廣播/組播式通信中,一對多
實時性較高
傳輸數(shù)據(jù)時快,資源消耗小
網(wǎng)絡(luò)編程
1.預(yù)備知識
1)socket套接字
網(wǎng)絡(luò)編程的通用接口
是一種特殊的文件描述符
當(dāng)調(diào)用socket函數(shù)時就會創(chuàng)建一個套接字,并返回套接字的文件描述符
支持面向連接(TCP)與無連接(UDP)
套接字的類型
TCP所用的時流式套接字,用于可靠傳輸,SOCK_STREAM
UDP所用的數(shù)據(jù)報套接字,用于無連接不可靠的,SOCK_DGRAM
SOCK_RAW:原始套接字,直接作用于網(wǎng)絡(luò)層
套接字位于應(yīng)用層與傳輸層之間,OSI模型的會話層和傳輸層之間
2)IP地址
IP地址就是網(wǎng)絡(luò)中主機的標(biāo)識—區(qū)分不同的主機
IP地址:IPv4(32)和IPv6(128)
IP地址表示:點分形式;例:192.168.2.99
IP地址 = 網(wǎng)絡(luò)號 + 主機號
? 網(wǎng)絡(luò)號:IP & 子網(wǎng)掩碼
? 主機號:IP & (-子網(wǎng)掩碼)
同一局域網(wǎng)內(nèi)主機號,網(wǎng)絡(luò)號相同,主機號不同
Linux:
? ifconfig : 查看IP地址
? ifconfig ens33 up/down/IP … 啟動/關(guān)閉/設(shè)置IP
? ping IP/域名 : 檢測網(wǎng)絡(luò)是否聯(lián)通
6、解決有線無無法邊接:顯示W(wǎng)ired Unmanaged
{
dashhome/system setting/network。顯示W(wǎng)ired Unmanaged
? 解決方法:
? sudo vim /etc/NetworkManager/NetworkManager.conf
? 將managed=false
? 改成managed=true
? 然后重啟network-manager
? sudo service network-manager restart
? 或者 kill掉再啟用:sudo NetworkManager。再不行就重啟:sudo reboot
? }
IP地址的轉(zhuǎn)換
inet_aton()
字符串->網(wǎng)絡(luò)字節(jié)序
將strptr所指的字符串轉(zhuǎn)換成32位的網(wǎng)絡(luò)字節(jié)序二進制值
#include <arpa/inet.h>
int inet_aton(const char *strptr,struct in_addr *addrptr);
inet_addr()
字符串->網(wǎng)絡(luò)字節(jié)序并且返回地址
功能同上,返回轉(zhuǎn)換后的地址。
in_addr_t inet_addr(const char *strptr);
inet_ntoa()
網(wǎng)絡(luò)字節(jié)序->字符串
將32位網(wǎng)絡(luò)字節(jié)序二進制地址轉(zhuǎn)換成點分十進制的字符串。
char *inet_ntoa(stuct in_addr inaddr);
3)端口號
同一臺主機上區(qū)分不同任務(wù)的標(biāo)識
一臺主機接收到的數(shù)據(jù)包應(yīng)該轉(zhuǎn)交給哪個任務(wù)來處理
類型:unsigned short (1~65536)
保留端口 1~1023
系統(tǒng)分配端口 1024~5000
自己分配端口 5001~65536
4)字節(jié)序(大小端)
小端存儲:低字節(jié)數(shù)據(jù)存在低地址,高字節(jié)數(shù)據(jù)存儲在高地址
? 先存fd
大端存儲:低字節(jié)數(shù)據(jù)存在高地址,高字節(jié)數(shù)據(jù)存儲在低地址
? 先存fa
unsigned int a = 0xfafbfcfd
fa高字節(jié)數(shù)據(jù)
fd低字節(jié)數(shù)據(jù)
/*===============================================
* 文件名稱:zijiexu.c
* 創(chuàng) 建 者:memories
* 創(chuàng)建日期:2023年05月18日
* 描 述:
================================================*/
地址由低到高存儲,如果存的是fd則是小段存儲
#include <stdio.h>
int main(int argc, char *argv[])
{
unsigned int a = 0xfafbfcfd;
unsigned char *p = (unsigned char*)&a;
printf("*p=%x\n",*p);//%x表示十六進制
return 0;
}
hqyj@ubuntu:~/5.18$ gcc zijiexu.c
hqyj@ubuntu:~/5.18$ ./a.out
*p=fd
網(wǎng)絡(luò)傳輸統(tǒng)統(tǒng)使用大端序,所以大端序也稱為網(wǎng)絡(luò)字節(jié)序文章來源:http://www.zghlxwxcb.cn/news/detail-449953.html
主機一般使用小端序,所以小端序也稱為主機字節(jié)序文章來源地址http://www.zghlxwxcb.cn/news/detail-449953.html
網(wǎng)絡(luò)字節(jié)序和主機字節(jié)序的轉(zhuǎn)換
主機字節(jié)序到網(wǎng)絡(luò)字節(jié)序
u_long htonl (u_long hostlong);
u_short htons (u_short short);
網(wǎng)絡(luò)字節(jié)序到主機字節(jié)序
u_long ntohl (u_long hostlong);
u_short ntohs (u_short short);
2.TCP網(wǎng)絡(luò)編程框架
類似于app是客戶端,app中的內(nèi)容是服務(wù)器提供的
***服務(wù)器(server)流程***
socket ---- 創(chuàng)建套接字,兩者都要創(chuàng)建
bind ---- 綁定本機地址和端口
listen ---- 設(shè)定監(jiān)聽套接字,檢測是否有客戶端訪問服務(wù)器
accept ---- 接收客戶端的連接,并生成通信套接字
read/write() ---- 接收/發(fā)送數(shù)據(jù)
close() ---- 關(guān)閉套接字
-----------------------------------------------------
***客戶端:client***
socket ---- 創(chuàng)建套接字,兩者都要創(chuàng)建
connect ---- 主動連接服務(wù)器
write/read() ---- 發(fā)送/接收數(shù)據(jù)
close() ---- 關(guān)閉套接字
3.網(wǎng)絡(luò)編程接口
1)socket()
作用:創(chuàng)建套接字
函數(shù):
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
參數(shù):
domain:地址族:AF_INET:IPv4 internel protocol
type:套接字類型
SOCK_STREAM:流式套接字 TCP
SOCK_DGRAM:數(shù)據(jù)報套接字 UDP
protocol:0
返回值:
成功:套接字文件描述符
失?。?span id="n5n3t3z" class="token operator">-1,并設(shè)置error
2)bind()
作用:綁定本機地址和端口
函數(shù):
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
參數(shù):
sockfd:套接字文件描述符
addr:地址結(jié)構(gòu)體
addrlen:地址長度
返回值:
成功:0
失敗:-1,并設(shè)置error
地址結(jié)構(gòu):
struct sockaddr { //通用地址
sa_family_t sa_family;
char sa_data[14];
}
struct sockaddr_in { //IPv4地址結(jié)構(gòu)
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 { //網(wǎng)絡(luò)字節(jié)序
uint32_t s_addr; /* address in network byte order */
};
例如:
//用IPv4結(jié)構(gòu)體
struct sockaddr_in srvaddr;
memset(&srvaddr,0,sizeof(srvaddr));
srvaddr.sin_family = AF_INET;//指定地址族為IPv4的地址
srvaddr.sin_port = htons(6666);//端口號
srvaddr.sin_addr.s_addr = inet_addr("192.168.2.84");//將點分式的字符串轉(zhuǎn)化32位的網(wǎng)絡(luò)字節(jié)序
bind(sockfd,(struct sockaddr*)&srvaddr,sizeof(srvaddr));
3)listen
作用:設(shè)置監(jiān)聽套接字
函數(shù):
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int listen(int sockfd, int backlog);
參數(shù):
sockfd:套接字描述符
backlog:監(jiān)聽隊列長度(>0)
返回值:
成功:0
失?。?span id="n5n3t3z" class="token operator">-1,并設(shè)置error
4)accept()
作用:接收客戶端的連接,并生成通信套接字
函數(shù):
#include <sys/types.h> /* See NOTES */ #include <sys/so
cket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
參數(shù):
sockfd:套接字文件描述符
addr:客戶端地址結(jié)構(gòu)體
addrlen:客戶端地址長度
當(dāng)不需要知道連接的客戶端是誰時,第2,3參數(shù)都可以設(shè)置NULL
返回值:
成功:連接成功的通信套接字
失?。?span id="n5n3t3z" class="token operator">-1,并設(shè)置error
服務(wù)器套接字:
監(jiān)聽套接字(普通套接字轉(zhuǎn)為監(jiān)聽套接字):用于監(jiān)聽、連接
通信套接字:用于通信(發(fā)送、接收)
/*===============================================
* 文件名稱:server.c
* 創(chuàng) 建 者:memories
* 創(chuàng)建日期:2023年05月18日
* 描 述:
================================================*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
//1.創(chuàng)建套接字
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
perror("socket");
return -1;
}
printf("socket-----------------\n");
//2.綁定本機地址和端口
//用IPv4結(jié)構(gòu)體
struct sockaddr_in srvaddr;
memset(&srvaddr,0,sizeof(srvaddr));
srvaddr.sin_family = AF_INET;//指定地址族為IPv4的地址
srvaddr.sin_port = htons(5429);//端口號
srvaddr.sin_addr.s_addr = inet_addr("192.168.2.84");//將點分式的字符串轉(zhuǎn)化32位的網(wǎng)絡(luò)字節(jié)序
if(0 > bind(sockfd,(struct sockaddr*)&srvaddr,sizeof(srvaddr)))
{
perror("bind");
return -1;
}
printf("bind-----------------\n");
//3.設(shè)置監(jiān)聽套接字
if(0>listen(sockfd,5))//必須寫大于1的整數(shù)
{
perror("listen");
return -1;
}
printf("listen-----------------\n");
//4.接受客戶端的連接,并生成通信套接字
int connfd = accept(sockfd,NULL,NULL);
if(connfd < 0)
{
perror("accept");
return -1;
}
printf("accept-----------------\n");
//5.與客戶端通信
int ret;
char buf[1024];
while(1)
{
memset(buf,0,sizeof(buf));
ret = read(connfd,buf,sizeof(buf));
if(ret < 0)
{
perror("read");
break;
}
else if(ret == 0)
{
printf("write close\n");
break;
}
printf("recv:%s\n",buf);
if(0 > write(connfd,buf,ret))
{
perror("write");
return -1;
}
}
//6.關(guān)閉套接字
close(sockfd);
close(connfd);
return 0;
}
/*===============================================
* 文件名稱:client.c
* 創(chuàng) 建 者:memories
* 創(chuàng)建日期:2023年05月18日
* 描 述:
================================================*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
int main(int argc, char *argv[])
{
//1.創(chuàng)建套接字
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
perror("socket");
return -1;
}
printf("sockfd:%d\n",sockfd);
printf("socket------------\n");
//2.主動連接服務(wù)器
struct sockaddr_in sockst;
sockst.sin_family = AF_INET;
sockst.sin_port = htons(5429);
sockst.sin_addr.s_addr = inet_addr("192.168.2.84");
int conn = connect(sockfd,(struct sockaddr*)&sockst,sizeof(sockst));
if(conn <0)
{
perror("connect");
return -1;
}
while(1)
{
char buf[1024]={0};
fgets(buf,sizeof(buf),stdin);
write(sockfd,buf,strlen(buf));
if(strncmp(buf,"quit",4)==0)
{
break;
}
}
//3.關(guān)閉套接字通信
close(sockfd);
return 0;
}
hqyj@ubuntu:~/5.18$ gcc client.c
hqyj@ubuntu:~/5.18$ ./a.out
sockfd:3
socket------------
你好
??
hqyj@ubuntu:~/5.18$ gcc server.c
hqyj@ubuntu:~/5.18$ ./a.out
socket-----------------
bind-----------------
listen-----------------
accept-----------------
recv:你好
recv:??
到了這里,關(guān)于socket套接字通信 TCP傳輸控制協(xié)議/IP網(wǎng)絡(luò)協(xié)議 5.18的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!