IP 概述
ifconfig
和 netstat
。说明:
**版本字段(Version):**用于区分不同IP协议的版本。如IPv4、IPv6,用4bit表示(4位),IPV4头部为0100(4),IPV6头部为0110(6)。
**首部长度(Header Length):**因为头部长度不固定(IP首部的选项部分 Option 不固定),所以需要标识该分组的头部长度用4bit表示(4位),以4byte为单位,取值范围:5-15,即20-40byte(其他字段也是类似的计算方式,因为bit位是不够表示该字段的值)。
DS Field字段:早期用来表示业务类型,现在用于支持QoS中的差别服务模型,实现网络流量优化。
Total Length总长度:长16位,描述了 IP 数据包头部和后续数据的总长度,最大可达到 65535 的一个长度,当数据包被分片的时候该字段的值也随着变化。
标识 Identification:16位长度,每一个IP包都有标识。便于在IP包分片后,判断是否是一个数据包。
**源和目的IP地址:**是分配给主机的逻辑地址,用于在网络层标识报文的发送方和接收方。根据源IP地址和目的IP地址可以判断目的端是否与发送端位于同一网段,如果二者不在同一网段,则需要采用路由机制进行跨网段转发。
Wireshark抓包查看
说明:源主机必须知道目的主机的ip地址才能将数据发送到目的地,源主机向其他主机发送报文之前,需要检查目的IP地址和源主机IP地址是否处于同一网段,如果是则将报文下发到底层的协议进行以太网的封装处理。如果目的地址和源主机地址不属于同一个网段,则主机需要获取下一跳路由的IP地址才能将报文下发到底层的协议处理。
如果企业网络中希望通过规划多个网段来隔离物理网络上的主机,使用缺省子网掩码就会存在一定的局限性。网络中划分多个网段后,每个网段中的实际主机数量可能很有限,导致很多地址未被使用。
如图所示的场景下,C类地址的缺省子网掩码为24位,可以支持254台这主机,而图中只有30台主机,如果使用缺省子网掩码的编址方案,则地址使用率很低。
128 64 32 16 8 4 2 1
1 1 1 0 0 0 0 0
第一个子网
网络地址:192.168.1.0
第一个IP地址:192.168.1.1
最后一个IP地址:192.168.1.30
广播地址:192.168.1.31
第二个子网
网络地址:192.168.1.32
第一个IP地址:192.168.1.33
最后一个IP地址:192.168.1.62
广播地址:192.168.1.63
第三个子网
网络地址:192.168.1.64
第一个IP地址:192.168.1.65
最后一个IP地址:192.168.1.94
广播地址:192.168.1.95
可变长子网掩码缓解了使用缺省子网掩码导致的地址浪费问题,同时也为企业网络提供了更为有效的编址方案。本例中需要使用可变长子网掩码来划分多个子网,借用一定数量的主机位作为子网位的同时,剩余的主机位必须保证有足够的IP地址供每个子网上的所有主机使用。
例如:公司有C类网段192.168.1.0/24,目前有以下几个部门:
需求是将一个C类网段合理分配给如下几个部门,保证地址合理分配
销售部地址范围:
子网掩码:255.255.255.192
子网范围:192.168.1.128~192.168.1.191
技术部地址范围:
子网掩码:255.255.255.224
子网范围:192.168.1.192~192.168.1.223
业务部地址范围:
子网掩码:255.255.255.128
子网范围:192.168.1.0~192.168.1.127
会计部地址范围:
子网掩码:255.255.255.240
子网范围:192.168.1.224~192.168.1.241
在没有路由器的情况下,两个网络之间的主机是不能进行TCP/IP通信的,即使是两个网络连接在同一台交换机,TCP/IP协议也会根据子网掩码(255.255.255.0)与主机的IP 地址作 “与” 运算的结果不同判定两个网络中的主机处在不同的网络里。
而要实现这两个网络之间的通信,则必须通过网关。如果主机A发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关(在封装MAC地址的时候是封装的是网关的MAC地址),再由网关转发给主机B的网关。
网关由管理员设置,从主机地址中随机挑选一个作为网关地址。
只有UDP的数据包才会有分片。
网络中转发的IP报文的长度可以不同,但如果报文长度超过了数据链路所支持的最大长度,则报文需要分割成若干个较小的片段才能够在链路上传输。将报文分割成多个片段的过程叫做分片。
说明:
接收端根据分片报文中的标识符(Identification),标志(Flags),及片偏移(Fragment Offset)字段对分片报文进行重组。
Identification:标识符,用于识别属于同一个数据包的分片,以区别于同一主机或其他主机发送的其它数据包分片,保证分片被正确的重新组合。
Identification该字段还在流量分析中也会起到重要的意义。例如在防火墙之前和之后去抓取同一个会话,那么数据在经过防火墙后,其源IP地址和目的IP地址甚至是端口可能都已经被改变了。很难去分辨在防火墙前和防火墙后是否是同一组流量。那么就可以使用Identification这个字段进行判断,因为Identification值是一样的。
标识字段唯一的标识主机发送的每一份数据报,通常每发送一个报文,它的值就会加1。
Flags:标志字段,用于判断是否已经收到最后一个分片。(最后一个分配的标志字段(flag)值为0,其他分片设置为1)
Fragment Offset:片偏移,原始分片中的位置。标识某个分片在分组中的位置。第一个分片的片偏移为0,第二个分片的片偏移表示紧跟第一个分片后的第一个比特的位置。比如,如果首片报文包含1259比特,那么第二片报文的片偏移字段值就应该为1260。
当IP数据报被分片后,每一片都成为一个分组,具有自己的IP首部,并在选择路由时与其他分组独立。这样,当数据报的这些分片到达目的端时有可能会失序,但是在IP首部中有足够的信息让接收端能正确组装这些分片。
尽管IP分片过程看起来是透明的,但是有一个点:即使只丢失一片数据也要重新传递整个数据报。
IP层本身没有超时重传的机制一一由更高层来负责超时和重传(TCP有超时和重传机制,但UDP没有。一些UDP应用程序本身也执行超时和重传)。当来自TCP报文段的某一片丢失后,TCP在超时后会重发整个TCP报文段,该报文段对应于一份IP数据报。没有办法只重传据报中的一个数据报片。
如果对数据报分片的是中间路由器,而不是起始端系统,那么起始端系统就无法知道数据报是如何被分片的。就这个原因,经常要避免分片。
使用UDP很容易导致IP分片,而TCP不会产生IP分片。这是因为TCP限制了传给IP层数据的长度,使IP数据报的长度不会超过路径MTU。
假设网络的MTU为1500字节。当发送一份数据长度为1473字节的UDP数据报时,封装成的IP数据报的长度为1501(1473+8+20)字节,大于路径的MTU值。于是IP层进行分片,一份IP数据报被分成两个分组,其中一个分组包含1472字节数据,另一个分组包含1字节数据。
执行ping命令
ping -l 2000 192.168.188.133 -n 1
命令解析:
在虚拟机中进行抓包查看:
说明:
DF位为0表示该数据报可以被分片。
以太网帧的数据大小最多要求1500个字节,其中IP头部占20个字节,ICMP头部占8个字节。数据部分就只剩下1472个字节了。
1472+528=2000。
抓取不分片的数据包
ping -l 1472 192.168.188.133 -n 1
OmniPeek 抓包查看
第一个分片
第二个分片
1500-20个字节的IP首部=1480数据部分
第三个分片
第四个分片
数据长度为1472+1480+1480+568=5000。
ICMP 不可达差错需要分片。
思科路由器会支持显示下一站网络的MTU。
解析:主机solaris在和主机bsdi通信的时候,数据长度设置为600字节,在主机netb的MTU值是大于600的所以是可以通过并不需要就行分片操作。而主机sun的路径MTU是552(ping程序检查的出接口,这个MTU=552是入接口,所以在去的时候是不需要分片的)。但是在回来的时候由于MTU值是大于600,所以主机sun这里的出接口是过不来的。看不见回显应答,返回一个ICMP 不可达差错报文,不会返回给主机solaris,而是返回给主机bsdi。
说明:
Time to Live 生存周期:数据包每经过一个三层设备转发就将TTL值减1,当生存周期TTL为0时,向源IP地址发送ICMP错误消息。不同都操作系统的默认TTL值不同,Linux中的TTL值位64,Windows中的TTL值为128。(但是这个TTL值是可以修改的,只能是作为一个参考)
并且有时候每个方向的TTL值是不一样的,有可能发包的时候TTL值是128,返回可能TTL值是255。
Header Checksum 首部校验和:长16位,只对IPv4头部进行校验,如果出现错误则丢弃数据包。
数据包在网络中传输为什么会出现拥塞?
TTL解决环路导致拥塞
Ping是ICMP协议
协议字段被 IP 用来对数据报进行分用,根据它可以识别是哪个协议向IP传送数据。
目的端的网络层在接收并处理报文以后,需要决定下一步对报文该做如何处理。IP报文头中的**协议字段(Protocol)**标识了将会继续处理报文的协议。与以太帧头中的Type字段类似,协议字段也是一个十六进制数。
IP报文头中的协议字段也标识上层协议如:
ICMP 控制消息协议,对应值0x01。
TCP 传输控制协议,对应值0x06。
UDP 用户数据报协议,对应值0x17。
最后一个字段是选项,它是数据报中的一个可变长的可选信息。选项字段以32位作为界限,在必要的时候插入值为0的填充字节。这样就保证IP首部长度始终是32位的整数倍(这是首部长度字段所要求的)。
有如下几个选项:
这些选项很少被使用,并非所有的主机和路由器都支持这些选项。选项字段一直都是以32bit作为界限,在必要的时候插入值为0的填充字节。这样就保证IP首部始终是32bit的整数倍(这是首部长度字段所要求的)。
数据报从主机bsdi到sun的传送过程。
查询路由的过程:
DHCP的源IP地址就是0.0.0.0 。
127.0.0.1是环回地址,但是127后面随便写都是环回地址。
IP选路的原理涉及计算机网络中的路由协议和路由表。当数据包到达路由器时,路由器需要决定将数据包发送到哪个接口以及下一跳的地址是什么。
除了传统的路由选择方式外,还可以通过使用IP选路选项(如IP源站选路选项),来指定数据包的传输路径,以实现特定的路由策略和行为控制。
选路是IP最重要的功能之一。下图是IP层处理过程的简单流程。需要进行选路的数据报可以由本地主机产生,也可以由其他主机产生。在后一种情况下,主机必须配置成一个路由器,否则通过网络接口接收到的数据报,如果目的地址不是本机就要被丢弃(例如,悄无声息地被丢弃)。
在下图中,描述了一个路由守护程序( daemon),通常这是一个用户进程。在Unix系统中,大多数普通的守护程序都是路由程序和网关程序(术语 daemon指的是运行在后台的进程,它代表整个系统执行某些操作。 daemon一般在系统引导时启动,在系统运行期间一直存在)。在某个给定主机上运行何种路由协议,如何在相邻路由器上交换选路信息,以及选路协议是如何工作的,所有这些问题都是非常复杂的。
下图所示的路由表经常被IP访问(在一个繁忙的主机上,一秒钟内可能要访问几百次),但是它被路由守护程序更新的频度却要低得多(可能大约30秒种一次)。当接收到ICMP重定向,报文时,路由表也要被更新。
路由守护程序:动态路由协议RIP协议,OSPF协议。
开始讨论 IP 选路之前,首先要理解内核是如何维护路由表的。路由表中包含的信息决定了 IP 层所做的所有决策。
IP 搜索路由表的几个步骤:
搜索匹配的主机地址;
搜索匹配的网络地址;
搜索默认表项(默认表项一般在路由表中被指定为一个网络表项,其网络号为 0)。
匹配主机地址步骤始终发生在匹配网络地址步骤之前。
IP层进行的选路实际上是一种选路机制,它搜索路由表并决定向哪个网络接口发送分组。(可以添加路由表)
这区别于选路策略,它只是一组决定把哪些路由放入路由表的规则。 IP 执行选路机制,而路由守护程序则一般提供选路策略。
下图是“srv4”主机的路由表:
对于一个给定的路由器,可以打印出五种不同的标志( flag):
标志G是非常重要的,因为由它区分了间接路由和直接路由(对于直接路由来说是不设置标志G的)。其区别在于:发往直接路由的分组中的IP地址是目的端的IP地址,链路层地址是目的端的链路层地址。而当分组被发往一个间接路由时,分组中的IP地址还是目的端的IP地址,但是链路层地址却是网关(即下一跳路由器)的链路层地址。
链路层地址也称为MAC地址。
Linux下查看路由表
netstat -rn
Windows下查看路由表
route print
netstat -r
如果路由表中没有默认表项,而又没有找到匹配项,这时会发生什么情况呢?结果取决于该IP数据报是由本机产生的还是被转发的(主机充当一个路由器)。如果数据报是本机产生的,那么就给发送该数据报的应用程序返回一个错误,或者是“主机不可达差错”或者是“网络不可达差错”。如果是被转发的数据报,那么就给发送该数据报的主机发送一份ICMP主机不可达的差错报文。
一旦默认路由发生差错,默认路由器将通知它进行重定向,并允许主机对路由表作相应的改动。
ICMP 重定向报文的格式如下:
ICMP重定向报文的接收者(主机)必须查看三个IP地址:
1. 导致重定向的IP地址(即ICMP重定向报文中包含的IP首部中的目的IP地址)。(目的IP地址)
2. 发送重定向报文的路由器的IP地址(IP数据报首部中的源IP地址)。(网关)
3. 应该采用的路由器IP地址(ICMP重定向报文中的4~7字节)。(优化的网关)
ICMP 重定向数据包
R1去往2.2.2.2的时候要走202.100.1.2这个IP
在生成ICMP重定向报文之前这些条件需要满足: