目录
一.补充知识
二.IP协议格式
三.分片与组装
3.1分片
3.2组装
3.3如何避免分片
四.网络号与主机号
4.1介绍
4.2网段划分
4.3特殊的IP地址
四.私网IP地址和公网IP地址
五.路由
前面已经学习了应用层与传输层的知识了。
应用层协议:如http,https(加密)等。在应用层向下交付给传输层后,保证的是数据传输的可靠性和传输效率,如TCP协议。但真正负责数据在网络中传输的则传输层之下的网络层和链路层。
有传输层的存在,可以保证数据可以从一方可以发送给另一方(出现丢包等问题时,可以重传等,以及它的其它特性,保证了数据传输的可靠性和传输效率),而数据在网络上是如何走的,是由网络层和链路层控制的。网络层要解决的问题就是,将数据从一台主机送到另一台主机,也就是数据的路由。
主机: 配有IP地址, 但是不进行路由控制的设备;。
路由器: 即配有IP地址, 又能进行路由控制;
节点: 主机和路由器的统称。
数据的传输基本都是夸网络的,路由器就是连接多个网络的硬件设备,因此数据在进行跨网络传输时一定需要经过多个路由器,数据中包含目的地的地址,而路由器可以通过查路由表找到最短路径,慢慢接近目的主机。
具体解释:
1. 4位版本号:即IP协议的版本,对于IPv4来说, 就是4。
2.4位首部长度:表示IP报头的长度,以4字节为单位。(最大值为1111,即15*4=60字节)
3. 8位服务类型:3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0). 4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个.
4.16位总长:表示IP数据报整体占多少个字节。
5. 16位标识(id):当数据包过大时会进行分片(ip层分片),而同一个数据包的分片16位标识是一样的。
6.3位标志段:第一位保留(现在未用到)。第二位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文。第三位表示"更多分片", 如果进行分片了,最后一个分片置为1, 其他是0.
7.13位片偏移:是分片相对于原始IP报文开始处的偏移.,其实就是在表示当前分片
在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的。例如:8.8位生存时间:数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL-= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环。
9. 8位协议:用来表示上层协议的类型。10.16位头部校验和:使用CRC进行校验,来鉴别数据报的首部是否损坏,但不检验数据部分。
11.32位源IP地址和32位目的IP地址:表示发送端和接收端所对应的IP地址。
12.选项字段:(0-40字节,4位首部长度表示的长度-20)
数据在网络上传输时,要经过多个路由器,IP进行数据跨网络传送的前提是,需要先将数据从一个节点传送到和自己相连的下一个节点,这个问题实际就是由IP之下的数据链路层解决的,其中数据链路层最典型的代表协议就是MAC帧。两两相连的节点是在同一个局域网当中的,因此要讨论两个相邻节点的数据传送时,实际讨论的就是局域网通信的问题。
MAC帧是在数据链路层的协议,它会对IP层传输下来的数据进行封装,后再发送到网络上。但MAC帧携带的有效载荷的最大长度是有限制的,IP层向下交付的数据一般最大为1500字节,这个值也叫做最大传输单元(Maximum Transmission Unit,MTU)。
所以当数据大于1500字节时(包括IP的报头和IP的有效载荷。),数据要在网络层进行分片。
具体过程:
如果 MTU = 1500
确定分片后长度方法:L=长度 & 满足 L + 20 <= MTU(1500) 且 L 能被8整除的最大值
L <= 1480,1480 能被8整除且最接近与MTU,另外 如果这个包大小为4000,4000/1480 = 2.7,及要分为3个分片包发送。
确定分片后的 偏移量:由每个分片起始位置决定,如果是第一个分片,起始位就是 0 偏移量 = 0/8=0,第一个分片的偏移量就是0,以此类推。
确定分片后的标识:随机产生,但每个分片需相同。
确定分片后的标志:除了最后一个分片包是0,其余都是1。计算过程中都不带包头
因为网络环境的不同,网络中的MTU也可能不一样,数据的分片和组装发生在IP层,不仅源端主机可能会对数据进行分片,数据在路由过程中的路由器也可能对数据进行分片但,分片数据的组装只会发生在目的端的IP层。
在分片的数据中,每一个分片在IP层都会被添加上对应的IP报头,而传输层添加的报头只会出现在第一个分片中,因此网络中传输的数据包可能没有传输层的报头。
通过ip报头的32位原ip地址可以确定数据是由哪些主机发送的,通过16位标识符可以确定哪些数据是分片的。第一个分片报文中的13位片偏移的值一定为0。最后一个分片报文中的“更多分片”标志位一定为0。对于每一个分片报文来说,当前报文的13位片偏移加上当前报文的数据字节数 ÷ 8所得到的值,就是下一个分片报文的所对应的13位片偏移。通过特点就可以将数据数据进行组装,直到拼接到一个“更多分片”标志位为0的分片报文,此时表明分片报文组装完毕。
如果数据在ip层进行了分片,在数据传输过程中就可能出现丢包问题,若一个分片对方主机未收到,也就等同于这个报文整体丢失了,因此分片会增加传输层重传数据的概率。
TCP作为传输控制协议,它需要控制一次向下交付数据不能超过某一阈值,这个阈值就叫做MSS(Maximum Segment Size,最大报文段长度)。MAC帧的有效载荷最大为MTU,TCP的有效载荷最大为MSS,而TCP和IP一般情况下报头的长度是20字节,因此一般情况下 MSS = MTU - 20 - 20,而MTU的值一般是1500字节,因此MSS的值一般就是1460字节。
ip地址的分为两个部分,网络号和主机号。
网络号:保证互相连接的两个网段具有不同的标识。
主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号。
子网其实就是把网络号相同的主机放到一起,如果要在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复。
过去曾经提出一种划分网络号和主机号的方案, 把所有IP 地址分为五类,例如:
由于A类地址第一位是0,所以前八位最大是 0111 1111,换算成十进制是 127。
A类:0.0.0.0到127.255.255.255。
B类:128.0.0.0到191.255.255.255。
C类:192.0.0.0到223.255.255.255。
D类:224.0.0.0到239.255.255.255。
E类:240.0.0.0到247.255.255.255。
判断一个IP地址是属于哪一类时,只需要遍历IP地址的前五个比特位,第几个比特位最先出现0值,那么这个IP地址对应就属于A、B、C、D、E类地址。
这种方案存在很大的问题,在实际网络架设中,在一个局域网当中一般不会有这么多主机的情况,也就意味着大量的IP地址实际都被浪费掉了。
后面有了改进的方案:CIDR(Classless Interdomain Routing):
在原有的五类网络的基础上继续进行子网划分,这也就意味着需要借用主机号当中的若干位来充当网络号,此时为了区分IP地址中的网络号和主机号,于是引入了子网掩码(subnet mask)的概念。
每一个子网都有自己的子网掩码,子网掩码实际就是一个32位的正整数,通常用一串“0”来结尾。将IP地址与当前网络的子网掩码进行“按位与”操作,就能够得到当前所在网络的网络号。
例如:如果在某一子网中,它将前16位作为网络号,那么该网络对应的子网掩码的前16位就为1,剩下的8个比特位为0。
本质就是保留了主机IP地址中前16个比特位的原貌,将剩下的16个比特位的值清0了而已,也就是将主机号清0了,所以“按位与”后的结果就是该网络对应的网络号。
有一些IP的地址是具有特殊用途的,例如:
私网IP:在一个局域网内内的通信,并且不直接连到Internet上。
规定:
这个范围内的为私网ip,其余的为公网ip。
路由器是连接两个或多个网络的硬件设备,它有两个接口:LAN口和WAN口
我们将LAN口的IP地址叫做LAN口IP,也叫做子网IP,将WAN口的IP地址叫做WAN口IPO,也叫做外网IP
子网内的主机在和外网进行通信时,路由器会不断将数据包IP首部中的源IP地址替换成路由器的WAN口IP,这样逐级替换,最终数据包中的源IP地址成为一个公网IP,这种技术成为NAT(Network Address Translation,网络地址转换)。如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 只需要把程序部署在一台具有外网IP的服务器上,这样的服务器可以在阿里云/腾讯云上进行购买。
概念:数据在路由的过程中,实际就是一跳一跳(Hop by Hop)“问路”的过程。所谓“一跳”就是数据链路层中的一个区间,具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间。
路由器的查找结果可能有以下三种:
路由器经过路由表查询后,得知该数据下一跳应该跳到哪一个子网。
路由器经过路由表查询后,没有发现匹配的子网,此时路由器会将该数据转发给默认路由。
路由器经过路由表查询后,得知该数据的目标网络就是当前所在的网络,此时路由器就会将该数据转给当前网络中对应的主机。