全部博文(153)
分类:
2010-01-13 16:16:47
IP
层(先主要研究ipv4)written by leeming
简述:
Ip层的目的有三个:
a. ip层定义了在整个tcpip互联网中使用的数据传送基本单元,其他的高级协议都是放 在ip层的数据区的。(ICMP, IGMP(这两个仍然属于ip协议的一部分), UDP(DHCP使用UDP来携带), TCP均是这样)
效果图如下:
b. ip层软件完成转发的功能,选择分组发送的路径。因为ip层是实现一个ip到另外一个ip之间的通路,网路的概念在这一层已经被它屏蔽,所以它要完成ip包路径的选择。
c. ip还体现了不可靠分组交付思路的规则。这些规则包括如何处理分组,如何产生差错报文(ICMP)。
1. ipinput:
ip这一层还是相对比较简单的,毕竟是不可靠分组的,只是在ip的分片和重装部分还是有点小烦的。看一下具体流程:
从网络接口层到达的数据包,一般数据指针已经移到了ip首部的位置了,这一步是在arp_input的pbuf_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类似,我们认为igmp是ip协议的一部分。提交给IGMP模块处理。
2. ipoutput:
ip层的output函数还是比较简单的,主要的工作就是填充ip的数据首部,然后调用netif的output函数(一般是etharp_output---à netif的linkoutput)。
下面是流水账:ip_route寻找合适的网络设备,对于多个网络接口有用——》ip_output_if 真正的发送函数——》接下来就是添加ip数据首部(分成已经有ip首部和没有ip首部两种情况)——》lwi
So,ip层还遗留一些问题:icmp的问题,igmp的问题,分片和重装。