一、概述

1.1 分层

网络协议通常分不同层次进行开发,每一层分别负责不同的通信功能。一个协议簇,比如TCP/IP,是一组不同层次上的多个协议的组合。TCP/IP通常被认为是一个4层协议系统:
image.png

  1. 链路层——有时也称作数据链路层和网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。
  2. 网络层——有时也称作互联网层,处理分组在网络中的活动,例如分组的选路。在TCP/IP协议族中,网络层IP提供的是一种不可靠的服务。在TCP/IP协议族中,网络层协议包括IP协议(网际协议)、ICMP协议(Inertnet互联网控制报文协议)和IGMP协议(Internet组管理协议)
  3. 运输层——主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协议:
    1. TCP(传输控制协议)——为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节
    2. UDP(用户数据报协议)——为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但不保证该数据报能到达另一端。任何必需的可靠性都由应用层来提供
  4. 应用层——负责处理特定的应用程序细节。

我们可以划分出端系统(两边的两台主机)和中间系统(中间的路由器)。应用层和运输层使用端到端(End-to
-end)协议,在图中,只有端系统需要这两层协议。但是网路曾提供的确实逐跳(Hop-by-hop)协议,两个端系统和每个中间系统都要使用它。
image.png
连接网络的另一个途径是使用网桥。网桥是在链路层上对网络进行互连,而路由器是在网络层上对网络进行互连。网桥使得多个局域网LAN组合在一起,这样对上层来说就像是一个局域网。

1.2 封装

当应用程序用TCP传送数据时,数据被送入协议栈,然后逐个通过每一层直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息(有时还要增加尾部信息)。TCP传给IP的数据单元称作TCP报文段或简称为TCP段。IP传给网络接口层的数据单元称为IP数据报。通过以太网传输的比特流称作帧,以太网数据帧的物理特性是其长度必须在46~1500字节之间。
由于TCP、UDP、ICMP和IGMP都要向IP传送数据,因此IP必须在生成的IP首部加入某种标识,以表明数据属于哪一层。为此,IP在首部中存入一个长度为8bit的数值,称作协议域。1表示为ICMP协议,2表示为IGMP协议,6表示为TCP协议,17表示为UDP协议。
类似的,许多应用程序都可以使用TCP或UDP来传送数据:

  • 运输层协议在生成报文首部时要存入一个应用程序的标识符。TCP和UDP都用一个16bit的端口号来表示不同的应用程序。TCP和UDP把源端口号和目的端口号分别存入报文首部中
  • 网络接口分别要发送和接受IP、ARP和RARP数据,因此也必须在以太网的帧首部中加入某种形式的标识,以指明生成数据的网络层协议。为此,以太网的帧首部也有一个16bit的帧类型域

    二、链路层

    2.1 引言

    在TCP/IP协议族中,链路层主要有三个目的:
  1. 为IP模块发送和接收IP数据报
  2. 为ARP模块发送ARP请求和接收ARP应答
  3. 为RARP发送RARP请求和RARP应答

    2.2 PPP:点对点协议

    image.png
    每一帧都以标志字符0x7e开始和结束。紧接着是一个地址字节,值始终是0xff,然后是一个值为0x03的控制字节。接下来是协议字段,类似于以太网中类型字段的功能。当它的值为0x0021时,表示信息字段是一个IP数据报;值为0xc021时,表示信息字段是链路控制数据;值为0x8021时,表示信息字段是网络控制数据。

    三、IP:网际协议

    3.1 IP首部

    image.png

    3.2 IP路由选择

    如果目的主机与源主机直接相连或都在一个共享网络上,那么IP数据报就直接送到目的主机上。否则,主机把数据报发往一默认的路由器上,由路由器来转发该数据报。
    IP层在内存中有一个路由表。当收到一份数据报并进行发送时,它都要对该表搜索一次。当数据包来自某个网络接口时,IP首先检查目的IP地址是否为本机的IP地址之一或者IP广播地址。如果是,数据报就被送到由IP首部协议字段所指定的协议模块进行处理。如果数据报的目的不是这些地址,那么:

  4. 如果IP层被设置为路由器的功能,那么就对数据报进行转发

  5. 否则数据报被丢弃

路由器表中的每一项都包含下面的信息:

  • 目的IP地址——它既可以是一个完整的主机地址,也可以是一个网络地址,由该表目中的标志字段来指定。主机地址有一个非0的主机号,以指定某一特定的主机,而网络地址中的主机号为0,以指定网络中的所有主机
  • 下一跳路由器的IP地址,或者有直接连接的网络IP地址——下一跳路由器是指一个在直接相连网络上的路由器,通过它可以转发数据报。下一跳路由器不是最终的目的,但是它可以把传送给它的数据报转发到最终目的
  • 标志——其中一个标志指明目的IP地址是网络地址还是主机地址,另一个标志指明下一站路由器是否为真正的下一站路由器,还是一个直接相连的接口
  • 为数据报的传输指定一个网络接口

IP路由选择是逐跳地进行的,IP路由选择主要完成以下这些功能:

  1. 搜索路由表,寻找能与目的IP地址完全匹配的条目(网络号和主机号都要匹配)。
  2. 搜索路由表,寻找能与目的网络号相匹配的条目。
  3. 搜索路由表,寻找标为“默认”的表目
  4. 如果上述步骤都未成功,那么该数据报就不能被传送。

数据报在各站的传输过程中目的IP地址始终不变,但是封装和目的链路层地址在每一站都可以改变。

四、ARP:地址解析协议

注意 OSI中ARP属于链路层 tcp/ip中ARP属于网络层;其实可以理解为ARP在网络层的下层

ARP 为 IP地址到对应的硬件地址之间提供动态映射。
image.png

  1. 主机A首先查看自己的ARP表,确定其中是否包含有主机B对应的ARP表项。如果找到了对应的MAC地址,则主机A直接利用ARP表中的MAC地址,对IP数据包进行帧封装,并将数据包发送给主机B。
  2. 如果主机A在ARP表中找不到对应的MAC地址,则将缓存该数据报文,然后以广播方式发送一个ARP请求报文。ARP请求报文中的发送端IP地址和发送端MAC地址为主机A的IP地址和MAC地址,目标IP地址和目标MAC地址为主机B的IP地址和全0的MAC地址。由于ARP请求报文以广播方式发送,该网段上的所有主机都可以接收到该请求,但只有被请求的主机(即主机B)会对该请求进行处理。
  3. 主机B比较自己的IP地址和ARP请求报文中的目标IP地址,当两者相同时进行如下处理:将ARP请求报文中的发送端(即主机A)的IP地址和MAC地址存入自己的ARP表中。之后以单播方式发送ARP响应报文给主机A,其中包含了自己的MAC地址。
  4. 主机A收到ARP响应报文后,将主机B的MAC地址加入到自己的ARP表中以用于后续报文的转发,同时将IP数据包进行封装后发送出去。同时它还更新自己的ARP缓存表,下次再向主机B发送信息时,直接从ARP缓存表里查找就可。ARP缓存表采用老化机制,在一段时间内如果表中的某一行没有使用,就会被删除,这样可以大大减少ARP缓存表的长度,加快查询速度。

