构建用户态网络协议栈(1)

网络数据到达如果经过内核怎么处理?如果不经过内核怎么处理?用户态协议栈?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)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值