网络基础
OSI模型
数据传递过程
应用层协议
传输层协议TCP&UDP
TCP与UDP异同:
1.面向连接&无连接
2.可靠性高&可靠性低(准确性)
3.协议头大(最少20byte最多80byte)&协议头小(固定8byte)
4.传输效率低&效率高
UDP可靠性设计一般在应用层做,包括丢包重传和乱序处理机制。
如果发送数据量过大,会在IP层分片,如果某片丢失,UDP会重传整个数据包
TCP的三次握手
TCP的四次挥手
TCP如何保证可靠性
网络编程
socket套接字
字节序
网络字节序:大端序
主机字节序:取决于CPU架构
网络IO模型
1.阻塞IO(BIO)
缺省情况下,套接字创建后所处的IO模式就是阻塞IO。
对于接收函数,如果对端没有发送数据,接收函数就会阻塞不返回。
对于发送函数,如果发送数据大小大于发送缓冲区剩余空间大小,发送函数就会阻塞不返回。
优点:简单,常用。
缺点:如果对端不发送消息,或者对端崩溃了,接收函数就会挂住不返回,不能处理其他业务。
2.非阻塞IO (NIO)
对于接收函数,如果对端没有发送数据,接收函数会返回错误。
对于发送函数,如果发送数据大小大于发送缓冲区剩余空间大小,发送函数会返回错误。
while (1) {
ret = recv();
if (ret < 0 && errno == EAGAIN) {
// 没有数据可读
continue;
}
// 对读取到的数据做处理
……………
}
优点:可防止进程阻塞在I/O操作上。
缺点:需要循环不停检测是否有数据,很浪费CPU资源。
3.信号驱动IO
void sig_handler(int signo)
{
recv();
}
signal(SIGIO, sig_handler);
4.IO多路复用
Linux进程默认能打开1024个文件,对应1024个文件描述符。
文件描述符的特点:
a)文件描述符都是非负的整数
b)文件描述符一般从小到大分配
IO多路复用的实现方式:
a)select
b)poll
c)epoll
select的IO多路复用的思想分为三步:
1.创建一个文件描述符集合,集合里有1024个bit位,对应1024个文件描述符。每一个文件描述符对应一路IO通道。将关注的.文件描述符加入文件描述符集合,就是将文件描述符对应的bit位置1,其余文件描述符对应的bit位置为0。
2.调用select监控文件描述符集合,如果关注的文件描述符上有数据发生,将文件描述符对应的bit位置1,其余bit位置0,返回有数据发生的文件描述符的数量。
如果关注的文件描述符上都没有数据发生,select阻塞不返回。
3.循环遍历select返回的文件描述符集合,用FD_ISSET判断关注的文件描述符上是否有数据发生,如果有数据发生,处理对应文件描述符IO通道上的数据。
服务器类型
循环服务器
TCP循环服务器一次只能接入一个客户端,为一个客户端提供消息处理服务,该客户端退出之前,其他他客户端无法接入服务器,服务器不能为其提供服务。TCP循环服务器不常用。
listenFd = socket();
bind(listenFd, …);
listen(listenFd, …);
while (1) {
// 接受客户端的连接
connFd = accept(listenFd, …);
// 消息处理
while (1) {
recv(connFd, …);
process();
send(connFd, …);
}
}
2)UDP循环服务器
只要UDP循环服务器对每个客户端消息处理的时间不长,UDP循环服务器可以为多个客户端提供服务,UDP循环服务器可以使用。
sockFd = socket();
bind(sockFd, …);
// 循环处理消息
while (1) {
recvfrom(sockFd, …);
process(sockFd, …);
sendto(sockFd, …);
}
并发服务器(进程并发,线程并发)
1)TCP多线程并发服务器
当客户端连接到服务器时,服务器为该客户端分配独立的线程,为其提供服务。当客户端断开与服务器的连接时,服务器回收为该客户端分配的线程资源。