image.png当发送主机和目的主机不在同一个局域网中时,即便知道目的主机的MAC地址,两者也不能直接通信,必须经过路由转发才可以。所以此时,发送主机通过ARP协议获得的将不是目的主机的真实MAC地址,而是一台可以通往局域网外的路由器的MAC地址。于是此后发送主机发往目的主机的所有帧,都将发往该路由器,通过它向外发送。这种情况称为ARP代理(ARP Proxy)

4.1 ARP的分组格式

image.png

  • 字段1是ARP请求的目的以太网地址,全1时代表广播地址。
  • 字段2是发送ARP请求的以太网地址。
  • 字段3以太网帧类型表示的是后面的数据类型,ARP请求和ARP应答这个值为0x0806。
  • 字段4表示硬件地址的类型,硬件地址不只以太网一种,是以太网类型时此值为1。
  • 字段5表示要映射的协议地址的类型,要对IPv4地址进行映射,此值为0x0800。
  • 字段6和7表示硬件地址长度和协议地址长度,MAC地址占6字节,IP地址占4字节。
  • 字段8是操作类型字段:
    • 值为1,表示进行ARP请求;
    • 值为2,表示进行ARP应答;
    • 值为3,表示进行RARP请求;
    • 值为4,表示进行RARP应答。
  • 字段9是发送端ARP请求或应答的硬件地址,这里是以太网地址,和字段2相同。
  • 字段10是发送ARP请求或应答的IP地址。
  • 字段11和12是目的端的硬件地址和协议地址。

    1. ARP请求报文

    image.png

    2. ARP响应报文

    ARP应答分组中,将ARP请求中的源和目的地址进行交换,此外,变化的还有字段8 Opcode。其余字段内容不会发生变化。image.png

    4.2 ARP表

    设备通过ARP解析到目的MAC地址后,将会在自己的ARP表中增加IP地址到MAC地址的映射表项,以用于后续到同一目的地报文的转发。

    1. 动态ARP表

    动态ARP表项由ARP协议通过ARP报文自动生成和维护,可以被老化,可以被新的ARP报文更新,可以被静态ARP表项覆盖。当到达老化时间、接口down时会删除相应的动态ARP表项。

    2. 静态ARP表

    静态ARP表项通过手工配置和维护,不会被老化,不会被动态ARP表项覆盖。配置静态ARP表项可以增加通信的安全性。静态ARP表项可以限制和指定IP地址的设备通信时只使用指定的MAC地址,此时攻击报文无法修改此表项的IP地址和MAC地址的映射关系,从而保护了本设备和指定设备间的正常通信。

    4.3 ARP代理

    如果ARP请求是从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答该请求,这个过程称作委托ARP或ARP代理。

    1. 为什么需要代理ARP?

    先要了解,路由器的重要功能之一就是把局域网的广播包限制在该网内,阻止其扩散,否则会造成网络风暴。
    ARP请求是个广播包,它询问的对象如果在同一个局域网内,就会收到应答。但是如果询问的对象不在同一个局域网该如何处理?路由器就提供了代理ARP为这个问题提供了解决方案。

    2. 工作过程

    两台主机A和B处于同一网段但不同的广播段(不在同一物理网络上)时,主机A发送ARP请求主机B的MAC地址时,因为路由器不转发广播包的原因,ARP请求只能到达路由器。如果路由器启用了代理ARP功能,并知道主机B属于它连接的网络,那么路由器就用自己接口的MAC地址代替主机B的MAC地址来对主机A进行ARP应答。主机A接收ARP应答,但并不知道代理ARP的存在。

    3. 代理ARP的优缺点

    优点:代理ARP能在不影响路由表的情况下添加一个新的Router,使子网对该主机变得透明化。一般代理ARP应该使用在主机没有配置默认网关或没有任何路由策略的网络上。
    缺点:从工作工程可以看到,这其实是一种ARP欺骗。而且,通过两个物理网络之间的路由器的代理ARP功能其实互相隐藏了物理网络,这导致无法对网络拓扑进行网络概括。此外,代理ARP增加了使用它的那段网络的ARP流量,主机需要更大的ARP缓存空间,也不会为不使用ARP进行地址解析的网络工作。

    4.4 免费ARP

    免费ARP指主机发送ARP查找自己的IP地址,通常发生在系统引导期间进行接口配置时。与标准ARP的区别就是免费ARP分组的目的IP地址字段封装的是自己的IP地址,即向所在网络请求自己的MAC地址。免费ARP的作用有:

  • 一个主机可以通过它来确定另一个主机是否设置了相同的 IP地址——正常情况下发送免费ARP请求不会收到ARP应答,如果收到了一个ARP应答,则说明网络中存在与本机相同的IP地址的主机,发生了地址冲突。

  • 更新其他主机高速缓存中旧的硬件地址信息——如果发送免费ARP的主机正好改变了硬件地址,如更换了接口卡。其他主机接收到这个ARP请求的时候,发现自己的ARP高速缓存表中存在对应的IP地址,但是MAC地址不匹配,那么就需要利用接收的ARP请求来更新本地的ARP高速缓存表表项。
  • 网关利用免费ARP防止ARP攻击——有些网关设备在一定的时间间隔内向网络主动发送免费ARP报文,让网络内的其他主机更新ARP表项中的网关MAC地址信息,以达到防止或缓解ARP攻击的效果。
  • 利用免费ARP进行ARP攻击——ARP协议并不只在发送了ARP请求才接收ARP应答,计算机只要接收到ARP应答数据包,就会使用应答中的IP和MAC地址对本地的ARP缓存进行更新。主机可以构造虚假的免费ARP应答,将ARP的源MAC地址设为错误的MAC地址,并把这个虚假的免费ARP应答发送到网络中,那么所有接收到这个免费ARP应答的主机都会更新本地ARP表项中相应IP地址对应的MAC地址。更新成功后,这些主机的数据报文就会被转发到错误的MAC地址,从而实现了ARP欺骗的攻击。

    五、RARP:逆地址解析协议

    ARP 协议是已知 IP 地址求 MAC 地址,那 RARP 协议正好相反,它是已知 MAC 地址求 IP 地址

具有本地磁盘的系统引导时,一般是从磁盘上的配置文件中读取IP地址。但是无盘机,如X终端或无盘工作站,则需要采用其他方法来获取IP地址。
网络上的每个系统都具有唯一的硬件地址,它是由网络接口生产厂家配置的。无盘系统的RARP实现过程是从接口卡上读取唯一的硬件地址,然后发送一份RARP请求,请求某个主机响应该无盘系统的IP地址。
通常这需要架设一台 RARP 服务器,在这个服务器上注册设备的 MAC 地址及其 IP 地址。然后再将这个设备接入到网络,接着:

  • 该设备会发送一条「我的 MAC 地址是XXXX,请告诉我,我的IP地址应该是什么」的请求信息。
  • RARP 服务器接到这个消息后返回「MAC地址为 XXXX 的设备,IP地址为 XXXX」的信息给这个设备。

最后,设备就根据从 RARP 服务器所收到的应答信息设置自己的 IP 地址。

六、ICMP:Internet控制报文协议

6.1 引言

ICMP经常被认为是IP层的一个组成部分。它传递差错报文以及其他需要注意的信息。ICMP报文通常被IP层或更高层协议(TCP或UDP)使用。一些ICMP报文把差错报文返回给用户进程。
ICMP报文是在IP数据报内部被传输的:
image.png
ICMP报文的格式如图所示,所有报文的前4个字节都是一样的,但是剩下的的其他字节则互不相同。image.png

