1.1 网络常识
1)网络的7层网络协议
ISO按照逻辑划分出来7层网络协议
应用层:和应用程序打交道的,进行数据的交互
表示层:将应用程序中的数据按照规则封装起来。
会话层:聊天,对话的意思,控制会话的开始和结束等
传输层:用于数据交换的通道
网络层:通过具体的网络传送数据
数据链路层:对具体的信息进行编码转换等等。
物理层:路由器和交换机等
2)常见的协议
TCP 传输控制协议,面向连接的协议
UDP 用户数据报协议 ,面向无连接的协议
IP 网络协议 ,信息传递机制
3)IP地址
IP地址是Internet中唯一的地址标识,一般都是一个32位的整数(IPV4),也有128位整数(ipv6)
将ip地址中的每一个字节转换为十进制,采用.隔开,这种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的端口号一般被系统占用,比如:HTTP:80 FTP:21
如:
0x12345678
=> 按照内存地址从低到高依次存放:
0x12 0x34 0x56 0x78
低位内存地址存放高位数据:大端系统
低位内存地址存放低位数据:小端系统
字节序只要有两种:网络字节序 和 主机字节序
主机字节序一般表示当前主机的字节顺序
网络字节序一般表示不同主机之间的统一字节序
2.0
使用socket进行通信,soket -套接字,实际上就是一个逻辑通信载体
2.1一对一通信的模型
服务器端:
1)创建socket,使用socket函数
2)准备一个通信地址,使用结构体类型
3)将socket和通信地址进行绑定,使用bind函数
4)进行通信,使用read/write函数
5)关闭socket,使用close函数
客户端:
1)创建socket,使用socket函数
2)准备一个通信地址,使用结构体类型
3)将socket和通信地址进行连接,使用connect函数
4)进行通信,使用read/write函数
5)关闭socket,使用close函数
2.2 相关函数的介绍1)socket函数
int socket(int domain,int type,int protocol)
第一个参数:域/协议簇 AF_UNIX AF_LOCAL ----本地通信
AF_INET --使用IPV4进行通信
AF_INET6 --使用IPV6进行通信
第二个参数:指定协议
SOCK_STREAM --使用数据流的形式通信,TCP协议
SOCK_DGRAM --使用数据报的形式通信,UDP协议
第三个参数:指定特殊的协议,直接给0
返回值:成功会返回文件描述符,失败会返回-1
函数功能:创建用于交流的端点,通信载体
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;//域,协议簇
char sa_data[14];//地址
};
注意:此结构体一般很少直接使用,而绝大多数都是作为函数的参数去使用
//b 本地通信的结构体类型#include
struct sockaddr_un
{
sa_family sun_family;//协议簇
char sun_path[];//socket文件的路径};
//c 网络通信的结构体类型
struct sockaddr_in
{
sa_family_t sin_family;//协议簇
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类型参数的主机字节序,转换为网络字节序,通过返回值返回转换之后的结果
6)inet_addr函数
in_addr_t inet_addr(cons char *cp)
功能:将参数指定的点分十进制形式的ip地址转换网络字节序的整数地址
---------------------------------------------------------------------------------------------------------
2.3基于TCP通信模型
服务器端:
1)创建socket,使用socket函数,SOCK_STREAM
2)准备通信地址,struct sockaddr_in结构体
3)使用绑定,使用bind函数
4)监听,使用listen函数
5)接收客户端的连接请求,使用accept函数
6)进行通信,使用read/write函数
7)关闭socket,使用close函数
客户端:
1)创建socket
2)准备通信地址
3)进行连接
4)进行通信
5)关闭socket
2.4 相关函数
1)listen函数
int listen(int sockfd,int backlog);
第一个参数:socket描述符
第二个参数:允许访问的最大连接数,即将连接的队列最大值
返回值:成功返回0,失败返回-1
功能:监听socket上的连接请求
2)accept函数
int accept(int sockfd,struct sockaddr* addr,socken_t *addrlen);
第一个参数:sockt描述符
第二个参数:用于保存所接受的客户端的地址
第三个参数:地址的大小
返回值:成功返回新的文件描述符,失败返回-1
函数功能:响应客户端的连接请求
注意:使用socket函数创建的描述符主要用于等待客户端的连接,不参与信息的交互,而accept函数返回的描述符主要用于针对当前客户端的信息交互通道
3)inet_ntoa函数
char *inet_ntoa(struct in_addr in);
功能:将网络通信结构体中的第三个成功类型的ip地址 转换 字符串形式的ip地址
------------------------------------------------------------------------------------------------------
UDP
1.1概念
TCP 传输控制协议 ,面向连接的协议
UCP 用户数据报协议 非面向连接的协议
1.2区别
1)TCP是一种面向连接的协议,在通信的全程保持连接
优点:可以保证数据的完整性和安全性以及准确性,并且可以重发一切数据
缺点:服务器压力比较大,资源占用率比较高
2)UDP是一种非面向连接的协议,在发送数据时连一下,不包吃全程连接
优点是:服务器压力比较小,资源占用率比较低
缺点是:不保证数据的安全性和完整性以及准确性
1.3 基于UDP通信的模型:
服务器:
1)创建socket,使用socket函数
2)准备通信地址,使用struct sockaddr_in结构体
3)绑定socket和通信地址,使用bind函数
4)通信,使用read/write/sendto/recvfrom函数
5)关闭socket函数,使用close函数
客户端:
1)创建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描述符
第二个参数:将要发送的数据的首地址
第三个参数:发送的数据大小
第四个参数:发送的方式,默认给0
第五个参数:发送到的目标地址
第六个参数:目标地址的大小
返回值:成功返回发送的数据大小,失败返回-1
函数功能:向指定的目标地址发送数据
注意: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描述符
第二个参数:存放数据的缓冲区首地址
第三个参数:读取的数据大小
第四个参数:默认给0即可
第五个参数:存放客户端地址信息的
第六个参数:客户端地址的大小
返回值:成功返回读取的数据大小,失败返回-1
函数功能:接受指定的消息