網(wǎng)絡(luò)編程(TCP協(xié)議)

TCP 協(xié)議簡介

一顷蟆、TCP 協(xié)議的作用


TCP/IP協(xié)議族按照層次由上到下修壕,層層包裝

IP 協(xié)議只是一個地址協(xié)議,并不保證數(shù)據(jù)包的完整损同。如果路由器丟包(比如緩存滿了翩腐,新進(jìn)來的數(shù)據(jù)包就會丟失),就需要發(fā)現(xiàn)丟了哪一個包膏燃,以及如何重新發(fā)送這個包茂卦。這就要依靠 TCP 協(xié)議

簡單說,TCP 協(xié)議的作用是组哩,保證數(shù)據(jù)通信的完整性和可靠性等龙,防止丟包。

二伶贰、TCP 數(shù)據(jù)包的大小


TCP包結(jié)構(gòu)

以太網(wǎng)數(shù)據(jù)包(packet)的大小是固定的负芋,最初是1518字節(jié),后來增加到1522字節(jié)媒役。其中咸作, 1500 字節(jié)是負(fù)載(payload),22字節(jié)是頭信息(head)们豌。

IP 數(shù)據(jù)包在以太網(wǎng)數(shù)據(jù)包的負(fù)載里面涯捻,它也有自己的頭信息,最少需要20字節(jié)望迎,所以 IP 數(shù)據(jù)包的負(fù)載最多為1480字節(jié)障癌。


圖片說明:IP 數(shù)據(jù)包在以太網(wǎng)數(shù)據(jù)包里面,TCP 數(shù)據(jù)包在 IP 數(shù)據(jù)包里面辩尊。

TCP 數(shù)據(jù)包在 IP 數(shù)據(jù)包的負(fù)載里面涛浙。它的頭信息最少也需要20字節(jié),因此 TCP 數(shù)據(jù)包的最大負(fù)載是 1480 - 20 = 1460 字節(jié)。由于 IP 和 TCP 協(xié)議往往有額外的頭信息轿亮,所以 TCP 負(fù)載實(shí)際為1400字節(jié)左右疮薇。

因此,一條1500字節(jié)的信息需要兩個 TCP 數(shù)據(jù)包我注。HTTP/2 協(xié)議的一大改進(jìn)按咒, 就是壓縮 HTTP 協(xié)議的頭信息,使得一個 HTTP 請求可以放在一個 TCP 數(shù)據(jù)包里面但骨,而不是分成多個励七,這樣就提高了速度。

三奔缠、TCP 數(shù)據(jù)包的編號(SEQ)

一個包1400字節(jié)掠抬,那么一次性發(fā)送大量數(shù)據(jù),就必須分成多個包校哎。比如两波,一個 10MB 的文件,需要發(fā)送7100多個包贬蛙。

發(fā)送的時候雨女,TCP 協(xié)議為每個包編號(sequence number,簡稱 SEQ)阳准,以便接收的一方按照順序還原氛堕。萬一發(fā)生丟包,也可以知道丟失的是哪一個包野蝇。

第一個包的編號是一個隨機(jī)數(shù)讼稚。為了便于理解,這里就把它稱為1號包绕沈。假定這個包的負(fù)載長度是100字節(jié)锐想,那么可以推算出下一個包的編號應(yīng)該是101。這就是說乍狐,每個數(shù)據(jù)包都可以得到兩個編號:自身的編號赠摇,以及下一個包的編號。接收方由此知道浅蚪,應(yīng)該按照什么順序?qū)⑺鼈冞€原成原始文件藕帜。


(圖片說明:當(dāng)前包的編號是45943,下一個數(shù)據(jù)包的編號是46183惜傲,由此可知洽故,這個包的負(fù)載是240字節(jié)。)

四盗誊、TCP 數(shù)據(jù)包的組裝

收到 TCP 數(shù)據(jù)包以后时甚,組裝還原是操作系統(tǒng)完成的隘弊。應(yīng)用程序不會直接處理 TCP 數(shù)據(jù)包。

對于應(yīng)用程序來說荒适,不用關(guān)心數(shù)據(jù)通信的細(xì)節(jié)梨熙。除非線路異常,收到的總是完整的數(shù)據(jù)刀诬。應(yīng)用程序需要的數(shù)據(jù)放在 TCP 數(shù)據(jù)包里面串结,有自己的格式(比如 HTTP 協(xié)議)。

