简介
IP(Internet Protocol)网际协议是TCP/IP协议族中最核心的协议。它位于7层OSI参考模型的网络层,或者说的4层TCP/IP参考模型的网络互联层。所有的TCP、UDP、ICMP以及IGMP数据都是以IP数据报格式传输。
特点
- 不可靠(unreliable):它不能保证IP数据报能成功地到达目的地。IP仅提供最好的传输服务。如果发生某种错误,如某个路由器暂时用完了缓存区,IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP消息报给信息源。任何要求的可靠新必须由上层协议来提供(如TCP)。
- 无连接(connectionless):IP并不维护任何关于后续数据报的状态信息。每个数据报的处理是相互独立的。这也说明, IP数据报可以不按发送顺序接收。如果一信源向相同的信宿发送两个连续的数据报(先是A,然后是B),每个数据报都是独立地进行路由选择,可能选择不同的路线,因此B可能在A到达之前先到。
IP数据报格式
由于数据在IP互联网中传输时是被封装成多个ip数据报文,而在计算机网络的七层OSI模型中,数据包严格地指第3 层即网络层的数据单元。数据链路层第2层数据单元的正确术语是一个帧,而在第4 层传输层,正确的术语是段或数据报。对于通过以太网的TCP / IP通信,TCP段由一个或多个IP数据包携带,每个数据包携带一个或多个以太网帧。
下面要说的就是数据包的包结构。
一个数据包又被分成两个部分,包括控制信息,也就是头(header),和数据本身,也就是负载(payload).
上图是IP数据报格式及首部中的各个字段。
其中最高位在左边,记为0bit;最低位在右边,记为31bit。
4个字节的32bit值以下面的次序传输:0~7bit,8~15bit,16~23bit,24~31bit.这种传输次序称作big endian字节序。由于TCP/IP首部中所有的二进制整数在网络中传输时都要求以这种次序,因此它又称作网络字节序.
依次从上到下从左到右数据包中每一块的作用:
- 版本:包含版本的4位,用来指定它是IPv4还是IPv6.
- 首部长度:包含因特网报头长度的4比特,其是以4字节的倍数(例如,5表示20字节)的报头的长度.由于它是一个4bit字段,所以首部最长为60字节(2^4=16 15*4=60)
- 服务类型(TOS)字段:由8bit构成,用来表明服务质量。
- DSCP(Differential Services Codepoint,差分服务代码点),用来进行质量控制
- ECN(Explicit Congestion Notification,显式拥塞通告),用来报告网络拥堵情况,由2bit构成
- 总长度:以字节为单位的分组长度的16位。指的是整个IP数据报的长度,利用首部长度字段和总长度字段我们就可以知道IP数据报中数据内容的起始位置和长度。由于该字段长16bit,所以IP数据报最长可达65535字节。
- 标识:包含一个识别标签的 16位,唯一地标识主机发送的每一份数据报,用来帮助从几个片段重建数据包,通常每发送一份报文它的值就会加1。
- 标志:3位。第一个包含一个零,后面跟着一个标志,表明是否允许数据包被分段(DF:不分段),以及一个标志来指明数据包是否有更多的分段(MF:More Fragments)
- 第一位:未使用,现在必须为0
- 第二位:指示是否进行分片
- 0:可以分片
- 1:不能分片
- 第三位:包被分片的情况,表示是否是最后一个包
- 0:最后一个分片的包
- 1:分片中段的包
- 片段偏移:包含片段偏移的13比特,用于标识原始分组内的片段的位置的字段(以8字节为单位,所以实际的偏移位置就是数值*8;这种格式允许2^13 = 8192个八位字节的每个片段,共有65536个八位字节。这刚好符合数据报总长度字段)
- 生存时间:8位包含生存时间(TTL),TTL是跳过的数量(路由器,计算机或网络上的设备),TTL的初始值由源主机设置(通常为32或64),一旦经过一个处理它的路由器,它的值就减去1。当该字段的值为0时,数据报就被丢弃,并发送ICMP报文通知源主机。
- 协议:包含协议(TCP,UDP,ICMP等)的8位
- 首部校验和:根据IP首部计算的检验和码。它不对首部后面的数据进行计算。ICMP、IGMP、UDP和TCP在它们各自的首部中均含有同时覆盖首部和数据检验和码
- 源IP地址:源IP地址的 32位
- 目的IP地址:目标地址的 32位
- 选项:在这些160位之后,可选的标志可以添加不同的长度,可以根据使用的协议进行更改,然后添加包承载的数据。
目前,这些可选项定义有:
- 安全和处理限制(用于军事领域,详细内容参见 RFC 1108[Kent 1991])
- 记录路径(让每个路由器都记下它的 IP地址)
- 时间戳(让每个路由器都记下它的 IP地址和时间)
- 宽松的源站选路(为数据报指定一系列必须经过的 IP地址)
- 严格的源站选路(与宽松的源站选路类似,但是要求只能经过指定的这些地址,不能经过其他的地址)
IP地址分类
在IPv4中,IP地址的长度是32bit,其中32位地址被写成4个十进制数,其中每个整数对应一个字节。Internet地址并不采用平面形式的地址空间,如1、2、3等,IP地址具有一定的结构,且被分为五类IP地址。 上图即五类IP地址的划分
它们的地址范围分别是
IP路由选择
所谓的路由选择即在从源主机到目的主机的过程中,中间路由的选择过程。如果目的主机与源主机直接相连(如点对点链路)或都在一个共享网络上(以太网或令牌环网),那么I P数据报就直接送到目的主机上。否则,主机把数据报发往一默认的路由器上,由路由器来转发该数据报。大多数的主机都是采用这种简单机制。 IP层在内存中有一个路由表,当收到一份数据报并进行发送时,它都要对该表搜索一次。路由表中的每一项都包含下面这些消息:
- 目的IP地址
- 下一站(下一跳)路由器的IP地址,或者有直接连接的网络IP地址。下一站路由器是指一个在直接相连网络上的路由器,通过它可以转发数据报
- 标志。其中一个标志指明目的IP地址是网络地址还是主机地址,另一个标志指明下一站路由器是否为真正的下一站路由器,还是一个直接相连的接口
- 为数据报的传输指定一个网络接口 IP路由选择是逐跳地(hop-by-hop)进行的,IP并不知道到达任何目的的完整路劲,所有的IP路由选择只为数据报传输提供下一站路由器的IP地址。 IP路由器的选择主要完成以下的功能:
- 搜索路由表,寻找能与目的 I P地址完全匹配的表目(网络号和主机号都要匹配)。如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(取决于标志字段的值)
- 搜索路由表,寻找能与目的网络号相匹配的表目。如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(取决于标志字段的值)。目的网络上的所有主机都可以通过这个表目来处置。例如,一个以太网上的所有主机是通过这种表目进行寻径的。这种搜索网络的匹配方法必须考虑可能的子网掩码。
- 搜索路由表,寻找标为“默认(default)”的表目。如果找到,则把报文发送给该表目指定的下一站路由器
如果上面步骤都没有成功,则该数据报就不能被发送成功。一般会想生成数据报的应用程序返回一个“主机不可达”或“网络不可达”的错误。