网络层-IP
IPv4数据报格式
- 版本号:4比特,规定了数据报的IP协议版本,不同IP版本使用不同的数据报格式;
- 首部长度:由于IPv4数据报可能包含一些可选项(包含在头部),需要用4比特来确定IP数据报头部和载体的部分在哪;
- 服务类型:用于区分不同类型的IP数据报,例如实时数据报与非实时流量;
- 数据报长度:整个IP数据报的总长度(头部+数据)。该字段有16比特,所以理论最大长度为65,535字节。然而由于数据链路层的限制,通常不会超过1500字节。有了首部长度和数据报长度,便可以在一系列字节流中找到数据报和数据报之间的界限;
- 标识、标志、片偏移:这三个字段与IP分片有关。
- 标识:用来对片进行标记,具有相同标识的片来自于同一数据报;
- 标志:0或1,如果为1表示该片后还有片,如果为0则为同一数据报中最后一个片;
- 片偏移:用来标识每个片占据原始数据包的第几个字节,第一个片的偏移量为0
- 寿命:用来确保数据报不会永远在网络中循环,每当一台路由器处理数据报,寿命就会减1;
- 协议:该字段仅当一个IP数据报到达目的地才会有用。该字段指示了IP数据报的数据部分应该交给哪个特定的上层协议。例如,值为6交给TCP,为17交给UDP,为1交给ICMP;
- 首部检验和:用于判断是否出现错误;
- 源和目的IP地址:发送方和接收方的IP地址;
- 选项:该字段允许IP首部被拓展,但通常很少使用;
- 数据:要付给上层应用的数据。
IPV4数据分片
由于存在多种不同的数据链路层协议,并且不同的链路层协议承载的分组大小不同,因此需要对IP数据报进行分片,使得每个片的大小能够被对应的数据链路所承担。
当生成一个数据报时,发送主机会对它发送的每个数据报的标识号加1.当对一个数据报分片时,每个片都保留着大部分原始的数据报头(原地址、目标地址等)。由于IP是一种不可靠的服务,为了确保已经收到最后一个片,将最后一个片的标志设置为0,其它的设置为1。为了让目标主机确定是否丢失了一个片,使用偏移字段指定该字段应该放在初始IP数据报的哪个位置。
特殊的IP地址
私网地址
- 10.0.0.0-10.255.255.255
- 172.16.0.0-172.31.255.255
- 192.168.0.0-192.168.255.255
有限广播地址
255.255.255.255(有限广播地址),向本网段内的所有主机转发数据包
直接广播地址
主机位全为1,表示直接广播地址,用于向指定网络内全部主机发送IP数据包
有限广播地址和直接广播地址的区别在于,有限广播地址不需要知道网络号,直接在本网段内进行广播,而直接广播需要知道网段,在指定网段下进行广播
其它特殊IP地址
0.0.0.0 所有不清楚的主机IP地址均可以使用0.0.0.0来表示,例如主机刚接入网络还未分配具体IP地址时,使用0.0.0.0来表示
127.0.0.1,指电脑本身,也叫“localhost”,以127开头的均为保留地址
主机位全为0,表示网段
IPv6数据报格式
IPv6相对于IPv4来说主要增加了地址容量,删除了报头中的可选项,固定为40字节。
- 版本:使用4比特来标识IP版本号。IPv6将该字段设置为6;
- 流量类型:服务类型;
- 流标签:用于设置数据报的优先权;
- 有效载荷长度:16比特的无符号整数,给出了数据的字节数量;
- 下一个首部:数据报的内容需要交给哪个协议进行处理;
- 跳限制:生命周期;
- 源地址和目标地址:128位的IP地址;
- 数据:数据报的有效载荷部分
可以看出,IPv6移除了与分片相关的字段。于是只能在源和目的地进行分片和重装,如果路由器收到一个过大的报文,则会发送一个“分组太大”的ICMP差错报文。并且移除了首部校验和,这是因为TCP和数据链路层均对数据进行了检验。移除了选项字段,但它并没有消失,而是可能出现在“下一个首部”位置。
IPv4到IPv6进行迁移
双栈协议
如果一个主机同时启用IPv4和IPv6,则使用了双栈技术。当一个报文到达该主机时,数据链路层检查包头,如果报头表示其为IPv4,则交由IPv4进行处理,反之则交由IPv6处理。
隧道技术
当一个发送IPv6报文的主机希望将数据发送到另一个可以接受IPv6报文的主机上时,中间可能会通过很多弃用IPv4的路由器。为此,需要先将IPv6报文套上IPv4的报文头,并将协议号设置为41以表示其中的报文为IPv6数据报。等到数据报到达目的地,对报头进行检查,然后拆包得到IPv6报文。
ICMP(因特网控制报文协议)
ICMP依靠IP协议来传输消息,并不通过TCP,因此可以将其看作是一个介于网络层和传输层之间的协议,也可以将其看作是一个网络层的协议。ICMP通常用于返回的错误信息或是分析路由。ICMP错误消息总是包括了源数据并返回给发送者。
ICMP报文格式如下所示:
- Type:ICMP的类型,标识生成的错误报文类型;
- Code:进一步划分ICMP的类型,用该字段来查找产生错误的原因。例如,ICMP的目标不可达type可以把code设置为1至15来表示不同的意思;
- Checksum:校验和,用于错误检查;
- 内容:四字节字段,内容根据ICMP类型和代码而有所不同
常见的ICMP报文如下所示:
当使用ping命令时,就会发送一个type为8,code为0的ICMP报文到指定主机。在正常情况下,目标主机会发送一个type为0,code为0的ICMP回显回答。
使用ping命令去访问www.baidu.com(110.242.68.4)的抓包结果如下所示:
可以看到向baidu发送的ICMP数据报的type为8,code为0,并且IP协议的protocol为1,指的是该IP数据包承载了ICMP的数据报。
也可以看到baidu发回来的ICMP数据报的type为0,code为0,IP协议的protocol为1。