WebRTC通話質(zhì)量調(diào)優(yōu):三個(gè)弱網(wǎng)模擬測試工具的使用與對比

作為一個(gè)使用 WebRTC 獨(dú)立開發(fā)者或團(tuán)隊(duì)鞋屈,怎樣才能知道自己 App 的通話質(zhì)量已經(jīng)“達(dá)標(biāo)”了呢?如何進(jìn)行合理的弱網(wǎng)模擬測試故觅?介紹給開發(fā)者們?nèi)齻€(gè)開源工具的部署厂庇、使用方法,及其各自優(yōu)缺點(diǎn)输吏。

如果你是長期關(guān)注 WebRTC 的資深開發(fā)者或技術(shù)愛好者权旷,你可能留意到了,Jitsi 曾在其官方博客[1]上發(fā)布了一個(gè) WebRTC 與 Zoom Web 客戶端的視頻通話對比測試贯溅。測試結(jié)果顯示拄氯,WebRTC 的視頻通話質(zhì)量比 Zoom 還要好。一石激起千層浪它浅,不少博主發(fā)表了自己的看法译柏。

看似是在挑事,但 Jitsi 出此一舉完全事出有因姐霍。

Jitsi 是一個(gè)開源項(xiàng)目鄙麦,可幫開發(fā)者在 Web 典唇、Windows、Linux胯府、Mac OS X介衔、Android 平臺上實(shí)現(xiàn)實(shí)時(shí)的語音、視頻通話應(yīng)用骂因。有很多獨(dú)立開發(fā)者在基于這套代碼開發(fā)自己的視頻通話應(yīng)用炎咖。這一切,都是建立于 WebRTC 的基礎(chǔ)之上實(shí)現(xiàn)的寒波。然而塘装, Jitsi 卻看到作為視頻會議服務(wù)提供商的 Zoom 不但從 2015 年開始就在一些地方一再聲稱自己并沒有使用 WebRTC,甚至不斷表示“WebRTC 是一種能力非常有限的解決方案”:

圖:源自 Jitsi 官方博客

Jitsi 如何測試 WebRTC 弱網(wǎng)傳輸呢影所?

他們在同一個(gè) Wi-Fi 環(huán)境下,用同樣的一臺 Mac 僚碎,做了兩次測試猴娩,分別用 WebRTC 和 Zoom 進(jìn)行一對一視頻通話。在兩組通話的最初 10 秒勺阐,只是進(jìn)行正常通話卷中,在 10 秒之后,開始增加網(wǎng)損渊抽,同時(shí)限制上行與下行帶寬至 500kbps蟆豫。這時(shí)測量兩個(gè)方案各自需要多長時(shí)間來調(diào)整,使正在進(jìn)行的視頻通話穩(wěn)定適應(yīng)目前網(wǎng)絡(luò)帶寬的變化懒闷。如下圖所示十减,博主 Tsahi Levent-Levi 在其博文[2]中,用一張比較形象圖描繪了測試過程中的碼率變化愤估。

圖片源自 Tsahi Levent-Levi 的博客

結(jié)果是在帶寬受到人為限制后帮辟,WebRTC 的視頻通話用了 20 秒完全調(diào)整到了合適的碼率,而 Zoom 則用了 156 秒玩焰。

相對于與這個(gè)對比結(jié)果由驹,我們更關(guān)心的是,這個(gè)方法對 WebRTC 開發(fā)者有多大參考意義呢昔园?WebRTC 開發(fā)者參照這個(gè)方法蔓榄,是否能準(zhǔn)確地測試出自己與他人應(yīng)用之間的差距呢?

答案是“否”默刚,這個(gè)方法并不嚴(yán)謹(jǐn)甥郑。

以聲網(wǎng)的經(jīng)驗(yàn)來講,上下行同時(shí)限制相同帶寬門限的測試羡棵,并非常用的質(zhì)量測試方式壹若。通常會單向限制上行,或者限制下行。但是從測試本身來說店展,是公平的养篓。相信 Jitsi 并不會專門針對這個(gè)場景進(jìn)行調(diào)試后給出這樣的對比結(jié)果,應(yīng)該是 Zoom 在這個(gè)場景下有弱點(diǎn)被抓住了赂蕴。

