第八章 IP:网际协议

一、本章比较大,因为IP协议的结构及其IP处理过程比较复杂。在文中,按照首先介绍基本的数据结构,然后根据图8-1中的流程图来介绍各个函数及各个函数中调用的重要函数。
二、本章比较重要的几个函数:ipinitr函数,ip_forward函数,ip_output函数,这一章就讲了这三个函数= =,但每一个函数都挺大的。
三、IP的首部什么的就不介绍了,烂大街了。首先介绍一下协议栈在IP这一块的处理流程:

  • 1.从下层(接口层)接收数据分组(mbuf装着的首部啦,数据啦),在ipintrq这个结构组成的链表里排队
  • 2.ipintr函数从ipintrq中取出来,然后函数做个决定,我是扔给上层的传输层协议还是扔给ip_forward函数,还是真的扔了(丢弃数据)。这个决定依据一个全局标识量的设置ipforwarding全局变量或者分组中包换源路由,要是前面这俩情况出现一种,而且这个分组ipintr函数发现不是给自己的,那么就扔给ip_forward函数。当然要是给自己的自己就收着了,传给上层的传输层协议。如果前面那两种情况哪个都没有出现,就丢弃数据包。
  • 3.ipintr函数把分组处理完后,就看情况该谁干活了。要是交给了上层就另说(文中说上层的处理过程是在这里面的一个函数里处理的,需要在往后的文中看一下)。如果交给了ip_forward函数,那么现在这个设备就会像路由器一样做事情了。处理完后,交给ip_output函数。
  • 4.流程来到ip_output函数,对于ip_output函数的调用有两种情况,一种是上层传输层协议的调用,这个是协议相关的。而ip_forward函数对ip_output函数的调用是协议无关的。

四、然后详细讲解三个函数的执行流程。
五、输入处理:ipintr函数

  • 1.首先函数会把ipintrq链表中的所有东西都取出来。在此过程中要注意对链表加锁。
  • 2.然后对取出的分组进行正确性验证:看该接口是否被分配了IP地址,校验和是否正确,分组的各个长度数据是否正确。其中m_pullup函数会对mbuf进行必要的操作:将分组的所有头都提升到第一个mbuf中来。
  • 3.然后ipintr函数会调用ip_dooptions函数处理IP选项,然后决定是否转发分组。(ip_dooptions函数内部也会对分组转发进行处理,调用ip_forward函数,详见源码)转发与否要看机器是否被配置成路由器(有一个全局变量ip_forwarding),一般主机都是不被配置成路由器的。
  • 4.在决定是否转发前还要查看in_ifaddr列表来匹配IP地址列表,来查看分组是否发给自己,要不是发给自己的就考虑转发的问题了,转发是调用ip_forward函数进行。
  • 5.最后在对分组进行重装和分用。重装分组是为了向传输层提交数据报。分用是针对传输层的不同协议进行的分用,回想前面章节中的ip_protox数组与inetsw数组的对应,然后通过protosw结构中的pr_input函数指针调用协议相关的input函数进行处理。

六、转发:ip_forward函数

  • 1.该函数要么被ip_dooptions函数调用,要么被ipintr函数调用。
  • 2.函数不转发链路层的广播、环回分组还有那些曾经的E类地址、默认路由、组播分组。
  • 3.转发前要减少TTL值
  • 4.然后开始寻找下一跳的地址,找的时候依据自己的路由表。找得到就发,找不到就要发还一个ICMP差错报文,然后丢弃分组。
  • 5.此外,ip_forward函数还要决定是否发送一个重定向报文。对于重定向报文,要判断若干个方面:一共四个条件第177页到第178页自己数。如果可以发送,就要选择发送的重定向报文的类型,看一下卷一,忘了每种都是啥含义了
  • 6.然后开始发送分组,ip_forward函数会调用ip_output函数进行分组的发送。调用后会根据ip_output函数的返回值决定是直接返回还是发送ICMP差错报文

七、输出:ip_output函数

  • 1.初始化分组首部。有两种情况,一种是从传输层调用ip_output函数,这时需要将初始化分组的首部;一种是从ip_forward函数或者ip_mforward函数调用的(有一个参数IP_FORWARDING设定),这时不允许修改分组的首部
  • 2.确定一条到目的地的路由(不是很懂)
  • 3.选择源地址并视情况对分组分片
  • 4.最后函数结束
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值