TCP協(xié)議(上):復(fù)雜的同時(shí)卻輕松

上一節(jié)意狠,我們講的 UDP粟关,基本上包括了傳輸層所必須的端口字段。它就像我們小時(shí)候一樣簡(jiǎn)單环戈,相信“網(wǎng)之初闷板,性本善,不丟包院塞,不亂序”遮晚。

后來(lái)呢,我們都慢慢長(zhǎng)大拦止,了解了社會(huì)的殘酷县遣,變得復(fù)雜而成熟,就像 TCP 協(xié)議一樣。它之所以這么復(fù)雜萧求,那是因?yàn)樗械氖恰靶詯赫摗崩稹K烊徽J(rèn)為網(wǎng)絡(luò)環(huán)境是惡劣的,丟包饭聚、亂序忌警、重傳,擁塞都是常有的事情秒梳,一言不合就可能送達(dá)不了法绵,因而要從算法層面來(lái)保證可靠性。

TCP 包頭格式

我們先來(lái)看 TCP 頭的格式酪碘。從這個(gè)圖上可以看出朋譬,它比 UDP 復(fù)雜得多。

首先兴垦,源端口號(hào)和目標(biāo)端口號(hào)是不可少的徙赢,這一點(diǎn)和 UDP 是一樣的。如果沒(méi)有這兩個(gè)端口號(hào)探越。數(shù)據(jù)就不知道應(yīng)該發(fā)給哪個(gè)應(yīng)用狡赐。

接下來(lái)是包的序號(hào)。為什么要給包編號(hào)呢钦幔?當(dāng)然是為了解決亂序的問(wèn)題枕屉。不編好號(hào)怎么確認(rèn)哪個(gè)應(yīng)該先來(lái),哪個(gè)應(yīng)該后到呢鲤氢。編號(hào)是為了解決亂序問(wèn)題搀擂。既然是社會(huì)老司機(jī),做事當(dāng)然要穩(wěn)重卷玉,一件件來(lái)哨颂,面臨再?gòu)?fù)雜的情況,也臨危不亂相种。

還應(yīng)該有的就是確認(rèn)序號(hào)威恼。發(fā)出去的包應(yīng)該有確認(rèn),要不然我怎么知道對(duì)方有沒(méi)有收到呢蚂子?如果沒(méi)有收到就應(yīng)該重新發(fā)送沃测,直到送達(dá)缭黔。這個(gè)可以解決不丟包的問(wèn)題食茎。作為老司機(jī),做事當(dāng)然要靠譜馏谨,答應(yīng)了就要做到别渔,暫時(shí)做不到也要有個(gè)回復(fù)。

TCP 是靠譜的協(xié)議,但是這不能說(shuō)明它面臨的網(wǎng)絡(luò)環(huán)境好哎媚。從 IP 層面來(lái)講喇伯,如果網(wǎng)絡(luò)狀況的確那么差,是沒(méi)有任何可靠性保證的拨与,而作為 IP 的上一層 TCP 也無(wú)能為力稻据,唯一能做的就是更加努力,不斷重傳买喧,通過(guò)各種算法保證捻悯。也就是說(shuō),對(duì)于 TCP 來(lái)講淤毛,IP 層你丟不丟包今缚,我管不著,但是我在我的層面上低淡,會(huì)努力保證可靠性姓言。

這有點(diǎn)像如果你在北京,和客戶約十點(diǎn)見面蔗蹋,那么你應(yīng)該清楚堵車是常態(tài)何荚,你干預(yù)不了,也控制不了猪杭,你唯一能做的就是早走兽泣。打車不行就改乘地鐵,盡力不失約胁孙。

接下來(lái)有一些狀態(tài)位唠倦。例如 SYN 是發(fā)起一個(gè)連接,ACK 是回復(fù)涮较,RST 是重新連接稠鼻,F(xiàn)IN 是結(jié)束連接等。TCP 是面向連接的狂票,因而雙方要維護(hù)連接的狀態(tài)候齿,這些帶狀態(tài)位的包的發(fā)送,會(huì)引起雙方的狀態(tài)變更闺属。

不像小時(shí)候慌盯,隨便一個(gè)不認(rèn)識(shí)的小朋友都能玩在一起,人大了掂器,就變得禮貌亚皂,優(yōu)雅而警覺(jué),人與人遇到會(huì)互相熱情的寒暄国瓮,離開會(huì)不舍地道別灭必,但是人與人之間的信任會(huì)經(jīng)過(guò)多次交互才能建立狞谱。

