1.IP协议
IP协议是位于TCP/IP协议五层模型中,网络层的主要协议,我们首先在1.1中了解其报文的格式,再在1.2、1.3中了解其主要工作。
1.1 报头格式
1)版本:由4比特构成,表示标识IP首部的版本号,当前只有两个取值——4和6(IPV4和IPV6),本篇文章主要讨论IPV4。
2)首部长度:由4比特构成,表明IP首部的大小,单位为4字节(32比特),其与TCP类似,都是可变的,实际的首部长度为60字节。
3)TOS:由8比特构成,用来表明服务质量。其实只有4位有效,4位TOS分别表示:最小延时、最大吞吐量、最高可靠性、最小成本。这四种状态在同一时刻只能取一种状态。
4)总长度:由16比特位表示IP首部与数据部分合起来的总字节数,IP包的最大长度为65535,如果要构造一个更长的数据报,就需要实现分包组包这样的操作
5)标识、标志位、片偏移:IP协议通过这三个字段来实现分包组包这样的操作。
如下图,如果整个IP数据报太长了,IP协议就会把这个大包拆成多个小包,来保证每个包都不超过64k。
16位标识: 多个被拆分出的IP包,其16位标识相同
13位片偏移: 通过片偏移来描述多个包谁先谁后
3位标志: 仅一位有效,0表示还有后续包,1表示这是最后一个包。
小Tips:如何基于UDP实现分包组包呢?就是在应用层照抄IP的实现过程。
6)生存时间(TTL):由8个比特位构成,表示一个IP数据报在网络上还能存在多久,这里的单位不是s或者ms,而是转发次数。
IP数据报被发送的时候,会有一个初始的TTL(例如常见的取值128或者64),IP数据报每次经过一个路由器,TTL就会-1,如果TTL减到0了,此时收到这个包的路由器就会把这个包给丢弃。(一些包里的IP地址是可能永远无法到达的,像这样的包不可能在网络上无休止的转发,这样将会占用太多硬件资源)
7)协议:由8个比特位构成,表示传输层使用哪种协议,TCP或者UDP都有不同的取值。
8)首部校验和:由16个比特位构成(2个字节),用来校验数据是否正确。
9)源地址、目标地址:也就是源IP(发件人地址)和目的IP(收件人地址)。
对于IPV4来说,一个IP地址本质上是32位的整数,通常会使用“点分十进制”这样的方式来表示这个IP地址,通过三个点把32位整数分成4个部分,每个部分1个字节,每个部分的取值就是0~255。
1.2 地址管理
1.2.1 IP地址
IP地址是一个点分十进制构成的数据,其分为两个部分:
网络号(局域网的标识,描述当前的网段信息)和主机号(区分了局域网内部的主机)。
要求同一个局域网内,主机之间的网络号是相同的,主机号不能相同
两个相邻的局域网(同一个路由器连接的),网络号不同
1.2.2 子网掩码
在譬如192.168.0.5这样的IP地址中,一定是前三个字节为网络号吗?其实是不固定的。
通过引入“子网掩码”这样的概念来表示前多少个bit位为网络号。
子网掩码也是一个32位,由点分十进制表示的整数,在子网掩码中,左侧都是1,右侧都是0(不会1、0混着排列),左边的这些1就表示哪些位是网络号,剩下的0就表示哪些位是主机号
1.2.3 特殊IP
1)IP的主机号全为0,该IP就表示网络号(局域网里的一个正常设备,主机号不能设为0)
2)IP的主机号全为1,该IP就表示“广播地址”,往这个广播地址上发的消息,在整个局域网中都能收到。
3)IP地址是127开头的,都表示“环回IP”,表示主机自己,例如典型代表:127.0.0.1
4)IP地址是10开头,192.168开头,172.16~172.31开头,表示该IP地址是一个局域网内部的IP(内网IP),除此之外,剩下的IP称为外网IP(直接在广域网上使用的IP)
要求外网IP一定是唯一的,每个外网IP都会对应到唯一的一个设备,内网IP只是在当前局域网中是唯一的,不同的局域网里可以有相同的内网IP设备。
1.2.4 IP地址不够用?
IP地址表示在一个网络上的唯一位置,IPV4协议中使用的IP地址是32位的整数,32位能表示的数据范围为42亿9千万,如果给每个设备都分配一个唯一的IP地址,世界上的设备肯定无法都获得唯一IP,如何解决这个问题呢,有以下三种方式:
1)动态分配IP地址:让每个设备在连上网的时候才有IP,不联网的时候就没IP(这样这个IP就可以供其他人使用),但是这个方案治标不治本。
2)NAT机制:让多个设备共用一个IP(外网IP)
把网络分成了外网(广域网)和内网(局域网),要求外网IP必须表示唯一的设备,同时内网中的若干个设备,可以共用一个外网IP,这样每个外网IP都可能表示很多个设备,IP地址的压力就得到了缓解。
NAI机制将IP分成了外网和内网,也隐藏了一个重要结论:
对于一个外网IP,可以在互联网的任意位置都能访问到
但对于一个内网IP,只能在当前局域网内部访问到(也就是说局域网1的设备不能使用内网IP来访问局域网2的设备)
这个方案也并没有真正的解决IP地址不够用的问题。
3)IPV6:IPV6在报头中使用了一个更长的字段(16个字节,128位)来表示IP地址,而在IPV4中只是4个字节,32位;通过这样的方法,使得IP地址能表示的范围大了很多很多,号称IPV6可以给地球上的每个沙子都分配一个IP地址,是从根本上解决了IP地址不够用的问题。
但现在大多还是在用IPV4+NAT,而不是IPV6,这是因为IPV6与IPV4并不兼容,要想升级到IPV6就需要耗费资金。
1.3 路由选择
路由选择也就是规划路径,如果数据要想从一个设备传输到另一个设备,要先找出一条路,根据IP数据报中的目的地址,运输到目的地。
这个目的地址,如果当前路由器直接认识,就直接告诉你路了;但如果当前路由器不认识,就会告诉你一个大概的方向,让你走到下一个路由器的时候再看是否认识,依次往后走,其实也就离目标越来越近了,这时候总会遇到一个认识这个地址的路由器,于是就可以具体的转发过去了。
就像我们去外地旅游时想到达一个著名的景点(没有导航的情况下),我们先问问路人是否知道这个位置,如果知道,我们直接就去了;如果不知道,他会告诉你一个大致的方位,你先沿着这个方向走,等离目标地点近一些时再问路人,就会问到了。
2.以太网
以太网协议是数据链路层的主要协议。
2.1 以太网帧格式
目标地址、源地址:使用mac物理地址,在网卡出厂时就被写死了,mac地址做到了每个设备都是唯一的(每个网卡都是唯一的)
类型:该字段有三种值,分别对应IP、ARP、RARP
一般情况下为第一种,特殊情况下为后两种
帧尾(4字节):帧尾的功能一般是校验,它是一个FCS或CRC算法实现的校验和。
2.2 认识MTU
以太网数据帧的最大数据载荷称为MTU,这个范围一般取决于硬件设备,不同硬件设备对应的数据链路层协议可能又不一样,MTU也就不同。
如果数据报超过了MTU,IP能够分包来解决,IP的分包其实不是给IP的报头64k准备的,更多的是为了适应数据链路层的MTU。
与MTU相关的概念还有一个是MSS,表示TCP在IP不分包的情况下,最多搭载多少载荷。
2.3 ARP协议
在传输一个IP数据报的时候,确定了源IP地址和目标IP地址后,就会通过主机「路由表」确定IP数据报下一跳。然而,网络层的下一层是数据链路层,所以我们还要知道「下一跳」的MAC地址。
ARP不是一个单纯的数据链路层协议,而是一个介于数据链路层和网络层之间的协议,通过ARP协议,建立主机IP地址和MAC地址的映射关系,来求得「下一跳」的MAC地址。
ARP报文并不是用来传输数据的,而是一个辅助信息,当设备启动的时候,就会向局域网中广播ARP报文,每个设备收到之后,都会给出一个应答,应答信息中就包含了自己的IP和MAC,发起广播的那一方,就可以根据这些回应,来建立起这个映射关系,求得「下一跳」的MAC地址。
3.两层协议的区别和关系
IP(网络层)和MAC(数据链路层)之间的区别和关系:
IP主要负责在「没有直连」的两个网络之间进行通信传输,而MAC的作用则是实现「直连」的两个设备之间通信。
举个栗子:
假如我们想要去一个很远的地方旅行,制定了一个行程表,其间需先后坐飞机、地铁、公交车才能抵达目的地,因此我们需要买飞机票、地铁票等。
飞机票和地铁票都是去往特定的地点的,每张票都只能够在某一特定限定区间内移动,此处的「区间内」就如同通信网络中的数据链路。
在区间内移动相当于数据链路层,充当区间内两个节点传输的功能,区间内的出发点就好比源MAC地址,目标地点就好比目的MAC地址。
整个旅游表就相当于网络层,充当远程定位的功能,行程的起点好比源IP,行程的终点好比目的IP地址。
如果我们只有行程表而没有车票,就无法搭乘交通工具到达目的地。相反,如果除了车票而没有行程表,也很难到达目的地,因为我们不知道该坐什么车,也不知道该在哪里换乘。
因此只有两者兼备,既有某个区间的车票又有整个旅行的行程表,才能保证到达目的地。与此类似,计算机网络中也需要「数据链路层」和「网络层」这个分层才能实现向最终目标地址的通信。
还有重要的一点,旅行中我们虽然不断变化了交通工具,但是旅行行程的起始地址和目的地址始终都没有发生改变。其实在网络中的数据包传输中也是如此,源IP地址和目标IP地址在传输过程中是不会变化的,只有源MAC地址和目标MAC一直在变化。