從通信架構(gòu)角度來看柳弄,Zoom 采用的是 MCU/SFU 的服務(wù)器接入通信方式,使用分段式的帶寬自適應(yīng)策略概说。而 Jitsi 的 1 對 1 通信碧注,相信是沿用了 WebRTC 的端到端反饋。所以糖赔,兩者是不同的萍丐。全鏈路反饋在這個(gè)場景中有一定優(yōu)勢,鏈路上的瓶頸可以快速反應(yīng)到發(fā)送端放典,從而快速自適應(yīng)逝变。而分段式策略,就要分別估算上行和下行帶寬奋构,依賴于服務(wù)器的投遞決策機(jī)制壳影,策略配置是一個(gè) QoE 的難點(diǎn)。

Tsahi Levent-Levi 也在博客中表示弥臼,通過人為工具干預(yù)網(wǎng)絡(luò)傳輸?shù)姆绞讲⒉粔蛲耆珡?fù)現(xiàn)真實(shí)的用戶場景宴咧。但我們可以通過工具來盡可能的接近用戶的真實(shí)場景。

真實(shí)用戶場景與弱網(wǎng)環(huán)境

什么是真實(shí)的用戶場景呢径缅?一個(gè)人晚上在家通過 Wi-Fi 上網(wǎng)掺栅,在線電影播放基本流暢,可一旦在晚間用網(wǎng)高峰期打視頻電話就畫面糊芥驳,這時(shí)不僅可能帶寬受限了柿冲,還可能有較高的丟包率。

與有線網(wǎng)絡(luò)通信相比兆旬,無線網(wǎng)絡(luò)通信受環(huán)境影響會更大假抄,比如高層建筑、用戶的移動丽猬、環(huán)境噪音宿饱、封閉的環(huán)境等,網(wǎng)絡(luò)服務(wù)質(zhì)量相對不穩(wěn)定脚祟,導(dǎo)致用戶經(jīng)常在弱網(wǎng)環(huán)境下通信谬以。例如,在車庫的視頻通話通常都不如在室外的質(zhì)量由桌。

除了受環(huán)境影響外为黎,網(wǎng)絡(luò)覆蓋邮丰、過載控制、鄰區(qū)漏配等铭乾,也會造成呼叫失敗剪廉、服務(wù)質(zhì)量下降。這些真實(shí)的用戶場景炕檩。

Jitsi 所做的就是模擬弱網(wǎng)環(huán)境的測試斗蒋。一般這種測試是靠修改帶寬、丟包笛质、抖動參數(shù)來進(jìn)行模擬泉沾。從數(shù)據(jù)角度講,不同的應(yīng)用對弱網(wǎng)的定義是不同的妇押,要對各網(wǎng)絡(luò)類型最低速率跷究、業(yè)務(wù)場景做綜合考慮今野。以移動場景為例机蔗,一般 2G,速率較低的 3G欣除,弱信號的 Wi-Fi 都算是弱網(wǎng)色冀,需要被納入到弱網(wǎng)測試場景中。

弱網(wǎng)模擬測試的正確姿勢

其實(shí)柱嫌,這次事件也揭示了一個(gè)很普遍存在問題锋恬,很多剛接觸 WebRTC 的獨(dú)立開發(fā)者,可能并不了解如何模擬弱網(wǎng)場景编丘。我們來分享一些聲網(wǎng)Agora音視頻實(shí)驗(yàn)室的經(jīng)驗(yàn)与学,推薦 3 個(gè) WebRTC 開發(fā)者們都可以使用的弱網(wǎng)環(huán)境模擬測試工具。

下面詳細(xì)說一下每個(gè)工具的搭建嘉抓、使用方法索守,以及三者之間優(yōu)缺點(diǎn)對比:

Linux Traffic Control(TC)

Linux 內(nèi)核內(nèi)置了一個(gè) Traffic Control 框架,能夠?qū)崿F(xiàn)流量限速抑片、流量整形卵佛、策略應(yīng)用,可以注入延時(shí)故障敞斋、丟包故障截汪、包重復(fù)故障、亂序故障植捎,以及模擬網(wǎng)絡(luò)閃斷等情況衙解。TC 對硬件、系統(tǒng)還有一些要求:

硬件要求

  • PC - 建議配置不低于 CPU i3焰枢,4G 內(nèi)存蚓峦,64G 硬盤

  • 雙網(wǎng)卡 - 除原有板載網(wǎng)卡外, 額外需要一塊 pci-e 網(wǎng)卡(例如 intel 82574L)

  • 路由器 - 支持橋接模式

  • 網(wǎng)線 - 若干

系統(tǒng)要求

  • 需要 Fedora舌剂、OpenSuse、Gentoo暑椰、Debian霍转、Mandriva 或 Ubuntu,如果Linux內(nèi)核版本大于 2.6干茉,則已內(nèi)置 TC谴忧。