還有一個(gè)重要的就是窗口大小。TCP 要做流量控制禁漓,通信雙方各聲明一個(gè)窗口跟衅,標(biāo)識(shí)自己當(dāng)前能夠的處理能力,別發(fā)送的太快播歼,撐死我伶跷,也別發(fā)的太慢,餓死我秘狞。

作為老司機(jī)撩穿,做事情要有分寸,待人要把握尺度谒撼,既能適當(dāng)提出自己的要求食寡,又不強(qiáng)人所難。除了做流量控制以外廓潜,TCP 還會(huì)做擁塞控制抵皱,對(duì)于真正的通路堵車不堵車,它無(wú)能為力辩蛋,唯一能做的就是控制自己呻畸,也即控制發(fā)送的速度。不能改變世界悼院,就改變自己嘛伤为。

作為老司機(jī),要會(huì)自我控制据途,知進(jìn)退绞愚,知道什么時(shí)候應(yīng)該堅(jiān)持,什么時(shí)候應(yīng)該讓步颖医。

通過(guò)對(duì) TCP 頭的解析位衩,我們知道要掌握 TCP 協(xié)議,重點(diǎn)應(yīng)該關(guān)注以下幾個(gè)問(wèn)題:

順序問(wèn)題 熔萧,穩(wěn)重不亂糖驴;

丟包問(wèn)題,承諾靠譜佛致;

連接維護(hù)贮缕,有始有終;

流量控制俺榆,把握分寸感昼;

擁塞控制,知進(jìn)知退肋演。

TCP 的三次握手

所有的問(wèn)題抑诸,首先都要先建立一個(gè)連接,所以我們先來(lái)看連接維護(hù)問(wèn)題爹殊。

TCP 的連接建立蜕乡,我們常常稱為三次握手。

A:您好梗夸,我是 A层玲。

B:您好 A,我是 B反症。

A:您好 B辛块。

我們也常稱為“請(qǐng)求 -> 應(yīng)答 -> 應(yīng)答之應(yīng)答”的三個(gè)回合。這個(gè)看起來(lái)簡(jiǎn)單铅碍,其實(shí)里面還是有很多的學(xué)問(wèn)润绵,很多的細(xì)節(jié)。

首先胞谈,為什么要三次尘盼,而不是兩次?按說(shuō)兩個(gè)人打招呼烦绳,一來(lái)一回就可以了扒渖印?為了可靠径密,為什么不是四次午阵?

我們還是假設(shè)這個(gè)通路是非常不可靠的,A 要發(fā)起一個(gè)連接享扔,當(dāng)發(fā)了第一個(gè)請(qǐng)求杳無(wú)音信的時(shí)候底桂,會(huì)有很多的可能性,比如第一個(gè)請(qǐng)求包丟了惧眠,再如沒(méi)有丟戚啥,但是繞了彎路,超時(shí)了锉试,還有 B 沒(méi)有響應(yīng)猫十,不想和我連接。

A 不能確認(rèn)結(jié)果呆盖,于是再發(fā)拖云,再發(fā)。終于应又,有一個(gè)請(qǐng)求包到了 B宙项,但是請(qǐng)求包到了 B 的這個(gè)事情,目前 A 還是不知道的株扛,A 還有可能再發(fā)尤筐。

B 收到了請(qǐng)求包汇荐,就知道了 A 的存在,并且知道 A 要和它建立連接盆繁。如果 B 不樂(lè)意建立連接掀淘,則 A 會(huì)重試一陣后放棄,連接建立失敗油昂,沒(méi)有問(wèn)題革娄;如果 B 是樂(lè)意建立連接的,則會(huì)發(fā)送應(yīng)答包給 A冕碟。

當(dāng)然對(duì)于 B 來(lái)說(shuō)拦惋,這個(gè)應(yīng)答包也是一入網(wǎng)絡(luò)深似海,不知道能不能到達(dá) A安寺。這個(gè)時(shí)候 B 自然不能認(rèn)為連接是建立好了厕妖,因?yàn)閼?yīng)答包仍然會(huì)丟,會(huì)繞彎路挑庶,或者 A 已經(jīng)掛了都有可能叹放。