TCP 并沒有提供任何機(jī)制舅列,表示原始文件的大小,這由應(yīng)用層的協(xié)議來規(guī)定卧蜓。比如帐要,HTTP 協(xié)議就有一個頭信息Content-Length,表示信息體的大小弥奸。對于操作系統(tǒng)來說榨惠,就是持續(xù)地接收 TCP 數(shù)據(jù)包,將它們按照順序組裝好盛霎,一個包都不少赠橙。

操作系統(tǒng)不會去處理 TCP 數(shù)據(jù)包里面的數(shù)據(jù)。一旦組裝好 TCP 數(shù)據(jù)包愤炸,就把它們轉(zhuǎn)交給應(yīng)用程序期揪。TCP 數(shù)據(jù)包里面有一個端口(port)參數(shù),就是用來指定轉(zhuǎn)交給監(jiān)聽該端口的應(yīng)用程序规个。


系統(tǒng)根據(jù) TCP 數(shù)據(jù)包里面的端口凤薛,將組裝好的數(shù)據(jù)轉(zhuǎn)交給相應(yīng)的應(yīng)用程序。上圖中诞仓,21端口是 FTP 服務(wù)器缤苫,25端口是 SMTP 服務(wù),80端口是 Web 服務(wù)器墅拭。

應(yīng)用程序收到組裝好的原始數(shù)據(jù)活玲,以瀏覽器為例,就會根據(jù) HTTP 協(xié)議的Content-Length字段正確讀出一段段的數(shù)據(jù)谍婉。這也意味著舒憾,一次 TCP 通信可以包括多個 HTTP 通信。

五屡萤、TCP 數(shù)據(jù)包


TCP報(bào)文

1.端口號(port)

前4個字節(jié)來標(biāo)識了發(fā)送方的端口號和接收方的端口號珍剑,即該數(shù)據(jù)包由誰發(fā)送,由誰接收死陆。前2個字節(jié)標(biāo)識源端口號招拙,緊接著2個字節(jié)標(biāo)識目的端口號唧瘾。

即發(fā)送方:(11111111,1111111)2= (65535)10,除去0~1023.

即接收方:(11111111,1111111)2= (65535)10别凤,除去0~1023.

2.序號(seq)

TCP是面向字節(jié)流的饰序。在一個TCP連接中傳送的字節(jié)流中的每一個字節(jié)都按順序編號。整個要傳送的字節(jié)流的起始序號必須在連接建立時設(shè)置规哪。首部中的序號字段值則是指的是本報(bào)文段所發(fā)送的數(shù)據(jù)的第一個字節(jié)的序號求豫。長度為4字節(jié)诉稍,序號是32bit的無符號數(shù),序號到達(dá)232- 1后又從0開始。

3.確認(rèn)號(ack)

確認(rèn)號杯巨,占4個字節(jié),是期望收到對方下一個報(bào)文的第一個數(shù)據(jù)字節(jié)的序號服爷。例如,B收到了A發(fā)送過來的報(bào)文仍源,其序列號字段是501,而數(shù)據(jù)長度是200字節(jié)笼踩,這表明B正確的收到了A發(fā)送的到序號700為止的數(shù)據(jù)。因此嚎于,B期望收到A的下一個數(shù)據(jù)序號是701,于是B在發(fā)送給A的確認(rèn)報(bào)文段中把確認(rèn)號置為701匾旭;

4.數(shù)據(jù)偏移

占4位镣屹,它指出TCP報(bào)文的數(shù)據(jù)距離TCP報(bào)文段的起始處有多遠(yuǎn)

5.保留

占6位,保留今后使用价涝,但目前應(yīng)都位0

6.URG

當(dāng)URG=1女蜈,表明緊急指針字段有效。告訴系統(tǒng)此報(bào)文段中有緊急數(shù)據(jù)

7.ACK

僅當(dāng)ACK=1時色瘩,確認(rèn)號(ack)字段才有效伪窖。TCP規(guī)定,在連接建立后所有報(bào)文的傳輸都必須把ACK置1

8.PSH

當(dāng)兩個應(yīng)用進(jìn)程進(jìn)行交互式通信時居兆,有時在一端的應(yīng)用進(jìn)程希望在鍵入一個命令后立即就能收到對方的響應(yīng)覆山,這時候就將PSH=1

9.RST

當(dāng)RST=1,表明TCP連接中出現(xiàn)嚴(yán)重差錯泥栖,必須釋放連接簇宽,然后再重新建立連接

10.SYN

在連接建立時用來同步序號勋篓。當(dāng)SYN=1,ACK=0魏割,表明是連接請求報(bào)文譬嚣,若同意連接,則響應(yīng)報(bào)文中應(yīng)該使SYN=1钞它,ACK=1

11.FIN