系統(tǒng)模塊

  • Ubuntu/Debian 系統(tǒng)下需要 iproute2

  • Fedora/RHEL 系統(tǒng)下需要 iproute-tc

  • iptables

  • Linux kernel module : sch_netem

同時(shí),軟件方面還需要安裝 dhcp server角虫。具體安裝方法沾谓,請參考 Ubuntu 官方文檔[3]。

開始部署

NIC-0 通過網(wǎng)線連接外網(wǎng), 假設(shè)對應(yīng) Net device eth0

NIC-1 通過網(wǎng)線連接路由器 WAN 口, 假設(shè)對應(yīng) Net device eth1

路由器: 打開橋接模式, 關(guān)閉 DHCP 服務(wù)

PC 端輸入命令行:

vi /etc/default/isc-dhcp-server

添加:

INTERFACESv4="eth1"

重啟服務(wù):

sudo /etc/init.d/isc-dhcp-server restart

重啟后運(yùn)行以下命令:

echo "1" > /proc/sys/net/ipv4/ip_forward

iptables -F

iptables -P INPUT ACCEPT

iptables -P FORWARD ACCEPT

iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE

modprobe ifb

ip link set ifb0 up

至此戳鹅,你已經(jīng)完成了部署均驶。

TC 的使用方法

做弱網(wǎng)測試基本是按照以下四個(gè)步驟:

設(shè)備連接 Wi-Fi 熱點(diǎn)成功獲取 IP 地址,假設(shè)為:192.168.3.101枫虏。

打開 Linux terminal妇穴,輸入 TC 命令為發(fā)送端 IP 為 192.168.3.101 的設(shè)備添加網(wǎng)損。

此時(shí)手機(jī)即在弱網(wǎng)環(huán)境下運(yùn)行隶债。

測試完成后腾它,輸入 TC 命令取消弱網(wǎng)。

例如死讹,你要是想限制 IP 地址為 192.168.3.101 的設(shè)備上行丟包 5%瞒滴,那么需要運(yùn)行如下命令:

sudo tc qdisc add dev ifb0 root handle 1: prio bands 3

sudo tc qdisc add dev eth1 ingress

sudo tc filter add dev eth1 parent ffff: protocol ip u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev ifb0

sudo tc qdisc add dev ifb0 parent 1:3 handle 30: netem loss 5 limit 1000

sudo tc filter add dev ifb0 protocol ip parent 1:0 prio 3 u32 match ip src 192.168.3.101 flowid 1:3

如果想要限制 IP 地址為 192.168.3.101 的設(shè)備下行丟包 20%,需要運(yùn)行如下命令:

sudo tc qdisc add dev eth1 root handle 1: prio bands 3

sudo tc qdisc add dev eth1 parent 1:3 handle 30: netem loss 20 limit 1000

sudo tc filter add dev eth1 protocol ip parent 1:0 prio 3 u32 match ip dst 192.168.3.101 flowid 1:3

可以說 TC 框架可以實(shí)現(xiàn)很多場景赞警,但前提是需要開發(fā)者們學(xué)會使用 TC 命令行妓忍。如果你想了解更多的 TC 命令,可以學(xué)習(xí)一下官方文檔[4]愧旦。

Augmented Traffic Control(ATC)

ATC 其實(shí)是 Facebook 在 2015 年開源的一套網(wǎng)絡(luò)測試工具世剖。ATC 是基于 TC 的封裝。

在部署好 ATC 弱網(wǎng)控制機(jī)后笤虫,在手機(jī)上通過 Web 界面就可以隨時(shí)切換不同的網(wǎng)絡(luò)環(huán)境旁瘫。多個(gè)手機(jī)可以連接到同一個(gè) Wi-Fi ,復(fù)用同一臺弱網(wǎng)控制機(jī)琼蚯,且多設(shè)備之間模擬的網(wǎng)絡(luò)環(huán)境互不影響境蜕。也就是說,部署好這個(gè)測試工具后凌停,團(tuán)隊(duì)里的任何人都可以通過 Web 自行測試粱年,且互不干擾。

ATC 的部署方法相對復(fù)雜罚拟,但只要根據(jù)官方文檔[5]台诗,就可以順利完成搭建完箩。按照官方文檔完成搭建之后,大家還需要通過以下幾行命令配置 HOST 地址拉队,然后就可以啟動運(yùn)行了弊知。

打開 Setting:

