Linux的网络开发

Linux的网络开发

OSI开发系统互联模型:

![OSI](https://img-blog.csdnimg.cn/20201023191557681.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwODM0MDI=,size_16,color_FFFFFF,t_70#pic_center)

高层:应用层,表示层,会话层
底层:传输层,网络层,数据链路层,物理层

TCP/IP协议族体系结构

TCP/IP协议是Internet上的工业标准插入图片描述
一共有四层:应用层,传输层,网络层,网络接口和物理层

网络接口和物理层:屏蔽硬件差异
网络层:端到端的传输
传输层:数据交给任务处理
应用层:处理

TCP协议的特点
1.面向连接的可靠性传输协议
TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供很高的可靠性通信(即数据无误,无丢失,无重复到达的通信)
对于可靠传输,判断丢包,误码靠的是TCP的段编号以及确认号。TCP为了保证报文传输的可靠,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。

2.面向字节流
TCP不像UDP一样那样一个个报文独立地传输,而是在不保留报文边界的情况下以字节流方式进行传输。

3.仅支持单播
每条TCP传输连接只能有两个端点,只能进行点对点的数据传输,不支持多播和广播传输方式。

适用情况:
1 适合于对传输质量要求比较高,以及传输大量数据的通信
2 在需要可靠数据传输的场合,通常使用TCP协议
3 MSN/QQ等即时通讯软件的用户登录账户管理相关功能采用TCP协议

UDP协议的特点

1.面向无连接的不可靠性传输协议
UDP(User Datagram Protocol)用户数据报协议,是不可靠的无连接协议。在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。

2.有单播,多播,广播的功能
UDP不止支持一对一的传输方式,同样支持一对多,多对多,多对一的方式,也就是说UDP提供了单播,多播,广播的功能
3.UDP是面向报文的

发送方的UDP对应用程序交下来的报文,在添加首部后就下交给IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留在这些报文的边界。因此,应用程序必须选择合适大小的报文。

适用情况:
1 发送小尺寸的数据(如对DNS服务器进行IP地址查询时)
2 在接收到数据,给出应答比较困难的网络中使用UDP(如:无线网络)
3 适合于广播/组播式通信中
4 MSN/QQ等即时通讯软件的点对点文本通讯以及音视频通讯通常采用UDP协议
5 流媒体,VOD,Voip,IPTV等网络多媒体服务中通常采用UDP方式进行实时数据传输

Socket简介
Socket
–是一个编程接口
–是一种特殊的文件描述符
– 面向连接也面向无连接

可以对它执行IO操作的函数,read(),write(),close()等;
socket代表网络编程的一种资源

Socket类型
1.流式套接字(SOCK_STREAM)
–提供了一个面向连接,可靠的数据传输服务,数据无差错,无重复的发送且按发送顺序接收.内设置流量控制,避免数据流淹没慢的接受方。数据被看作是字节流,无长度限制。

2.数据报套接(SOCK_DGRAM)
–提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失,重复,顺序发送可能乱序接受

3.原始套接字(SOCK_RAW)
–可以对较低层次协议如IP,ICMP直接访问

TCP编程模型
在这里插入图片描述
server:socket申请到文件描述符->bind->listen->accept
client:socket申请到文件描述符->connect

UDP编程模型
在这里插入图片描述
server:socket申请到文件描述符->bind->收发数据
client:socket申请到文件描述符->收发数据

IO复用

服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种:

(1)同步阻塞IO(Blocking IO):即传统的IO模型。

(2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非Java的NIO(New IO)库。

(3)IO多路复用(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。

(4)异步IO(Asynchronous IO):即经典的Proactor设计模式,也称为异步非阻塞IO。在这里插入图片描述
在这里插入图片描述

非阻塞IO模式非阻塞IO

非阻塞模式的实现在这里插入图片描述

多路复用IO在这里插入图片描述

IO机制讲解 —来自狮小白
https://blog.csdn.net/baixiaoshi/article/details/48708347?utm_source=copy

epoll的优点:
1、没有最大并发连接的限制,能打开的FD的上限远大于1024(1G的内存上能监听约10万个端口);
2、效率提升,不是轮询的方式,不会随着FD数目的增加效率下降。只有活跃可用的FD才会调用callback函数;
即Epoll最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,Epoll的效率就会远远高于select和poll。
3、 内存拷贝,利用mmap()文件映射内存加速与内核空间的消息传递;即epoll使用mmap减少复制开销。
select、poll、epoll 区别总结:
1、支持一个进程所能打开的最大连接数
2、FD剧增后带来的IO效率问题
3、 消息传递方式
select
内核需要将消息传递到用户空间,都需要内核拷贝动作
poll
同上
epoll
epoll通过内核和用户空间共享一块内存来实现的。
总结:
综上,在选择select,poll,epoll时要根据具体的使用场合以及这三种方式的自身特点。
1、表面上看epoll的性能最好,但是在连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好,毕竟epoll的通知机制需要很多函数回调。

select的几大缺点:
(1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大
(2)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大
(3)select支持的文件描述符数量太小了,默认是1024

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值