用來釋放連接拜银。當(dāng)FIN=1,表明此報(bào)文的發(fā)送方的數(shù)據(jù)已經(jīng)發(fā)送完畢遭垛,并且要求釋放

12.窗口

占2字節(jié)尼桶,指的是通知接收方,發(fā)送本報(bào)文你需要有多大的空間來接受

13.檢驗(yàn)和

占2字節(jié)锯仪,校驗(yàn)首部和數(shù)據(jù)這兩部分

14.緊急指針

占2字節(jié)疯汁,指出本報(bào)文段中的緊急數(shù)據(jù)的字節(jié)數(shù)

15.選項(xiàng)

長度可變,定義一些其他的可選的參數(shù)

六卵酪、三次握手

最開始的時候客戶端和服務(wù)器都是處于CLOSED狀態(tài)。主動打開連接的為客戶端谤碳,被動打開連接的是服務(wù)器溃卡。

1.TCP服務(wù)器進(jìn)程先創(chuàng)建傳輸控制塊TCB,時刻準(zhǔn)備接受客戶進(jìn)程的連接請求蜒简,此時服務(wù)器就進(jìn)入了LISTEN(監(jiān)聽)狀態(tài)瘸羡;

2.TCP客戶進(jìn)程也是先創(chuàng)建傳輸控制塊TCB,然后向服務(wù)器發(fā)出連接請求報(bào)文搓茬,這是報(bào)文首部中的同部位SYN=1犹赖,同時選擇一個初始序列號 seq=x ,此時卷仑,TCP客戶端進(jìn)程進(jìn)入了 SYN-SENT(同步已發(fā)送狀態(tài))狀態(tài)峻村。TCP規(guī)定粘昨,SYN報(bào)文段(SYN=1的報(bào)文段)不能攜帶數(shù)據(jù)窜锯,但需要消耗掉一個序號锚扎。

3.TCP服務(wù)器收到請求報(bào)文后,如果同意連接芍秆,則發(fā)出確認(rèn)報(bào)文。確認(rèn)報(bào)文中應(yīng)該 ACK=1螟碎,SYN=1掉分,確認(rèn)號是ack=x+1酥郭,同時也要為自己初始化一個序列號 seq=y愿吹,此時犁跪,TCP服務(wù)器進(jìn)程進(jìn)入了SYN-RCVD(同步收到)狀態(tài)。這個報(bào)文也不能攜帶數(shù)據(jù)寝优,但是同樣要消耗一個序號乏矾。

4.TCP客戶進(jìn)程收到確認(rèn)后钻心,還要向服務(wù)器給出確認(rèn)铅协。確認(rèn)報(bào)文的ACK=1狐史,ack=y+1,自己的序列號seq=x+1侈玄,此時序仙,TCP連接建立潘悼,客戶端進(jìn)入ESTABLISHED(已建立連接)狀態(tài)。TCP規(guī)定棒动,ACK報(bào)文段可以攜帶數(shù)據(jù)宾添,但是如果不攜帶數(shù)據(jù)則不消耗序號缕陕。

5.當(dāng)服務(wù)器收到客戶端的確認(rèn)后也進(jìn)入ESTABLISHED狀態(tài),此后雙方就可以開始通信了


TCP建立連接圖解

為什么TCP客戶端最后還要發(fā)送一次確認(rèn)呢怜浅?

一句話恶座,主要防止已經(jīng)失效的連接請求報(bào)文突然又傳送到了服務(wù)器跨琳,從而產(chǎn)生錯誤沪袭。

如果使用的是兩次握手建立連接冈绊,假設(shè)有這樣一種場景埠啃,客戶端發(fā)送了第一個請求連接并且沒有丟失,只是因?yàn)樵诰W(wǎng)絡(luò)結(jié)點(diǎn)中滯留的時間太長了毅该,由于TCP的客戶端遲遲沒有收到確認(rèn)報(bào)文眶掌,以為服務(wù)器沒有收到朴爬,此時重新向服務(wù)器發(fā)送這條報(bào)文橡淆,此后客戶端和服務(wù)器經(jīng)過兩次握手完成連接母赵,傳輸數(shù)據(jù)凹嘲,然后關(guān)閉連接周蹭。此時此前滯留的那一次請求連接贞绳,網(wǎng)絡(luò)通暢了到達(dá)了服務(wù)器冈闭,這個報(bào)文本該是失效的萎攒,但是,兩次握手的機(jī)制將會讓客戶端和服務(wù)器再次建立連接刃永,這將導(dǎo)致不必要的錯誤和資源的浪費(fèi)斯够。

