目录
网络层
在复杂的网络环境中确定一个合适的路径。
IP协议
应用层主要解决的是如何对数据进行格式化处理、对数据进行加密解密保证安全性等问题,而传输层、网络层和数据链路层三层隐藏网络的细节,将可靠数据从一台主机送到另一台主机。可靠性主要是通过传输层中的 TCP 协议来保证,而网络层中的 IP 协议具有将数据从一台主机送到另一台主机的能力,但仅凭它并不一定能做到,它还需要TCP协议来保证数据的可靠性以及数据链路层来传输数据!!
基本概念:
- 主机:配有 IP 地址,但是不进行路由控制的设备。
- 路由器:即配有 IP 地址,又能进行路由控制。
- 节点:主机和路由器的统称。
- 数据并不是从一台主机直接送到另一台主机的,而是传输到路由器,经过查询路由器表根据 IP 地址进行路径选择,然后一步一步下一跳地到达目标主机的,这个过程就是数据转发的过程。
协议头格式
IP报头字段:
- 4位版本号(version):指定IP协议的版本,对于IPv4来说, 就是4。
- 4位头部长度(header length):IP头部的长度是多少个32bit,也就是 length * 4 的字节数。4bit表示最大的数字是15, 因此IP头部最大长度是60字节。
- 8位服务类型(Type Of Service):3位优先权字段(已经弃用),4位TOS字段和1位保留字段(必须置为0)。4位TOS分别表示: 最小延时,最大吞吐量, 最高可靠性,最小成本,这四者相互冲突只能选择一个。对于ssh/telnet这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要。
- 16位总长度(total length): IP数据报整体占多少个字节,有效载荷的字节数等于 16 位总长度减去 4 位首部长度 * 4。
- 16位标识(id):唯一的标识主机发送的报文,如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的。
- 3位标志字段: 第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到)。第二位置为 1 表示禁止分片,这时候如果报文长度超过 MTU,IP 模块就会丢弃报文。第三位表示 “更多分片”,如果分片了的话,最后一个分片置为 0,其他是 1,类似于一个结束标记。
- 13位分片偏移(framegament offset):是分片相对于原始 IP 报文开始处的偏移,其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的,因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了)。
- 8位生存时间(Time To Live, TTL):数据报到达目的地的最大报文跳数, 一般是64。 每次经过一个路由 TTL-= 1,一直减到0还没到达,那么就丢弃了,这个字段主要是用来防止出现路由循环。
- 8位协议: 表示上层协议的类型,如 UDP 协议或 TCP 协议。
- 16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏。
- 32位源地址和32位目标地址: 表示发送端和接收端。
- 选项字段(不定长, 最多40字节):略
Q:网络层如何分离有效载荷与报头?
IP报文是由固定的前20个字节、选项字段和有效载荷组成的,4位首部长度字段得知IP报头总大小,16位总长度字段得到IP报文的总长度,由此我们就能找到报头与有效载荷的边界,就能交有效载荷与报头分离!
Q:如何交付给上层?
IP报头中的8位协议字段用来标识UDP与TCP协议,由此我们就知道将数据交给对应的协议向上进行处理了。
Q:IP报头中16位标识、3位标志以及13位片偏移等字段都与分片操作有关,IP报文为什么要进行分片操作?
数据链路层由于物理特性的原因,一般无法转发太大的数据,因此数据链路层对转发到网络的报文大小有限制,称之为 MTU(Maximum Transmission Unit,最大传输单元),一般是 1500 字节。如果 IP 报文超过了 MTU,就需要对 IP 报文进行分片。传输层并不关心你是如何进行分片的,同时分片也需要考虑组装问题。
Q:网络层是如何对数据进行分片和组装的?
要解决这个问题我们必须要了解这三个字段:16位标识字段可以标识主机发送的报文,如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的;3位标志字段中第三位表示 “更多分片”,如果分片了的话,最后一个分片置为 0,其他是 1,类似于一个结束标记;13位分片偏移是分片相对于原始IP报文开始处的偏移,其实就是在表示当前分片在原报文中处在哪个位置。
Q:如何判别报文是否被分片?
如果报文没有被分片,那么更多分片标志位为 0 并且 13 位片偏移为 0,那么此时则为一个独立的报文;如果更多分片标志位是 1或者13位偏移量大于0,则表明该报文被分片了。
Q:如何判别分片是原始报文中的哪一部分?
如果更多分片标志位为 1,片偏移为 0,则表示该分片是报文的开始部分。而如果更多分片标志位为 0,片偏移不为 0,则表示该分片是报文的结尾部分。如果更多分片标志位为 1,片偏移不为 0,则表示该分片是报文的中间部分。如果更多分片标志位为 0 并且 13 位片偏移为 0,则是一个独立报文,未被分片!!
Q:如何保证收齐了这些分片呢?
可以根据偏移量进行升序排序,然后扫描全部分片来判断分片是否收齐。因为下一个分片的偏移量等于上一个分片的偏移量 + 上一个分片的大小,如果分片没有收齐,那么一定不符合这个关系,那么中间的分片就一定有丢失的。
Q:如何将分片组装成报文?
同样的可以根据偏移量进行升序排序,然后去掉各分片对应的报头(除原始报头外),将其组装起来!!分片之后每一片都是IP报文,都要有IP报头,要不然怎么知道哪一个分片是属于哪一种报文呢!!哪一个分片位于原始报文的哪个区域呢!!所以分片之后必须都要有自己的报头信息,这样才能完成组装!!
下面我们来简单模拟一下IP层分片与组装的过程:
虽然分片解决了数据链路层对转发到网络的报文大小限制问题,但实际上我们并不推荐分片!!为何?
当一个大的数据包被分成多片时,这无疑是增加了丢包的概率。因为当所有的分片在对端的网络层中收齐再进行组装后检查无误才能认为收到了一个完整的数据包,如果缺少某一个分片,我们就不会向上交付给传输层,而是进行超时重传,这样相较于原先一个完整的数据包丢包进行超时重传的概率大大增加了,因此,非常地不推荐分片。
那么如何解决这个问题呢?
本质上是因为传输层向下交付给网络层的数据包过大,网络层才要进行分片满足数据链路层对于数据大小的限制,因此我们应该让TCP协议尽量发送数据不要过大,那么应该是多少呢?假设我们抛开TCP/IP协议报头中的选项字段,那么俩者的报头大小固定都是占20字节,因此TCP中有效载荷的长度最大(MSS,最大段尺寸)为1460字节。这也就是我们在tcp协议中不直接把滑动窗口范围内的报文直接打一个包直接向下交付给IP层的原因,而是一般拆成多个报文向下交付,在对端中的接收缓冲区中完成组装成完整报文!!
网段划分
由于 IP 地址资源有限,每个国家都会被分配一定的 IP 地址段。划分好 IP 地址后,国际上的路由器都会有着自己的路由表,负责国家和国家之间的路由转发。同样,在一个国家内部,也要对 IP 地址进行划分以及路由器的配置,这样才能完成省和省之间的路由转发。
因为 IP 地址资源是有限的,我们需要对 IP 地址进行划分,那么就有了各种网络划分方案。IP 地址被分为两部分,分别是网络号和主机号(网络号+主机号标识了广域网中唯一性!!)。
- 网络号保证保证相互连接的两个网段具有不同的标识,本质就是不同的区域。
- 主机号:在同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号。
- 子网其实就是把所有网络号相同的主机放到一起,而路由器则是局域网内的第一台主机,将不同的子网连接起来,就能够进行跨网络路由转发。
- 如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致,但是主机号必须不能和子网中的其他主机重复(唯一性)。
- 在进行路由转发时,网络号是在不断地变大,并且收敛的,直至找到目标主机所在的区域(即不断缩小目标主机的查找范围)。
- 将 IP 地址分为网络号和主机号的原因是:方便定位一台主机,提高查找的效率。
通过合理设置主机号和网络号,就可以保证在相互连接的网络中,每台主机的 IP 地址都不相同。那么问题来了,手动管理子网内的 IP,是一个相当麻烦的事情。
动态主机配置协议(Dynamic Host Configuration Protocol,简称 DHCP)是一种计算机网络协议,它用于在网络中自动分配 IP 地址和其他网络配置参数,以便网络设备(如计算机、手机、打印机等)能够在加入网络时获得所需的网络配置信息。DHCP 能够简化网络管理,使得设备的连接和配置更加便捷。
DHCP 协议的优势在于它简化了网络中的 IP 地址管理,减轻了网络管理员的负担,并且使设备的添加和移除更加灵活和方便。同时,DHCP 也支持 IP 地址重用,即设备离开网络后,它分配的 IP 地址可以被其他设备再次使用,充分利用 IP 地址资源。<