前言
之前我们讲的udp和tcp协议,是处于传输层的协议
而ip协议,是处于传输层下面的网络层的协议
一个报文传输的时候,表面上是一个主机的传输层运输到另一个主机的传输层,本质是其实是由应用层不断向下交付到数据链路层,再通过物理层通过各种信号什么的传输到对方的数据链路层,然后再不断向上解包分用
上一章我们讲tcp主要解决数据可靠地从一个主机传输到另一个主机,其实准确来说这是tcp/ip组合起来解决的
tcp主要是保证可靠性,ip则是提供将数据包从A主机运到B主机的能力
ip协议
以上就是ip协议的报文(报头+有效载荷)
有效载荷就是传输层tcp或者udp的完整报文,再加上ip自己的报头,组成一个完整的ip报文
32位目的ip和32位源ip地址
我们之前讲的,ip地址标明唯一主机,而端口号标明进程,所以ip+port可以表示互联网中唯一的进程
ip地址一共有32位,所以最大表示2^32,也就42亿,这个数字肯定远远满足不了现在需求的,所以就有了后面要讲的两个技术——NAT和IPV6,而网络也是分成公网和私网的
在认识ip协议的时候,我们也要体会到运营商在网络世界作出的不可磨灭的贡献
首部长度+总长度
4位首部长度和tcp报文里的一样,[0,15]×4,所以ip最大报头长度也是60字节,然后总长度减去报头长度就是有效载荷的长度,通过上面的关系也就能实现报头和有效载荷的问题了
8位服务协议
填传输层是tcp还是udp,发送方填充,对方识别,解决有效载荷向上交付的问题
第二行的16位标识和3位标记位和13位片偏移与数据链路层相关,放在后面一点再讲
网段划分
ip=网络号+主机号,但是ip地址总共也就42亿个,所以为了提高ip地址的利用率,将ip地址进行了分类,分成ABCDE五种,从前往后网络号占比增加,主机号减少
但是一个局域网内大部分都不会需要2^24个主机,大部分的需求是C类,所以C很快就不足了
所以为了再进一步提高ip地址的利用率,有了子网掩码技术
有了子网掩码以后,网络号和主机号的划分与这个ip地址是什么类无关
将ip地址与子网掩码按位与后得到的结果就是网络号
子网掩码虽然提高了使用率,但ip地址仍然还是不够用的,所以有了NAT技术
NAT
关于路由器的知识:
每个路由器有两个ip地址,能构建子网
路由器有一张表,根据目标ip进行查找,如果表中不存在目标ip地址,则发送给默认路由
路由器在转发的时候,会将源ip替换成WAN口ip,有的时候端口也会进行替换
在一个局域网内,一个信息发送后会被所有主机接受,就如同石头掉入湖里激起的波纹
收到信息后,不属于自己的就会被丢弃
公网的ip地址是唯一的,内网的ip允许重复,这大大缓解了ip地址不足的问题
上图假设局域网以地区来划分,方便理解,实际情况并不是这么简单粗暴
中国通过路由器构建一个很大的子网,包含各个省区,这里是公网
每个省区也通过路由器构建自己的子网,包含每个市
如何循环...
这样一圈套一圈下来后,最后的几个圈就是内网了,内网内的ip地址不能重复,但是子网之间的ip地址可以重复
服务器都是部署在公网的,那么内网里的机器是如何访问到内网的呢?
假如我用微信发送一条信息给朋友,这条信息是要先到达微信的后台服务器的,而服务器的公网ip地址我们肯定是知道的
从发送信息的子网里寻找目标ip,路由器将目标ip与子网掩码按位与发现网络号不一样,证明不在当前子网内,向外转发并进行源地址的替换,如此循环
如果目标ip与子网掩码按位与后发现网络号一样,证明在当前子网内,接下来对在该子网内的所有主机发送arp请求,目标主机收到arp请求后发送arp应答给回给路由器,这样就知道了目标主机的mac地址,通过mac协议(数据链路层)才能进行实际的发送
ip地址标明方向,mac才有一跳一跳的能力
arp协议——同一子网内,根据目标ip地址,得到目标mac地址
局域网中,任何时候只允许一台主机发送数据,如果同时发送会产生数据碰撞的问题
划分碰撞域——交换机
主机得到arp应答,会将arp应答缓存起来(有时间限制),如果收到许多同类型的,会将最新的缓存起来
任何一台主机,都可能即会收到arp应答,又会收到arp请求
arp请求,广播报文
arp应答
分片
受限于物理底层各种因素,如果要传送的数据太大,是会分片的,也就是将一个大的数据分成几个小的数据来发送
分片一定是不好的,提高了数据的发送个数,增加了丢包概率
如何做到不分片呢?将每次发送的数据限制在规定大小内,这也是之前为什么tcp发送缓冲区画成一小格一小格的原因