【网络】网络层IP,数据链路层,高级IO,select、epoll

网络层ip

  • IP=网络号+主机号
  • IP:较大概率将数据从A主机跨网络传送给B主机,IP层不保证可靠性,TCP替你保证呢。
  • 在网络层分片,在网络层组装,因为链路层的传输大小有限。
  • 16位标识:相同分片的标识符一样。把大家聚在一起。
  • 13位片偏移,我的报文的有效载荷在原始报文的有效载荷中的偏移量。将大家组合在一起。
  • 3位标志,1位保留,1位禁止分片,1位更多(为1表示后面还有分片,为0表示没有了)。

数据链路层

IP的最大意义在于路径选择我要从A-B-C。而链路层是解决如何从A-B又是怎么从B-C的。

ARP协议

ARP协议中,有一张主机IP地址和MAC地址的映射表,但当只知道对方IP地址,不知道MAC地址时就要有发现一个局域网指定一台主机MAC地址的能力。
源主机拿着目的IP,将自己的ARP请求的以太网帧首部的目的MAC地址设为全F,代表广播所有人都可以收到。
之后其他主机都将这个ARP请求向上交付,对比目的IP是不是自己,如果不是就丢弃,如果是,就为源主机发送ARP应答,并将自己的MAC地址填写在应答中,而且应答是可以指定发送给谁的,因为你知道哪个MAC地址发给你的。

  • DNS:域名解析成IP地址。
  • ICMP协议:跳过传输层的网络层协议,ping,功能是确认IP包是否成功到达。
  • NAT,解决IP地址不足,地址转化。
  • 代理服务器,负载均衡,安全。

高级IO

IO=等+拷贝

select 的原理以及缺点?

select 是 一种 IO 多路复用技术,它的主旨思想是: 1. 首先要构造一个关于文件描述符的列表,将要监听的文件描述符添加到该列表中,这个文件描述符的列表数据类型为 fd_set,它是一个整型数组,总共是 1024 个比特位,每一个比特位代表一个文件描述符的状态。比如当需要 select 检测时,这一位为 0 就表示不检测对应的文件描述符的事件,为 1 表示检测对应的文件描述符的事件。 2. 调用 select() 系统调用,监听该列表中的文件描述符的事件,这个函数是阻塞的,直到这些描述符中的一个或者多个进行 I/O 操作时,该函数才返回,并修改文件描述符的列表中对应的值,0 表示没有检测到该事件,1 表示检测到该事件。函数对文件描述符的检测的操作是由内核完成的。 3. select() 返回时,会告诉进程有多少描述符要进行 I/O 操作,接下来遍历文件描述符的列表进行 I/O 操作。 select 的缺点: 1. 每次调用select,都需要把 fd 集合从用户态拷贝到内核态,这个开销在 fd 很多时会很大; 2. select之中每次调用 select 都需要在内核轮询遍历传递进来的所有 fd,这个开销在 fd 很多时也很大; 3. select 支持的文件描述符数量太小了,默认是 1024(由 fd_set 决定); 4. 文件描述符集合不能重用,因为内核每次检测到事件都会修改,所以每次在select之前都需要重置; 5. 每次 select 返回后,只能知道有几个 fd 发生了事件,但是具体哪几个还需要遍历文件描述符集合进一步判断。
将fd加入select监控集的同时,还需使用一个数据结构array保存放到select监控集的fd。1、在select返回后,数组作为源数据和fd_set进行FD_ISSET判断。2、select返回后会把以前加入的但并没有发生的fd清空,则每次开始select之前都要重新从array取得fd逐一加入,最开始要记得FD_ZERO,扫描array同时取得fd最大值max_fd,作为select第一个参数。

epoll 的原理

epoll 是一种更加高效的 IO 复用技术,epoll 的使用步骤及原理如下:

  1. 调用 epoll_create() 会在内核中创建一个epoll句柄,构建epoll模型,称之为 epoll 对象,对象里有一棵红黑树,把要关心的fd和事件放入这棵树中,epoll_ctl的增删查改就是对红黑树的操作。还有一个就绪队列,存放检测到数据发送改变的文件描述符信息(双向链表);

  2. 调用 epoll_ctrl() 可以向 epoll 对象中添加、删除、修改要监听的文件描述符及事件;

  3. 调用 epoll_wt() 可以让内核去检测就绪的事件,并将就绪的事件放到就绪列表中并返回,通过返回的事件数组做进一步的事件处理。 epoll 的两种工作模式:

  4. LT 模式(水平触发) LT(Level - Triggered)。并且同时支持 Block 和 Nonblock Socket。在这种做法中,内核检测到一个文件描述符就绪了,然后可以对这个就绪的 fd 进行 IO
    操作,如果不作任何操作,内核还是会继续通知。 底层只要有你的事件就绪了,不管新旧就一直通知你。

  5. ET 模式(边沿触发) ET(Edge - Triggered)是高速工作方式,只支持 Nonblock socket。在这种模式下,只有当事件从无到有,从有到多,才会给你通知一次,除此之外不会多通知你一次。通过这个策略可以倒闭程序眼在应用层一次把数据读取完。epoll
    工作在 ET 模式的时候,必须使用非阻塞套接口,以避免由于一个文件描述符的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。


⭐感谢阅读,我们下期再见
如有错 欢迎提出一起交流

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周周汪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值