一、网络基础
1.网络体系结构
定义:是指网络的分层模型和每层所使用的协议的集合
有两种体系结构:OSI和TCP/IP
OSI七层模型(理想化模型):应用层 表示层 会话层 传输层 网络层 数据链路层 物理层
TCP/IP四层模型(实际使用):应用层 传输层 网络层 物理层
对于以上两种模型来说,除了物理层没有协议,其他各层都有对应的协议去完成该层相应的功能
2.IP地址
IP地址:在网络中唯一标识一台主机的符号
唯一标识一台主机的符号是MAC地址(硬件地址)
现在使用的IP地址是那个协议维护的IP地址?IPV4
IPV4维护的IP地址宽度是4个字节
4个字节的IP地址可表示的地址范围是:0000 0000*4~1111 1111*4
可以分成5类:
A类:1.0.0.1~126.255.255.254
B类:127.0.0.1~191.255.255.254
C类:192.0.0.1~223.255.255.254(用户地址)
D类:224.0.0.1~239.255.255.254(组播&多播地址)
E类:240以后
C类=24bit网络号+8bit的主机号(2^8=256)(255/0/1不能用)
3.网络协议
定义:通信双方对某种通信规则的约定
协议:通用的网络协议 TCP/IP协议栈(OS)
行业专用协议 协议开发
自定义协议
4.端口号
作用:用来区分应用进程
端口号是一个无符号的整数,范围:1~65535
1~1023已经被占用
5.字节序
主机字节序:是指不同的CPU主机存储多字节整数的方式,有大端序主机和小端序的主机
大端序主机:数据的高字节存放在内存的低地址ns
小端序主机:数据的高字节存放在内存的高地址
主机字节序——>网络字节序
Htonl
Htons
多字节整数发送前要从主机字节序转化成网络字节序,以适配对端的网络主机
网络字节序:大端序
二、基于TCP协议的网络客户端和服务端模型
服务端:socket->bind->listen->accept->IO函数
客户端:socket->connect->IO函数
Day2
1.基于UDP协议的客户端和服务端模型
服务端:socket->bind->IO函数
客户端:socket->IO函数
两种网络编程框架的对比:
1.1 特点
TCP:使用流式套接字(SOCK_STREAM)
提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内部设置了流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。
UDP:使用数据报套接字(SOCK_DGRAM)
提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。
原始套接字(SOCK_RAW)--ping.c
可以对较低层次协议如IP、ICMP直接访问
2.协议
TCP(传输控制协议):
TCP是一个可靠的,全双工的,有序的,面向链接的字节流通信的协议。
为什么可靠:
1.丢失的数据包重发(能保证拿到数据)
2.错误的数据包重发 (保证能拿到正确的数据)
3.数据的有序到达(因为对每个数据包进行了编号)(拆包,编号)
4.有较为健全的校验机制(为了保证数据的正确性)
5.支持面向连接(保证通信线路的畅通)-->三次握手
6.有信道拥堵控制(通过一种对于信道拥堵解决的方案,来提高转发效率)
为什么有序(有序列号):
1.保证数据都能传输给对端,不至于当传输的数据 > 信道带宽,导致数据丢弃。
2.通过序号,在对端主机上可以拼接成原本的数据包
3.保证数据传输的可靠性
如何面向链接:
三次握手和四次挥手
UDP:
UDP(The User Datagram Protocol):无连接的数据报协议,别名"不可靠的协议"
<1>使用校验和来实现错误侦测
<2>UDP常用于媒体流的传输(音频、视频、等),在这种情况下,实时性比可靠性更重要
<3>UDP也常用于简单的查询/回应程序,例如DNS查找,在这种情况下,建立可靠传输的你买了可能会资源消耗太大
<4>UDP是一种实时传输协议(Real-time Transport Protocol),这种协议通常用来传输实时数据例如:音视频流
不可靠的原因:
1.非面向连接(不关心接收端是否在线)--》没有三次握手
2.丢包不重发
3.错误的包不重发
4.没有信道拥堵控制
5.有一个最大传输长度限制
6.没有严格的校验机制
如何抉择使用TCP还是UDP?
1.可靠性
2.实时性
可靠性 > 实时性: TCP
可靠性 < 实时性: UDP
2.3 IO多路复用
思想:
1.构建一张文件描述符集合表,表的大小为1024bit,这些bit分别对应的是1024个文件描述符,这些bit位中存放的数据表示的是该描述符对应的IO通道是否有数据发生的(1 有数据;0 没有数据)
int a[32]-->1024bit
2.使用select检测程序关心的文件描述符对应的通道是否有数据发生?若有数据发生,将文件描述符的相应bit位置1,同时将其他的bit位置0,并返回监测到的文件描述符的通道的个数
3.对检测的结果做出判断或响应。
循环遍历文件描述符集合表,查看集合表中关心的描述符对应的bit位是否为1?如果是1,响应这路IO;如果是0,继续循环
int select(int n,fd_set *read_fds,fd_set *write_fds,fd_set *)
作用:监控文件描述符对应的IO通道是否有数据
N:最多监控多少个通道
Day3
1.服务器模型
服务器:可以服务于多个客户端的服务程序
种类:循环服务器和并发服务器
循环服务器:指的是该服务程序可以服务多个客户端,但是在同一时刻只能服务于一个客户端
并发服务器:指的是该服务器可以在同一时刻服务与多个服务器
在linux系统中,实现并发服务器,可以使用:多进程 多线程 select poll epoll
并发服务器:
1.1多进程
思想:主进程专门用于连接多个客户端,若有一个客户端接进来,就创建一个子进程来负责该客户端的业务数据的收发
1.2多线程
思想:主进程专门用于连接多个客户端,若有一个客户端接进来,就创建一个子线程来负责该客户端的业务数据的收发
1.3select
思想:
1.构建一张文件描述符集合表,表的大小为1024bit,这1024个bit位用来存放1024个文件描述符对应的IO通道是否有数据发生,有数据发生的通道对应的BIT位置1,没数据发生的通道对应的BIT位置0-->空表
2.使用select函数去监控关注的文件描述符对应的通道是否有数据发生,若监控到一路或多路通道有数据发生,则返回通道的路数同时将有数据发生的通道对应的文件描述符集合表的相应BIT位置1,同时将其他BIT位置0(监控 置位)
3.对文件描述符集合表中对应的置位结果做出判断和响应。使用FD_ISSET去判断关心的描述符是否被置位了,返回真,那么响应这路IO;若没有被置位,返回假,不做处理
int select(int nfds,fd-set*readfds,fd-set*writefds,fd_set*exceptfds,struct timeval *timeout);
参数1:监控的最大通道个数
参数2:指向读文件的描述符集合表的指针
参数3:指向写文件描述符集合表的指针
参数4:指向异常文件描述符集合表的指针
参数5:timeout=0,只检测文件描述符集合的状态,然后立即返回
Timeout=NULL;select函数阻塞监控关注的文件描述符通道
Timeout=时间,时间到达之前select函数一直阻塞监控,时间到,结束监控
Day4
1.网络服务器超时检测
1.select超时设置->select
int select(int nfds,fd_set*readfds,fd_set*writefds,fd_set*exceptfds,struct timeval *timeout);
Timeout:超时时间,若在指定的时间内没有客户端连接该服务器,服务器会一直阻塞,当指定时间到时,没有客户端连接,select阻塞时间到,返回0。
2.使用信号和alarm
Signal(信号,信号对应的新的处理函数)--》set
Sigaction(信号,NULL,&act) --->/get获取信号对应的旧的处理动作
Sigaction(信号,&act,NULL)-->set 设置信号对应的新的处理动作
void handler(int signo) { return; }-->新的处理函数
struct sigaction act;--》信号对应的处理对象
sigaction(SIGALRM, NULL, &act);--》获取信号旧的处理对象信息
act.sa_handler = handler;--》设置对象新的处理函数
act.sa_flags &= ~SA_RESTART;--》设置对象的重启标志为不重启
sigaction(SIGALRM, &act, NULL);--》设置信号对应的新对象
alarm(5);--》启动定时器,定时5S
if (recv(,,,) < 0) ……
3.设置socket属性
Setsockopt:设置套接字的属性
Getsockopt:获取套接字的属性
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv,sizeof(tv));
2.广播&组播
在网络中,数据包的发送方式有三种:单播 广播 组播
广播:数据发送方将数据包发送给了局域网中的所有的主机。
广播地址通常是这个网段中最大的IP地址,
例如192.168.12.255
或者是255.255.255.255
广播发送:socket-->setsockopt(允许广播发送) --》sendto(广播地 址) udp_client.c
广播接收:socket-->bind-->recvfrom udp_server.c
组播:数据发送方将数据包发送到了某个主机的组播组里,加入 到该组播组的所有的主机能够接收到组播数据
组播地址:224.0.0.1~239.255.255.254
组播发送:socket-->指定目标地址为组播地址--》sendto udp_client.c
组播接收:socket-->加入组播组--》bind->recvfrom
Udp_server.c
3.unix域套接字--》socket文件--》通信介质
unix域:socket文件(使用本地协议创建的socket文件)
用socket函数使用本地协议可以创建一个socket文件,通过该文件能够实现一台主机上两个进程的通信。
unix域套接字有两种:流式套接字 数据报套接字
TCP流式套接字:
使用TCP协议的网络编程框架创建流式套接字文件,该套接字文件可以实现一台主机上两个本地进程的通信。
服务端:socket--》bind-->listen-->accept-->IO函数
客户端:socket-->connect-->IO函数
注意:tcp方式的unix域套接字,类似无名管道,实现双向通信只需要一个文件。可以实现两个不相关进程的通信
UDP数据报套接字:
使用UDP协议的网络编程框架创建数据报套接字
Day5
数据库:是指以同一组织方式将相关的数据组织在一起,并存放在计算机的储存器上的能够为多个用户所共享的文件,该文件与应用程序彼此独立。
在嵌入式领域常见的数据库有:SQLite mySql->SQL语句
SQlite是一个开源的,内嵌的关系型数据库
特点:源码开放 代码精简 免安装 支持SQL语句
1.SQL语句->用作操作数据库的指令
primary key;->主键约束
A 主键值必须是唯一的,用于标识每条记录,如学生的学号
B 主键同时也是一个索引,通过主键查找记录的速度最快
2.代码