大型网络实战之ospf路由协议

版权声明:原创作品,谢绝转载!否则将追究法律责任。

OSPF路由协议

楔子

为了加强自己我打算好好玩玩网络。

OSPF的基本概念和工作过程

开放式最短路径优先协议(OSFP)是基于开放标准的链路状态路由选择协议,它完成各路由选择协议算法的两大主要功能:路径选择和路径交换。Internet工程任务协会(IETF)于1988年开发了OSPF,其最近版本是OSPF版本2,在RFC 2328中进行了描述。

OSPF路由协议概述

OSPF是内部网关路由协议

在共同管理域下的一组运行相同路由选择协议的路由器的集合为一个自治系统(Autonomous System,AS)。在互联网中,一个自制系统是一个有权决定本系统使用哪种路由协议的单位,它可以是一个企业、一座城市或一个电信运营商。随着网络的发展,上述对AS的定义已经不是十分准确了,网络的发展使得网络之间经常出现网络合并情况,导致同一个自治系统中使用的路由协议也越来越多,所以自治系统的定义应该是在共同管理下的互联网络。

内部网关路由协议(IGP):用于在单一自治系统(Autonomous System,AS)内决策路由。内部网关路由协议包括RIP、OSPF等。

与内部网关路由协议相对应的叫做外部网关路由协议(EGP),外部网关路由协议用于在多个自治系统之间执行路由。BGP协议就是外部网关路由协议。

IGP是用来解决AS内部通信的,而EGP是解决AS间通信的。

OSPF是链路状态路由协议

链路状态路由协议通过与邻居路由器建立邻接关系,互相传递链路状态信息,来了解整个网络的拓扑结构。在链路状态信息中,包括有哪些链路,这些链路与哪个路由器相连,连接的路径成本是多少等信息,因此,在链路状态路由协议收敛后,一台路由器可以了解本区域完整的链路信息。

运行链路状态路由协议的路由器就好像各自“绘制”自己所了解的网段信息,然后通过与邻居路由器建立邻接关系,互相“交流”链路信息,学习整个区域内链路信息,来“绘制”出整个区域内的链路图。在一个区域内的所有路由器都保存着完全相同的链路状态数据库。

名词解释:

邻居路由器:位于同一条物理链路或物理网段上的路由器。

链路状态数据库:也称为拓扑数据库,它包含所有路由器、路由器的链路以及这些链路的状态,还包含所有网路以及到这些网络的所有路径。

邻接关系:当两台运行OSPF协议的邻居路由器的链路状态数据库达到一致(同步)时,它们就是完全邻接的。

OSPF的工作过程

运行RIP的路由器只需要保存一张路由器,而使用OSPF路由协议的路由器需要保存三张表。

邻居表:列出每台路由器已经建立邻接关系的全部邻居路由器。

链路状态数据库(LSDB):列出网络中其他路由器的信息,由此显示了全网的网络拓扑。

路由表:列出通过SPF算法计算出的到达每个相连网络的最佳路径。

运行OSPF的路由器试图与邻居路由器建立邻接关系,在邻居之间互相同步链路状态数据库。使用最短路径算法(OSPF依据的算法是Dijkstra算法),从链路状态信息计算得到一个以自己为树根的“最短路径树”。到最后,每一台路由器都将从最短路径树中构建出自己的路由表。OSPF的路由器也仍然是依据路由表进行数据转发的。

名词解释:

SPF(Shortest Path Tree):最短路径优先算法。

Edsger Wybe Dijkstra(艾兹格迪科斯彻):是Dijkstra最短路径算法的创造者。

OSPF的基本概念

OSPF区域

OSPF是一种链路状态型的路由协议,不会产生环路问题,因此不需要使用最大跳数等限制来防止环路的产生。

OSPF将自治系统分割成多个小的区域,OSPF的路由器只在区域内部学习完整的链路状态信息,而不必了解整个自治系统内部所有的链路状态。

区域0为骨干区域,它用来连接自治系统内部的所有其他区域。用来连接骨干区域和其他区域的路由器叫做区域边界路由器,它了解所连接的两个区域的完整的链路状态信息,并将链路状态信息汇总后发给区域内的其他路由器。这样,减小了路由器保存的链路状态数据库的大小,可以解决路由器内存容量有限的问题。

区域是通过一个32位的区域ID(Area ID)来标识的。

区域ID可以表示成一个十进制的数字,也可以表示成一个点分十进制的数字。在Cisco的路由器中这两种表示方式都可以使用。