如果采用的是三次握手喧锦,就算是那一次失效的報(bào)文傳送過來了,服務(wù)端接受到了那條失效報(bào)文并且回復(fù)了確認(rèn)報(bào)文束亏,但是客戶端不會再次發(fā)出確認(rèn)碍遍。由于服務(wù)器收不到確認(rèn)怕敬,就知道客戶端并沒有請求連接帘皿。

七.四次揮手

數(shù)據(jù)傳輸完畢后,雙方都可釋放連接罩锐。最開始的時候卤唉,客戶端和服務(wù)器都是處于ESTABLISHED狀態(tài)桑驱,然后客戶端主動關(guān)閉,服務(wù)器被動關(guān)閉痊硕。

1.客戶端進(jìn)程發(fā)出連接釋放報(bào)文押框,并且停止發(fā)送數(shù)據(jù)。釋放數(shù)據(jù)報(bào)文首部盒揉,F(xiàn)IN=1刚盈,其序列號為seq=u(等于前面已經(jīng)傳送過來的數(shù)據(jù)的最后一個字節(jié)的序號加1)藕漱,此時肋联,客戶端進(jìn)入FIN-WAIT-1(終止等待1)狀態(tài)。?TCP規(guī)定牺蹄,F(xiàn)IN報(bào)文段即使不攜帶數(shù)據(jù),也要消耗一個序號翘魄。

2舀奶,服務(wù)器收到連接釋放報(bào)文,發(fā)出確認(rèn)報(bào)文罗岖,ACK=1桑包,ack=u+1纺非,并且?guī)献约旱男蛄刑杝eq=v烧颖,此時炕淮,服務(wù)端就進(jìn)入了CLOSE-WAIT(關(guān)閉等待)狀態(tài)鳖悠。TCP服務(wù)器通知高層的應(yīng)用進(jìn)程,客戶端向服務(wù)器的方向就釋放了憎账,這時候處于半關(guān)閉狀態(tài)胞皱,即客戶端已經(jīng)沒有數(shù)據(jù)要發(fā)送了反砌,但是服務(wù)器若發(fā)送數(shù)據(jù)萌朱,客戶端依然要接受晶疼。這個狀態(tài)還要持續(xù)一段時間翠霍,也就是整個CLOSE-WAIT狀態(tài)持續(xù)的時間寒匙。

3.客戶端收到服務(wù)器的確認(rèn)請求后,此時祸憋,客戶端就進(jìn)入FIN-WAIT-2(終止等待2)狀態(tài)夺衍,等待服務(wù)器發(fā)送連接釋放報(bào)文(在這之前還需要接受服務(wù)器發(fā)送的最后的數(shù)據(jù))沟沙。

4.服務(wù)器將最后的數(shù)據(jù)發(fā)送完畢后矛紫,就向客戶端發(fā)送連接釋放報(bào)文颊咬,F(xiàn)IN=1牡辽,ack=u+1态辛,由于在半關(guān)閉狀態(tài)炊邦,服務(wù)器很可能又發(fā)送了一些數(shù)據(jù)熟史,假定此時的序列號為seq=w蹂匹,此時限寞,服務(wù)器就進(jìn)入了LAST-ACK(最后確認(rèn))狀態(tài)忍啸,等待客戶端的確認(rèn)。

5.客戶端收到服務(wù)器的連接釋放報(bào)文后昆烁,必須發(fā)出確認(rèn)吊骤,ACK=1缎岗,ack=w+1静尼,而自己的序列號是seq=u+1,此時,客戶端就進(jìn)入了TIME-WAIT(時間等待)狀態(tài)鼠渺。注意此時TCP連接還沒有釋放鸭巴,必須經(jīng)過2?*?MSL(最長報(bào)文段壽命)的時間后,當(dāng)客戶端撤銷相應(yīng)的TCB后拦盹,才進(jìn)入CLOSED狀態(tài)鹃祖。

6.服務(wù)器只要收到了客戶端發(fā)出的確認(rèn)恬口,立即進(jìn)入CLOSED狀態(tài)。同樣,撤銷TCB后,就結(jié)束了這次的TCP連接鳞滨√岵恚可以看到,服務(wù)器結(jié)束TCP連接的時間要比客戶端早一些。


TCP斷開連接四次揮手圖解

為什么客戶端最后還要等待2MSL后雷?

MSL(Maximum Segment Lifetime)贾漏,TCP允許不同的實(shí)現(xiàn)可以設(shè)置不同的MSL值隐圾。