而且這個(gè)時(shí)候 B 還能碰到一個(gè)詭異的現(xiàn)象就是,A 和 B 原來(lái)建立了連接挠羔,做了簡(jiǎn)單通信后井仰,結(jié)束了連接。還記得嗎破加?A 建立連接的時(shí)候俱恶,請(qǐng)求包重復(fù)發(fā)了幾次,有的請(qǐng)求包繞了一大圈又回來(lái)了范舀,B 會(huì)認(rèn)為這也是一個(gè)正常的的請(qǐng)求的話合是,因此建立了連接,可以想象锭环,這個(gè)連接不會(huì)進(jìn)行下去聪全,也沒(méi)有個(gè)終結(jié)的時(shí)候,純屬單相思了辅辩。因而兩次握手肯定不行难礼。

B 發(fā)送的應(yīng)答可能會(huì)發(fā)送多次,但是只要一次到達(dá) A玫锋,A 就認(rèn)為連接已經(jīng)建立了蛾茉,因?yàn)閷?duì)于 A 來(lái)講,他的消息有去有回撩鹿。A 會(huì)給 B 發(fā)送應(yīng)答之應(yīng)答谦炬,而 B 也在等這個(gè)消息,才能確認(rèn)連接的建立,只有等到了這個(gè)消息键思,對(duì)于 B 來(lái)講础爬,才算它的消息有去有回。

當(dāng)然 A 發(fā)給 B 的應(yīng)答之應(yīng)答也會(huì)丟吼鳞,也會(huì)繞路看蚜,甚至 B 掛了。按理來(lái)說(shuō)赖条,還應(yīng)該有個(gè)應(yīng)答之應(yīng)答之應(yīng)答失乾,這樣下去就沒(méi)底了常熙。所以四次握手是可以的纬乍,四十次都可以,關(guān)鍵四百次也不能保證就真的可靠了裸卫。只要雙方的消息都有去有回仿贬,就基本可以了。

好在大部分情況下墓贿,A 和 B 建立了連接之后茧泪,A 會(huì)馬上發(fā)送數(shù)據(jù)的,一旦 A 發(fā)送數(shù)據(jù)聋袋,則很多問(wèn)題都得到了解決队伟。例如 A 發(fā)給 B 的應(yīng)答丟了,當(dāng) A 后續(xù)發(fā)送的數(shù)據(jù)到達(dá)的時(shí)候幽勒,B 可以認(rèn)為這個(gè)連接已經(jīng)建立嗜侮,或者 B 壓根就掛了,A 發(fā)送的數(shù)據(jù)啥容,會(huì)報(bào)錯(cuò)锈颗,說(shuō) B 不可達(dá),A 就知道 B 出事情了咪惠。

當(dāng)然你可以說(shuō) A 比較壞击吱,就是不發(fā)數(shù)據(jù),建立連接后空著遥昧。我們?cè)诔绦蛟O(shè)計(jì)的時(shí)候覆醇,可以要求開啟 keepalive 機(jī)制,即使沒(méi)有真實(shí)的數(shù)據(jù)包炭臭,也有探活包叫乌。

另外,你作為服務(wù)端 B 的程序設(shè)計(jì)者徽缚,對(duì)于 A 這種長(zhǎng)時(shí)間不發(fā)包的客戶端憨奸,可以主動(dòng)關(guān)閉,從而空出資源來(lái)給其他客戶端使用凿试。

三次握手除了雙方建立連接外排宰,主要還是為了溝通一件事情似芝,就是 TCP 包的序號(hào)的問(wèn)題。

A 要告訴 B板甘,我這面發(fā)起的包的序號(hào)起始是從哪個(gè)號(hào)開始的党瓮,B 同樣也要告訴 A,B 發(fā)起的包的序號(hào)起始是從哪個(gè)號(hào)開始的。為什么序號(hào)不能都從 1 開始呢帝火?因?yàn)檫@樣往往會(huì)出現(xiàn)沖突炊豪。

例如,A 連上 B 之后枪萄,發(fā)送了 1、2猫妙、3 三個(gè)包瓷翻,但是發(fā)送 3 的時(shí)候,中間丟了割坠,或者繞路了齐帚,于是重新發(fā)送,后來(lái) A 掉線了彼哼,重新連上 B 后对妄,序號(hào)又從 1 開始,然后發(fā)送 2敢朱,但是壓根沒(méi)想發(fā)送 3剪菱,但是上次繞路的那個(gè) 3 又回來(lái)了,發(fā)給了 B蔫饰,B 自然認(rèn)為琅豆,這就是下一個(gè)包,于是發(fā)生了錯(cuò)誤篓吁。

