![1bd3274e0da6bc3ec4651e58ed11a262.png](https://i-blog.csdnimg.cn/blog_migrate/b74c1c27c850a3d8598387d6bfcfc9ed.jpeg)
我们已经知道,两台电脑间要通信,电脑A通过MAC地址可以将数据交到电脑B手里。但前提是,他们俩需要在同一个“房间”。如果不在,电脑A只能把数据交给自己的网关。
我们可以把一个“房间”叫做一个“广播域”,在一个广播域内,只要有人发出广播报文(比如ARP Request),其他人都能收到,包括网关。但网关并不会把这个广播报文转发到房间外面去,房间隔音效果没得说。
可问题是,如果二台电脑不在同一个广播域,电脑A通过ARP获得网关的MAC地址后,把数据封装在以太网中,网关收到后,发现收件人正是自己,于是拆开以太网封装,把里面的数据占为己有!
所以,必须告诉网关,你拆了以太网封装后,里面的数据是不是你的,你还要看个东西。
这个东西,就是IP地址!
IP地址?不就是电脑的“名字”吗?
是的。我们人类的身份证号码中包含了省市等地理位置信息,而名字中没有。相反,电脑的MAC地址中没有位置信息,但IP地址里却有!
所以,我们只要想办法让网关拆开以太网封装后,看到收件人的IP地址,并能根据IP地址中的位置信息去找真正的收件人,问题就可以解决。
IP(Internet Protocol,互联网协议),设计的初衷就是为了提高网络的可扩展性,比如实现不同“房间”内的电脑之间的通信,实现网络间的互连。
IP主要有三个内容:IP编址方案、分组封装格式和分组转发规则。
IP地址可以在网络中唯一地标识一台网络设备。
不是说MAC地址是唯一的吗?
没错,MAC地址的确唯一,而且不会重复、无法修改,但MAC地址不包含位置信息,一般在一个广播域内使用,无法在更大范围里用它找别人。
但IP地址可以,不管范围多大,通过IP地址都能找到你!
既然这样,直接用IP就好了,干嘛还要用MAC多此一举呢?
这是因为IP地址资源有限,分配给电脑的 IP地址可能会发生变化,并不是唯一不变的。如果一台电脑今天和明天的IP地址不同,那别人找起来会非常麻烦。比如你每天换个名字,你周围的人可能会“疯”!而MAC地址固定不变,找起来要容易得多。所以,不管你IP地址怎么变,电脑都会用ARP协议把多变的IP地址和唯一不变的MAC地址建立对应关系就可以了。
也有人把IP地址叫“逻辑地址”,MAC地址叫“物理地址”或“硬件地址”。
我们曾经说过,通过IP地址和子网掩码,可以计算出网络地址。网络地址表示了你在网络中的哪个“房间”,就是你的位置。
所以,我们只要让电脑在把数据封装为以太网格式之前,先把数据用IP封装一下。IP的分组封装“快递单”格式如下:
![e21c39eb1689a2578dbfcb7bbe638c3f.png](https://i-blog.csdnimg.cn/blog_migrate/e29a25075d0d52004fec25e804d3a2c5.jpeg)
“快递单”里要填的内容挺多,但我们最关心的是最后两行:
Source:发件人的IP地址;
Destination:收件人的IP地址。
其他内容我们也解释一下:
Version版本号,目前使用的是版本4(IPv4);
Header Length头部长度,表示这份“快递单”的大小,一般为20字节;
Differentiated Services Field区分服务字段,用于QoS,我们可以理解为表示该数据包的重要或优先程度。这东西以后讨论;
Total Length总长度,表示该数据包(被IP封装之后)的总大小。它等于里面的数据加上Header Length的大小。IP协议定义了MTU(Maximum Transmission Unit,最大传输单元),也就是IP传输的数据包最大值,一般这个值为1500字节。
Identification标识号,表示该数据包的唯一编号;
Flags标志位,共有3位:第1位保留没有使用,第2位为DF位,第3位为MF位;
Fragment offset分片偏移量;
当数据包总长度大于MTU时,IP无法传输,需要把数据包“切开”,使数据包大小不超过MTU,这叫“IP分片”。你可以理解为IP用很多辆汽车运输数据,每辆车最多能装1500字节。
如果IP在分片前发现DF置为“1”,表示该数据不允许“分片”。IP无法传输大于MTU的数据包,只能丢弃:
![106dad2a4b41317b482ffce878a79336.png](https://i-blog.csdnimg.cn/blog_migrate/64d387e4abcafde5f9c089e4b41712b8.png)
图中,我们发送了一个2000字节的数据包并把DF置为“1”,发现全部丢弃了。
如果数据包需要分片,IP在分片后,除最后一片的MF位为“0”外,其他的分片均为“1”,并把第1个分片中的Identification复制到所有分片中。另外,除最后一片的Fragment offset分片偏移量为0外,其他分片的Fragment offset均为下一个分片的长度。
Time to live生存时间,这个东西以后讨论;
Protocol协议,收件人收到数据包,拆除IP封装后根据Protocol填写的内容判断把里面的数据交给谁处理,作用类似以太网封装中的Type;
Header checksum头部校验和,只校验IP头部信息,不校验里面封装的数据。这样做的好处是简单、效率高。
IP协议用于实现不同网络之间的互通,所有具备路由功能的网络设备都能实现IP寻址,比如路由器。网关也是具备路由功能的设备,可以是路由器,也可以是其他设备。
IP是一个“尽力而为”的协议,意思是IP协议答应会尽力把数据送到目的地,但不保证什么。如果数据包在传输过程中出现错误,IP会根据协议规定把它丢弃。
听上去IP很不靠谱,但这样做的好处是简单而高效。很早的时候曾因为IP的不靠谱,也有其他的协议想取代IP网络协议的地位,比如ATM(不不,不是取款机,它叫Asynchronous Transfer Mode,异步传输模式)。ATM虽然也很高效,但过于复杂,最终还是失败了。
如果想保证什么,可以想别的办法,IP还是简单点好。
既然IP成为在不同网络中寻址的协议,那IP如何编址就显得格外重要。
IP地址由32位二进制位组成,共4个字节,为书写方便,使用点分十进制表示,如192.168.1.10。
IP地址可以分成网络地址和主机地址两部分,网络地址标识了这个IP地址在什么地方,在哪个网络。你看,IP地址包含了位置信息,而MAC地址并没有。
主机地址,就是你在这个房间里的编号,只要和房间里其他人不同就行。
我们发现,一幢楼的房间有大有小,可容纳的人数也有多有少。网络也是这样,可以分成许许多多的子网,子网越大,可容纳的电脑也越多,能用的主机地址也就越多。
那么,IP如何编址呢?
小Q:IP干嘛要有MTU,要分片?不分不行吗?
欢迎留言讨论。