vi atcui/atcui/settings

添加 HOST 地址 :

ALLOWED_HOSTS = ['*']

啟動命令:

atcd --atcd-wan eth0 --atcd-lan eth1

使用方法

設(shè)備接入對應(yīng) Wi-Fi

打開 http://192.168.3.1:8000 (假設(shè) eth1 IP地址為:192.168.3.1)

輸入對應(yīng)弱網(wǎng)參數(shù)后,點(diǎn)擊按鈕 [Update Shaping] 生效粱快,該弱網(wǎng)僅對本機(jī)生效

測試完成后秩彤,點(diǎn)擊按鈕 [Turn Off] 清除弱網(wǎng)設(shè)置。

Network Link Conditioner(NLC)

可能有些 iOS 開發(fā)者已經(jīng)認(rèn)出來了事哭。NLC 是蘋果官方提供的網(wǎng)絡(luò)模擬工具漫雷,支持安裝在 macOS 和 iOS 上。

macOS 端安裝

打開 Xcode鳍咱,選擇 Xcode -> Open Developer Tool -> More Develop Tools降盹。

用蘋果賬號登錄網(wǎng)站,搜索 Additional Tools for Xcode谤辜,下載 Xcode 對應(yīng)版本的 Additional Tools蓄坏。

打開下載的文件,在 Hardware 文件夾中雙擊 Network Link Conditioner 安裝丑念。 安裝完成后涡戳,工具會在系統(tǒng)設(shè)置中的最后一排出現(xiàn)。

iOS 端安裝

通過打開“開發(fā)者選項(xiàng)”就可以使用 Network Link Conditioner 功能脯倚。

數(shù)據(jù)線連接手機(jī)到 Mac 上妹蔽,Xcode -> Windows -> Devices -> 選中當(dāng)前手機(jī)設(shè)備,右鍵彈出

菜單 -> 選擇Show Provisioning Profiles... 會彈出一個(gè)證書列表窗口

如果手機(jī)已經(jīng)安裝了必要的開發(fā)者證書挠将,直接點(diǎn)擊窗口中的 done 按鈕即可。否則需要點(diǎn)擊左下角的 + 號编整,把從網(wǎng)上下載下來的證書導(dǎo)入進(jìn)去舔稀, 點(diǎn)擊 done 按鈕關(guān)閉窗口。

此時(shí)手機(jī)設(shè)置中就多了一個(gè)開發(fā)者選項(xiàng)掌测,進(jìn)入開發(fā)者選項(xiàng)可以看到 Network Link Conditioner 選項(xiàng)内贮。

使用方法

NLC 的使用方法就簡單多了,不需要用命令行汞斧。如果 NLC 中的配置不滿足需求的話夜郁,可以手動添加更多的配置。在 Mac 端和 iOS 上粘勒,按照以下操作即可竞端。

Mac 端

iOS 端

需要注意的是 interface 設(shè)置,當(dāng) iOS 通過共享 Wi-Fi 熱點(diǎn)的方式作為接入設(shè)備的弱網(wǎng)控制機(jī)時(shí)庙睡,需要將 interface 設(shè)置為 Cellular事富。

對比與小結(jié)

相對來講技俐,TC 的參數(shù)最為豐富,可以控制更多細(xì)節(jié)统台,能模擬出多種不同的網(wǎng)絡(luò)情況雕擂,但操作太復(fù)雜,需要開發(fā)者熟悉 TC 命令及網(wǎng)絡(luò)模型贱勃。NLC 最簡單易操作井赌,參數(shù)配置可以滿足普通開發(fā)需求。

WebRTC 1.0 的重點(diǎn)是提供給開發(fā)者更多對媒體贵扰、數(shù)據(jù)通道的控制仇穗。而根據(jù)此前的提案[6]顯示,下一版本的 WebRTC 將有可能使數(shù)據(jù)處理脫離主線程拔鹰。使用 RTCDataChannels 傳輸數(shù)據(jù)仪缸,相比使用 WebSocket 會有更好的擁塞控制。

根據(jù) WebRTCHacks 博主 Philipp Hancke 的分析[7]列肢,Zoom 的 Web Client 并沒有使用 WebRTC恰画,客戶端用 WebSocket 進(jìn)行媒體傳輸,該方法類似于 WebRTC 中的 Turn/TCP瓷马。盡管有利于穿越防火墻拴还,但在進(jìn)行實(shí)時(shí)通信時(shí),如果出現(xiàn)丟包欧聘,就會進(jìn)行重傳片林,最終導(dǎo)致積累延時(shí)。僅從這個(gè)角度看怀骤,下一個(gè)版本的 WebRTC 的方案更優(yōu)于 Zoom费封。