6.2 ICMP报文的类型

不同类型由报文中的类型字段和代码字段共同决定。

类 型 代 码 描述 查 询 差 错
0 0 回显应答(Ping应答)
3

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
目的不可达
网络不可达
主机不可达

















4 0 源端被关闭
5

0
1
2
3
重定向
对网络重定向
对主机重定向
对服务类型和网络重定向
对服务类型和主机重定向




8 0 请求回显(Ping请求)
9
10
0
0
路由器通告
路由器请求

11

0
1
超时
传输期间生存时间为0
在数据报组装期间生存时间为0



12

0
1
参数问题
坏的IP首部(包括各种差错)
缺少必需的选项



13
14
0
0
时间戳请求
时间戳应答

15
16
0
0
信息请求(作废不用)
信息应答(作废不用)

17
18
0
0
地址掩码请求
地址掩码应答

1. ICMP地址掩码请求与应答

ICMP地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码。系统广播它的ICMP请求报文。(无盘系统获取子网掩码的另一个方法是BOOTP协议)。ICMP地址掩码请求和应答报文的格式:
image.png
ICMP报文中的标识符和序列号字段由发送端任意选择设定,这些值在应答中将被返回。

2. ICMP时间戳请求与应答

ICMP时间戳请求允许系统向另一个系统查询当前的时间,返回值建议值是自午夜开始计算的毫秒数,协调的统一时间。ICMP时间戳请求和应答报文格式:
image.png
请求段填写发起时间戳,然后发送报文。应答系统收到请求报文时填写接收时间戳,在发送应答时填写发送时间戳。

6.3 Ping程序

Ping 是 ICMP 的一个重要应用,主要用来测试两台主机之间的连通性。
Ping 的原理是通过向目的主机发送 ICMP 回显请求报文,目的主机收到之后会发送 ICMP回显应答报文。Ping 会根据时间和成功响应的次数估算出数据包往返时间以及丢包率。

6.4 Traceroute程序

Traceroute 是 ICMP 的另一个应用,用来跟踪一个分组从源点到终点所经过的路由。
Traceroute 发送的 IP 数据报封装的是无法交付的 UDP 用户数据报,并由目的主机发送终点不可达差错报告报文。

  • 源主机向目的主机发送一连串的 IP 数据报。第一个数据报 P1 的生存时间 TTL 设置为 1,当 P1 到达路径上的第一个路由器 R1 时,R1 收下它并把 TTL 减 1,此时 TTL 等于 0,R1 就把 P1 丢弃,并向源主机发送一个 ICMP 时间超过差错报告报文;
  • 源主机接着发送第二个数据报 P2,并把 TTL 设置为 2。P2 先到达 R1,R1 收下后把 TTL 减 1 再转发给 R2,R2 收下后也把 TTL 减 1,由于此时 TTL 等于 0,R2 就丢弃 P2,并向源主机发送一个 ICMP 时间超过差错报文。
  • 不断执行这样的步骤,直到最后一个数据报刚刚到达目的主机,主机不转发数据报,也不把 TTL 值减 1。但是因为数据报封装的是无法交付的 UDP,因此目的主机要向源主机发送 ICMP 终点不可达差错报告报文。
  • 之后源主机知道了到达目的主机所经过的路由器 IP 地址以及到达每个路由器的往返时间。

    七、IGMP:Internet组管理协议

    用于支持主机和路由器进行多播的Internet组管理协议,它让一个物理网络上的所有系统知道主机当前所在的多播组。多播路由器需要这些信息以便知道多播数据报应该向哪些接口转发。IGMP报文通过IP数据报进行传输。

    7.1 IGMP报文

    image.png
    这是版本为1的IGMP。IGMP类型为1说明是由多播路由器发出的查询报文,为2说明是主机发出的报告报文。
    组地址为D类的IP地址。在查询报文中组地址设置为0,在报告报文中组地址为要参加的组地址。

    7.2 IGMP协议

    1. 加入一个多播组

    多播的基础就是一个进程的概念,该进程在一个主机的给定接口上加入了一个多播组。在一个给定接口上的多播组中的成员是动态的——它随时因进程加入和离开多播组而变化。
    这里暗示一个主机是通过组地址和接口来识别一个多播组。主机必须保留一个表,此表中包含所有至少含有一个进程的多播组以及多播组中的进程数量。

    2. IGMP报告和查询

    多播路由器使用IGMP报文来记录该路由器相连网络中组成员的变化情况。使用规则如下:
  1. 当第一个进程加入一个组时,主机就发送一个IGMP报告。如果一个主机的多个进程加入同一组,只发送一个IGMP报告。这个报告被发送到进程加入组所在的同一接口上。
  2. 进程离开一个组时,主机不发送IGMP报告,即便是组中最后一个进程离开。主机知道在确定的组中已不再有组成员后,在随后收到的IGMP查询中就不再发送报告报文。
  3. 多播路由器定时发送IGMP查询来了解是否还有任何包含有属于多播组的进程。多播路由器必须向每个接口发送一个IGMP查询。因为路由器希望主机对它加入的每个多播组均发回一个报告,因此IGMP查询报文中的组地址被设置为0。
  4. 主机通过发送IGMP报告来响应一个IGMP查询,对每个至少还包含一个进程的组均要回IGMP报告。

使用这些查询和报告报文,多播路由器对每个接口保持一个表,表中记录接口上至少还包含一个主机的多播组。当路由器收到要转发的多播数据报时,它只将该数据报转发到还拥有属于那个组主机的接口上。

3. 实现细节

  1. 当一个主机首次发送IGMP报告时,并不保证该报告被可靠接受,下一个报告将在间隔一段时间后发送。
  2. 当一个主机收到一个从路由器发出的查询后,并不立即响应,而是经过一定的时间间隔后才发出一些响应。

    八、IP选路

    7.1 引言

    需要进行选路的数据报可以由本地主机产生,也可以由其他主机产生(此时,主机必须配置一个路由器,否则通过网络接口接收到的数据报如果目的地址不是主机就要被丢弃)。
    image.png

    7.2 选路的原理

    IP层进行的选录实际上是一种选路机制,它搜索路由表并决定向哪个网络接口发送分组,这区别于选路策略,它只是一组决定把哪些路由放入路由表的规则。IP执行选路机制,而路由守护程序则一般提供选路策略。

    1. 简单路由表

    1. svr4 % netstat -rn
    2. Routing tables
    3. Destination Gateway Flags Refcnt Use Interface
    4. 140.252.13.65 140.252.13.35 UGH 0 0 emd0
    5. 127.0.0.1 127.0.0.1 UH 1 0 lo0
    6. default 140.252.13.33 UG 0 0 emd0
    7. 140.252.13.32 140.252.13.34 U 4 25043 emd0
  • 对于一个给定的路由器,可以打出5种不同的标志:
  1. U——该路由可以使用
  2. G——该路由是到一个网关(路由器)。如果没有设置该标志,说明目的地是直接相连的
  3. H——该路由是一个主机,即目的地址是一个完整的主机地址。如果没有设置该标志,说明该路由是到一个网络,而目的地址是一个网络地址:一个网络号或者网络号与子网号的组合
  4. D——该路由是由重定向报文创建的
  5. M——该路由已被重定向报文修改
  • 参考记数Refcnt给出的是正在使用路由的活动进程个数。
  • use显示的是通过该路由发送的分组数。
  • interface是本地接口的名字

