1.1 網絡常識
1)網絡的7層網絡協(xié)議
ISO按照邏輯劃分出來7層網絡協(xié)議
應用層:和應用程序打交道的,進行數據的交互
表示層:將應用程序中的數據按照規(guī)則封裝起來。
會話層:聊天,對話的意思,控制會話的開始和結束等
傳輸層:用于數據交換的通道
網絡層:通過具體的網絡傳送數據
數據鏈路層:對具體的信息進行編碼轉換等等。
物理層:路由器和交換機等
2)常見的協(xié)議
TCP 傳輸控制協(xié)議,面向連接的協(xié)議
UDP 用戶數據報協(xié)議 ,面向無連接的協(xié)議
IP? 網絡協(xié)議 ,信息傳遞機制
3)IP地址
IP地址是Internet中唯一的地址標識,一般都是一個32位的整數(IPV4),也有128位整數(ipv6)
將ip地址中的每一個字節(jié)轉換為十進制,采用.隔開,這種IP地址的表示方法叫做:點分十進制表示法
IP地址分為網絡號和主機號,將ip地址分為以下四類地址:
A類:0 + 7位網絡地址 + 24位本地地址
B類:10 +14位網絡地址 +16位本地地址
C類:110+21為網絡地址 +8位本地地址
D類:1110+28位多播地址
子網掩碼是采用點分十進制表示法進行表示,主要用于指名一個IP地址中哪些位表示網絡地址,以及哪些位表示主機地址,不能單獨使用,必須和IP地址搭配使用。
如:IP地址:192.168.182.48
子網掩碼:255.255.255.0? &
-------------------------------
192.168.182網絡地址
其中48表示主機號
可以判斷兩個不同的IP地址是否在同一個子網中
MAC地址:電腦上的網卡地址,物理地址
MAC地址也就是物理地址,也就是網卡的地址,可以通過綁定Mac地址來限制上網的設備
4)端口號
IP地址可以定位具體的主機,端口號可以用于定位具體的某個進程
端口號是unsigned short類型,范圍是 : 0 - 65535,其中0 - 1024的端口號一般被系統(tǒng)占用,比如:HTTP:80 FTP:21
如:
0x12345678
=> 按照內存地址從低到高依次存放:
0x12??? 0x34 ? 0x56?? 0x78
低位內存地址存放高位數據:大端系統(tǒng)
低位內存地址存放低位數據:小端系統(tǒng)
字節(jié)序只要有兩種:網絡字節(jié)序 和 主機字節(jié)序
主機字節(jié)序一般表示當前主機的字節(jié)順序
網絡字節(jié)序一般表示不同主機之間的統(tǒng)一字節(jié)序
2.0
使用socket進行通信,soket -套接字,實際上就是一個邏輯通信載體
2.1一對一通信的模型
服務器端:
1)創(chuàng)建socket,使用socket函數
2)準備一個通信地址,使用結構體類型
3)將socket和通信地址進行綁定,使用bind函數
4)進行通信,使用read/write函數
5)關閉socket,使用close函數
客戶端:
1)創(chuàng)建socket,使用socket函數
2)準備一個通信地址,使用結構體類型
3)將socket和通信地址進行連接,使用connect函數
4)進行通信,使用read/write函數
5)關閉socket,使用close函數
2.2 相關函數的介紹1)socket函數
int socket(int domain,int type,int protocol)
第一個參數:域/協(xié)議簇 AF_UNIX AF_LOCAL ----本地通信
AF_INET --使用IPV4進行通信
AF_INET6 --使用IPV6進行通信
第二個參數:指定協(xié)議
SOCK_STREAM --使用數據流的形式通信,TCP協(xié)議
SOCK_DGRAM --使用數據報的形式通信,UDP協(xié)議
第三個參數:指定特殊的協(xié)議,直接給0
返回值:成功會返回文件描述符,失敗會返回-1
函數功能:創(chuàng)建用于交流的端點,通信載體
2)bind函數
int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen_);
第一個參數:socket描述符
第二個參數:準備的通信地址
第三個參數:通信地址的大小
返回值:成功返回0,失敗返回-1
函數功能:將準備的通信地址和sockt進行綁定
3)準備的通信地址類型
//a 通用的通信地址s
struct sockaddr{
sa_family_t sa_family;//域,協(xié)議簇
char sa_data[14];//地址
};
注意:此結構體一般很少直接使用,而絕大多數都是作為函數的參數去使用
//b 本地通信的結構體類型#include
struct sockaddr_un
{??
sa_family sun_family;//協(xié)議簇?
char sun_path[];//socket文件的路徑};
//c 網絡通信的結構體類型
struct sockaddr_in
{
? sa_family_t sin_family;//協(xié)議簇
AF_INETin_PORT_T sin_port;//端口號
struct in_addr sin_addr://ip地址}
struct in_addr
{
in_addr_t s_addr;//ip地}
4)connect函數
int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen);
函數的功能類似于bind函數
5)htons函數#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函數表示將short類型參數的主機字節(jié)序,轉換為網絡字節(jié)序,通過返回值返回轉換之后的結果
6)inet_addr函數
in_addr_t inet_addr(cons char *cp)
功能:將參數指定的點分十進制形式的ip地址轉換網絡字節(jié)序的整數地址
---------------------------------------------------------------------------------------------------------
2.3基于TCP通信模型
服務器端:
1)創(chuàng)建socket,使用socket函數,SOCK_STREAM
2)準備通信地址,struct sockaddr_in結構體
3)使用綁定,使用bind函數
4)監(jiān)聽,使用listen函數
5)接收客戶端的連接請求,使用accept函數
6)進行通信,使用read/write函數
7)關閉socket,使用close函數
客戶端:
1)創(chuàng)建socket
2)準備通信地址
3)進行連接
4)進行通信
5)關閉socket
2.4 相關函數
1)listen函數
int listen(int sockfd,int backlog);
第一個參數:socket描述符
第二個參數:允許訪問的最大連接數,即將連接的隊列最大值
返回值:成功返回0,失敗返回-1
功能:監(jiān)聽socket上的連接請求
2)accept函數
int accept(int sockfd,struct sockaddr* addr,socken_t *addrlen);
第一個參數:sockt描述符
第二個參數:用于保存所接受的客戶端的地址
第三個參數:地址的大小
返回值:成功返回新的文件描述符,失敗返回-1
函數功能:響應客戶端的連接請求
注意:使用socket函數創(chuàng)建的描述符主要用于等待客戶端的連接,不參與信息的交互,而accept函數返回的描述符主要用于針對當前客戶端的信息交互通道
3)inet_ntoa函數
char *inet_ntoa(struct in_addr in);
功能:將網絡通信結構體中的第三個成功類型的ip地址 轉換 字符串形式的ip地址
------------------------------------------------------------------------------------------------------
UDP
1.1概念
TCP 傳輸控制協(xié)議 ,面向連接的協(xié)議
UCP 用戶數據報協(xié)議 非面向連接的協(xié)議
1.2區(qū)別
1)TCP是一種面向連接的協(xié)議,在通信的全程保持連接
優(yōu)點:可以保證數據的完整性和安全性以及準確性,并且可以重發(fā)一切數據
缺點:服務器壓力比較大,資源占用率比較高
2)UDP是一種非面向連接的協(xié)議,在發(fā)送數據時連一下,不包吃全程連接
優(yōu)點是:服務器壓力比較小,資源占用率比較低
缺點是:不保證數據的安全性和完整性以及準確性
1.3 基于UDP通信的模型:
服務器:
1)創(chuàng)建socket,使用socket函數
2)準備通信地址,使用struct sockaddr_in結構體
3)綁定socket和通信地址,使用bind函數
4)通信,使用read/write/sendto/recvfrom函數
5)關閉socket函數,使用close函數
客戶端:
1)創(chuàng)建socket,使用socket函數
2)準備通信地址,使用struct sockaddr_in結構體
3)進行通信,使用read/write/recvfrom/sendto函數
4)關閉socket,使用close函數
1.4相關函數的介紹1)sendto函數
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);
第一個參數:socket描述符
第二個參數:將要發(fā)送的數據的首地址
第三個參數:發(fā)送的數據大小
第四個參數:發(fā)送的方式,默認給0
第五個參數:發(fā)送到的目標地址
第六個參數:目標地址的大小
返回值:成功返回發(fā)送的數據大小,失敗返回-1
函數功能:向指定的目標地址發(fā)送數據
注意:send函數相對于sendto少了目標地址參數,一般用于tcp通信中
2)recvfrom函數
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);
第一個參數:socket描述符
第二個參數:存放數據的緩沖區(qū)首地址
第三個參數:讀取的數據大小
第四個參數:默認給0即可
第五個參數:存放客戶端地址信息的
第六個參數:客戶端地址的大小
返回值:成功返回讀取的數據大小,失敗返回-1
函數功能:接受指定的消息