linux 网络模型

linux 网络模型
一、基本概念:
1、多路复用: 一根网线可同时传递多个信号(时分或频分复用)
2、linux内核的作用:管理、调度进程,管理内存,管理外设(文件描述符)、驱动程序、网络(先管理再分发)
3、linux中所有外设都是fd(文件描述符),socket也是一种文件
4、非阻塞IO:机器中只有一个网卡,在多路复用环境下,应用程序需要进行网络IO,这时如果网卡还没准备好,应用程序有2个选择:
1》等着网卡可用, 如read时网卡上有数据,write时输出缓冲有空间;这时进程会停下来,所以叫阻塞IO
2》先问一下网卡是否可用,不能用就先处理后面的事情,(非阻塞IO)
5、数据缓存:物理设备转动一下很慢,所以可以在内存中组织一大块数据,在需要时一次性转动设备,之后一次性写出,这样比每次都转动、写出要快。
6、网络缓存:一个socket代表一个网络对端,server会同时处理多个socket,每个socket上有自己的数据;另外,一个OS上多个程序共享一个网卡,这时
就需要网络缓存。
1》网卡在内存中的缓冲区(这个和其他块设备是一样的),对于应用程序而言,将报文复制到此缓冲区就完成了写操作
2》socket内缓存一个报文,用于读、写、处理等操作(复制到socket内就完成了读的操作)
3》对于应用程序而言, 写到缓冲区就意味着写成功,读到缓存区就意味着读成功(网络双方是异步的关系)

二、select实现原理:
1、遍历每个fd(socket)调用驱动的poll函数
2、poll将此进程挂在等待队列,并返回此资源是否可用,
3、遍历结束时如果没有可用fd,(且未超时、无中断信号)阻塞进程,一直到timeout或者有资源可用
4、当任何一个fd可用时,唤醒此进程


while(true)
{
select();
ret = select(maxsock + 1, &fdsr, NULL, NULL, &tv);
}

三、epoll实现原理
1、将需要监听的fd放进来
2、有状态变化或有数据可用时通知应用程序(内核使用回调函数而不是轮询每个fd,这样是空间换时间(设置函数指针是要用空间的))

四、select、epoll区别
内核在监听状态时的处理方式不同,select是依次轮询每个fd,epoll是每个fd自己在适当的时候回调一下。

五、网络程序基本逻辑

while(true)
{
poll_event(); // 内核检查网络状态变化的事件
process_event();// 依次处理事件
}

六、如何选择网络模型?
1、短连接、开关频繁: 多线程, 长连接时会消耗太多内存(线程的执行栈)
2、长连接、开关频繁:epoll(有效取event) + 线程队列(有效利用cpu), 但是这时要维护连接状态(断线?重连?),而且要注意异步时的报文解析
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值