我們在上文中也曾提到,WebRTC 服務(wù)器的策略配置開發(fā)是 QoE 的難點(diǎn)蒋伦。所以弓摘,多人通信的質(zhì)量不佳,是原生 WebRTC 應(yīng)用最常被人詬病的問題痕届。其實(shí)韧献,聲網(wǎng)的 Agora Web SDK 也是基于 WebRTC 開發(fā)而來的,并且基于原生 WebRTC 進(jìn)行了多方面的優(yōu)化研叫。聲網(wǎng) Agora Web SDK 始終聚焦于通信質(zhì)量的提升锤窑,優(yōu)化至現(xiàn)在的版本,已經(jīng)可支持17人的視頻通話嚷炉。我們針對 WebRTC 網(wǎng)關(guān)進(jìn)行了多層面的優(yōu)化渊啰,比如傳輸質(zhì)量保障,對原生 WebRTC QoS 調(diào)優(yōu)申屹,針對場景差異做了不同的優(yōu)化策略虽抄。

我們提供的是全球化的服務(wù)走搁,覆蓋了包括視頻會議、在線醫(yī)療迈窟、在線教育私植、社交直播、社交游戲音視頻车酣、金融曲稼、IoT 等多種實(shí)時(shí)音頻、視頻通信場景湖员。目前贫悄,Agora Web SDK 已經(jīng)是全球商用服務(wù)中規(guī)模最大的基于 WebRTC 的實(shí)時(shí)通信 SDK。很多情況下 WebRTC 不會被考慮作為大頻道解決方案娘摔。而 Agora Web SDK 現(xiàn)在已經(jīng)支持百萬級別并發(fā)的大頻道通話窄坦。

參考資源

[1] WebRTC vs. Zoom – A Simple Congestion Test https://jitsi.org/news/a-simple-congestion-test-for-zoom/

[2] WebRTC vs Zoom. Who has Better Video Quality? https://bloggeek.me/webrtc-vs-zoom-video-quality/

[3] Ubuntu 官方文檔:DHCP server https://help.ubuntu.com/community/isc-dhcp-server

[4] TC 命令的使用 http://tldp.org/HOWTO/Traffic-Control-HOWTO/index.html

[5] Augmented Traffic Control: A tool to simulate network conditions https://code.fb.com/production-engineering/augmented-traffic-control-a-tool-to-simulate-network-conditions/

[6] WebRTC NV proposal https://www.w3.org/2011/04/webrtc/wiki/images/5/5c/WebRTCWG-2018-06-19.pdf

[7] How Zoom’s web client avoids using WebRTC https://webrtchacks.com/zoom-avoids-using-webrtc/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市凳寺,隨后出現(xiàn)的幾起案子鸭津,更是在濱河造成了極大的恐慌,老刑警劉巖肠缨,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逆趋,死亡現(xiàn)場離奇詭異,居然都是意外死亡晒奕,警方通過查閱死者的電腦和手機(jī)闻书,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脑慧,“玉大人魄眉,你說我怎么就攤上這事∶铺唬” “怎么了坑律?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長霜运。 經(jīng)常有香客問我,道長蒋腮,這世上最難降的妖魔是什么淘捡? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮池摧,結(jié)果婚禮上焦除,老公的妹妹穿的比我還像新娘。我一直安慰自己作彤,他們只是感情好膘魄,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布乌逐。 她就那樣靜靜地躺著,像睡著了一般创葡。 火紅的嫁衣襯著肌膚如雪浙踢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天灿渴,我揣著相機(jī)與錄音洛波,去河邊找鬼。 笑死骚露,一個(gè)胖子當(dāng)著我的面吹牛蹬挤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播棘幸,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼焰扳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了误续?” 一聲冷哼從身側(cè)響起吨悍,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎女嘲,沒想到半個(gè)月后畜份,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡欣尼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年爆雹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片愕鼓。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钙态,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出菇晃,到底是詐尸還是另有隱情册倒,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布磺送,位于F島的核電站驻子,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏估灿。R本人自食惡果不足惜崇呵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望馅袁。 院中可真熱鬧域慷,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至叠骑,卻和暖如春李皇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背座云。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工疙赠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人朦拖。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓圃阳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親璧帝。 傳聞我的和親對象是個(gè)殘疾皇子捍岳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345