第4行说明如果目的地是142.252.13.65,那么网关将把分组转发给140.252.13.35。输出的第5行是环回接口,他的名字始终为lo0。输出的第6行是默认路由。输出的最后一行是所在的以太网。网管列指出的IP地址是外出地址

2. 初始化路由表

每当初始化一个接口时(通常是用ifconfig命令设置接口地址),就为接口自动创建一个直接路由。对于点对点链路和环回接口来说,路由是到达主机。对于广播接口来说,路由是到达网络。
到达主机或网络的路由如果不是直接相连的,那么就必须加入路由表。一个常用的方法是在系统引导时显示地在初始化文件中运行route命令。一些系统允许在某个文件中指定默认的路由。
初始化路由表的其他方法是运行路由守护程序或者用较新的路由发现协议

九、动态选路协议

8.1 动态选路

当相邻路由器之间进行通信,以告知对方每个路由器当前所连接的网络,这时就出现了动态选路。路由器上有一个进程称为路由守护程序,它运行选路协议,并与其相邻的一些路由器进行通信。路由守护程序根据它从相邻路由器收到的信息,更新内核中的路由表。

当路由随时间变化时,路由是由路由守护程序动态地增加或删除,而不是来自于自引导程序文件中的route命令

可以把路由选择协议划分为两大类:

  • 自治系统内部的路由选择:RIP 和 OSPF
  • 自治系统间的路由选择:BGP

    8.2 RIP:选路信息协议

    1. 报文格式

    RIP报文包含在UDP数据报中。
    image.png

  • 命令字段为1表示请求(请求表示要求其他系统发送其全部或部分路由表);2表示应答(应答则包含发送者全部或部分路由表);还有两个舍弃不用的命令(3和4);两个非正式的命令:轮询(5)和轮询表项(6)。

  • 版本字段通常为1,而第2版RIP将此字段设置为2
  • 紧跟在后面的20字节指定地址系列(对于IP地址来说,其值为2)、IP地址以及相应的度量(以跳计数)

image.png

2. 实现原理

RIP 是一种基于距离向量的路由选择协议。距离是指跳数,直接相连的路由器跳数为 1。跳数最多为 15,超过 15 表示不可达。
RIP 按固定的时间间隔仅和相邻路由器交换自己的路由表,经过若干次交换之后,所有路由器最终会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器地址。
距离向量算法:

  • 对地址为 X 的相邻路由器发来的 RIP 报文,先修改报文中的所有项目,把下一跳字段中的地址改为 X,并把所有的距离字段加 1;
  • 对修改后的 RIP 报文中的每一个项目,进行以下步骤:
    • 若原来的路由表中没有目的网络 N,则把该项目添加到路由表中;
    • 否则:若下一跳路由器地址是 X,则把收到的项目替换原来路由表中的项目;
    • 否则:若收到的项目中的距离 d 小于路由表中的距离,则进行更新(例如原始路由表项为 Net2, 5, P,新表项为 Net2, 4, X,则更新);
    • 否则什么也不做。
  • 若 3 分钟还没有收到相邻路由器的更新路由表,则把该相邻路由器标为不可达,即把距离置为 16。

RIP 协议实现简单,开销小。但是 RIP 能使用的最大距离为 15,限制了网络的规模。并且当网络出现故障时,要经过比较长的时间才能将此消息传送到所有路由器。

8.3 OSPF:开放最短路径优先

在一个链路状态协议中,路由器并不与其邻站交换距离信息。它采用的是每个路由器主动地测试与其邻站相连链路的状态,将这些信息发送给它的其他邻站、而邻站将这些信息在自治系统中传播出去。每个路由器接收这些链路状态信息,并建立起完整的路由表。最短路径优先表示使用了 Dijkstra 提出的最短路径算法 SPF。
OSPF与RIP的不同点在于,OSPF直接使用IP,即它并不使用UDP或TCP,对于IP首部的protocol字段,OSPF有其自己的值。
OSPF 具有以下特点:

  • 向本自治系统中的所有路由器发送信息,这种方法是洪泛法。
  • 发送的信息就是与相邻路由器的链路状态,链路状态包括与哪些路由器相连以及链路的度量,度量用费用、距离、时延、带宽等来表示。
  • 只有当链路状态发生变化时,路由器才会发送信息。

    8.4 BGP:边界网关协议

    BGP系统与其他BGP系统之间交换网络可达信息。这些信息包括数据可达这些网络所必需经过的自治系统AS中的所有路径。这些信心足以构造一副自治系统连接图。然后,可以根据连接图删除选路环,制定选路策略。
    首先,将一个自治系统中的IP数据报分为本地流量和通过流量。在自治系统中,本地流量是起始或终止于该自治系统的流量即信源IP地址或信宿IP地址所指定的主机位于该自治系统中。其他的流量则称为通过流量。在Internet中使用BGP的一个目的就是减少通过流量。
    可以将自治系统分为以下几种类型:
  1. 残桩自治系统(stub AS)——它与其它自治系统只有单个连接。stub AS只有本地流量。
  2. 多接口自治系统(multihomed AS)——它与其它自治系统有多个连接,但拒绝传送通过流量。
  3. 转送自治系统(transit AS)——它与其它自治系统有多个连接,在一些策略准则之下,它可以传送本地流量和通过流量。

BGP使用基于策略的选路。由自治系统管理员制定策略,并通过配置文件将策略指定给BGP。BGP与RIP和OSPF的不同之处在于BGP使用TCP作为其传输层协议。两个运行BGP的系统之间建立一条TCP连接,然后交换整个BGP路由表。从这个时候开始,在路由表发生变化时,再发送更新信号。
BGP是一个距离向量协议,但是与RIP不同的是:BGP列举了到每个目的地址的路由(自治系统到达目的地址的序列号)。BGP通过定期发送keepalive报文给其邻站来检测TCP连接对端的链路或主机失败。两个报文之间的时间间隔建议值位30s。

8.5 CIDR:无类型域间选路

无类型域间选路CIDR是一个防止Internet路由表膨胀的方法,它也称为超网。基本观点是:采用一种分配多个IP地址的方式,使其能够将路由表中的许多表项总和成更少的数目。
要使用这种总和,必须满足以下三种特性:

  1. 未进行选路要对多个IP地址进行总和时,这些IP地址必须具有相同的高位地址比特。
  2. 路由表和选路算法必须扩展成根据32bit IP地址和32bit 掩码做出选路决策。
  3. 必须扩展选路协议使其除了32bit地址外,还要有32bit掩码。

    十、UDP:用户数据报协议

    用户数据报协议 UDP(User Datagram Protocol)是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信。

    9.1 UDP首部

    首部字段只有 8 个字节,包括源端口、目的端口、长度、检验和。12 字节的伪首部是为了计算检验和临时添加的。
    TCP/IP详解——协议 - 图18
    UDP长度字段指的是UDP首部和UDP数据的字节长度。该字段的最小值为8字节(发送一份0字节的UDP数据报是OK的)。

    9.2 UDP实现可靠传输

    UDP如何实现可靠传输
    由于在传输层UDP已经是不可靠的连接,那就要在应用层自己实现一些保障可靠传输的机制。简单来讲,要使用UDP来构建可靠的面向连接的数据传输,就要实现类似于TCP协议的
  • 超时重传(定时器)
  • 有序接受 (添加包序号)
  • 应答确认 (Seq/Ack应答机制)
  • 滑动窗口流量控制等机制 (滑动窗口协议)

