网络数据到达如果经过内核怎么处理?如果不经过内核怎么处理?用户态协议栈?napi?netmap?dpdk?ovs-dpdk?openflow?sdn?f-stack?nfv?fd.io?
传统网络设备驱动包流向和处理流程:
网络数据包->网卡->网卡dma拷贝数据到内核缓冲区? ? ? ->? ? ?网卡发送中断给内核 或者内核自己轮询(napi)? ?->? ? cpu接管? ?->? ? 网卡驱动处理解析数据包? ?->? ? 内核协议栈解析ip包? ?->? ? 内核协议栈解析tcp包? ?->? ? 修改对应fd可读,加入epoll就绪列表,通知对应的进程? ?->? ?切换到用户态,对应的进程从内核将数据拷贝到应用层缓冲区。
保证可靠和qos(服务质量)可能需要的特性,以tcp为例:
物理层:调制解调器处理模电数电的转换,什么都不能保证,解调后数据就是二进制流;
数据链理层:封装成帧,透明传输,差错检测。到这一层已经可以将数据流拆成包了(头尾都有标志符),并且使用crc差错校验,但是校验失败就丢包,没有重传机制可靠性还是很弱。
网络(ip)层:头部已经可以区分不同的ip地址的包,并且可以支持ip分片和重组,有首部检验和能一定程度保证首部的正确性(只是头部16位相加的反码,校验功能很弱),生存时间ttl一定程度保证无效包的清出,总长度标志了包体界限,可记录上层协议类型。但是和数据链路层相比并没有加强多少可靠性。(包头长 = 固定20字节 + 可选字段,一般为4的倍数)
传输层udp:在ip基础上只增加了两端的端口,包长和整包的校验和(和ip校验和类似,头部和数据都校验)。整包的校验和能一定程度保证包的数据的可靠性,但是仅此而已。(包头长 =固定8字节)
传输层tcp:面向连接,可靠交付,点对点,全双工通信,面向字节流。到这一层保证了可靠性的同时能保证qos。两端端口实现ip分用;序号保证字节流的有序;确认号期望下一个报文段的序号;数据偏移记录首部长度;6位控制位可以实现urg,ack,数据传输的优先级psh,复位rst,建立连接的syn,中止连接的fin;窗口大小告诉对方发送大小限制;校验和和udp一样;紧急指针记录紧急数据的字节数,窗口为零仍然可使用;可选选项最多加20字节,可选mss数据段最大长度,窗口扩大,时间戳,sack。(包头长 =固定20字节+4n,总共最多40字节)
tcp保证可靠性的机制:可靠连接的建立,连接的释放,滑动窗口,超时重传,选择确认sack,时间戳。定时器(建立连接定时器,重传定时器,延迟应答定时器,坚持定时器,保活定时器,FIN_WAIT_2定时器,TIME_WAIT定时器)。
tcp保证服务质量qos:利用滑动窗口实现流量控制,拥塞控制(新算法bbr)。
|