IP协议提供一种尽力投递(best-effors,即不提供任何保证)的方法将数据从源端传递到目标端,它不关心源机器和目标机器是否在同样的网路中,也不关心他们之间是否还有其他网路。下面来看下IPv4协议头部组成。
IPv4协议头部
IPv4的头部有一个20字节的定长部分和一个可选的变成部分组成
Version
version域(4bit)记录了数据报属于哪一个版本的协议,下图是version域值所对应的协议
IHL
IHL(Internet Header Length)表示IP协议头部的长度(以32bit为单位,也就是4字节)。最小值为5,因为定长部分是20个字节;最大值是15,因此头部最长为60字节,也就意味着option域(变长部分)最多有40字节。
Differentiated Service
Differentiated Service用来表示不同的服务种类(通过服务质量来区分),例如延迟(Delay),吞吐量(Throughput),可靠性(Reliability)等。该域共有8位,但是只使用了6位,具体如下图
其中Precedence表示优先级,剩下三个标志位D(延迟),T(吞吐量),R(可靠性)表示关注的服务质量
###Total length
表示数据报的总长度,也就是整个IP包的长度(头部+数据),总共有16位,所以最大长度是65535字节
Identification
Identification是一个数据报的唯一标识,它的作用是让目标主机确定一个新到达的分段(fragment)是属于哪个数据报的。同一数据报的所有分段都含有相同的标识。
Flags
Flags域有3个标志位,第一个标识位没有被使用,设置为0.第二个标志位DF(Don’t Fragment)表示不要进行分段;第三标识位MF(More Fragment),用来标识最后一个分段。若分段为数据报中最后一个分段,则该位为0,其余分段为1。接收方可以通过它来确定一个数据报的所有分段是否已经全部到达。
Fragment Offset
该域指明了分段在当前数据报的什么位置上。除了一个数据报的最后一个分段,其他分段的长度必须是8字节的倍数。8字节是基本的分段单位。由于该域共有13位,因此最多可以有2^13=8192个分段
TTL
TTL(Time to Live)是用来追踪一个数据报的存活周期,计数单位是表,因此最大的存活周期是2^8=256秒。在每一跳上数值减1,如果为0,则该数据报被丢弃
Protocol
当网络层组装完成一个完整的数据报之后,它需要知道如何对数据报进行处理,Protocol表示了对该数据报进行处理的协议,可以是TCP协议,也可以是UDP协议,
Header checksum
头部检验和,只用来校验头部,没到达一跳,都需要重新计算头部检验和。
Source IP address
源地址,32位
Destination IP address
目标地址,32位
IP地址
IP地址共有32位,可以表示为XXX.XXX.XXX.XXX。IP地址包含网络号和主机号两个部分,根据网络号和主机号的分配方式,IP地址可以分为A,B,C,D,E五类。
类别|前缀|网络号|主机号
|—|—|—|—|
|A|0|2^7=128|2^24|
|B|10|2^14|2^16|
子网
所谓的子网,是指将一个网络分成多个可供内部使用,但是对于外界仍然像单个网络一样。具体的做法其实就是从主机号中取出一些位作为子网号。
子网掩码
为了实现对子网的支持,路由器需要一个子网掩码(subnet mask),它表示的网络号+子网号+主机号的分隔方案
通常情况下,子网掩码的表示方法和地址本身的表示方法是一样的。在IPv4中,就是点分十进制四组表示法(四个取值从0到255的数字由点隔开,比如255.128.0.0)
另一种更为简短的形式叫做无类别域间路由(CIDR)表示法,它给出的是一个地址加上一个斜杠以及网络掩码的二进制表示法中“1”的位数(即网络号中和网络掩码相关的是哪些位)。例如,192.0.2.96/28表示的是一个前28位被用作网络号的IP地址(和255.255.255.240的意思一样)
子网掩码的好处就是:不管网络有没有划分子网,只要把子网掩码和IP地址进行逐位的“与”运算(AND)即得出网络地址来
CIDR
CIDR的原理是将IP地址以可变大小的块的方式进行分配,而不管他们属于的类别(IP共有A,B,C,D,E)。比如一个站点需要2000个地址,那么它可以获得以2048作为字节边界的地址块,其中包含了2048个地址。
假设从194.24.0.0开始的地址都可以使用,A需要2048个地址,B需要4096个地址,C需要1024个地址。
对于A来说,需要2048个地址,那么主机号就需要2^11个,所以它的子网掩码是194.24.0.0/21,地址范围从11000010.00011000.00000000.00000000到11000010.00011000.00000111.11111111,即194.24.0.0 到194.24.7.255
对于B来说,需要4096个地址,那么主机号就需要2^12个,所以它的子网掩码长度为20位,所以它的起始地址为11000010.00011000.00010000.00000000即194.24.16.0,所以子网掩码位194.16.24.0/20
类别 | 首地址 | 末地址 | 地址个数 | 子网掩码 |
---|---|---|---|---|
A | 194.24.0.0 | 194.24.7.255 | 2048 | 194.24.0.0/21 |
C | 194.24.8.0 | 194.24.11.255 | 1024 | 194.24.8.0/22 |
可分配 | 194.24.12.0 | 194.24.15.255 | 1024 | 194.24.12.0/22 |
B | 194.24.16.0 | 194.24.31.255 | 4096 | 194.24.16.0/20 |
假设一个目标地址为194.24.17.4到达路由器,那么路由器会选择A,B,C中的哪个呢?
首先194.24.17.4 与A的子网掩码进行与操作
11000010.00011000.00010001.00000100 and 11111111.11111111.11111000.00000000
得到194.24.16.0与A的首地址不符合,所以该地址不属于A
194.24.17.4与C的子网掩码进行与操作
11000010.00011000.00010001.00000100 and 11111111.11111111.11111100.00000000
得到194.24.16.0与C的地址不符合,所以该地址不属于C
194.24.17.4与B的子网掩码进行与操作
11000010.00011000.00010001.00000100 and 11111111.11111111.11111000.00000000
得到194.24.16.0,与B首地址符合,所以属于B
NAT(Network Address Translation)-网络地址转换
解决问题
IP地址短缺
基本思想
公司或者机构以一个公用IP出现在公网上,内部则使用私有的IP。NAT把私有IP转换为公有IP,以便私有IP可以访问外部资源
实现原理
NAT的基本工作原理是,当私有网主机和公共网主机通信的IP包经过NAT网关时,将IP包中的源IP或目的IP在私有IP和NAT的公共IP之间进行转换
如下图所示,NAT网关内有两个私有主机,其中公共网络IP为202.20.65.5。当私有主题192.168.1.2发送IP包给web server时,当IP经过NAT网关时,NAT会把IP包的源地址进行转换
(src=192.168.1.2, dst=202.20.65.4) ---NAT---> (src=202.20.65.5, dst=202.20.65.4)
同理,当web server向192.168.1.2发送IP包,经过NAT时,目的地址会被替换为私有地址
(src=202.20.65.4, dst=202.20.65.5) ---NAT---> (src=202.20.65.4, dst=192.168.1.2)
NAT 分类
从功能上来划分,NAT可以分为Basic NAT和PAT
Basic NAT
只转化IP,不映射端口
PAT
除了转化IP,还做端口映射,可以用于多个内部地址映射到少量(甚至一个)外部地址
从映射的时效性可以分为静态NAT和动态NAT
静态NAT
将内部网络中的每个主机都永久映射成外部网络中的某个合法的地址,多用于服务器。
动态NAT
外部网络中定义了一个或多个合法地址,采用动态分配的方法映射到内部网络。
ARP(Address resolution Protocol)地址解析协议
功能
将IP地址映射到MAC地址上,网路层使用IP地址,数据链路层使用MAC地址
工作流程
- 主机A向局域网中的主机B发送IP数据报时,先在自身的ARP缓冲表中查询主机B的MAC地址
- 如果有,即可以找出对应的MAC地址,将其写入帧中,再通过数据链路层的协议将数据发送到目的地址
- 如果没有,则主机A启动ARP服务
- ARP服务首先在局域网中广播一个ARP请求分组,分组的内容为,我的IP地址是192.31.63.0,我的MAC地址是00-00-C0-15-AD-18,我想知道知道IP地址为192.31.63.1的MAC地址
- 主机B收到请求后,发现是自己的IP地址,则向主机A发送一个ARP响应分组,内容为我的IP地址是192.31.63.1,我的MAC地址是08-00-2B-00-EE-AA。局域网中其他主机则忽略这个请求
RARP(Reverse Address Resolution Protocol)反向地址解析协议
功能
将MAC地址映射到IP地址上