因而茫因,每個(gè)連接都要有不同的序號(hào)。這個(gè)序號(hào)的起始序號(hào)是隨著時(shí)間變化的杖剪,可以看成一個(gè) 32 位的計(jì)數(shù)器冻押,每 4 微秒加一,如果計(jì)算一下盛嘿,如果到重復(fù)洛巢,需要 4 個(gè)多小時(shí),那個(gè)繞路的包早就死翹翹了次兆,因?yàn)槲覀兌贾?IP 包頭里面有個(gè) TTL稿茉,也即生存時(shí)間。

好了,雙方終于建立了信任漓库,建立了連接恃慧。前面也說(shuō)過(guò),為了維護(hù)這個(gè)連接渺蒿,雙方都要維護(hù)一個(gè)狀態(tài)機(jī)痢士,在連接建立的過(guò)程中,雙方的狀態(tài)變化時(shí)序圖就像這樣茂装。

一開始怠蹂,客戶端和服務(wù)端都處于 CLOSED 狀態(tài)。先是服務(wù)端主動(dòng)監(jiān)聽某個(gè)端口少态,處于 LISTEN 狀態(tài)城侧。然后客戶端主動(dòng)發(fā)起連接 SYN,之后處于 SYN-SENT 狀態(tài)况增。服務(wù)端收到發(fā)起的連接赞庶,返回 SYN训挡,并且 ACK 客戶端的 SYN澳骤,之后處于 SYN-RCVD 狀態(tài)±奖。客戶端收到服務(wù)端發(fā)送的 SYN 和 ACK 之后为肮,發(fā)送 ACK 的 ACK,之后處于 ESTABLISHED 狀態(tài)肤京,因?yàn)樗话l(fā)一收成功了颊艳。服務(wù)端收到 ACK 的 ACK 之后,處于 ESTABLISHED 狀態(tài)忘分,因?yàn)樗惨话l(fā)一收了棋枕。

TCP 四次揮手

好了,說(shuō)完了連接妒峦,接下來(lái)說(shuō)一說(shuō)“拜拜”重斑,好說(shuō)好散。這常被稱為四次揮手肯骇。

A:B 啊窥浪,我不想玩了。

B:哦笛丙,你不想玩了啊漾脂,我知道了。

這個(gè)時(shí)候胚鸯,還只是 A 不想玩了骨稿,也即 A 不會(huì)再發(fā)送數(shù)據(jù),但是 B 能不能在 ACK 的時(shí)候,直接關(guān)閉呢坦冠?當(dāng)然不可以了镜豹,很有可能 A 是發(fā)完了最后的數(shù)據(jù)就準(zhǔn)備不玩了,但是 B 還沒(méi)做完自己的事情蓝牲,還是可以發(fā)送數(shù)據(jù)的趟脂,所以稱為半關(guān)閉的狀態(tài)。

這個(gè)時(shí)候 A 可以選擇不再接收數(shù)據(jù)了例衍,也可以選擇最后再接收一段數(shù)據(jù)昔期,等待 B 也主動(dòng)關(guān)閉。

B:A 啊佛玄,好吧硼一,我也不玩了,拜拜梦抢。

A:好的般贼,拜拜。

這樣整個(gè)連接就關(guān)閉了奥吩。但是這個(gè)過(guò)程有沒(méi)有異常情況呢哼蛆?當(dāng)然有,上面是和平分手的場(chǎng)面霞赫。

A 開始說(shuō)“不玩了”腮介,B 說(shuō)“知道了”,這個(gè)回合端衰,是沒(méi)什么問(wèn)題的叠洗,因?yàn)樵诖酥埃p方還處于合作的狀態(tài)旅东,如果 A 說(shuō)“不玩了”灭抑,沒(méi)有收到回復(fù),則 A 會(huì)重新發(fā)送“不玩了”抵代。但是這個(gè)回合結(jié)束之后腾节,就有可能出現(xiàn)異常情況了,因?yàn)橐呀?jīng)有一方率先撕破臉主守。

