ip:网际协议 - littleboy12580/learning_python GitHub Wiki
IP是TCP/IP协议族中最为核心的协议,所有的TCP,UDP,ICMP,IGMP数据都以IP数据报格式传输;IP提供的传输服务有两个特点:不可靠与无连接
- 不可靠
IP协议不能保证数据报能成功到达目的地,IP仅提供尽力而为的传输服务。如果发生错误,IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP消息给信源端;任何要求的可靠性必须由上层来提供 - 无连接
IP并不维护任何关于后续数据报的状态信息,每个数据报是相互独立的;因此IP数据报可以不按发送顺序接收
IP地址分为A,B,C,D,E五类;它由网络号和主机号组成(有时候主机号也可以划分出子网变成子网号加主机号)
网络号:用于识别主机所在的网络
主机号:用于识别该网络中的主机
A类保留给政府机构,B类分配给中等规模的公司,C类分配给任何需要的人,D类用于组播,E类用于实验,各类可容纳的地址数目不同。其中A类、B类、和C类这三类地址用于TCP/IP节点,其它两类D类和E类被用于特殊用途。
A、B、C三类IP地址的特征:当将IP地址写成二进制形式时,A类地址的第一位总是O,B类地址的前两位总是10,C类地址的前三位总是110。
- A类地址第1字节为网络地址,其它3个字节为主机地址。
- A类地址范围:1.0.0.1—126.155.255.254
- 10.X.X.X是私有地址(所谓的私有地址就是在互联网上不使用,而被用在局域网络中的地址)。
- 127.X.X.X是保留地址,用做循环测试用的。
- B类地址第1字节和第2字节为网络地址,其它2个字节为主机地址。
- B类地址范围:128.0.0.1—191.255.255.254。
- 172.16.0.0—172.31.255.255是私有地址
- 169.254.X.X是保留地址。如果你的IP地址是自动获取IP地址,而你在网络上又没有找到可用的DHCP服务器。就会得到其中一个IP。
- C类地址第1字节、第2字节和第3个字节为网络地址,第4个个字节为主机地址。另外第1个字节的前三位固定为110。
- C类地址范围:192.0.0.1—223.255.255.254。
- 192.168.X.X是私有地址。
- D类地址不分网络地址和主机地址,它的第1个字节的前四位固定为1110。
- D类地址范围:224.0.0.1—239.255.255.254
- E类地址也不分网络地址和主机地址,它的第1个字节的前五位固定为11110。
- E类地址范围:240.0.0.1—255.255.255.254
IP数据报的格式如图所示,普通IP首部长为20个字节,除非含有选项字段;数据报格式如下图所示
- 4位版本号
指IP协议的版本。通信双方使用的IP协议版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4) - 4位首部长度
指首部占32bit字的数目,包括任何选项。由于是一个4比特字段,最大值为1111=15,因此首部最长为15*32/8=60个字节;普通IP数据报(没有任何选择项)字段的值是5。当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。因此数据部分永远在4字节的整数倍开始,这样在实现IP协议时较为方便 - 8位服务类型(TOS)
包括一个3bit的优先权子字段(现在已经被忽略),4bit的TOS子字段和1bit未用位但必须置0;4bit的TOS分别代表:最小时延,最大吞吐量,最高可靠性和最小费用;4bit中只能置其中1bit。如果所有4bit均为0,那该服务就是一般服务 - 16位总长度字段
总长度字段是指整个IP数据报的长度,以字节为单位;通过首部长度字段与总长度字段可以算出IP数据报中数据内容的起始位置和长度;因为该字段是16bit,所以IP数据报的最大长度为2^16 -1=65536字节;
在IP层下面的每一种数据链路层都有自己的帧格式,其中包括帧格式中的数据字段的最大长度,这称为最大传送单元MTU(Maximum Transfer Unit)。当一个数据报封装成链路层的帧时,此数据报的总长度(即首部加上数据部分)一定不能超过下面的数据链路层的MTU值。 - 16位标识字段
IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。 - 3位标志字段
目前只有2位有意义。标志字段中的最低位记为MF(More Fragment)。MF=1即表示后面“还有分片”的数据报。MF=0表示这已是若干数据报片中的最后一个。标志字段中间的一位记为DF(Don’t Fragment),意思是“不能分片”。只有当DF=0时才允许分片。 - 13位片偏移字段
片偏移指较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位,每个分片的长度一定是8字节(64位)的整数倍。 - 8位生存时间(TTL)
TTL设置了数据报可以经过的最多路由器数,它指定了数据报的生存时间;TTL的初始值由源主机设置(通常为32或64),一旦经过一个处理它的路由器,TTL的值就减一,当该字段值为0时,数据报就被丢弃,并发送ICMP报文通知源主机 - 8位协议字段
协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程 - 16位首部检验和字段
首部检验和字段是根据IP首部计算的检验和码,它不对首部后面的数据进行计算 - 32位源IP地址与32位目的IP地址
指该IP数据报的源地址与目的地址 - 选项部分
IP首部的可变部分就是一个可选字段。选项字段用来支持排错、测量以及安全等措施,内容很丰富。此字段的长度可变,从1个字节到40个字节不等,取决于所选择的项目。某些选项项目只需要1个字节,它只包括1个字节的选项代码。但还有些选项需要多个字节,这些选项一个个拼接起来,中间不需要有分隔符,最后用全0的填充字段补齐成为4字节的整数倍。
增加首部的可变部分是为了增加IP数据报的功能,但这同时也使得IP数据报的首部长度成为可变的。这就增加了每一个路由器处理数据报的开销。实际上这些选项很少被使用。新的IP版本IPv6就将IP数据报的首部长度做成固定的。
目前,这些任选项定义如下:- 安全和处理限制(用于军事领域)
- 记录路径(让每个路由器都记下它的IP地址)
- 时间戳(让每个路由器都记下它的IP地址和时间)
- 宽松的源站路由(为数据报指定一系列必须经过的IP地址)
- 严格的源站路由(与宽松的源站路由类似,但是要求只能经过指定的这些地址,不能经过其他的地址)
这些选项很少被使用,并非所有主机和路由器都支持这些选项。
如果目的主机与源主机直接相连或都在一个共享网络上,那就直接把包发送到目的主机,如果不是,那把ip数据报送到默认路由器,由它转发
路由器使用路由表保存自己知道的网络的信息,它包括:
- 目的IP地址
它可以是一个完整的主机地址或是一个网络地址,主机地址主机号非0,网络地址主机号为0 - 下一个路由器地址
这个路由器是与当前路由器直接相连的路由器,或是直接相连的网络ip地址(考虑到一台电脑有两个网口,其中一个连接目的地址) - 标志
其中一个表明目的IP地址是网络地址还是主机地址.另一个指明下一站是真正的路由器还是网络接口 - 为数据报的传输指定一个网络接口.
每个路由器都不需要知道所有网络的信息,当它发现要转发的包不在与自己直接连接的网络时,就会把这个包发给下一个路由器,一直到终点
IP路由选择主要完成以下功能:
- 搜索路由表,寻找能与目的地址完全匹配的条目,如果找到直接发给它
- 搜索路由表,寻找能与目的网络号完全匹配的条目,如果找到将包发给这一条目指定的下一个路由器或是网络接口
- 搜索路由表,寻找默认条目,如果找到把这个报文发给它
如果都不成功,将不再发送这个包,向源地址发送一个ICMP不可达报文
现在所有的主机都要求子网编址,即不是把IP地址看成由单纯的一个网络号和一个主机号组成,而是把主机号再分成一个子网号和一个主机号。大多数子网例子都是B类地址,一般都采用自然划分法来划分子网号和主机号,即把B类地址中留给主机的16bit中的前8bit作为子网地址,后8位作为主机号,不过对于划分并没有硬性规定
子网掩码 由于使用了子网寻址,所以不可以直接使用A类的网络地址与主机地址来判断一台主机是不是在同一网络上,这时需要使用子网掩码来进行区分子网号与主机号,有了它,主机可以确定IP数据报的目的是:
- 本子网中主机
- 本网络中其它子网主机
- 其它网络主机
假设有IP地址:11.33.44.55,子网掩码为255.255.255.0,因为它是11,所以是一个A类网络,从掩码中可以知道它所在子网为33.44,主机号为55;如果它要发一个ip包给11.33.44.66,那从子网掩码中可以知道目标主机与源主机在同一子网上,可以直接发送;如果要发给11.22.33.44 那从子网掩码知道目标是在同一网络中不在同一子网中;如果要发给12.33.44.55那从A类地址的掩码就可以直接判断不是同一网络内了