IP 在 TCP/IP 参考模型中处于第三层,也就是⽹络层。
网络层的主要作⽤是:实现主机与主机之间的通信,也叫点对点(end to end)通信
⽹络层与数据链路层有什么关系呢?
IP 的作用是主机之间通信⽤的,而 MAC 的作⽤则是实现「直连」的两个设备 之间通信,IP 则负责在「没有直连」的两个网络之间进行通信传输。
源IP地址和目标IP地址在传输过程中是不会变化的,只有源 MAC 地址和目标 MAC ⼀直在变化
广播地址分类:
多播地址:
多播⽤于将包发送给特定组内的所有主机。由于⼴播⽆法穿透路由,若想给其他⽹段发送同样的包,就可以使⽤可以穿透路由的多播。
IP分类的缺点
这种⽅式不再有分类地址的概念,32 ⽐特的 IP 地址被划分为两部分,前⾯是网络号,后⾯是主机号。
表示形式 a.b.c.d/x ,其中 /x 表示前 x 位属于⽹络号, x 的范围是 0 ~ 32 ,这就使得 IP 地址更加具有灵活性。
还有另⼀种划分网络号与主机号形式,那就是子网掩码,掩码的意思就是掩盖掉主机号,剩余的就是网络号。 将子网掩码和 IP 地址按位计算 AND,就可得到网络号。
子网掩码还有⼀个作⽤,那就是划分子网。 子网划分实际上是将主机地址分为两个部分:子网网络络地址和子网主机地址。
IP地址的网络地址这⼀部分是⽤于进⾏路由控制。
路由控制表中记录着网络地址与下⼀步应该发送⾄路由器的地址。在主机和路由器上都会有各⾃的路由器控制表。 在发送 IP 包时,⾸先要确定 IP 包⾸部中的⽬标地址,再从路由控制表中找到与该地址具有相同⽹络地址的记录, 根据该记录将 IP 包转发给相应的下⼀个路由器。如果路由控制表中存在多条相同⽹络地址的记录,就选择相同位数最多的⽹络地址,也就是最长匹配。
路由表中表项内容一般包括:
1、destination:目的地址,用来标识IP包的目的地址或者目的网络。
2、mask:网络掩码,与目的地址一起标识目的主机或者路由器所在的网段的地址。
3、nexthop:下一跳IP地址,说明IP包所经过的下一个路由器。(若下一跳为直接,则说明找到了对应的子网了,直接从接口转发)
4、interface:输出接口,说明IP包将从该路由器哪个接口转发。
环回地址
环回地址是在同⼀台计算机上的程序之间进⾏网络通信时所使⽤的⼀个默认地址。 计算机使⽤⼀个特殊的 IP 地址 127.0.0.1 作为环回地址。与该地址具有相同意义的是⼀个叫做 localhost 的主机 名。使⽤这个 IP 或主机名时,数据包不会流向⽹络
每种数据链路的最⼤传输单元 MTU之所以不同,是因为每个不同类型的数据链路的使⽤⽬的不同。使⽤目的不同,可承载的 MTU 也就不同。
其中,我们最常⻅数据链路是以太⽹,它的 MTU 是 1500 字节。 那么当 IP 数据包⼤于 MTU 时, IP 数据包就会被分片(源主机或者路由器分片)。 经过分片之后的 IP 数据报在被重组的时候,只能由目标主机进⾏。
在网络编程中,我们要避免出现IP分片,原因是IP层是没有超时重传机制的,如果IP层对一个数据包进行了分片,只要有一个分片丢失了,只能依赖于传输层进行重传,结果是所有的分片都要重传一遍,这个代价有点大。由此可见,IP分片会大大降低传输层传送数据的成功率,所以我们要避免IP分片。
对于UDP包,我们需要在应用层去限制每个包的大小,一般不要超过1472字节,即以太网MTU(1500)减去 UDP首部(8)减去IP首部(20)。
对于TCP数据,应用层就不需要考虑这个问题了,因为传输层已经帮我们做了。在建立连接的三次握手的过程中,连接双方会相互通告MSS(Maximum Segment Size,最大报文段长度),MSS一般是MTU减去IP首部(20)减去TCP首部(20),每次发送的TCP数据都不会超过双方MSS的最小值,所以就保证了IP数据报不会超过MTU,避免了IP分片。