分析描述 icmp协议和ip协议的关系?_Linux内核网络协议栈TCP/IP分析之三:网络层...

一 概述

  网络层的任务:选择合适的网间路由和交换结点, 确保数据及时传送。数据包选取合适的路径进行传输,保证了我们的数据有能力从一台主机抵达另外一台主机。  

网络层将数据链路层提供的帧组成数据包,包中封装有网络层包头,其中含有逻辑地址信息- -源站点和目的站点地址的网络地址。

其主要任务包括 :

  (1)路由处理,即选择下一跳;

  (2)添加 IP header;

  (3)计算 IP header checksum,用于检测 IP 报文头部在传播过程中是否出错;

  (4)可能的话,进行 IP 分片; 

  (5)处理完毕,获取下一跳的 MAC 地址,设置链路层报文头,然后转入链路层处理。

1.1 IP协议的功能:

(1)寻址和路由:根据对方的IP地址,寻找最佳路径传输信息;

(2)传递服务:① 不可靠(IP协议只是尽自己最大努力去传输数据包),可靠性由上层协议提供(TCP协议);② 无连接;(事先不建立会话);

(3)数据包的分片和重组。

二 IP数据包详解

f7d51c753dbc40bb4e8bbbcec0ac9c75.png

(1)版本(Version) : 4(表示使用的 IPv4协议),对等层之间要使用同一种IP协议(IPv4协议)。

(2)头部长度( Header Length) : 首部长度占4 bit ,可表示的最大数值为15个单位(1111),一个单位一个字节,最大为60字节。

(3)服务类型:占8 bit ,(Differentiated Services Field)字段来区分服务,Delay = 1: 延迟小;Throughput = 1:吞吐量大;Reliability = 1: 质量比较高,Cost = 1: 最小代价;同一时刻只有一位是1。

(4)总长度(Total Length): 占 16 bit,最大2^16 - 1 = 65535 字节,值为首部和数据之和的长度,单位为字节,因此数据报的最大长度为65535字节(MTU最大传送单元)。

(5)标识符(identification):占16 bit,它是一个计数器,用来产生数据包的标识;IP 报文的唯一id,分片报文的id 相同,便于进行重组。

(6)标志(flag):数据包在传输的过程中,标志字段MF(More Fregment),MF = 1表示后面还有分片;MF = 0 表示最后一个分片。标明是否分片。

(7)片偏移:每个数据片不同时传输,标志着某片在原分组中的相对偏移位置,以8字节为偏移单位;注意:发送数据报过大,就要对其数据报分片处理,每一个分片都会含有一个标识(IP地址 + 标识),到达目的地要对其所有的分片进行重新组装;重点:偏偏移计算过程;首部分大题的内容是一样,因为都属于同一个数据报文!

(8)生存时间(TTL,Time To Live)占用 8bit ,使用“跳数“作为TTL的单位。数据报每经历一个路由器时对应的TTL值就会减 1 ;防止数据报发送在路由器中出现环路,因为数据报在传送的过程中要占用一定的带宽(TTL值为零自动丢弃)。

(9)协议(8bit)字段指出此数据报所携带上层数据使用的TCP协议还是UDP协议,以便对等层接收到数据报交给上层相应的协议(TCP或者UDP协议)进行处理。

(10)首部检验和(Header checksum):16bit,字段只校验数据报的首部,不包含数据部分;看IP数据包头部是否被破坏、被篡改和丢失等。

(11)IP源地址:占32bit,数据向外发送,发送机器本身的IP地址,也称为逻辑地址;

(12)IP目的地址:占32bit,数据具体要发送目标及其的IP地址。

三 IP栈处理过程  

e9f2cd172359c65c18313265a77a7f82.png

(1)module_init():#define module_init(x) __initcall(x);module_init()函数进行模块加载,将inet_init()函数作为Linux 2.4.9内核模块注册;

(2)ip_init():将IP网络协议处理函数ip_rcv()用头插法插入IP协议链表;

(3)ip_rcv()–>ip_route_input()–>ip_route_input_mc()–>ip_route_input_slow():ip_rcv()对IP头部合法性进行严格检查,然后把具体功能交给ip_rcv_finish;ip_rcv_finish()完成路由表的查询,决定报文经过IP层处理后,是继续向上传递,还是进行转发,还是丢弃。ip_rcv_finish()调用ip_route_input()处理从网络上进来的IP包,它的结果主要有两个:即如果是本地包则传给上层协议层,如果不是则选择一个出端口再发送出去。ip_route_input_slow()当路由缓存查找没有命中,且目的地址不是组播地址时,则调用ip_route_input_slow进行路由项的查找;

(4)ip_defrag():进行碎片重组,返回重组后的skb包,或者返回NULL;从接收到的IP分片报文中,提取偏移地址frag_off和标志位mf。建立碎片处理队列,队列中每个节点(struct ipq)是一个链表,这个链表保存同一个连接的碎片,当碎片都到达之后进行数据包重组,或者在一定时间(缺省30秒)内所有碎片包不能到达而释放掉。该函数接受分片的数据包(sk_buff),并试图进行组合,当完整的包组合好时,将新的sk_buff返还,否则返回一个空指针。

(5)ip_find():根据IP头信息查找队列节点;提取IP部首中的IP源地址、目标地址、标识和协议作为哈希函数的输入,根据运算结果求出分片在Hash表的位置。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值