//调用路径ip_rcv->ip_rcv_finish->dst_input->(skb->dst->input) //ip_forward以回调函数的形式,保存在skb->dst->input,input在通过ip_route_input路由封包时被设置 //函数的主要任务: // 1.更新ttl // 2.如果路由被重定向,则向发送方发送icmp重定向报文 // 2.如果有选项,通过ip_forward_options处理在转发时需要更新的选项 // 3.通过…
//ip协议与l4协议接口,l4通过此接口向下l3传递数据帧 //函数主要任务: // 1.通过路由子系统路由封包 // 2.填充l3报头 // 3.ip分片 // 4.计算校验和 // 5.衔接邻居子系统,向下层传送封包. 1.1 int ip_queue_xmit(struct sk_buff *skb, int ipfragok) { struct sock *sk = skb->sk; struct inet_sock *inet = inet_sk(sk); struct ip_opt…
网络的分层协议总结 OSI七层模型OSI 中的层            功能                                                        TCP/IP协议族 应 用层                  文件传输,电子邮件,文件服务,虚拟终 端          TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 表示层                   数据格式化,代码转换,数据加密                     …
//向协议栈注册l3处理函数 1.1 void dev_add_pack(struct packet_type *pt) { int hash; //ptype_all ptype_base共用一把锁 ptype_lock spin_lock_bh(&ptype_lock); if (pt->type == htons(ETH_P_ALL)) {//ETH_P_ALL类型的l3协议,从外接收到的数据帧,和从本地发送的数据帧,都会向ptype_all链表中的l3协议,传递一份 netdev_n…
//为分片确定正确的ipq结构 // 定位5元组 // 1.<id, 源ip, 目的ip, l4协议> 可通过ip报文获取 // 2.user 通过ip_defrag给出,指出重组是由谁发起的,最常见的时IP_DEFRAG_LOCAL_DELIVER,当重组的入口分包要传递给本地时 // ipq中所有分片最迟完成重组的时间为30HZ 1.1 static inline struct ipq *ip_find(struct iphdr *iph, u32 user) { //定位4元组 __u1…
//ip分片加入到正确的ipq结构 //调用路径:ip_defrag->ip_frag_queue // 处理过程: // 1.正在被释放的ipq,不处理新加入的分片(ipq正在被释放由last_in设置COMPLETE指出) // 2.处理分片的合法性 // 2.1当该封包为最后一个分片时 // 2.1.1如果之前没有接收到最后一个分片,则该分片在总有效载荷中的结尾位置需要大于等于以推测出的最大长度 // 2.1.2如果之前已经接收到最后一个分片,则该分片在总有效载荷中的结尾位置需要等于之前接…
//ip报头tos字段,一个字节 // 二进制位:[0 1 2] [3] [4] [5] [6] [7] // 1.[0 1 2] 表示优先级: // 000 路由 // 001 优先级 // 010 立即 // 011 火速 // 100 火速覆盖 // 101 紧急 // 110 互联网控制 // 111 网络控制 // 2.[3] 表示时延 // 0 普通 // 1 最小 // 3.[4] 吞吐量 // 0 普通 // 1 最大 // 4.[5] 可靠性 // 0 普通 // 1.最大 /…
//调用路径:ip_defrag->ip_evictor // 分片重组时,可使用内存上下限: // 1.sysctl_ipfrag_high_thresh 可用内存上限 // 2.sysctl_ipfrag_low_thresh 内存超过上限后,需要释放内存到此限 1.1 static void ip_evictor(void) { struct ipq *qp; struct list_head *tmp; int work; //计算需要释放的内存 work = atomic_read(&am…
Linux 网络设备驱动之网络协议接口层介绍. 网络协议接口层最主要的功能是给上层协议提供透明的数据包发送和接收接口. 当上层ARP或IP需要发送数据包时,它将调用网络协议接口层的dev_queue_xmit 函数发送该数据包, 同时还需要传递给改函数一个 struct sk_buff 数据结构的指针. dev_queue_xmit() 函数的原型为: int dev_queue_xmit(struct sk_buff *skb); 同样的,上层对数据包的接收也通过向 netif_rx() 函数…
内核版本:linux-2.6.11 本文对Linux网络子系统的收发包的流程进行一个大致梳理,以流水账的形式记录从应用层write一个socket开始到这些数据被应用层read出来的这个过程中linux的网络子系统怎么运作的. PS:不能保证所有内容都是正确的,同时欢迎指出问题. 发包流程 1)用户进程对一个网络套接字执行write或者send后,该进程通过系统调用进入内核态. 2)在socket这层最终会通过调用sendmsg这个函数将数据传给传输层(这里涉及到使用一个多态的手法来实现不同协议…