一、操作系统
1、混杂模式:是指开启混杂模式的网卡能接收所有经过它的数据流,无论地址是否是它。常用于数据分析、窃听。wireshark也是通过混杂模式抓包的。
2、软中断:操作系统在进行中断处理的时候,会暂时停止响应其它中断请求,这就要求中断处理程序短且快。否则会丢失其它设备的中断请求。
Liunx为了解决这个问题,将中断分为了两部分:上半部分、下半部分。
上半部分:快速处理中断。会暂时关闭中断。
下半部分:延迟处理上半部分没有处理完的部分,以内核线程的方式运行。
举例:网卡收到报文后,硬中断触发内核的中断处理函数。此时内核会暂时屏蔽中断,将网卡数据拷贝到内存中,然后更新硬件寄存器状态,内核再触发软中断,将其他耗时的处理,比如协议解析,交给软中断处理程序处理,
3、网卡收到数据报文后,如何上交?
网线上的物理帧首先被网卡芯片获取,网卡芯片检查CRC,然后去掉物理帧头(前导码、FCS),得到MAC包。网卡芯片*接下来检查MAC地址,如果不一样则丢弃(混杂模式除外)。
抓包无法看到前导码与FCS。
之后网卡将frame拷贝到网卡内部的FIFO缓冲区,触发硬件中断(Linux中是存在ring buffer中)。CPU响应中断请求,调用网卡启动时注册的中断处理函数,中断处理函数发起软中断请求,COU线程暂时关闭硬中断,将frame拷贝到内存skb中,交给内核处理(上交的数据是有MAC头的)。
套接字数据缓存(socket buffer):在Linux内核中表示为struct sk_buff,是Linux内核中数据包管理的基本单元。各层协议都依靠这个结构体完成信息的传递,但是解封装的过程中,改变的是指针,而不是真的删除了头部数据。(节省了CPU开销)。
对于有ring buffer的网卡,ring buffer是由驱动与网卡共享的,所以内核可以直接访问rung buffer,一般拷贝frames的副本到自己的内核空间进行处理(deliver到上层协议,之后的一个个skb就是按skb的指针传递方式传递,直到用户获得数据,所以,对于ring buffer网卡,大量拷贝发生在frame从ring buffer传递到内核控制的计算机内存里)。
4、网卡发包过程
网卡驱动程序为IP包添加14字节的MAC头,构成frame(暂无CRC)。然后驱动程序将frame拷贝到网卡芯片缓存区,由网卡处理。网卡芯片添加CRC和头部同步信息,发送到网线上。
5、点击一个URL,会发生什么?
1)DNS解析阶段:
①浏览器查找自身的DNS缓存--->搜索本机(OS)缓存
②请求域名解析服务器:
根域服务器--->.com/.cn/.org/.edu域服务器--->baidu.com/google.com域服务器--->mail.google.com
2)报文形成阶段:
应用层:应用层获得IP地址后,根据HTTP协议生成HTTP请求报文。
传输层:组装TCP头部
网络层:组装IP头部,根据ARP(网络层协议)协议获得下一跳MAC地址,存储在ARP表中。(实际上此时内核也会组装MAC帧,将完整的帧交给网卡)
6、常见的IO模型
(1)阻塞IO/非阻塞IO
阻塞IO:发起IO的线程会一直阻塞到有数据返回;
非阻塞IO:发起IO请求后会立刻返回,需要轮询查看数据是否准备完毕
(2)IO多路复用
一个线程管理多个IO,有数据准备就绪后再分配对应的线程读取数据。
io多路复用是阻塞的。
(3)信号驱动IO
不再是循环请求询问去监控数据就绪状态,而是建立信号联系,内核数据准备好之后再通过信号通知线程数据已可读。
信号驱动IO只是用于TCP建立连接或者UDP,因为接收方不知道信号是由什么消息触发的。
(4)异步IO
应用发起某个操作(如读操作),让内核完成操作后再通知应用。
同步异步可以理解为针对的是线程之间/应用程序和内核之间的交互状态。
同步是发起IO后等待OR轮询,异步是发起IO后去做自己的事,内核完成后会通知。
异步一定是非阻塞的。
7、IO复用是阻塞还是非阻塞?
可以设置阻塞还是非阻塞,或者设置阻塞时间。
二、项目
1、什么是SDN?
SDN就是软件定义网络,它将网络的转发平面与控制平面分离开,使用统一的控制器作为控制平面。
2、SDN的优势
中心化与去中心化:中心化更安全,去中心化效率更高
(1)转发平面可以采用不同的硬件来实现,不再需要统一硬件。
(2)可以通过控制器集中配置,更高效快捷
(3)满足行业用户的差异化需求