Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1002891
  • 博文数量: 153
  • 博客积分: 4195
  • 博客等级: 上校
  • 技术积分: 2631
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-22 11:32
文章存档

2012年(7)

2010年(35)

2009年(111)

分类:

2010-01-13 16:16:47

 

IP层(先主要研究ipv4

written by leeming

简述:

Ip层的目的有三个:

a.  ip层定义了在整个tcpip互联网中使用的数据传送基本单元,其他的高级协议都是放      ip层的数据区的。(ICMP, IGMP(这两个仍然属于ip协议的一部分), UDPDHCP使用UDP来携带), TCP均是这样)     

效果图如下:

b.    ip层软件完成转发的功能,选择分组发送的路径。因为ip层是实现一个ip到另外一个ip之间的通路,网路的概念在这一层已经被它屏蔽,所以它要完成ip包路径的选择。

c.     ip还体现了不可靠分组交付思路的规则。这些规则包括如何处理分组,如何产生差错报文(ICMP)。

1.         ipinput

ip这一层还是相对比较简单的,毕竟是不可靠分组的,只是在ip的分片和重装部分还是有点小烦的。看一下具体流程:

从网络接口层到达的数据包,一般数据指针已经移到了ip首部的位置了,这一步是在arp_inputpbuf_header(p, -(s16_t)SIZEOF_ETH_HDR)实现了。因此在ipinput的开始获取ip数据首部的一些信息,比如首部长度,数据包总长度,核对校验和等等。调用pbuf_realloc(p, iphdr_len);,其实这部一般没多少意思。

接下来是关于DHCP的一些处理,暂时打算不涉及这部分(等把tcpip的路全部走通了一遍再来看这些features)。

如果netif不是针对本网卡,则调用ip_forward转发到其他网络接口上。

最后判断ip首部的协议类型:

a.  如果是UDP,则调用udp_input,将数据提交到传输层

b.  如果是TCP,则调用tcp_input,将数据提交到传输层

c.  如果是ICMP,则调用icmp_input,将数据提交到icmp模块处理,一般来说icmp是属于ip层的一部分的,虽然它的报文封装形式和tcp/udp类似,都是封装在ip数据区。

d.  如果是IGMP,与ICMP类似,我们认为igmpip协议的一部分。提交给IGMP模块处理。

 

2.         ipoutput

ip层的output函数还是比较简单的,主要的工作就是填充ip的数据首部,然后调用netifoutput函数(一般是etharp_output---à netiflinkoutput)。

下面是流水账:ip_route寻找合适的网络设备,对于多个网络接口有用——》ip_output_if 真正的发送函数——》接下来就是添加ip数据首部(分成已经有ip首部和没有ip首部两种情况)——》lwip 1.3.2还增加了对数据包分片和重装的支持,接下来就是判断是否支持分片,支持的话调用Ip_frag函数——》最终调用netif->output函数发送ip数据包。

 

Soip层还遗留一些问题:icmp的问题,igmp的问题,分片和重装。

 

 

阅读(5786) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~