等于说要在传输层的上一层(或者直接在应用层)实现TCP协议的可靠数据传输机制,比如使用UDP数据包+序列号,UDP数据包+时间戳等方法。
目前已经有一些实现UDP可靠传输的机制,比如基于UDP的数据传输协议(UDP-based Data Transfer Protocol,简称UDT)是一种互联网数据传输协议。UDT的主要目的是支持高速广域网上的海量数据传输,而互联网上的标准数据传输协议TCP在高带宽长距离网络上性能很差。 顾名思义,UDT建于UDP之上,并引入新的拥塞控制和数据可靠性控制机制。UDT是面向连接的双向的应用层协议。它同时支持可靠的数据流传输和部分可靠的数据报传输。 由于UDT完全在UDP上实现,它也可以应用在除了高速数据传输之外的其它应用领域,例如点到点技术(P2P),防火墙穿透,多媒体数据传输等等。

十一、TCP传输控制协议

十二、DNS:域名系统

12.1 DNS基础

DNS域名系统是一种用于TCP/IP应用程序的分布式数据库,它提供主机名字和IP地址之间的转换及有关电子邮件的选路信息。从应用的角度上来看,对DNS的访问是通过一个地址解析器来完成的。在Unix主机中,解析器主要是通过两个库函数gethostbyname(3)和gethostbyaddr(3)来访问的,它们在编译应用程序时与应用程序连接在一起。
DNS的名字空间和Unix的文件系统相似,也具有层次结构。
image.png
每个结点有一个至多63个字符长的标识。树根是没有任何标识的特殊结点,命名标识中一律不区分大小写。命名树上任何一个结点的域名就是将从该结点到最高层的域名串联起来,中间使用一个点“.”分割这些域名。以“.”结尾的域名成为绝对域名或完全合格的域名FQDN。
DNS 可以使用 UDP 或者 TCP 进行传输,使用的端口号都为 53。大多数情况下 DNS 使用 UDP 进行传输,这就要求域名解析器和域名服务器都必须自己处理超时和重传从而保证可靠性。在两种情况下会使用 TCP 进行传输:

  • 如果返回的响应超过的 512 字节(UDP 最大只支持 512 字节的数据)
  • 区域传送(区域传送是主域名服务器向辅助域名服务器传送变化的那部分数据)。

    12.2 解析过程

    image.png
  1. 请求一旦发起,若是chrome浏览器,先在浏览器找之前「有没有缓存过的域名所对应的ip地址」,有的话,直接跳过dns解析了,若是没有,就会「找硬盘的hosts文件」,看看有没有,有的话,直接找到hosts文件里面的ip
  2. 如果本地的hosts文件没有能的到对应的ip地址,浏览器会发出一个「dns请求到本地dns服务器」「本地dns服务器一般都是你的网络接入服务器商提供」,比如中国电信,中国移动等。
  3. 查询你输入的网址的DNS请求到达本地DNS服务器之后,「本地DNS服务器会首先查询它的缓存记录」,如果缓存中有此条记录,就可以直接返回结果,此过程是「递归的方式进行查询」。如果没有,本地DNS服务器还要向「DNS根服务器」进行查询。
  4. 本地DNS服务器继续向域服务器发出请求,在这个例子中,请求的对象是.com域服务器。.com域服务器收到请求之后,也不会直接返回域名和IP地址的对应关系,而是告诉本地DNS服务器,你的域名的解析服务器的地址。
  5. 最后,本地DNS服务器向「域名的解析服务器」发出请求,这时就能收到一个域名和IP地址对应关系,本地DNS服务器不仅要把IP地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。

    12.3 DNS查询方式

    当局部DNS服务器自己不能回答客户机的DNS查询时,它就需要向其他DNS服务器进行查询。此时有两种方式。

    1. 递归解析{Domain:IP}

    「局部DNS服务器自己负责向其他DNS服务器进行查询,一般是先向该域名的根域服务器查询,再由根域名服务器一级级向下查询」。最后得到的查询结果返回给局部DNS服务器,再由局部DNS服务器返回给客户端。

    2. 迭代解析{Domain:CNAME}

    当局部DNS服务器自己不能回答客户机的DNS查询时,也可以通过迭代查询的方式进行解析。
    局部DNS服务器不是自己向其他DNS服务器进行查询,「而是把能解析该域名的其他DNS服务器的IP地址返回给客户端DNS程序」,客户端DNS程序再继续向这些DNS服务器进行查询,直到得到查询结果为止。也就是说,迭代解析只是帮你找到相关的服务器而已,而不会帮你去查。比如说:baidu.com的服务器ip地址在192.168.4.5这里,你自己去查吧,本人比较忙,只能帮你到这里了。

    12.4 DNS负载均衡

    当一个网站有足够多的用户的时候,假如每次请求的资源都位于同一台机器上面,那么这台机器随时可能会崩掉。
    处理办法就是用DNS负载均衡技术,它的原理是在「DNS服务器中为同一个主机名配置多个IP地址,在应答DNS查询时,DNS服务器对每个查询将以DNS文件中主机记录的IP地址按顺序返回不同的解析结果,将客户端的访问引导到不同的机器上去,使得不同的客户端访问不同的服务器」,从而达到负载均衡的目的。
    例如可以根据每台机器的负载量,该机器离用户地理位置的距离等等。

    12.5 DNS的问题思考:

    1. 为什么域名解析用UDP协议?

    因为UDP快啊!UDP的DNS协议只要一个请求、一个应答就好了,而使用基于TCP的DNS协议要三次握手、发送数据以及应答、四次挥手。
    但是UDP协议传输内容不能超过512字节。不过客户端向DNS服务器查询域名,一般返回的内容都不超过512字节,用UDP传输即可。

    2. 为什么区域传送用TCP协议?

    因为TCP协议可靠性好啊!你要从主DNS上复制内容啊,你用不可靠的UDP? 因为TCP协议传输的内容大啊,你用最大只能传512字节的UDP协议?万一同步的数据大于512字节,你怎么办?

    十三、CDN:内容分发网络

    13.1 CDN概念

    CDN全称叫做“Content Delivery Network”,中文叫内容分发网络。实际上CDN这个概念是在1996年由美国麻省理工学院的一个研究小组为改善互联网的服务质量而提出的。那么它到底是怎么改善互联网服务质量的呢?

    13.2 原理分析

    我们知道,当我们使用域名访问某一个网站时,实际上就是将请求包(以Http请求为例)通过网络传输给某台服务器,比如访问“www.baidu.com”时:

  6. 首先解析出该域名所对应的IP地址(DNS域名解析)

  7. 然后将Http请求包通过网络路由到IP地址所对应的服务器

    我们通常说“服务器的IP地址”,这其实不太准确,IP地址是和网卡绑定的,一个服务器可以有多个网卡,也就是可能有多个IP地址。

我们先来看第一步:域名解析:

1. 域名解析

解析域名分为两种:

  1. 将一个域名解析为一个IP地址
  2. 将一个域名解析为另外一个域名

