IP是TCP/IP协议族中最为核心的协议。所有的TCP、UDP、ICMP和IGMP都以IP数据报格式传输。
IP是不可靠的,因为它不能保证IP数据报能成功到达目的地。如果发生了错误,IP有一个简单的错误处理算法:丢弃该数据报。任何要求的可靠性必须由上层来提供,比如TCP,这其实也是一个优点,因为IP提供了发送数据报的基本功能,这样UDP和TCP都可以使用它。
IP也是无连接的,这意味着IP并不维护关于后续数据报的状态信息。因此每个IP数据报的处理都是独立的,比如不按发送顺序接收,因为每个数据报都独立地进行路由选择。
IP首部

首先要提的是传输的次序是大端字节序。TCP/IP首部中所有的二进制整数在网络中传输都要求这种次序,因此又称为网络字节序。如果机器存储二进制整数用的小端法,那抱歉了,请转换成大端法再发送。
4位版本号:目前的版本号还是4,也就是IPv4。
首部长度:首部占32bit的数目。因为是4bit的字段,因此最多是15个32bit的长度,32*15=480 bit,也就是说,首部最长是60字节。一般长度是20字节,也就是说这个首部长度为5。
8位服务类型:这个老实说我看着还比较模糊,先放着,后续明白了补足。
16位总长度:整个IP数据报的长度。结合首部长度,可以判断数据的起始位置和长度。由于占16位,所以最长长度为65535字节,但链路层的MTU一般没那么大,所以数据报经常需要分片,数据报被分片时该值会受到影响。有时数据链路层需要填充一些数据达到最小长度,没有总长度就不知道真实数据。
16位标识:唯一地标识主机发送的每一份数据报,发送一份报文值就加1。标识字段和片偏移字段在讲述分片时会再分析。
TTL:生存时间字段设置了数据报可以经过的最多路由器数。初始值由源主机发送,每经过一个路由器减一,为0时该数据报便会被丢弃,并发送ICMP给源主机。
8位协议:用于识别哪个协议向IP传送数据。
首部检验和:根据IP首部计算的检验和。简单地说就是对首部中每16bit进行二进制反码求和,结果存在该字段中。
选项字段很少使用,如果使用,一个选项占32bit,不足的用0填充。选项定义举例为安全和限制处理。
IP路由选择
简单地说,如果目的主机与源主机直接相连(点对点链路)或在一个共享网络上(以太网或令牌环网),那么IP数据报直接发送到目的主机。否则就发送到默认的路由器上。
IP层在内存中有一个路由表,当收到一份数据报并进行发送时,它都要对该表搜索一次。当数据报来自某个网络接口时,IP首先检查目的IP地址是否是本地地址或IP广播地址,如果是,数据报发送到相应的协议模块处理;如果不是,如果IP层被设置成路由器功能,那么对数据报进行转发,否则就丢弃。
路由表内容:暂缺。
IP路由选择的过程:
1)在路由表中寻找能与目的IP地址完全匹配的表目(网络号+主机号)。如果匹配,发送到该条目指定的下一站路由器或直接连接的网络接口。
2)在路由表中寻找能与目的网络号匹配的表目。如果匹配,发送到该条目指定的下一站路由器或直接连接的网络接口。目标网络上的所有主机都可以通过这个表目来处理。
3)在路由表中寻找默认表目,找到就发送给该表目指定的下一站路由器。
上面的步骤如果都失败了,那么生成数据报的程序返回一个“主机不可达”或“网络不可达”的错误。
如果我们仔细品味第二步骤,可以发现为一个网络只需要执行一个路由器。这可以极大地缩小路由表的规模。

上图中,主机bsdi向主机sun发送一个IP数据报。搜索路由表,发现在一个直接相连的网络上(140.252.13.0),也就是匹配了网络地址,可以直接发送。

上图中,主机bsdi有一份IP数据报要发送到ftp.uu.net主机上,IP见上图。这里在搜索路由表时,均找不到匹配主机地址或网络地址的表目,所以数据报都发送给了默认的下一站路由,这里分别是sun,netb和gateway。
这里需要注意的是,数据报中的目的IP地址始终没有改变,但每个链路层可能有不同的链路首部,而且链路层的目的地址始终指的是下一站的链路层地址。比如bsdi发送到sun的链路层地址和netb发送到gateway的链路层地址不同,但是目的IP地址不变。
子网寻址
浙公网安备 33010602011771号