学习自极客时间《趣谈网络协议》 作者:刘超
1. 为什么要学习网络协议?
1.1 协议的三要素
计算机语言作为程序员控制一台计算机工作的协议,具备了协议的三要素。
- 语法,就是这一段内容要符合一定的规则和格式。例如,括号要成对,结束要使用分号等。
- 语义,就是这一段内容要代表某种意义。例如数字减去数字是有意义的,数字减去文本一般来说就没有意义。
- 顺序,就是先干啥,后干啥。例如,可以先加上某个数值,然后再减去某个数值。
会了计算机语言,你就能够教给一台计算机完成你的工作了。
但是,要想打造互联网世界的通天塔,只教给一台机器做什么是不够的,你需要学会教给一大片机器做什么。这就需要网络协议。只有通过网络协议,才能使一大片机器互相协作、共同完成一件事。
1.2 HTTP协议的格式
HTTP/1.1 200 OK
Date: Tue, 27 Mar 2018 16:50:26 GMT
Content-Type: text/html;charset=UTF-8
Content-Language: zh-CN
首先,符合语法,也就是说,只有按照上面那个格式来,浏览器才认。
- 例如,上来是状态,然后是首部,然后是内容。第二,符合语义,就是要按照约定的意思来。
- 例如,状态 200,表述的意思是网页成功返回。如果不成功,就是我们常见的“404”。
- 第三,符合顺序,你一点浏览器,就是发送出一个 HTTP 请求,然后才有上面那一串 HTTP 返回的东西。浏览器显然按照协议商定好的做了,最后一个五彩缤纷的页面就出现在你面前了
1.3 网络协议的种类
1.4 问题思考
(1) 当网络包到达一个网关的时候,可以通过路由表得到下一个网关的 IP 地址,直接通过 IP 地址找就可以了,为什么还要通过本地的 MAC 地址呢?
报文端到端的传输过程中,目的地址和源地址是不变的,但是每通过一个网关,源mac和目的mac一直在变。两个局域网之间的网关要通过mac互相传递报文。
(2) 1.MAC 地址可以修改吗?
MAC(Media Access Control,介质访问控制)地址,也叫硬件地址,长度是 48 比特(6 字节),由 16 进制的数字组成,分为前 24 位和后 24 位。
- 前 24 位叫作组织唯一标志符(Organizationally Unique Identifier,OUI),是由 IEEE 的注册管理机构给不同厂家分配的代码,用于区分不同的厂家。
- 后 24 位是厂家自己分配的,称为扩展标识符。同一个厂家生产的网卡中 MAC 地址后 24 位是不同的。也就是说,MAC 本来设计为唯一性的,但是后来设备越来越多,而且还有虚拟化的设备和网卡,有很多工具可以修改,就很难保证不冲突了。但是至少应该保持一个局域网内是唯一的。
- MAC 的设计,使得即便不能保证绝对唯一,但是能保证一个局域网内出现冲突的概率很小。这样,一台机器启动的时候,就能够在没有 IP 地址的情况下,先用 MAC 地址进行通信,获得 IP 地址。
- MAC 地址是工作在一个局域网中的,因而即便出现了冲突,网络工程师也能够在自己的范围内很快定位并解决这个问题。这就像我们生成 UUID 或者哈希值,大部分情况下是不会冲突的,但是如果碰巧出现冲突了,采取一定的机制解决冲突就好。
2. 网络分层的真实含义是什么?
2.1 网络为什么要分层?
对于软件世界来说,在计算机领域,任何问题到了某个复杂的阶段,如果当前方法不能解决问题,必定可以通过加多一层来解决,如果加多一层都解决不了问题,那肯定是这个问题模型的层次已经到极限了。
TCP 的实现将所有的逻辑耦合在了整个七层,不用 TCP 的可靠传输机制都没有办法。
1)各层之间相互独立:高层是不需要知道底层的功能是采取硬件技术来实现的,它只需要知道通过与底层的接口就可以获得所需要的服务;
2)灵活性好:各层都可以采用最适当的技术来实现,例如某一层的实现技术发生了变化,用硬件代替了软件,只要这一层的功能与接口保持不变,实现技术的变化都并不会对其他各层以及整个系统的工作产生影响;
3)易于实现和标准化:由于采取了规范的层次结构去组织网络功能与协议,因此可以将计算机网络复杂的通信过程,划分为有序的连续动作与有序的交互过程,有利于将网络复杂的通信工作过程化解为一系列可以控制和实现的功能模块,使得复杂的计算机网络系统变得易于设计,实现和标准化
在网络协议中的分层。不仅仅是根据负责的功能来简单的划分层次,而且层与层之间会有不可缺少的的封装与传递。对于网络模型各层的封装是根据整个网络模型从上到下的工作流程来划分的。但是,每层之间会有一定的联系,不是独立工作的。
2.2 程序是如何工作的?
2.3 层与层之间联系
- 只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。
- 所以,对 TCP 协议来说,三次握手也好,重试也好,只要想发出去包,就要有 IP 层和 MAC 层,不然是发不出去的。
3. ifconfig:最熟悉又陌生的命令行
linux上查看ip地址的命令有ifconfig和ip addr两种
3.1 ifconfig 和 ip addr 的区别
这是一个有关 net-tools 和 iproute2 的“历史”故事,net-tools起源于BSD的TCP/IP工具箱,后来成为老版本Linux内核中配置网络功能的工具,但自2001年起,Linux社区已经对其停止维护。同时,一些Linux发行版比如Arch Linux和CentOS/RHEL 7则已经完全抛弃了net-tools,只支持iproute2。
作为网络配置工具的一份子,iproute2是linux下管理控制TCP/IP网络和流量控制的新一代工具包,旨在替代老派的工具链net-tools,即大家比较熟悉的ifconfig,arp,route,netstat等命令。
net-tools通过procfs(/proc)和ioctl系统调用去访问和改变内核网络配置,而iproute2则通过netlink套接字接口与内核通讯。
抛开性能而言,net-tools的用法给人的感觉是比较乱,而iproute2的用户接口相对net-tools来说相对来说,更加直观。比如,各种网络资源(如link、IP地址、路由和隧道等)均使用合适的对象抽象去定义,使得用户可使用一致的语法去管理不同的对象,更重要的是,到目前为止,iproute2仍处在持续开发中,所以,net-tools和iproute2都需要去学习掌握了。
如果你仍在使用net-tools,而且尤其需要跟上新版Linux内核中的最新最重要的网络特性的话,那么是时候转到iproute2的阵营了。原因就在于使用iproute2可以做很多net-tools无法做到的事情。
3.2 ip地址的分类
linux下输入ip addr
1 | root@test:~ |
在 IP 地址的后面有个 scope,对于 eth0 这张网卡来讲,是 global,说明这张网卡是可以对外的,可以接收来自各个地方的包。对于 lo 来讲,是 host,说明这张网卡仅仅可以供本机相互通信。lo 全称是 loopback,又称环回接口,往往会被分配到 127.0.0.1 这个地址。这个地址用于本机通信,经过内核处理后直接返回,不会在任何网络中出现。
这个命令显示了这台机器上所有的网卡。大部分的网卡都会有一个 IP 地址,当然,这不是必须的。
IP 地址是一个网卡在网络世界的通讯地址,相当于我们现实世界的门牌号码
以前人们根本想不到会有这么多的计算机,所以ip地址总共就32位,也就是我们所说的ipv4,可是ipv4很快就别分配完了,于是就出现了ipv6。
iPv4被分成了5类
这里面有个尴尬的事情,就是 C 类地址能包含的最大主机数量实在太少了,只有 254 个。当时设计的时候恐怕没想到,现在估计一个网吧都不够用吧。而 B 类地址能包含的最大主机数量又太多了。6 万多台机器放在一个网络下面,一般的企业基本达不到这个规模,闲着的地址就是浪费。
3.3 无类型域间选路(CIDR)
无类型域间选路(CIDR)基本思想是取消地址的分类结构,取而代之的是允许以可变长分界的方式分配网络数。它支持路由聚合,可限制Internet主干路由器中必要路由信息的增长。“无类型”的意思是选路决策是基于整个32位IP地址的掩码操作。而不管其IP地址是A类、B类或是C类。这样能够将路由表中的许多表项归并(summarization)成更少的数目。
- 伴随着 CIDR 存在的,一个是广播地址,10.100.122.255。如果发送这个地址,所有 10.100.122 网络里面的机器都可以收到。
- 另一个是子网掩码,255.255.255.0。将子网掩码和 IP 地址进行 AND 计算。前面三个 255,转成二进制都是 1。1 和任何数值取 AND,都是原来数值,因而前三个数不变,为 10.100.122。后面一个 0,转换成二进制是 0,0 和任何数值取 AND,都是 0,因而最后一个数变为 0,合起来就是 10.100.122.0。这就是网络号。将子网掩码和 IP 地址按位计算 AND,就可得到网络号。
3.4 公有 IP 地址和私有 IP 地址
上图中可以看到私有地址的范围,私有地址就是平时我们看到的数据中心里,办公室、家里或学校的 IP 地址,一般都是私有 IP 地址段。因为这些地址允许组织内部的 IT 人员自己管理、自己分配,而且可以重复。因此,你学校的某个私有 IP 地址段和我学校的可以是一样的。
就像你的小区有402号房间,我的小区也可以有402号房间,但是一旦出了小区,直接说402房间别人就找不到了。
公有 IP 地址有个组织统一分配,你需要去买。如果你搭建一个网站,给你学校的人使用,让你们学校的 IT 人员给你一个 IP 地址就行。但是假如你要做一个类似网易 163 这样的网站,就需要有公有 IP 地址,这样全世界的人才能访问。
3.5 MAC地址
- MAC 地址更像是身份证,是一个唯一的标识。它的唯一性设计是为了组网的时候,不同的网卡放在一个网络里面的时候,可以不用担心冲突。从硬件角度,保证不同的网卡有不同的标识。但是光有mac地址是不够的的,就像光知道你的身份证是很难找得到你的人的,还需要你现在的居住地址(相当于ip地址)
- MAC地址只有很小范围的定位功能,就像大家在一个房间里,这时候大喊这个人的身份证,就会有对应的人回复你。
- mac地址是唯一的,为什么可以修改?想想身份证,身份证号是唯一的,不能改变的,但是可以造价。mac地址全球唯一,它是固化在网卡里的。网卡毕竟是个硬件,需要软件支持,既操作系统识别。重点来了,操作系统识别出来的mac地址是可以更改的,它只不过是一个字符串。我们常说的修改mac指的是修改电脑中记录的既注册表中的记录。
- 有了mac地址为什么还要有ip地址。举个例子,身份证号是你的唯一标识,不会重复,一落户就有(网卡一出厂就有mac)。现在我要和你通信(写信给你),地址用你的姓名+身份证,信能送到你手上吗?明显不能!身份证号前六位能定位你出生的县。mac地址前几位也可以定位生产厂家。但是你出生后会离开这个县(哪怕在这个县,也不能具体找到你)。所以一般写个人信息就要有出生地和现居地址了
3.6 问题思考
(1) 组播和广播的意义和原理是什么?
- 广播和组播分为两个层面,其中 MAC 层有广播和组播对应的地址,IP 层也有自己的广播地址和组播地址。
- 广播相对比较简单,MAC 层的广播为 ff:ff:ff:ff:ff:ff,IP 层指向子网的广播地址为主机号为全 1 且有特定子网号的地址。
- 组播复杂一些,MAC 层中,当地址中最高字节的最低位设置为 1 时,表示该地址是一个组播地址,用十六进制可表示为 01:00:00:00:00:00。IP 层中,组播地址为 D 类 IP 地址,当 IP 地址为组播地址的时候,有一个算法可以计算出对应的 MAC 层地址。
- 多播进程将目的 IP 地址指明为多播地址,设备驱动程序将它转换为相应的以太网地址,然后把数据发送出去。这些接收进程必须通知它们的 IP 层,它们想接收的发给定多播地址的数据报,并且设备驱动程序必须能够接收这些多播帧。这个过程就是“加入一个多播组”。当多播跨越路由器的时候,需要通过 IGMP 协议告诉多播路由器,多播数据包应该如何转发。
4. DHCP与PXE:IP是怎么来的,又是怎么没的?
4.1 配置ip地址
使用 net-tools:
$ sudo ifconfig eth1 10.0.0.1/24
$ sudo ifconfig eth1 up
使用 iproute2:
$ sudo ip addr add 10.0.0.1/24 dev eth1
$ sudo ip link set up eth1
但是在手动配置ip地址时,不是自由的去配置的,要考虑很多因素,如两台电脑需要通信时,源IP 地址 16.158.23.6,目标 IP 地址 192.168.1.6,因为不是同一个网卡的话,Linux 默认的逻辑是,如果这是一个跨网段的调用,它便不会直接将包发送到网络上,而是企图将包发送到网关。需要经过多次网关才能达到,如果两台电脑是相邻的,如果直接配置成同一个网段的,直接发送ARP请求,节省很多资源.
4.2 动态主机配置协议(DHCP)
概要
动态主机配置协议 (DHCP) 是由 RFC 1541(已被 RFC 2131 取代)定义的标准协议,允许服务器将 IP 地址和配置信息动态分发给客户端。正常情况下,DHCP 服务器至少会为客户端提供以下基本信息:
- IP 地址
- 子网掩码
- 默认网关
4.2.1 DHCP 的工作方式:
这里第二步,如果有多个DHCP服务器,新的客户端会收到多个ip地址,一般选择第一个到来的,客户端仍然使用 0.0.0.0 为源 IP 地址、255.255.255.255 为目标地址进行广播。在 BOOTP 里面,接受某个 DHCP Server 的分配的 IP。
4.2.2 IP 地址的收回和续
客户机会在租期过去 50% 的时候,直接向为其提供 IP 地址的 DHCP Server 发送 DHCP request 消息包。客户机接收到该服务器回应的 DHCP ACK 消息包,会根据包中所提供的新的租期以及其他已经更新的 TCP/IP 参数,更新自己的配置。这样,IP 租用更新就完成了。
4.2.3 PXE 的工作过程
网络管理员不仅能自动分配 IP 地址,还能帮你自动安装操作系统!
我们安装操作系统的过程,只能插在 BIOS 启动之后了。因为没安装系统之前,连启动扇区都没有。因而这个过程叫做预启动执行环境(Pre-boot Execution Environment),简称 PXE。PXE 协议分为客户端和服务器端,由于还没有操作系统,只能先把客户端放在 BIOS 里面。当计算机启动时,BIOS 把 PXE 客户端调入内存里面,就可以连接到服务端做一些操作了。
4.2.4 DCHP总结
DHCP 协议主要是用来给客户租用 IP 地址,和房产中介很像,要商谈、签约、续租,广播还不能“抢单”
DHCP 协议能给客户推荐“装修队”PXE,能够安装操作系统,这个在云计算领域大有用处
4.3 问题思考
(1)PXE 协议可以用来安装操作系统,但是如果每次重启都安装操作系统,就会很麻烦。你知道如何使得第一次安装操作系统,后面就正常启动吗?
- 现在一般电脑的网卡几乎都支持PXE启动, PXE client 就在网卡的 ROM 中,当计算机引导时,BIOS 把 PXE client 调入内存执行。
安装完成后,将提示重新引导计算机。这个时候,在重新引导的过程中将BIOS修改回从硬盘启动就可以了。 - 服务器一般都提供 IPMI 接口,可以通过这个接口启动、重启、设置启动模式等等远程访问,这样就可以批量管理一大批机器。
(2)在 DHCP 网络里面,手动配置 IP 地址会冲突吗?
- 在一个 DHCP 网络里面,如果某一台机器手动配置了一个 IP 地址,并且在 DHCP 管理的网段里的话,DHCP 服务器是会将这个地址分配给其他机器的。一旦分配了,ARP 的时候,就会收到两个应答,IP 地址就冲突了
- 当发生这种情况的时候,应该怎么办呢?DHCP 的过程虽然没有明确如何处理,但是 DHCP 的客户端和服务器都可以添加相应的机制来检测冲突。
- 如果由客户端来检测冲突,一般情况是,客户端在接受分配的 IP 之前,先发送一个 ARP,看是否有应答,有就说明冲突了,于是发送一个 DHCPDECLINE,放弃这个 IP 地址。
- 如果由服务器来检测冲突,DHCP 服务器会发送 ping,来看某个 IP 是否已经被使用。如果被使用了,它就不再将这个 IP 分配给其他的客户端了。
(3)DHCP 的 Offer 和 ACK 应该是单播还是广播呢?
正常情况下,一旦有了 IP 地址,DHCP Server 还是希望通过单播的方式发送 OFFER 和 ACK。但是不幸的是,有的客户端协议栈的实现,如果还没有配置 IP 地址,就使用单播。协议栈是不接收这个包的,因为 OFFER 和 ACK 的时候,IP 地址还没有配置到网卡上。所以,一切取决于客户端的协议栈的能力。
- 如果没配置好 IP,就不能接收单播的包,那就将 BROADCAST 设为 1,以广播的形式进行交互。
- 如果客户端的协议栈实现很厉害,即便是没有配置好 IP,仍然能够接受单播的包,那就将 BROADCAST 位设置为 0,就以单播的形式交互。
(4)DHCP 如何解决内网安全问题?
其实 DHCP 协议的设计是基于内网互信的基础来设计的,而且是基于 UDP 协议。但是这里面的确是有风险的。例如一个普通用户无意地或者恶意地安装一台 DHCP 服务器,发放一些错误或者冲突的配置;再如,有恶意的用户发出很多的 DHCP 请求,让 DHCP 服务器给他分配大量的 IP。
- 对于第一种情况,DHCP 服务器和二层网络都是由网管管理的,可以在交换机配置只有来自某个 DHCP 服务器的包才是可信的,其他全部丢弃。如果有 SDN,或者在云中,非法的 DHCP 包根本就拦截到虚拟机或者物理机的出口。
- 对于第二种情况,一方面进行监控,对 DHCP 报文进行限速,并且异常的端口可以关闭,一方面还是 SDN 或者在云中,除了被 SDN 管控端登记过的 IP 和 MAC 地址,其他的地址是不允许出现在虚拟机和物理机出口的,也就无法模拟大量的客户端。
参考文章
学习自极客时间 《趣谈网络协议》