区域0(或者区域0.0.0.0)是为骨干区域保留的区域ID号。OSPF的骨干区域(Backbone Area)是一个特殊的OSPF区域,它担负着区域间路由信息传播的重任。

名词解释:

区域:区域ID相同的一组逻辑上的OSPF路由器,区域中的所有路由器的链路状态数据库都相同。在OSPF配置中,区域是分别在各个接口上定义的。

Router ID

因为运行OSPF的路由器要了解每条链路是连接在哪个路由器上的,因此,就需要有一个唯一的标识来标记OSPF网络中的路由器,这个标识称为Router ID

Router ID是在OSPF区域内唯一标识路由器的IP地址。Cisco路由器通过下面的方法得到它们的Router ID。

首先,路由器选取它所有Loopback接口上数值最高的IP地址。

如果路由器没有配置Loopback接口的IP地址,那么路由器就在所有活动物理端口中选取一个数值最高的IP地址作为路由器的Router ID。用作Router ID的路由器接口不一定非要运行OSPF协议。

使用Loopback接口作为Router ID的主要好处是Loopback接口比任何其他的物理端口都更稳定。一旦路由器启动成功,这个回环接口就会处于活动状态,只有整个路由器失效时它才会失效。

在OSPF协议中可以通过router-id命令指定路由器的Router ID,所以网络管理员可以配置便于识别和记忆的Router ID值。

在实际工程中配置OSPF时都需要手工指定路由器的Router ID,这已经成为了一种标准配置。

DR和BDR

DR和BDR的概念

运行OSPF的路由器通过与邻居路由器建立邻接关系,互相传递链路状态信息。如果每两个路由器之间都要建立邻接关系,那么,就会构成n(n-1)/2个邻接关系。每台路由器都要与其他所有的邻居路由器互相传递链路状态信息。

那么这种情况就会显得比较混乱,而且也会浪费许多不必要的网络资源。

为了避免这些问题的发生,可以在这个网段上选举一个指定路由器(Designated Router,DR)。由DR同网络中的其他路由器建立邻接关系,并负责将网段上的变化告知它们。

网络上的每一台路由器都和DR构成一个邻接关系,那么只需要建立n-1个邻接关系就可以了。

为了实现冗余,当DR失效时,需要有一个新的指定路由器来接替它,这个路由器就是备份指定路由器(Backup Designated Router,BDR)。网络上所有的路由器将和DR、BDR同时形成邻接关系,DB和BDR之间也将形成邻接关系。如果DR失效了,BDR将成为新的DR。

DR和BDR的选举

可以由OSPF自动选择DR和BDR,也可以手工选择。

自动选择DR和BDR

网段上Router ID最大的路由器将被选举为DR,第二大的将被选举为BDR。这样的选举结果可能不是最佳的,例如:如果网段中有Cisco7200和3800系列路由器,那么3600路由器可能由于Router ID较大而被选举为DR。

手工选举DR和BDR。

要手工选择DR和BDR,需要设置路由器的优先级。每台路由器的接口都有一个路由器优先级(Router Priority),用一个八位的无符号整数来表示,大小范围是0-255,数值越大,优先级越高。Cisco路由器上默认的优先级是1。接口优先级可以通过命令ip ospf priority来更改。如果路由器的优先级被设置为0,它将不参与DR和BDR的选举。

优先级越高,赢得选举的可能性越大。如果优先级相同,则需要比较Router ID。

DB和BDR的选举过程

当一台OSPF路由器启动并发现它的邻居路由器时,它将去检查有效的DB和BDR路由器。

如果DR和BDR路由器存在的话,这台路由器将接受已经存在的DR和BDR路由器。

如果BDR路由器不存在,将执行一个选举过程,选出具有最高优先级的路由器作为BDR路由器。如果存在多个路由器具有相同的优先级,那么Router ID最大的路由器将被选中。

如果没有有效的DR路由存在,那么BDR路由器将被提升为DR路由器,然后再执行一个选举过程选举BDR路由器。

这里需要注意的是,路由器的优先级可以影响一个选举过程,但是它不能强制更换已经存在的DR或BDR路由器。也就是说,在已经选举了DR和BDR路由器后,如果一台具有更高优先级的路由器接入网络,这台新的路由器并不会马上替换DR或BDR路由器中的任何一个。因此,在一个广播多路访问网络上,最先初始化启动的两台具有选举资格的路由器将成为DR和BDR路由器。

