目录
网络层
IP协议
IP报文格式(IPv4)
网段划分(地址管理)
CIDR
特殊的IP地址
IP地址的数量限制
私有IP地址和公网IP地址
路由选择
ICMP协议
介于传输层和数据链路层之间, 它在数据链路层提供的两个相邻端点之间的数据帧的传送功能上, 进一步管理网络中的数据通信, 将数据设法从源端经过若干个中间节点传送到目的端, 从而向运输层提供最基本的端到端的数据传送服务.
在网络层中, 最重要的协议就是IP协议, 我们来看看IP协议.
IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议. 设计IP的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模、异构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。根据端到端的设计原则,IP只为主机提供一种无连接、不可靠的、尽力而为的数据报传输服务.
IP是整个TCP/IP协议族的核心,也是构成互联网的基础。IP位于TCP/IP模型的网络层(相当于OSI模型的网络层),对上可载送传输层各种协议的信息,例如TCP、UDP等;对下可将IP信息包放到链路层,通过以太网、令牌环网络等各种技术来传送。
4位版本协议(version) : 通信双方的IP协议必须要达到一致, IPv4的版本就是4
4位首部长度(header length) : 定义了IP协议首部(报头)的长度, 以4字节为单位, IP报头是不定长的, 首部长度范围 [5, 15] 即 [20字节, 60字节]
8位服务类型(Type Of Service, TOS) : 3 位优先权字段(已经弃用), 4位TOS字段, 和一位保留字段(此位必须置0), 思维TOS分别表示 : 最小延迟, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能有一个置1. 对于ssh/telnet这样的应用程序, 最小延时标胶重要, 对于ftp(文件传输协议)类型的程序, 最大吞吐量比较重要.
16位总长度 : IP数据报整体占多少个字节(单位是字节), 16位能表示的最大数是 65535, 即65535字节, 即64k, 那么TCP的数据肯定不能大于64k -20-20, 一个20是IP报头最次小长度, 一个20是TCP报头的最小长度; UDP的数据肯定不能大于64K-20-8, 第一个20也是IP报头的最短长度, 8是UDP报头的长度. TCP会在传输层根据MSS(最大分段大小, Maxitum Segment Size)自动进行数据分段; UDP在传输层不会分段; 传输的IP报文还受到下层数据链路层的MTU(最大传输单元, Maximum Transfer Unit)的限制; 而TCP中的MSS就是根据数据链路层的MTU计算的. UDP在在传输层不会分段, 所以当UDP数据大小 大于 MTU 而小于64k 20-8 时, 数据就会在网络层进行分片
16位(分片)标识 : 在进行数据分片重组的时候表示数据分片属于那个完整的UDP报文, 具体来说, IP在存储器中维持一个计数器, 每产生一个 数据报, 计数器就加1, 并将此值赋给标识字段. 但这个标识并不是平常的序号,因为IP是无连接, 不可靠服务, 数据报不存在按序接收的问题. 当数据报由于长度超过链路层的MTU而必须分片时, 这个标识字段的值就被复制到所有的数据报片的标识字段中, 等到对端重组的时候, 相同标识符的值的数据报就会被重新组装成一个数据报.
3位(分片)标志 : 高位未用, 中间位DF置1, 表示不能进行分片,置0才可以进行分片操作. 最低位MF, 置1表示后面还有数据分片,MF=0表示这已经是最后一个数据分片了.
13位片偏移 : 标识一个分片在原始UDP报文中的位置, 以8字节为单位, 例如将一个10001的UDP报文按256字节分片后, 第一片的数据报的片偏移就是0, 第二片数据报的片偏移就是256/8 = 32, 第三片就是512/8=64, 第四片就是768/8=96, 第四片并没有256个字节, 如果分片前的数据不能够被8整除, 那么分片后的最后一个数据大小就是分片前的数据报大小除以8的余数. 可以看到不管分片前的大小能不能被8整除, 片偏移永远是8的整数倍.
8位TTL : 报文在网络中的生存周期 -- 即跳数, 指的是能够经过多少路由器, 每经过一个路由器就称为一跳, 该值就减1, 为0时就被网络丢弃掉, 8位TTL, 最大值为2^8 - 1 = 255.
8位协议 : 标识传输层使用的是什么协议, 用于数据分用
16位校验和 : 二进制反码求和, 用于校验数据的一致性
32位源地址 / 32位目的地址 :用于标识源端/对端主机, 路由器就是根据对端主机IP地址进行路径选择的
选项字段(不定长, 最多40字节) : 基本很少用到
网络层功能的实现, 就是地址管理与路由选择,
IP地址分为两个部分, 网络号和主机号
通过合理的设置网络号和主机号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不同
那么问题来了, 手动管理子网内的IP, 是一件不现实的事情, 该如何解决?
DHCP动态主机配置协议 : 首先, 这是一个应用层协议, 可以自动给子网内新增的主机节点分配IP地址. 一般的路由器都带有DHCP功能, 因此路由器也可以看做是一个DHCP服务器.
在早期, 人们将所有的IP地址划分为5类, 要组建多大的局域网, 就选择相应的网段, 然后给局域网内的主机分配相应的主机号, IP地址分类如下:
随着互联网的飞速发展, 这种划分方案的局限性很快就显现出来, 大多数组织都申请B类网络地址, 导致B类地址很快就分配完了, 而A类却浪费了大量地址. 这是因为申请一个B类地址, 理论上一个子网内能允许6万5千多个主机. A类地址的子网内的主机数更是达到数千万之多, 然而实际网络架设中, 不会存在一个子网内有这么多主机的情况. 因此大量的A类IP地址都被浪费掉了.
对于这种情况, 人们提出了新的划分方案, 称为CIDR(Classless Interdomain Routing) :
例子1 : IP : 140.252.20.68 子网掩码 : 255.255.255.0 ==> 网络号 : IP和子网掩码按位与 :140.252.20.0
==> 子网地址范围就是主机号的二进制从全0到全1, 140.252.20.0 ~ 140.252.20.255
例子2 : IP : 140.252.20.68 子网掩码 : 255.255.255.240 ==> 网络号 : IP和子网掩码按位与 :140.252.20.64
==> 子网地址范围就是主机号的二进制从全0到全1, 140.252.20.53 ~ 140.252.20.79
IP地址和子网掩码还有一种更加简洁的表示方法, 例如 : 140.252.20.68/24, 表示IP地址是140.252.20.68, 子网掩码的搞24位全为1, 也就是255.255.255.0
最大的主机号 + 1 就是局域网中主机的个数. 再看一个例子:
某公司网络的网段是192.168.2.0/24, 现在公司想从这个网段中划分出四个子网, 给公司的四个部门, 问, 每个子网的网络号以及子网掩码是多少, 以及每个子网中的IP地址范围是多少?
首先, 这是一个C类网络, 一个C类网络可以有256个主机号, 分为4个子网, 则每个子网的主机号个数就是64, 那每个子网中最大主机号就是64 - 1 = 63, 这个值就是子网掩码取反后的值, 那子网掩码就是63取反的值, 为255.255.255.192
四个子网的子网掩码是一样的, 因为其能分配的主机数都是一样的, 这道题中子网掩码为255.255.255.192
第一个子网IP范围 : 192.168.2.0 ~ 192.168.2.63 -- 网络号 : 192.168.2.0
第一个子网IP范围 : 192.168.2.64 ~ 192.168.2.127 -- 网络号 : 192.168.2.64
第一个子网IP范围 : 192.168.2.128 ~ 192.168.2.191 -- 网络号 : 192.168.2.128
第一个子网IP范围 : 192.168.2.192 ~ 192.168.2.255 -- 网络号 : 192.168.2.192
IP地址(IPv4)是一个4字节32位的正整数. 那么一共只有 2的32次方 个IP地址, 大概是43亿左右. 而TCP/IP协议规定, 每个主机都需要有一个IP地址. 这意味着, 一共只有43亿台主机能接入网络么?
实际上, 由于一些特殊的IP地址的存在, 数量远不足43亿; 另外IP地址并非是按照主机台数来配置的, 而是每一个网卡
都需要配置一个或多个IP地址.CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率, 减少了浪费, 但是IP地址的绝对上限并没有增加), 仍然不是很够用. 这时候有三种方式来解决:
私有IP地址 : 在局域网中使用的IP
公网IP地址 : 在互联网中使用的地址
如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到互联网上, 理论上 使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址 :
路由选择过程如下 :
具体如何判定当前这个数据报该发送到哪儿, 这就依靠每个节点(包括主机和路由器)内部都维护着一张路由表
Linux中用route查看路由表 :
路由选择具体过程 :
以上图路由表为例, 若有一个IP数据包到以上这个节点中(主机或路由器), 先将目的IP地址在路由表中逐行判断, 首先与第一行的子网掩码255.255.255.0相与, 只要目的地址与子网掩码相与的结果是网络号(网段)192.168.40.0, 就可以判断出, 这个IP数据包的目的主机就是在自己局域网内的主机, 直接转发就好. 如果相与后不是, 则再与第二行的子网掩码相与, 相与的结果与第二行的网段(网络号)比较看是否相等, 若相等, 这个IP数据包的目的主机是和这个节点相连网络中的主机, 则使用连接这个网络的网卡将其发送到这个网络中, 若相与结果与网段不相等, 则继续往下一行判断, 重复以上过程, 若所有行都判断完了, 还没有匹配的, 这时候这个节点就会通过连接自己网关的网卡, 将这个IP数据包发送给自己的上层网关, 让上层网关再去路由选择.
一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通;但是IP协议并不提供可靠传输. 如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因. 所以我们就需要一种协议来完网络探测–ICMP协议。
ICMP协议的功能主要有:
简单来说, 就是在网络层向指定主机发送ICMP请求应答报文, 要求对方收到后进行回复, 通过这种方式实现网络探测(说白了就是针对IP地址的一种确认应答)
需要注意的是 :
ICMP报文包含在IP数据报中,IP报头在ICMP报文的最前面。一个ICMP报文包括IP报头(至少20字节)、ICMP报头(至少八字节)和ICMP报文(属于ICMP报文的数据部分)。当IP报头中的协议字段值为1时,就说明这是一个ICMP报文
ping命令(在Windows和Linux下都有) 就是使用ICMP协议实现的, 不涉及到端口.