linux网络协议栈---废话
先说点废话
由于本人最近似乎有点点怠惰了,确确实实也有点拖延的毛病,不然之前打算写点技术博客的我也不至于坐在电脑面前满脑子都是生活的废料,今天和同事摸鱼聊天,感叹万物皆可互联网,各路大神争先恐后往里卷,像我们这种处于食物链下层的自然明白物竞天择的道理,居安思危这个词在哪儿都适用.
flag
emmm,虽然前人总说不要轻易立flag,但是嘛,生活的仪式感还是要有的,万一自己做到了呢,是不,当然哈哈哈哈,说这句话自己没啥底气==,很早以前就想开linux网络协议栈的坑了,奈何本人拖延症晚期,一直没能好好实行下去,今天趁着这股雄心壮志还将泯未泯,就当一个好的开始啦.
introduction
linux是个开源项目,因此相对于其他专用操作系统具有如下优势:遵照通用公共许可证(GPL)条款,用户可以免费获得其源码.linux内核网络栈是linux内核中的一个极其重要的子系统.在基于linux的系统中,不使用任何网络功能的很少.linux内核网络协议栈主要涉及OSI七层模型中的L2,L3,L4层,分别是数据链路层,网络层和传输层.从本质上说,Linux内核栈的任务主要是将接收到的数据包从L(网络设备驱动程序)传递给L(网络层,通常为ip4,ipv6).接下来,如果数据包目的地为当前设备,linux内核网络栈就将其传递给L4(传输层,应用tcp或者udp协议侦听套接字);如果数据包需要转发,就将其交还给L2继续传输.对于本地生成的出站数据包,将从L4依次传递给L2和L3,再由网络设备驱动程序再进行传输.这个过程分很多阶段,期间可能发生如下行为.
根据协议规则(如Ipsec规则或者NAT规则),可能需要对数据包进行修改.
数据包可能被丢弃.
数据包可能导致设备发送错误消息.
可能会对数据包进行分段.
可能需要重组数据包.
需要计算数据包的校验和.
要注意的是:内核并不涉及L4之上.这些层(会话层,表示层和应用层)的任务由用户空间应用程序来实现.此外,linux内核也不涉及物理层.
网络子系统最重要的两个结构:
- net_device结构体:网络设备
- sk_buff:表示套接字缓冲区的结构体