OSPF的组播地址

一旦DR和BDR路由器选举成功,其他路由器(成为DRother)将只与DR与BDR路由器形成邻接关系。组播地址224.0.0.5代表所有参与OSPF的路由器(AIISPFRouter),而组播地址224.0.0.6只有DR和BDR路由器去侦听这个地址,但BDR只侦听不响应。在广播多路访问网络上,链路更新信息先发送到244.0.0.6,再由DR路由器使用组播地址244.0.0.5泛洪更新报文到其他所有路由器。

OSPF的度量值

OSPF的用来度量路径优劣的度量值称为Cost(开销),是指从该接口发送出去的数据包的出站接口开销。链路开销使用16位的无符号的整数表示,大小范围是1-65535。

Cisco公司使用的默认代价是108/BW,表示为一个整数,在这里BW是指在接口上配置的带宽,而108是Cisco路由器使用的参考带宽。

路由器接口的开销值可以通过命令ip ospf cost来改变,当在一个有多家厂商产品的网络环境中配置Cisco的路由器时,这个命令变得十分重要。例如:有些厂商的路由器在其所有的接口上使用的默认开销值是1。如果网络中所有的路由器没有使用同一种计算开销的方式来指定OSPF的开销,那么OSPF协议将不能正确的进行路由选择。

使用108作为接口的参考带宽在现代一些带宽高于100Mb/s的网络介质中会产生一个问题。108/110Mb/s=1,这就意味着更高带宽的传输介质在OSPF协议中将会计算出一个小于1的数,这在OSPF协议中是不允许的。因此,从IOS 11.2版开始,Cisco可以在OSPF进程模式下使用命令auto-costreference-bandwidth修正这个问题,这个命令允许管理者更改默认的参考带宽。

如表所示,显示了一些典型接口的默认开销

接口类型开销(108/BW)

Fast Ethernet1

Ethernet10

56K1785

OSPF邻接关系的建立

OSPF的数据包类型

OSPF信息不使用TCP或UDP,它承载在IP数据包内,使用协议号89(十进制)。

OSPF路由协议依靠五种不同类型的包来标识它们的邻居以及更新链路状态信息。这五种类型的包使得OSPF具备了高级和复杂的通信能力,如下表所示列出了OSPF常用的包类型。

OSPF的包类型描述

Hello包用于发现和维持邻居关系,选举DR和BDR

数据库描述包(DBD)用于向邻居发送摘要信息以同步链路状态数据库

链路状态请求包(LSR)在路由器收到包含新信息的DBD后发送,用于请求更详细的信息

链路状态更新包(LSU)收到LSR后发送链路状态通告(LSA),一个LSU数据包可能包含几个LSA

链路状态确认包(LSAck)确认已经收到LSU,每个LSA需要被分别确认

OSPF邻接关系的建立

当两台或多台路由器同时启动运行OSPF路由协议时将开始建立邻接关系的过程,此过程将经历七种状态:

OSPF启动的第一个阶段是使用Hello报文建立双向通信的过程,如图所示:

失效(Down)状态

这是OSPF建立交互关系的初始化状态,路由器没有与任何邻居交换信息。

初始(Init)状态

路由器的各个接口通过224.0.0.5发送Hello报文,这里以R1发送Hello报文为例。当邻居路由器R2收到第一个Hello报文,这时就进入Init状态。在该状态时,路由器R2已经接收到Hello报文,但自身的ID并没有出现在该Hello报文内。

双向(2-Way)状态

路由器R2向路由器R1发送一个Hello回应报文,该Hello回应报文含有路由器R1的ID。当路由器R1收到该Hello回应报文,发现含有自身的ID,这是就进入2-Way状态,双向通信已经建立。DR和BDR的选举正是在这个状态完成的。

OSPF启动的第二个阶段是建立完全邻接关系,如图所示:

准启动(ExStart)状态

在选举出DR和BDR之后,路由器就被认为是处于ExStart状态。在该状态中,DR和BDR与网路中其他各路由器建立邻接关系。在这个过程中,两个邻接路由器之间建立起一个主/从(Master/Slave)关系,路由器ID大的作为主路由器,用来发起通信。

交换(Exchange)状态

主/从路由器之间交换一个或多个数据库描述包(DBD),路由器进入Exchange状态。DBD包含的是链路状态数据库中的LSA条目的摘要信息,主/从路由器之间交换DBD时要确保双方都接收到。

加载(Loading)状态