其实解析思路不难,我们在域名服务商购买了一个域名之后,需要去映射一个IP地址,可以用Map来表示这个关系:{域名:IP}
同时我们也可以给某个域名取一个别名,比如“www.baidu.com”取一个别名“test.baidu.com”,这种关系也可以用Map来表示:{域名:别名}。这里的别名专业一点叫做CNAME
域名解析,实际上就是解析出指定域名所对应的IP地址,或者该域名的一个CNAME。
而域名解析是由DNS系统来负责的,DNS服务接受外部请求,从请求里提取域名,

  • 如果这个域名对应的是IP地址,则返回这个IP地址,
  • 如果这个域名对应的是CNAME,则继续查找CNAME域名的IP地址,然后将该地址返回给请求发送者。

请求发送者拿到IP地址之后,完成真正的请求调用。
没有CNAME的情况:image.png
有CNAME的情况:image.png
特别注意:在有CNAME的情况下,我们可以发现,CNAME实际上在域名解析的过程中承担了中间人(或者说代理)的角色,这是CDN实现的关键。

2. CDN原理

首先CDN是为了改善互联网的服务质量通俗一点说其实就是提高访问速度。
假设百度网站现在只有一台服务器,现在有一个人在上海访问百度,如果该服务器也在上海,那么通常来说访问比较快,如果该服务器在拉萨,那么相对而言访问就比较慢了。那么这个问题的根本原因是网络传输是依赖于网线的,网线越长,那么时间肯定就越久。
那么怎么解决这个问题呢?其实思路很简单,百度在全国各地都部署一模一样的服务器就行了,专业一点叫冗余。
思路很简单,但实现还是比较麻烦的,服务器上的资源分为两种:静态资源动态资源

  • 静态资源:这种资源通常是很少变动的,比如图片,视频,css,javascript等等
  • 动态资源:这种资源不同用户不同时刻访问通常是不一样的,比如ftl,jsp等等。

那么如果百度要在全国各地都部署服务器,如果说每个服务器上都有相同的动态资源,那么可能还需要配置相应的数据库,因为动态资源所记录的信息通常会存储在数据库中,那么这就涉及到了数据同步等等问题,这会导致成本很高,这种做法专业一点其实就是集群,而目前来说集群架构最多是三地五中心,不是说全国多地集群不可能,主要是成本太高。
那么有没有成本比较低的方式呢,有,就是在每个服务器上只部署静态资源,静态资源通常不涉及到数据库,所以成本也比较低,而且也能提高用户的访问速度。
到这里,介绍了CDN想要达到的目的,那么怎么达到这个目的呢?现在如果要比较CDN系统,我们可以考虑两点:

  1. CDN系统中存储静态资源服务器的性能以及网速怎么样。
  2. CDN系统中全国甚至全球范围内服务器节点的数量以及部署情况。

第一点很好理解,第二点大家应该也能理解了,如果静态资源的服务器节点很多,能够让每个用户在访问这些静态资源时都不用“跑很远的路程”才能获取到,那么自然这是CDN系统的优点。
有公司看到了这种需求,所以现在其实有很多CDN供应商,比如阿里,腾讯等等都有自己的CDN服务。只要你自己的系统接入了这些大厂所提供的CDN服务,你把自己的静态资源传给CDN服务,那么这些静态资源将自动的分布到全世界各地去。
好,那么现在的问题是,用户在访问静态资源时也是通过域名来访问的,域名会被解析成某一个IP地址,关键的问题就是,DNS系统怎么在做域名解析时,解析出来一个离用户最近的一个IP地址呢
普通的DNS系统是做不到的,需要一个特殊的DNS服务器,这个特殊DNS需要知道

  1. 用户当前所在位置
  2. 还需要知道用户现在访问的这个域名对应哪些IP地址,以及这个IP地址分别在哪?

对于第一个问题好解决,直接从用户请求里提取出用户的ip地址,比如这个ip地址被解析为北京电信、上海移动等等。
第二个问题由谁来解决,我们现在考虑的是CDN,CDN提供商肯定知道他们公司在哪些地方部署了机器以及它们的IP地址,所以这个问题只能有CDN提供商来解决,CDN提供商会提供这个特殊的DNS服务器,我们叫做 CDN专用DNS服务器
这样的话,只要用户在使用某个域名访问静态资源时,如果用户直接配置自己电脑的DNS地址为CDN专用DNS服务器。那么自然解决了问题,但是我们需要考虑的是,我们不能要求世界上所有的用户都去修改自己电脑的DNS地址。所以这个时候就要利用DNS中的CNAME了。
用户使用某个域名来访问静态资源时(这个域名在阿里CDN服务中叫做“加速域名”),比如这个域名为“image.baidu.com”,它对应一个CNAME,叫做“cdn.ali.com”,那么普通DNS服务器(区别CDN专用DNS服务器)在解析“image.baidu.com”时,会先解析成“cdn.ali.com”,普通DNS服务器发现该域名对应的也是一个DNS服务器,那么会将域名解析工作转交给该DNS服务器,该DNS服务器就是CDN专用DNS服务器。CDN专用DNS服务器对“cdn.ali.com”进行解析,然后依据服务器上记录的所有CDN服务器地址信息,选出一个离用户最近的一个CDN服务器地址,并返回给用户,用户即可访问离自己最近的一台CDN服务器了。image.png

十四、TFTP:简单文件传送协议

14.1 协议

在开始工作时,TFTP的客户与服务器交换信息,客户发送一个读请求或写请求给服务器,在无盘系统进行系统引导的正常情况下,第一个请求是读请求RRQ。image.png
TFTP报文的头两个字节表示操作码。文件名字段说明客户端要读或写的位于服务器上的文件,这个文件字段以0字节作为结束。模式字段是一个ASCII码串netascii或octet,同样以0字节结束。每个数据分组包含一个块编号字段,它以后要在确认分组中使用。最后一种TFTP报文类型是差错报文,它的操作码为5。它用于服务器不能处理读请求或写请求的情况。

十五、FTP:文件传送协议

FTP 使用 TCP进行连接,它需要两个连接来传送一个文件:

  • 控制连接:服务器打开端口号 21 等待客户端的连接,客户端主动建立连接后,使用这个连接将客户端的命令传送给服务器,并传回服务器的应答。
  • 数据连接:用来传送一个文件数据。

根据数据连接是否是服务器端主动建立,FTP 有主动和被动两种模式:

  • 主动模式:服务器端主动建立数据连接,其中服务器端的端口号为 20,客户端的端口号随机,但是必须大于 1024,因为 0~1023 是熟知端口号。

03f47940-3843-4b51-9e42-5dcaff44858b.jpg

  • 被动模式:客户端主动建立数据连接,其中客户端的端口号由客户端自己指定,服务器端的端口号随机。

be5c2c61-86d2-4dba-a289-b48ea23219de.jpg
主动模式要求客户端开放端口号给服务器端,需要去配置客户端的防火墙。
被动模式只需要服务器端开放端口号即可,无需客户端配置防火墙。但是被动模式会导致服务器端的安全性减弱,因为开放了过多的端口号。

十六、DHCP:动态主机配置协议

DHCP是一个局域网的网络协议,使用UDP协议工作,主要有两个用途:

  • 用于内部网络或网络服务供应商自动分配IP地址给用户
  • 用于内部网络管理员作为对所有电脑作中央管理的手段

