计算机网络基础
网络层
传统的电信网主要业务是电话服务,采用面向连接的通信方式,提供可靠传输的服务。在计算机网络领域,网络层要向运输层提供怎样的服务有了两种争论:
- 有些人认为也应该先建立连接,比如虚电路方式
- 但是互联网先驱提出了一种崭新的设计思路,网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。 其实数据报(或 IP 数据报)就是我们经常使用的“分组”。
原码|反码|补码
原码:
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。比如如果是8位二进制
[+1]
= 0000 0001[-1]
= 1000 0001
反码:
正数的反码是其本身;负数的反码是在其原码的基础上, 符号位不变,其余各个位取反
[+1]
$= [00000001]_原 = [00000001]_反$[-1]
$= [10000001]_原= [11111110]_反$
补码:
正数的补码就是其本身;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1]
$= [00000001]_原 = [00000001]_反 = [00000001]_补$[-1]
$= [10000001]_原 = [11111110]_反 = [11111111]_补$
IP地址
IP地址(IPv4)由32位二进制数组成,分为4段(4个字节),每一段为8位二进制数。为了记忆和表示方便,可以用点分十进制表示法。
IP地址由两部分组成,一部分为网络号,一部分为主机号,同一网段内的计算机网络部分相同,通过主机号区分。路由器连接不同网段,根据目的主机所连接的网络号来转发分组,交换机连接的是同一网段的计算机。
MAC 地址和 IP 地址的区别
- 长度不同:IP地址为32位(二进制),MAC地址为48位(十六进制)
- 分配依据不同:IP地址的分配是基于网络拓扑,MAC地址的分配是基于制造商
- 寻址协议层不同:IP地址应用于OSI第三层(网络层),而MAC地址应用在OSI第二层(数据链路层)
IP地址分类
- A类地址中,网络号0表示「本网络」,网络号127(0111 1111)表示「环路测试」,都是特殊地址
- 在计算机网络中,主机ID全部为0的地址为网络地址,而主机ID全部为1的地址为广播地址,这2个地址是不能分配给主机用的
为了解决地址空间耗尽的问题,后来出现的CIDR编码。CIDR 消除了传统的 A 类、B 类和 C 类地址以及划分子网的概念。
CIDR采用斜线记法,地址 192.199.170.82/27 不仅表示 IP 地址是 192.199.170.82,而且还表示这个地址 块的网络的前缀有 27 位(剩下的 5 位是主机号)
公网和私网IP
- 公有地址分配和管理由Inter NIC(Internet Network Information Center 因特网信息中心)负责。各级ISP使用的公网地址都需要向Inter NIC提出申请,有Inter NIC统一发放,这样就能确保地址块不冲突
- 创建IP寻址方案的人也创建了私网IP地址。这些地址可以被用于私有网络,在Internet没有这些IP地址,Internet上的路由器也没有到私有网络的路由表
IP数据报格式
- 版本:占4位,有
ipv4
和ipv6
- 首部长度:占4位,单位是4字节。最小是5,最大是15,所以最小长度 20 个字节,最大为 60 个字节
- 区分服务:占8位,目前不怎么使用?
- 总长度:占16位,单位是字节。因此数据报最大长度是$2^{16}-1=65535$字节。但是数据链路层中规定了最大传送单元MTU,随意IP数据报不能超过规定的MTU值,如果超过就得分片处理
- 标识:占8位
- 标志:占3位,只有前两位有意义,和分片有关。
- 片偏移:占13位
- 生存时间:占8位,每经过一个路由后就减1,字段为0时数据报丢弃。防止数据报在选路时无休止地流动
- 协议:占8位
- 首部校验和:占16位,只检验数据报首部,不包括数据部分。数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存 时间、标志、片偏移等都可能发生变化)
- 先把校验和字段置0
- 对首部中每16个比特进行二进制反码求和
- 结果存在检验和字段中
- 收到一份 IP 数据包后,同样对首部中每个 16bit 二进制反码求和
- 最后结果全为 1,表示正确,否则表示错误
- 如果是错误的,IP 就丢弃该数据报,但是不生成差错报文,由上层去处理
子网掩码
- 子网掩码和IP地址做“与”运算,分离出IP地址中的网络地址和主机地址,用于判断该IP地址是在本地网络上,还是在远程网络网上
- 同IP地址一样,子网掩码是由长度为32位二进制数组成的一个地址
例:A主机要与B主机通信,A和B各自的IP地址与A主机的子网掩码进行And与运算,看得出的结果
- 如果结果相同,则说明这两台主机是处于同一个网段,这样A可以通过ARP广播发现B的MAC地址,B也可以发现A的MAC地址来实现正常通信
- 如果结果不同,ARP广播会在本地网关终结,这时候A会把发给B的数据包先发给本地网关,网关再根据B主机的IP地址来查询路由表,再将数据包继续传递转发,最终送达到目的地B
在网络层以上使用的中间设备叫做**网关(gateway)**。用网关连接两个不兼容的系统需要在高层进行协议的转换,由于历史的原因,许多有关 TCP/IP 的文献曾经把网络层使用的路由器称为网关
计算机的网关(Gateway)就是到其他网段的出口,也就是路由器接口IP地址。路由器接口使用的IP地址可以是本网段中任何一个地址,不过通常使用该网段的第一个可用的地址或最后一个可用的地址,这里这是为了尽可能避免和本网段中的主机地址冲突。
划分子网
IPv4地址如果只使用有类(A、B、C类)来划分,会造成大量的浪费或者不够用,为了解决这个问题,可以在有类网络的基础上,通过对IP地址的主机号进行再划分,把一部分划入网络号,就能划分各种类型大小的网络了
$$
\text { IP 地址 }::={<\text { 网络号>, <子网号>, <主机号> }}
$$
使用子网划分后,路由表必须包含以下三项内容:目的网络地址、 子网掩码和下一跳地址
ARP协议
地址解析协议 ARP是已知一个机器的IP地址,去找它对应的MAC地址。它通过在主机 ARP 高速缓存中存放一个从 IP 地址到硬件地址的映射表,并且这个映射表还经常动态更新(新增或超时删除)
当主机 A 要向本局域网上的某台主机 B 发送 IP 数据报时,就先在其 ARP 高速缓存中查看有无主机 B 的 IP 地址。如果有,就在 ARP 高速缓存中查出其对应的硬件地址;如果没有,则主机 A 自动运行ARP,然后执行:
- 主机 A 广播发送 ARP 请求分组的示意图。ARP 请求分组的主要内 容是:“我的 IP 地址是 209.0.0.5,硬件地址是 00-00-C0-15-AD-18 。我想知道 IP 地址为209.0.0.6 的主机的硬件地址
- 在本局域网上的所有主机上运行的 ARP 进程都收到此 ARP 请求分组
- 主机 B 的 IP 地址与 ARP 请求分组中要查询的 IP 地址一致,就收下这个 ARP 请求 分组,并向主机 A 发送 ARP 响应分组,同时在这个 ARP 响应分组中 写入自己的硬件地址。由于其余的所有主机的 IP 地址都与 ARP 请求分组中要查询的 IP 地址 不一致,因此都不理睬这个 ARP 请求分组
- 主机 A 收到主机 B 的 ARP 响应分组后,就在其 ARP 高速缓存中写入主机 B 的 IP 地址到硬件地址的映射。
ICMP协议
ICMP协议用来在网络设备间传递各种差错和控制消息,并对于收集各种网络消息、诊断和排除各种网络故障等方面起着至关重要的作用。ICMP 不是高层协议(看起来好像是高层协议,因为 ICMP 报文是装在 IP 数据报中,作为其中的数据部分),而是 IP 层的协议。
ICMP 报文的种类有两种,即:
- ICMP 差错报告报文,共有4种
- 终点不可达:路由器或主机不能交付数据报时就向源点发送终点不可达报文
- 时间超时:路由器收到生存时间为零的数据报时,除丢弃该数据报外,还要向 源点发送时间超过报文
- 参数问题:路由器或目的主机收到的数据报的首部中有的字段的值不正确时, 就丢弃该数据报,并向源点发送参数问题报文
- 改变路由:路由器把改变路由报文发送给主机,让主机知道下次应将 数据报发送给另外的路由器
- 对 ICMP 差错报告报文,不再发送 ICMP 差错报告报文
- 对第一个分片的数据报片的所有后续数据报片,都不发送 ICMP 差错报告报文
- 具有多播地址的数据报,都不发送 ICMP 差错报告报文
- 具有特殊地址(如 127.0.0.0 或 0.0.0.0)的数据报,不发送 ICMP 差错报告报文
- ICMP 询问报文,常用的有两种:
- 回送请求和回答
- 时间戳请求和回答