IP 协议位于 TCP/IP 协议的第三层——网络层,是用于分组交换数据网络的一种协议。与传输层协议相比,网络层的责任是提供点到点(hop by hop)的服务,而传输层(TCP/UDP)则提供端到端(end to end)的服务。
数据在IP互联网中传送时会被封装为数据报文。IP协议的独特之处在于:在报文交换网络中主机在传输数据之前,无须与先前未曾通信过的目的主机预先创建好一条特定的“通路”。互联网协议提供了一种“不可靠的”数据包传输机制(也被称作“尽力而为”或“尽最大努力交付”);也就是说,它不保证数据能准确的传输。数据包在到达的时候可能已经损坏,顺序错乱(与其它一起传送的报文相比),产生冗余包,或者全部丢失。如果应用需要保证可靠性,一般需要采取其他的方法,例如利用IP的上层协议控制。
由于封装带来的抽象机制,IP能够在各种各样的网络上工作,例如以太网,ATM,FDDI,Wi-Fi,令牌环等等。每个链路层的实现可能有自己的方法(也有可能是完全没有它自己的方法),把IP地址解析成相应的数据链路地址。IPv4使用地址解析协议(ARP),而IPv6采用邻居发现协议(NDP)。
互联网协议的设计原则,假定网络基础设施本身就是不可靠的单一网络元素或传输介质,并且它使用的是动态的节点和连接。不存在中央监测和性能衡量机制来跟踪和维护网络的状态。为了减少网络的复杂性,大部分网络只能故意地分布在每个数据传输的终端节点。传输路径中的路由器只是简单地将数据报文发送到下一个匹配目的地址的路由前缀的本地网关。
由于这种设计的结果,互联网协议只提供尽力传送,其服务也被视为是不可靠的。在网络专业语言中是一种无连接的协议,相对于所谓的面向连接的模式。在缺乏可靠性的条件下允许下列任何故障发生:
数据包传递乱序;意思是,如果包’A’是在包’B’之前发送的,但B可能在A到达前到达。 互联网协议提供的唯一帮助是,IPv4规定通过在路由节点计算校验和来确保IP数据报头是正确的。这个带来的副作用是当场丢弃报头错误的数据报文。在这种情况下不需要发送通知给任一个终端节点,但是互联网控制消息协议(ICMP)中存在一个机制来做到这一点。
但是,IPv6为了快速传输已经放弃了计算校验和的使用。
对这些可靠性问题的更正是一个上层协议的责任。例如,一个上层协议为了确保按顺序传送可能要缓存数据,直到数据可以传递给应用程序。
除了可靠性问题,互联网及其组成部分的动态性和多样性不能确保任何路径是有能力地或合适地完成所要求的数据传输,即使路径是有效并且可靠的。技术限制之一是在给定的链路上允许的数据包的大小。应用程序必须确保它使用适当的传输特性。这种责任还在于一些在应用层协议和IP之间的上层协议。存在审查的本地连接尺寸最大传输单位(MTU),以及整个预计到目标路径时使用IPv6。IPv4的网络层有自动分片成更小的单位进行传输原始数据报的能力。在这种情况下,IP确实能够为乱序的分片进行顺序排序。
IP协议最为复杂的方面可能就是寻址和路由了。寻址就是如何将IP地址分配给各个终端节点,以及如何划分和组合子网。所有网络端点都需要路由,尤其是网际之间的路由器。路由器通常用内部网关协议(Interior Gateway Protocols,IGPs)和外部网关协议(External Gateway Protocols,EGPs)决定怎样发送IP数据包。
现在的国际互联网普遍的采用了IP协议。而现在正在网络中运行的IP协议是IPv4;IPv6为IPv4的后续的一个版本。互联网现在正慢慢的耗尽IP地址,而IPv6的出现解决了这个问题,与IPv4的32位的地址相比而言,IPv6拥有128位的地址空间,可以提供比前者多很多的地址。版本0至3不是被保留就是没有使用。而版本5被用于实验流传输协议。其他的版本也已经被分配了,通常是被用于实验的协议,而没有被广泛的应用。
广播和多播仅用于UDP(TCP是面向连接的)。
广播
一共有四种广播地址:
受限的广播地址为255.255.255.255。该地址用于主机配置过程中IP数据报的目的地址,在任何情况下,router不转发目的地址为255.255.255.255的数据报,这样的数据报仅出现在本地网络中。
指向网络的广播地址是主机号为全1的地址。A类网络广播地址为netid.255.255.255,其中netid为A类网络的网络号。
一个router必须转发指向网络的广播,但它也必须有一个不进行转发的选择。
指向子网的广播地址为主机号为全1且有特定子网号的地址。作为子网直接广播地址的IP地址需要了解子网的掩码。例如,router收到128.1.2.255的数据报,当B类网路128.1的子网掩码为255.255.255.0时,该地址就是指向子网的广播地址;但是如果子网掩码为255.255.254.0,该地址就不是指向子网的广播地址。
指向所有子网的广播也需要了解目的网络的子网掩码,以便与指向网络的广播地址区分开来。指向所有子网的广播地址的子网号和主机号为全1.例如,如果子网掩码为255.255.255.0,那么128.1.255.255就是一个指向所有子网的广播地址。
当前的看法是这种广播是陈旧过时的,更好的方式是使用多播而不是对所有子网的广播。
广播示例:
PING 192.168.0.255 (192.168.0.255): 56 data bytes
64 bytes from 192.168.0.107: icmp_seq=0 ttl=64 time=0.199 ms
64 bytes from 192.168.0.106: icmp_seq=0 ttl=64 time=45.357 ms
64 bytes from 192.168.0.107: icmp_seq=1 ttl=64 time=0.203 ms
64 bytes from 192.168.0.106: icmp_seq=1 ttl=64 time=269.475 ms
64 bytes from 192.168.0.107: icmp_seq=2 ttl=64 time=0.102 ms
64 bytes from 192.168.0.106: icmp_seq=2 ttl=64 time=189.881 ms
可以看到的确收到了来自两个主机的答复,其中 192.168.0.107 是本机地址。
多播
多播又叫组播,使用D类地址,D类地址分配的28bit均用作多播组号而不再表示其他。 多播组地址包括1110的最高4bit和多播组号。它们通常可以表示为点分十进制数,范围从224.0.0.0到239.255.255.255。 多播的出现减少了对应用不感兴趣主机的处理负荷。 多播的特点:
多播示例:
PING 224.0.0.1 (224.0.0.1): 56 data bytes
64 bytes from 192.168.0.107: icmp_seq=0 ttl=64 time=0.081 ms
64 bytes from 192.168.0.106: icmp_seq=0 ttl=64 time=123.081 ms
64 bytes from 192.168.0.107: icmp_seq=1 ttl=64 time=0.122 ms
64 bytes from 192.168.0.106: icmp_seq=1 ttl=64 time=67.312 ms
64 bytes from 192.168.0.107: icmp_seq=2 ttl=64 time=0.132 ms
64 bytes from 192.168.0.106: icmp_seq=2 ttl=64 time=447.073 ms
64 bytes from 192.168.0.107: icmp_seq=3 ttl=64 time=0.132 ms
64 bytes from 192.168.0.106: icmp_seq=3 ttl=64 time=188.800 ms