IP(网络之间互连的协议 InternetProtocol)是TCP/IP协议簇中的核心协议,也是TCP/IP的载体。所有的TCP,UDP,ICMP及IGMP数据都以IP数据报格式传输。它是为计算机网络相互连接进行通信而设计的协议。
IP提供不可靠的,无连接的数据传送服务。不可靠指它不能保证IP数据报能成功到达目的地。IP仅提供最好的传输服务。当发生某种错误时,如某个路由器暂时用完了缓冲区,IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP消息给信源。任何要求的可靠性必须由上层来提供。无连接指IP并不维护任何关于后续数据报的状态信息。每个数据报的处理是相互独立的。IP数据报可以不按发送顺序接收。如果一信源向相同的信宿发送两个连续的数据报(先是A,然后是B)每个数据报都是独立的进行路由选择,可能选择不同的路线,因此B可能在A到达之前先到达。
链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度,不同的网络类型都有一个上限值。例如以太网的MTU是1500。如果网络层层有数据包要传,而且数据包的长度超过了MTU,那么网络层就要对数据包进行分片操作,使每一片的长度都小于或等于MTU。一个分片在到达接收主机的路径中,还可能被继续分片,因此,分片的IP数据报可能会以不同的路径传输到接收主机,接收主机通过一系列的重组,将其还原为一个完整的IP数据报,再提交给上层协议处理。
当提交给数据链路层进行传送时,一个IP分片或一个很小的无需分片的IP数据报称为分组。数据链路层在分组前面加上它自己的首部,并发送得到的帧。
IP首部(5-8字节)包含了分片和重组所需的信息:
Identification:发送端发送的IP数据包标识字段都是一个唯一值,该值在分片时被复制到每个片中。
R:保留未用。
DF:“不分片”位,如果将这一比特置1,IP层将不对数据报进行分片。
MF:“更多的片”,除了最后一片外,其他每个组成数据报的片都要把该比特置1。
FragmentOffset:该片偏移原始数据包开始处的位置。偏移的字节数是该值乘以8。
两个Flags和Fragment Offset结合使用,进行分片时,DF比特设置为0,表示可以进行分片,这时如果 MF的值为1,则表示当前IP报文是一个IP包的其中一段分片,并且不是最后一个分片,这时结合Fragment Offset域继续判断;如果MF为1而 Fragment Offset= 0,表示该IP报文为第一个分片,而且后续有分片;如果MF为1而Fragment Offset不是0,表示该IP报文为中间的一个分片;如果MF为0而Fragment Offset不是0,表示该报文是最后一个分片。另外,当数据报被分片后,每个片的总长度值要改为该片的长度值。
IP寻路要经过以下几个步骤:
1、搜索路由表中目的地址域与分组地址完全相同的入口,如果找到这样的入口,则将分组发给下一个路由器地址中指定的地址(下一个路由器或直连网络接口)。
2、如果1不成功,则搜索路由表中目的地址域与分组的目的网络地址相同的入口,如果能到则将分组发给下一个路由器地址域中指定的地址。
3、如果2不成功,则搜索路由表中目的地址域为“default”的入口,如果找到就将分组发给指定的路由器。
4、如果3仍不成功,则说明分组不可投递,通常将“主机不可达”或“网络不可答”的信息发送给产生这个分组的应用程序。
参考文献:
1.SM Bellovin.Security problems in the TCP/IP protocol suite.Acm Sigcomm Computer Communication Review, 1989, 19(2):32-48
2.周炎涛,李立明.TCP/IP协议下网络编程技术及其实现.航空计算技术, 2002, 32(3):122-124
版本号:4个bit,用来标识IP版本号。这个4位字段的值设置为二进制的0100表示IPv4,设置为0110表示IPv6。目前使用的IP协议版本号是4。
首部长度:4个bit。描述IP首部的长度,IP的首部中有变长的可选部分。IP首部最小长度为20 Byte,由于变长的可选部分最大长度可能会变成60Byte。
服务类型:8个bit。服务类型字段被划分成两个子字段:3bit的优先级字段和4bit TOS字段,最后一位置为0。4bit的TOS分别代表:最小时延,最大吞吐量,最高可靠性和最小花费。4bit中只能将其中一个bit位置1。如果4个bit均为0,则代表一般服务。
总长度字段:16个bit。接收者用IP数据报总长度减去IP报头长度就可以确定数据包数据有效负荷的大小。IP数据报最长可达65535字节。
标识字段:16个bit。唯一的标识主机发送的每一份数据报。接收方根据分片中的标识字段是否相同来判断这些分片是否是同一个数据报的分片,从而进行分片的重组。通常每发送一份报文它的值就会加1。
标志字段:3个bit。用于标识数据报是否分片。第1位没有使用,第2位是不分段(DF)位。当DF位被设置为1时,表示路由器不能对数据包进行分段处理。如果数据包由于不能分段而未能被转发,那么路由器将丢弃该数据包并向源发送ICMP不可达。第3位是分段(MF)位。当路由器对数据包进行分段时,除了最后一个分段的MF位被设置为0外,其他的分段的MF位均设置为1,以便接收者直到收到MF位为0的分片为止。
位偏移:13个bit。在接收方进行数据报重组时用来标识分片的顺序。用于指明分段起始点相对于报头起始点的偏移量。由于分段到达时可能错序,所以位偏移字段可以使接收者按照正确的顺序重组数据包。
生存时间:8个bit。TTL域防止丢失的数据包在无休止的传播。该域包含一个8位整数,此数由产生数据包的主机设定。TTL值设置了数据报可以经过的最多的路由器数。TTL的初始值由源主机设置(通常为32或64),每经过一个处理它的路由器,TTL值减1。如果一台路由器将TTL减至0,它将丢弃该数据包并发送一个ICMP超时消息给数据包的源地址。注意:TTL值经过PIX时不减1。
协议字段:8个bit。用来标识是哪个协议向IP传送数据。ICMP为1,IGMP为2,TCP为6,UDP为17,GRE为47,ESP为50。
首部校验和:根据IP首部计算的校验和码。
◎ 在发送数据时:
(1)把IP数据报的首部都置为0,包括校验和字段;
(2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和;
(3)把得到的结果存入校验和字段中。
◎ 在接收数据时:
(1)把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段;
(2)检查计算出的校验和的结果是否等于零;
(3)如果等于零,说明被整除,校验是和正确,否则,校验和就是错误的,协议栈要抛弃这个数据包二进制反码求和:先进行二进制求和,然后对和取反。
Option选项:是数据报中的一个可变长的可选信息。
源地址和目的地址:各32个bit,是IP地址。注意到的是链路层使用的是MAC地址即物理地址。
说到IP协议,我们自然会联想到IP地址。所谓IP地址就是给每个连接在互联网上的主机分配的一个32位地址。IP地址就好像电话号码(地址码):有了某人的电话号码,你就能与他通话了。同样,有了某台主机的IP地址,你就能与这台主机通信了。IP地址用二进制来表示,每个IP地址长32bit,就是4个字节。为了方便人们的使用,IP地址经常被写成十进制的形式,中间使用符号“.”分开不同的字节。
IP地址格式为:IP地址=网络地址+主机地址或 IP地址=网络地址+子网地址+主机地址。每个IP地址都包含两部分,即网络号和主机号。 网络号:用于识别主机所在的网络;主机号:用于识别该网络中的主机。当分配给主机号的二进制位越多,则能标识的主机数就越多,相应地能标识的网络数就越少,反之亦然。P地址分为五类,A类保留给政府机构,B类分配给中等规模的公司,C类分配给任何需要的人,D类用于组播,E类用于实验,各类可容纳的地址数目不同。
其中A类、B类和C类这三类地址用于TCP/IP节点,其它两类D类和E类被用于特殊用途。