动态主机设置协议(DHCP)提供了即插即用的连网方式,用户不再需要手动配置 IP 地址等信息。在IP网络中,每个连接Internet的设备都需要分配唯一的IP地址。DHCP使网络管理员能从中心结点监控和分配IP地址。当某台计算机移到网络中的其它位置时,能自动收到新的IP地址。
DHCP使用了 租约 的概念,或称为计算机IP地址的有效期。租用时间是不定的,主要取决于用户在某地连接Internet需要多久,这对于教育行业和其它用户频繁改变的环境是很实用的。通过较短的租期,DHCP能够在一个计算机比可用IP地址多的环境中动态地重新配置网络。DHCP支持为计算机分配静态地址,如需要永久性IP地址的Web服务器。
DHCP 配置的内容不仅是 IP 地址,还包括子网掩码、网关 IP 地址
DHCP 工作过程如下:

  1. 客户端发送 Discover 报文,该报文的目的地址为 255.255.255.255:67,源地址为 0.0.0.0:68,被放入 UDP 中,该报文被广播到同一个子网的所有主机上。如果客户端和 DHCP 服务器不在同一个子网,就需要使用中继代理。
  2. DHCP 服务器收到 Discover 报文之后,发送 Offer 报文给客户端,该报文包含了客户端所需要的信息。因为客户端可能收到多个 DHCP 服务器提供的信息,因此客户端需要进行选择。
  3. 如果客户端选择了某个 DHCP 服务器提供的信息,那么就发送 Request 报文给该 DHCP 服务器。
  4. DHCP 服务器发送 Ack 报文,表示客户端此时可以使用提供给它的信息。

23219e4c-9fc0-4051-b33a-2bd95bf054ab.jpg

十七、TELNET-远程登录协议

TELNET 用于登录到远程主机上,并且远程主机上的输出也会返回。
TELNET 可以适应许多计算机和操作系统的差异,例如不同操作系统系统的换行符定义。

十八、电子邮件协议

一个电子邮件系统由三部分组成:用户代理、邮件服务器以及邮件协议。
邮件协议包含发送协议和读取协议,发送协议常用 SMTP,读取协议常用 POP3 和 IMAP。
7b3efa99-d306-4982-8cfb-e7153c33aab4.png

18.1 SMTP

SMTP 只能发送 ASCII 码,而互联网邮件扩充 MIME 可以发送二进制文件。MIME 并没有改动或者取代 SMTP,而是增加邮件主体的结构,定义了非 ASCII 码的编码规则。
ed5522bb-3a60-481c-8654-43e7195a48fe.png

18.2 POP3

POP3 的特点是只要用户从服务器上读取了邮件,就把该邮件删除。但最新版本的 POP3 可以不删除邮件。

18.3 IMAP

IMAP 协议中客户端和服务器上的邮件保持同步,如果不手动删除邮件,那么服务器上的邮件也不会被删除。IMAP 这种做法可以让用户随时随地去访问服务器上的邮件。

十九、Websocket-兼容HTTP

WebSocket 是一种与 HTTP 不同的协议。两者都位于 OSI 模型的应用层,并且都依赖于传输层的 TCP 协议。 虽然它们不同,但 RFC 6455 规定:WebSocket设计为通过 80 和 443 端口工作,以及支持HTTP代理和中介,从而使其与HTTP协议兼容。为了实现兼容性, WebSocket 握手使用 HTTP Upgrade 头从 HTTP 协议更改为 WebSocket 协议。
与HTTP不同,WebSocket 提供全双工通信。此外,WebSocket 还可以在 TCP 之上启用消息流。 TCP 单独处理字节流,没有固有的消息概念。
WebSocket协议规范将 ws(WebSocket)和 wss (WebSocket Secure)定义为两个新的统一资源标识符(URI)方案,分别对应明文和加密连接。

19.1 优点

  • 较少的控制开销。在连接创建后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小。在不包含扩展的情况下,对于服务器到客户端的内容,此头部大小只有2至10字节(和数据包长度有关);对于客户端到服务器的内容,此头部还需要加上额外的4字节的掩码。相对于HTTP请求每次都要携带完整的头部,此项开销显著减少了。
  • 更强的实时性。由于协议是全双工的,所以服务器可以随时主动给客户端下发数据。相对于HTTP请求需要等待客户端发起请求服务端才能响应,延迟明显更少;
  • 保持连接状态。与 HTTP 不同的是,Websocket需要先创建连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息。而HTTP请求可能需要在每个请求都携带状态信息(如身份认证等)。
  • 更好的二进制支持。 Websocket 定义了二进制帧,相对HTTP,可以更轻松地处理二进制内容。
  • 可以支持扩展。Websocket 定义了扩展,用户可以扩展协议、实现部分自定义的子协议。如部分浏览器支持压缩等。
  • 更好的压缩效果。相对于HTTP压缩,Websocket 在适当的扩展支持下,可以沿用之前内容的上下文,在传递类似的数据时,可以显著地提高压缩率

    19.2 连接过程

    WebSocket 是独立的、创建在 TCP 上的协议。Websocket 通过 HTTP/1.1 协议的101状态码进行握手。为了创建Websocket连接,需要通过浏览器发出请求,之后服务器进行回应,这个过程通常称为 握手(handshaking)
    客户端请求

    1. GET / HTTP/1.1
    2. Upgrade: websocket
    3. Connection: Upgrade
    4. Host: example.com
    5. Origin: http://example.com
    6. Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ==
    7. Sec-WebSocket-Version: 13

    服务器回应

    1. HTTP/1.1 101 Switching Protocols
    2. Upgrade: websocket
    3. Connection: Upgrade
    4. Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s=
    5. Sec-WebSocket-Location: ws://example.com/

    二十、WAF-Web上的防火墙

    WAF是一种Web应用程序防护系统(Web Application Firewall,简称WAF) ,它是一种通过执行一系列针对HTTP / HTTPS的安全策略来专门为Web应用提供保护的一款产品,它是应用层面的防火墙,专门检测HTTP流量,是防护Web应用的安全技术。
    WAF通常位于Web服务器之前,可以阻止如SQL注入、跨站脚本等攻击,目前应用较多的一个开源项目是ModSecurity,它能够完全集成进Apache或Nginx.
    Web应用防火墙可以防止Web应用免受各种常见攻击,比如SQL注入,跨站脚本漏洞(XSS)等。WAF也能够监测并过滤掉某些可能让应用遭受DOS(拒绝服务)攻击的流量。WAF会在HTTP流量抵达应用服务器之前检测可疑访问,同时,它们也能防止从Web应用获取某些未经授权的数据。
    v2-5a61aa78bb055fb4d18f755db6a91115_720w.jpg

    20.1 WAF预防的攻击类型

    开放Web应用安全项目(OWASP)所例举的攻击类型,都在WAF实施时考虑的范围内,其中几种比较常见的攻击类型如下:
    跨站脚本漏洞(XSS)
    攻击者通过往Web页面里插入恶意Script代码,当用户浏览该页面时,嵌入在Web页面里的Script代码会被执行,从而达到恶意攻击用户的目的。
    XSS大概分为两类:

  • 反射型攻击。恶意代码并没有保存在目标网站,通过引诱用户点击一个链接到目标网站的恶意链接来实施攻击。

  • 存储型攻击。恶意代码被保存到目标网站的服务器中,这种攻击具有较强的稳定性和持久性,比较常见的场景是在博客,论坛等社交网站上。