第一叨咖,保證客戶端發(fā)送的最后一個ACK報(bào)文能夠到達(dá)服務(wù)器,因?yàn)檫@個ACK報(bào)文可能丟失,站在服務(wù)器的角度看來,我已經(jīng)發(fā)送了FIN+ACK報(bào)文請求斷開了,客戶端還沒有給我回應(yīng)剂跟,應(yīng)該是我發(fā)送的請求斷開報(bào)文它沒有收到辽剧,于是服務(wù)器又會重新發(fā)送一次辟拷,而客戶端就能在這個2MSL時間段內(nèi)收到這個重傳的報(bào)文,接著給出回應(yīng)報(bào)文,并且會重啟2MSL計(jì)時器唧喉。

第二干跛,防止類似與“三次握手”中提到了的“已經(jīng)失效的連接請求報(bào)文段”出現(xiàn)在本連接中。客戶端發(fā)送完最后一個確認(rèn)報(bào)文后,在這個2MSL時間中厚满,就可以使本連接持續(xù)的時間內(nèi)所產(chǎn)生的所有報(bào)文段都從網(wǎng)絡(luò)中消失丰榴。這樣新的連接中不會出現(xiàn)舊連接的請求報(bào)文。

為什么建立連接是三次握手,關(guān)閉連接確是四次揮手呢闷游?

建立連接的時候业簿, 服務(wù)器在LISTEN狀態(tài)下缰揪,收到建立連接請求的SYN報(bào)文后,把ACK和SYN放在一個報(bào)文里發(fā)送給客戶端星爪。

而關(guān)閉連接時窖杀,服務(wù)器收到對方的FIN報(bào)文時啃炸,僅僅表示對方不再發(fā)送數(shù)據(jù)了但是還能接收數(shù)據(jù)南用,而自己也未必全部數(shù)據(jù)都發(fā)送給對方了筑公,所以己方可以立即關(guān)閉十酣,也可以發(fā)送一些數(shù)據(jù)給對方后搓彻,再發(fā)送FIN報(bào)文給對方來表示同意現(xiàn)在關(guān)閉連接扼脐,因此,己方ACK和FIN一般都會分開發(fā)送任柜,從而導(dǎo)致多了一次。

#如果已經(jīng)建立了連接宙地,但是客戶端突然出現(xiàn)故障了怎么辦摔认?

TCP還設(shè)有一個保活計(jì)時器宅粥,顯然参袱,客戶端如果出現(xiàn)故障,服務(wù)器不能一直等下去,白白浪費(fèi)資源抹蚀。服務(wù)器每收到一次客戶端的請求后都會重新復(fù)位這個計(jì)時器剿牺,時間通常是設(shè)置為2小時,若兩小時還沒有收到客戶端的任何數(shù)據(jù)环壤,服務(wù)器就會發(fā)送一個探測報(bào)文段晒来,以后每隔75秒發(fā)送一次。若一連發(fā)送10個探測報(bào)文仍然沒反應(yīng)郑现,服務(wù)器就認(rèn)為客戶端出了故障湃崩,接著就關(guān)閉連接。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末接箫,一起剝皮案震驚了整個濱河市攒读,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辛友,老刑警劉巖薄扁,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瞎领,居然都是意外死亡泌辫,警方通過查閱死者的電腦和手機(jī)随夸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門九默,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宾毒,你說我怎么就攤上這事驼修。” “怎么了诈铛?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵乙各,是天一觀的道長。 經(jīng)常有香客問我幢竹,道長耳峦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任焕毫,我火速辦了婚禮蹲坷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘邑飒。我一直安慰自己循签,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布疙咸。 她就那樣靜靜地躺著县匠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乞旦,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天贼穆,我揣著相機(jī)與錄音,去河邊找鬼兰粉。 笑死扮惦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的亲桦。 我是一名探鬼主播崖蜜,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼客峭!你這毒婦竟也來了豫领?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤舔琅,失蹤者是張志新(化名)和其女友劉穎等恐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體备蚓,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡课蔬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了郊尝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片二跋。...
    茶點(diǎn)故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖流昏,靈堂內(nèi)的尸體忽然破棺而出扎即,到底是詐尸還是另有隱情,我是刑警寧澤况凉,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布谚鄙,位于F島的核電站,受9級特大地震影響刁绒,放射性物質(zhì)發(fā)生泄漏闷营。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一知市、第九天 我趴在偏房一處隱蔽的房頂上張望傻盟。 院中可真熱鬧,春花似錦初狰、人聲如沸莫杈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筝闹。三九已至媳叨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間关顷,已是汗流浹背糊秆。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留议双,地道東北人痘番。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像平痰,于是被迫代替她去往敵國和親汞舱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評論 2 359