如果收到的DBD有更新的LSA条目的摘要信息,路由器将向对方发送链路状态请求包(LSR)请求更详细的信息,对方路由器用链路状态更新(LSU)回应该LSR,此过程称为Loading状态。链路状态更新包(LSU)需要对方确认收到。

完全邻接(Full)状态

当路由器之间完成了数据库同步,它们的链路状态数据库已经完全一致,此时就达到了Full状态。

到此,路由器中的链路状态数据库已经完全一致了,路由器可以根据这个一致的链路状态数据库通过最短路径优先算法(SPF)来计算到目的网络的最佳路径并形成路由表。

OSPF的网络类型

根据路由器所连接的物理网络不同,OSPF将网络划分为以下四种类型:

点到点网络(Point-to-Point)

点到点网络连接单独的一对路由器。在点到点网络上的有效邻居总是可以形成邻接关系,不需要DR和BDR。在这些网络上的OSPF报文的目的地址也总是224.0.0.5。(s接口

点到点网络一般采用PPP协议、HDLC协议等。

广播多路访问网络(BMA)

广播多路访问网络,像以太网和光纤分布式数字网(FDDI)等,它们可以连接多于两台的设备。而且由于它们是广播型的,因而连接在这种网络上的所有设备都可以接收到传送的报文。在广播型网络上的OSPF路由器会选择DR和BDR。OSPF报文采用组播方式发送。(单播)

非广播多路访问网络(NBMA)

NBMA网络,像X.25和帧中继等,可以连接两台以上的路由器,但是它们没有广播数据包的能力。在NBMA网络上的OSPF路由器需要手工配置邻居,选举DR和BDR,并且所有的OSPF报文都是单播的。(组播)

点到多点网络(Point-to-MultiPoint)

点到多点网络是NBMA网络的一个特殊配置,可以被看作是一群点到点链路的集合。在这些网络上的OSPF路由器不需要选举DR和BDR,OSPF报文时组播的。

名词解释

HDLC(High Level Data Link Control,高级数据链路控制):是常用的数据链路层协议之一。许多常用的数据链路层协议的封装方式都是基于HDLC的封装格式。HDLC是ISO组织制定的一个标准化规程,它适用于点到点和点到多点的数据链路。由于各个厂家对DHLC标准的实现不尽相同,所以一般不同厂家设备之间互连不能采用HDLC协议进行封装。Cisco路由器串口使用的默认协议时HDLC。

PPP(Point to Point Protocol,点对点协议):是应用最广泛的广域网连接时使用的数据链路层协议。它支持多种网络层协议,并且支持用户认证。

OSPF的应用环境

使用OSPF的原因

OSPF与RIP相比虽然有点很明显,但是一般情况下,并不是所有的网络都需要都需要使用OSPF,一些简单的,路由器配置较低的环境,仍然需要使用静态路由。当考虑以下几个方面的因素时,一般需要使用OSPF来搭建:

1)网络的规模

当网络中的路由器在十台以上或大中型规模的网络。

2)网络的拓扑结构

网络的拓扑结构为网状,并且任意两台路由器之间都有互通的需求。

3)其他特殊的需求

要求路由器变化时能够快速收敛,路由协议自身的网络开销尽量降低。

4)路由器自身的要求

运行OSPF协议时对路由器CPU的处理能力及内存的大小都有一定的要求,性能很低的路由器不推荐使用OSPF协议。

OSPF的特点

OSPF主要具有以下几个特点:

可适应大规模网络

路由变化收敛速度快

无路由环路

支持可变长子网掩码VLSM

支持区域划分

支持以组播地址发送协议报文

OSPF与RIP的比较

从网络结构看

RIP的拓扑简单,适用于中小型网络,没有区域、边界等概念。最大跳数为15跳,路由是依靠下一跳的个数来描述,无法体现带宽与网络延迟。

OSPF适用于较大规模的网络。它把自治系统(AS)分成若干个区域,通过对系统内部路由的不同处理,对区域内和区域间路由的不同处理,减少网络数据量的传输。OSPF对应RIP的“跳数”,引入了“开销(Cost)”的概念。OSPF还把其他路由协议或者静态路由作为AS的外部路由引入,处理能力相当强。

RIP的原始版本不支持变长子网掩码VLSM(RIP v2支持),OSPF支持可变长子网掩码(VLSM)。

协议运行有差别