一種情況是禀倔,A 說(shuō)完“不玩了”之后,直接跑路参淫,是會(huì)有問(wèn)題的救湖,因?yàn)?B 還沒(méi)有發(fā)起結(jié)束,而如果 A 跑路涎才,B 就算發(fā)起結(jié)束鞋既,也得不到回答力九,B 就不知道該怎么辦了。另一種情況是邑闺,A 說(shuō)完“不玩了”跌前,B 直接跑路,也是有問(wèn)題的陡舅,因?yàn)?A 不知道 B 是還有事情要處理抵乓,還是過(guò)一會(huì)兒會(huì)發(fā)送結(jié)束。

那怎么解決這些問(wèn)題呢靶衍?TCP 協(xié)議專門設(shè)計(jì)了幾個(gè)狀態(tài)來(lái)處理這些問(wèn)題灾炭。我們來(lái)看斷開連接的時(shí)候的狀態(tài)時(shí)序圖。

斷開的時(shí)候颅眶,我們可以看到蜈出,當(dāng) A 說(shuō)“不玩了”,就進(jìn)入 FIN_WAIT_1 的狀態(tài)涛酗,B 收到“A 不玩”的消息后铡原,發(fā)送知道了,就進(jìn)入 CLOSE_WAIT 的狀態(tài)商叹。

A 收到“B 說(shuō)知道了”燕刻,就進(jìn)入 FIN_WAIT_2 的狀態(tài),如果這個(gè)時(shí)候 B 直接跑路沈自,則 A 將永遠(yuǎn)在這個(gè)狀態(tài)酌儒。TCP 協(xié)議里面并沒(méi)有對(duì)這個(gè)狀態(tài)的處理辜妓,但是 Linux 有枯途,可以調(diào)整 tcp_fin_timeout 這個(gè)參數(shù),設(shè)置一個(gè)超時(shí)時(shí)間籍滴。

如果 B 沒(méi)有跑路酪夷,發(fā)送了“B 也不玩了”的請(qǐng)求到達(dá) A 時(shí),A 發(fā)送“知道 B 也不玩了”的 ACK 后孽惰,從 FIN_WAIT_2 狀態(tài)結(jié)束晚岭,按說(shuō) A 可以跑路了,但是最后的這個(gè) ACK 萬(wàn)一 B 收不到呢勋功?則 B 會(huì)重新發(fā)一個(gè)“B 不玩了”坦报,這個(gè)時(shí)候 A 已經(jīng)跑路了的話,B 就再也收不到 ACK 了狂鞋,因而 TCP 協(xié)議要求 A 最后等待一段時(shí)間 TIME_WAIT片择,這個(gè)時(shí)間要足夠長(zhǎng),長(zhǎng)到如果 B 沒(méi)收到 ACK 的話骚揍,“B 說(shuō)不玩了”會(huì)重發(fā)的字管,A 會(huì)重新發(fā)一個(gè) ACK 并且足夠時(shí)間到達(dá) B啰挪。

A 直接跑路還有一個(gè)問(wèn)題是,A 的端口就直接空出來(lái)了嘲叔,但是 B 不知道亡呵,B 原來(lái)發(fā)過(guò)的很多包很可能還在路上,如果 A 的端口被一個(gè)新的應(yīng)用占用了硫戈,這個(gè)新的應(yīng)用會(huì)收到上個(gè)連接中 B 發(fā)過(guò)來(lái)的包锰什,雖然序列號(hào)是重新生成的,但是這里要上一個(gè)雙保險(xiǎn)丁逝,防止產(chǎn)生混亂歇由,因而也需要等足夠長(zhǎng)的時(shí)間,等到原來(lái) B 發(fā)送的所有的包都死翹翹果港,再空出端口來(lái)沦泌。

等待的時(shí)間設(shè)為 2MSL,MSL 是 Maximum Segment Lifetime辛掠,報(bào)文最大生存時(shí)間谢谦,它是任何報(bào)文在網(wǎng)絡(luò)上存在的最長(zhǎng)時(shí)間,超過(guò)這個(gè)時(shí)間報(bào)文將被丟棄萝衩。因?yàn)?TCP 報(bào)文基于是 IP 協(xié)議的回挽,而 IP 頭中有一個(gè) TTL 域,是 IP 數(shù)據(jù)報(bào)可以經(jīng)過(guò)的最大路由數(shù)猩谊,每經(jīng)過(guò)一個(gè)處理他的路由器此值就減 1千劈,當(dāng)此值為 0 則數(shù)據(jù)報(bào)將被丟棄,同時(shí)發(fā)送 ICMP 報(bào)文通知源主機(jī)牌捷。協(xié)議規(guī)定 MSL 為 2 分鐘墙牌,實(shí)際應(yīng)用中常用的是 30 秒,1 分鐘和 2 分鐘等暗甥。