XSS攻击能够:

  • 获取用户Cookie,将用户Cookie发送回黑客服务器。
  • 获取用户的非公开数据,比如邮件、客户资料、联系人等。

SQL注入
通过在目标数据库执行可疑SQL代码,以达到控制Web应用数据库服务器或者获取非法数据的目的。SQL注入攻击可以用来未经授权访问用户的敏感数据,比如客户信息、个人数据、商业机密、知识产权等。
SQL注入攻击是最古老,最流行,最危险的Web应用程序漏洞之一。比如查询?id=1,如果不对输入的id值1做检查,可以被注入?id=1 or 1=1从而得到所有数据。
SQL注入的产生原因通常表现在以下几方面:

  • 不当的类型处理。
  • 不安全的数据库配置。
  • 不合理的查询集处理。
  • 不当的错误处理。
  • 转义字符处理不合适。
  • 多个提交处理不当。

Cookie篡改
Cookie篡改是攻击者通过修改用户Cookie获得用户未授权信息,进而盗用身份的过程。攻击者可能使用此信息打开新账号或者获取用户已存在账号的访问权限。
很多Web应用都会使用Cookie保存用户的Session信息,当用户使用Cookie访问该应用时,Web应用能够识别用户身份,监控用户行为并提供个性化的服务。而如果Cookie的使用缺乏安全机制的话,也很容易被人篡改和盗用,并被攻击者用来获取用户的隐私信息。
未经验证的输入
Web应用往往会依据HTTP的输入来触发相应的执行逻辑。而攻击者则很容易对HTTP的任何部分做篡改,比如URL地址、URL请求参数、HTTP头、Cookies等,以达到攻破Web应用安全策略的目的。
第七层Dos攻击
我们将在下文中详细介绍WAF针对第七层(应用层)的Dos攻击防护。
网页信息检索(Web scraping)
通过一些工具来获取网页内容,并从中提炼出有用的网站数据信息。

二十一、综合:Web 页面请求过程

1. DHCP 配置主机信息

  • 假设主机最开始没有 IP 地址以及其它信息,那么就需要先使用 DHCP 来获取。
  • 主机生成一个 DHCP 请求报文,并将这个报文放入具有目的端口 67 和源端口 68 的 UDP 报文段中。
  • 该报文段则被放入在一个具有广播 IP 目的地址(255.255.255.255) 和源 IP 地址(0.0.0.0)的 IP 数据报中。
  • 该数据报则被放置在 MAC 帧中,该帧具有目的地址 FF:FF:FF:FF:FF:FF,将广播到与交换机连接的所有设备。
  • 连接在交换机的 DHCP 服务器收到广播帧之后,不断地向上分解得到 IP 数据报、UDP 报文段、DHCP 请求报文,之后生成 DHCP ACK 报文,该报文包含以下信息:IP 地址、DNS 服务器的 IP 地址、默认网关路由器的 IP 地址和子网掩码。该报文被放入 UDP 报文段中,UDP 报文段有被放入 IP 数据报中,最后放入 MAC 帧中。
  • 该帧的目的地址是请求主机的 MAC 地址,因为交换机具有自学习能力,之前主机发送了广播帧之后就记录了 MAC 地址到其转发接口的交换表项,因此现在交换机就可以直接知道应该向哪个接口发送该帧。
  • 主机收到该帧后,不断分解得到 DHCP 报文。之后就配置它的 IP 地址、子网掩码和 DNS 服务器的 IP 地址,并在其 IP 转发表中安装默认网关。

2. ARP 解析 MAC 地址

  • 主机通过浏览器生成一个 TCP 套接字,套接字向 HTTP 服务器发送 HTTP 请求。为了生成该套接字,主机需要知道网站的域名对应的 IP 地址。
  • 主机生成一个 DNS 查询报文,该报文具有 53 号端口,因为 DNS 服务器的端口号是 53。
  • 该 DNS 查询报文被放入目的地址为 DNS 服务器 IP 地址的 IP 数据报中。
  • 该 IP 数据报被放入一个以太网帧中,该帧将发送到网关路由器。
  • DHCP 过程只知道网关路由器的 IP 地址,为了获取网关路由器的 MAC 地址,需要使用 ARP 协议。
  • 主机生成一个包含目的地址为网关路由器 IP 地址的 ARP 查询报文,将该 ARP 查询报文放入一个具有广播目的地址(FF:FF:FF:FF:FF:FF)的以太网帧中,并向交换机发送该以太网帧,交换机将该帧转发给所有的连接设备,包括网关路由器。
  • 网关路由器接收到该帧后,不断向上分解得到 ARP 报文,发现其中的 IP 地址与其接口的 IP 地址匹配,因此就发送一个 ARP 回答报文,包含了它的 MAC 地址,发回给主机。

3. DNS 解析域名

  • 知道了网关路由器的 MAC 地址之后,就可以继续 DNS 的解析过程了。
  • 网关路由器接收到包含 DNS 查询报文的以太网帧后,抽取出 IP 数据报,并根据转发表决定该 IP 数据报应该转发的路由器。
  • 因为路由器具有内部网关协议(RIP、OSPF)和外部网关协议(BGP)这两种路由选择协议,因此路由表中已经配置了网关路由器到达 DNS 服务器的路由表项。
  • 到达 DNS 服务器之后,DNS 服务器抽取出 DNS 查询报文,并在 DNS 数据库中查找待解析的域名。
  • 找到 DNS 记录之后,发送 DNS 回答报文,将该回答报文放入 UDP 报文段中,然后放入 IP 数据报中,通过路由器反向转发回网关路由器,并经过以太网交换机到达主机。

4. HTTP 请求页面

  • 有了 HTTP 服务器的 IP 地址之后,主机就能够生成 TCP 套接字,该套接字将用于向 Web 服务器发送 HTTP GET 报文。
  • 在生成 TCP 套接字之前,必须先与 HTTP 服务器进行三次握手来建立连接。生成一个具有目的端口 80 的 TCP SYN 报文段,并向 HTTP 服务器发送该报文段。
  • HTTP 服务器收到该报文段之后,生成 TCP SYN ACK 报文段,发回给主机。
  • 连接建立之后,浏览器生成 HTTP GET 报文,并交付给 HTTP 服务器。
  • HTTP 服务器从 TCP 套接字读取 HTTP GET 报文,生成一个 HTTP 响应报文,将 Web 页面内容放入报文主体中,发回给主机。
  • 浏览器收到 HTTP 响应报文后,抽取出 Web 页面内容,之后进行渲染,显示 Web 页面。

    常用端口

    | 应用 | 应用层协议 | 端口号 | 传输层协议 | 备注 | | —- | —- | —- | —- | —- | | 域名解析 | DNS | 53 | UDP/TCP | 长度超过 512 字节时使用 TCP | | 动态主机配置协议 | DHCP | 67/68 | UDP | | | 简单网络管理协议 | SNMP | 161/162 | UDP | | | 文件传送协议 | FTP | 20/21 | TCP | 控制连接 21,数据连接 20 | | 远程终端协议 | TELNET | 23 | TCP | | | 超文本传送协议 | HTTP | 80 | TCP | | | 简单邮件传送协议 | SMTP | 25 | TCP | | | 邮件读取协议 | POP3 | 110 | TCP | | | 网际报文存取协议 | IMAP | 143 | TCP | |

3.png