运行RIP时,首先向邻居发送请求报文,其他运行RIP的路由器收到请求报文后,马上把自己的路由表发送过去;在没收到请求报文时,定期(30s)广播自己的路由表。

运行OSPF时,用Hello报文同邻居建立连接,然后迅速建立邻接关系,只在建立了邻接关系的路由器中发送路由信息;以后靠定期发送Hello报文来维持连接,相对RIP的路由表报文来说这个Hello报文要小得多,网络拥塞也就少了。Hello报文在广播网上一般每10s发送一次,若在一定时间内(4倍于Hello间隔)没有收到Hello报文,便认为对方已经死掉,从路由表中去掉,但在链路状态数据库中并没有真正的去掉,以备它在启用时减少数据传输量。但在它达到3600s(60分钟)时便真正去掉它。OSPF的LSA也会重发,重发间隔为1800s(30分钟)。

使用情况不同

般来说,OSPF占用的实际链路带宽比RIP少,因为它的路由表是有选择的广播(只在建立邻接的路由器间),而RIP是邻居之间的广播。OSPF使用CPU的时间比RIP少,因为OSPF达到平衡后的主要工作是发送Hello报文,而RIP发送的是路由表(Hello报文比路由表小得多)。OSPF使用的内存比RIP大,因为OSPF有一个相对大的路由表。OSPF使用了邻接关系,其收敛速度快。

归纳两者的比较情况,如下表所示:

OSPFRIP v1RIP v2

链路状态路由协议距离矢量路由协议

没有跳数的限制RIP的15跳限制,超过15跳的路由被认为不可达

支持可变长子网掩码(VLSM)不支持可变长子网支持可变长子网掩掩码(VLSM)码(VLSM)

收敛速度快收敛速度慢使用组播发送链路状态更新,周期性广播整个路由表,在低速链路及广

在链路状态变化时使用触发更新,域网中应用将产生很大问题提供了带宽的利用率

OSPF的基本配置命令

启动OSPF路由进程

与配置RIP不同的是,在配置OSPF的时候需要配置进程号,进程号是本地路由器的进程号,用于标识一台路由器上的多个OSPF进程,其值可以在1-65535之间选取。配置命令如下:

Router(config)# router ospfprocess-id

指定OSPF协议运行的接口和所在的区域,命令如下:

Router(config-router)# networkaddressinverse-maskareaarea-id

其中,各参数分别表示如下含义:

address:网络号,可以是网段地址、子网地址或者一个路由器接口的地址。用于指出路由器所要通告的链路。

inverse-mask:反向掩码,用于精确匹配所通告的网络ID。

area-id:区域号,指明同网络号相关的区域,可以是0、1、2这样的数字,也可以是192.168.1.0这样的标识方法。

修改接口的优先级

Router(config-if)# ip ospf prioritypriority

其中,priority默认为1,范围是0-255。设置为0时,表示不参与DR和

BDR的选举。

修改接口的Cost值,Cost值使用16位的无符号整数表示,大小范围为1-65535。

Router(config-if)# ip ospf costcost

例如:

Router(config)# int f0/0

Router(config-if)# ip ospf cost 100

用于诊断的查看命令

查看路由表

Router# show ip route

查看邻居列表及其状态

Router# show ip ospf neighbor

查看OSPF的配置

Router# show ip ospf

查看OSPF接口的数据结构

Router# show ip ospf interface type number

OSPF单域配置实例

实验环境

如上图所示为公司的路由器连接示意图,通过配置路由器实现公司内部全网互通,具体规划如下:

R1和R2的互联地址为:10.1.1.0/30,R2和R3的互联地址为:20.2.2.0/30,R3和R4的互联地址为:30.3.3.0/30,R4和R1的互联地址为:40.4.4.0/30。

使用路由器的Loopback接口地址作为Route ID,R1的Loopback0:1.1.1.1/32,R2的Loopback0:2.2.2.2/32,R3的Loopback0:3.3.3.3/32,R4的Loopback0:4.4.4.4/32

PC1用户的IP地址段为192.168.1.0/24,PC2用户的IP地址段为192.168.2.0/24,PC3用户的IP地址段为192.168.3.0/24,PC4用户的IP地址段为192.168.4.0/24。

具体步骤:

配置路由器的接口地址。

配置Router ID。

配置OSPF协议,实现网络互通。

使用show ip route命令查看路由表。

使用ping命令验证网络和OSPF协议通信正常。

总结勤动脑多喝六个核桃

本文出自 “李世龙” 博客,谢绝转载!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容