還有一個(gè)異常情況就是喜滨,B 超過(guò)了 2MSL 的時(shí)間,依然沒(méi)有收到它發(fā)的 FIN 的 ACK撤防,怎么辦呢虽风?按照 TCP 的原理,B 當(dāng)然還會(huì)重發(fā) FIN寄月,這個(gè)時(shí)候 A 再收到這個(gè)包之后辜膝,A 就表示,我已經(jīng)在這里等了這么長(zhǎng)時(shí)間了漾肮,已經(jīng)仁至義盡了厂抖,之后的我就都不認(rèn)了,于是就直接發(fā)送 RST初橘,B 就知道 A 早就跑了验游。

TCP 狀態(tài)機(jī)

將連接建立和連接斷開的兩個(gè)時(shí)序狀態(tài)圖綜合起來(lái)充岛,就是這個(gè)著名的 TCP 的狀態(tài)機(jī)。學(xué)習(xí)的時(shí)候比較建議將這個(gè)狀態(tài)機(jī)和時(shí)序狀態(tài)機(jī)對(duì)照著看耕蝉,不然容易暈崔梗。

在這個(gè)圖中,加黑加粗的部分垒在,是上面說(shuō)到的主要流程蒜魄,其中阿拉伯?dāng)?shù)字的序號(hào),是連接過(guò)程中的順序场躯,而大寫中文數(shù)字的序號(hào)谈为,是連接斷開過(guò)程中的順序。加粗的實(shí)線是客戶端 A 的狀態(tài)變遷踢关,加粗的虛線是服務(wù)端 B 的狀態(tài)變遷伞鲫。

小結(jié)

好了,這一節(jié)就到這里了签舞,我來(lái)做一個(gè)總結(jié):

TCP 包頭很復(fù)雜秕脓,但是主要關(guān)注五個(gè)問(wèn)題,順序問(wèn)題儒搭,丟包問(wèn)題吠架,連接維護(hù),流量控制搂鲫,擁塞控制傍药;

連接的建立是經(jīng)過(guò)三次握手,斷開的時(shí)候四次揮手魂仍,一定要掌握的我畫的那個(gè)狀態(tài)圖拐辽。

最后,給你留兩個(gè)思考題蓄诽。

TCP 的連接有這么多的狀態(tài)薛训,你知道如何在系統(tǒng)中查看某個(gè)連接的狀態(tài)嗎?

這一節(jié)僅僅講了連接維護(hù)問(wèn)題仑氛,其實(shí)為了維護(hù)連接的狀態(tài),還有其他的數(shù)據(jù)結(jié)構(gòu)來(lái)處理其他的四個(gè)問(wèn)題闸英,那你知道是什么嗎锯岖?

歡迎你留言和我討論。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末甫何,一起剝皮案震驚了整個(gè)濱河市出吹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辙喂,老刑警劉巖捶牢,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸠珠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡秋麸,警方通過(guò)查閱死者的電腦和手機(jī)渐排,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)灸蟆,“玉大人驯耻,你說(shuō)我怎么就攤上這事〕纯迹” “怎么了可缚?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)斋枢。 經(jīng)常有香客問(wèn)我帘靡,道長(zhǎng),這世上最難降的妖魔是什么瓤帚? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任测柠,我火速辦了婚禮,結(jié)果婚禮上缘滥,老公的妹妹穿的比我還像新娘轰胁。我一直安慰自己,他們只是感情好朝扼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布赃阀。 她就那樣靜靜地躺著,像睡著了一般擎颖。 火紅的嫁衣襯著肌膚如雪榛斯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天搂捧,我揣著相機(jī)與錄音驮俗,去河邊找鬼。 笑死允跑,一個(gè)胖子當(dāng)著我的面吹牛王凑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播聋丝,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼索烹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了弱睦?” 一聲冷哼從身側(cè)響起百姓,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎况木,沒(méi)想到半個(gè)月后垒拢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旬迹,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年求类,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奔垦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡仑嗅,死狀恐怖宴倍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情仓技,我是刑警寧澤鸵贬,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站脖捻,受9級(jí)特大地震影響阔逼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜地沮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一嗜浮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摩疑,春花似錦危融、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至楷怒,卻和暖如春蛋勺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸠删。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工抱完, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人刃泡。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓巧娱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親捅僵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子家卖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容