"吃了么?" | 一條消息的悲慘經(jīng)歷
下班之后,你一陣空虛,想起遠(yuǎn)方的她,倍感思念。這日子看似有盡頭,但實(shí)際經(jīng)歷起來(lái),卻好像沒(méi)有終點(diǎn)。在別人歡樂(lè)的時(shí)候,你卻有自己的憂傷;在你高興的時(shí)候,有人卻在經(jīng)歷生死的考驗(yàn)。
人與人之間的悲喜并不同步,但此時(shí),你就想找個(gè)人聊天。心中有千言萬(wàn)語(yǔ),到最后卻無(wú)力吐露,深思熟慮之后,你掏出了自己的手機(jī)。
“吃了么?”
三個(gè)方塊大字,帶著既好奇又關(guān)心又忐忑的標(biāo)點(diǎn)符號(hào),沖破無(wú)盡的阻礙,沖了出去。
感情不需要言語(yǔ),這個(gè)時(shí)候,忠實(shí)的互聯(lián)網(wǎng)傳播了你的憂傷和眷戀。你并不是麻花家族員工,但你隱約的猜到了數(shù)據(jù)的傳播過(guò)程。在遠(yuǎn)方的她回復(fù)之前,你腦子里虛構(gòu)了整個(gè)的過(guò)程。
合情合理,但為什么又感到一絲絲上頭的悲傷。
看不懂的密文
你用的是華為手機(jī),并沒(méi)有使用蘋果手機(jī),因?yàn)槟阌X(jué)得只有她才配;你也沒(méi)有升級(jí)鴻蒙系統(tǒng),因?yàn)槟阏J(rèn)為那是瞎折騰的智商稅。在各種紅粉綠粉沸騰的時(shí)候,你只關(guān)心你的消息能不能到達(dá)。
即使是這么普通的三個(gè)字,你也不希望它像裸體一樣被其他人觀看。事實(shí)上,你的信息是通過(guò)加密通道傳輸?shù)摹S捎谀闶褂昧四愕馁~戶密碼進(jìn)行了登錄,所以這條連接,就已經(jīng)存在了。
你長(zhǎng)舒一口氣,終于不TM再想一次那老掉牙的四次變?nèi)蔚奈帐至恕?/p>
這條連接應(yīng)該是HTTPS的,每一個(gè)連接,生成了唯一的加密密鑰。別人看到了也不知道你再說(shuō)啥,發(fā)言自然放心。雖然后臺(tái)有私鑰的程序員能看到,但大家都忙著賺錢,誰(shuí)關(guān)心你這點(diǎn)屁事呢?
此時(shí),“吃了么?”會(huì)被加密成一串看不懂的報(bào)文,發(fā)送出去。這是一串TLS協(xié)議格式的數(shù)據(jù),工作在應(yīng)用層。
接下來(lái),數(shù)據(jù)將在傳輸層進(jìn)行傳輸,也就是TCP,你手機(jī)上的ip+端口號(hào),加上服務(wù)器端的ip+端口號(hào),構(gòu)成了你們幽會(huì)的秘密通道。
奔跑吧,數(shù)據(jù)包
由于你連接的是自己的Wifi,所以你的IP地址還進(jìn)行了一層PNAT轉(zhuǎn)換,路由器最終把綁定在公網(wǎng)的IP,加上某個(gè)端口,映射到你的192網(wǎng)段IP,躲在路由器背后的你,竟感覺(jué)到莫名的安全感。
但是下層的網(wǎng)絡(luò)層(IP協(xié)議),可沒(méi)有什么端口號(hào)之稱,你的網(wǎng)絡(luò)包,都會(huì)被你的路由器直接發(fā)送出去。此時(shí)的端口號(hào),已經(jīng)變成了IP協(xié)議的報(bào)文內(nèi)容。即使是光速,等傳遞到服務(wù)器的時(shí)候,端口號(hào)存在不存在,也是個(gè)未知數(shù)。其實(shí),連這條連接的存在與否,都是個(gè)未知數(shù)。
你以為的連接,是一條直線,A和B之間穩(wěn)固的一塌糊涂,但其實(shí)它只是兩個(gè)點(diǎn)。一個(gè)點(diǎn),永遠(yuǎn)無(wú)法在同一時(shí)間知曉另外一個(gè)點(diǎn)此時(shí)是否存活。有時(shí)候,如果沒(méi)有心跳,一個(gè)點(diǎn)會(huì)永遠(yuǎn)的傻傻的等在那里。
海上生明月,天涯共此時(shí)?你搖了搖頭,這種哲學(xué)問(wèn)題,還是交給龍泉寺的方丈去想吧。IP協(xié)議通過(guò)我盡力的方式去發(fā)送信息,根據(jù)路徑節(jié)點(diǎn)上的路由表橫沖直撞,接力賽跑。說(shuō)不定哪個(gè)不靠譜的節(jié)點(diǎn),就把你可愛(ài)的數(shù)據(jù)包給搞丟了;或者RIP達(dá)到了15,你的數(shù)據(jù)包就被那樣無(wú)情的丟掉了。
還好傳輸層的TCP有重傳機(jī)制,ACK確保了數(shù)據(jù)包,也確保了你的愛(ài)。
然后終于到了不講道理的連接層,因?yàn)榇藭r(shí),連IP地址都變成了報(bào)文,因?yàn)樵谶@里的傳輸,根本不講道理,就是赤裸裸的Frame(以太網(wǎng)幀)。你的數(shù)據(jù)包就是以這種原始的數(shù)據(jù),發(fā)送了出去。
接下來(lái)的事情我們就都知道了,物理層網(wǎng)卡用高電壓表示1,低電壓表示0,最終生出了萬(wàn)物。
但是等等,事情并沒(méi)有這么簡(jiǎn)單,沒(méi)有這么順暢。
原因就在于傳輸層的TCP,并不是直接把數(shù)據(jù)寫(xiě)到網(wǎng)卡,它還有一個(gè)緩沖區(qū),比如SO_SNDBUF就表示設(shè)置套接字發(fā)送方的緩沖區(qū)大小。在對(duì)端返回ACK之前,這個(gè)緩沖區(qū)會(huì)一直存在,它不像UDP一樣那么無(wú)情。
所以緩沖區(qū)這玩意兒,硬生生的在TCP之前插了個(gè)隊(duì),屬于亂入的電燈泡。
嗯,是時(shí)候發(fā)送緩沖區(qū)了。由于緩沖區(qū)是在內(nèi)存里,這里就是把內(nèi)存的數(shù)據(jù)發(fā)往網(wǎng)卡的過(guò)程。TLS包在用戶態(tài)生成TCP報(bào)文,發(fā)送緩沖區(qū)的時(shí)候要切換成內(nèi)核態(tài)。
通過(guò)一系列的封裝和網(wǎng)卡驅(qū)動(dòng)的轉(zhuǎn)換,將sk_buff搞到網(wǎng)卡上去。
誰(shuí)去發(fā)送呢?CPU不屑于干這種活,那就通過(guò)中斷交給DMA吧,CPU可以有時(shí)間去干更有意義的事情。
解包
經(jīng)過(guò)99八十一難,服務(wù)器的網(wǎng)卡接收到相關(guān)的數(shù)據(jù)包。
它發(fā)現(xiàn),目標(biāo)機(jī)器,竟然是一臺(tái)LVS負(fù)載均衡。
通過(guò)路由查找,它發(fā)現(xiàn),后面是一臺(tái)Nginx服務(wù)器。
不好意思,Nginx后面竟然是一個(gè)二層的微服務(wù)網(wǎng)關(guān)。
微服務(wù)網(wǎng)關(guān)后面,赫然有多臺(tái)機(jī)器在那里伺服者,等君入甕。
通過(guò)負(fù)載均衡策略,終于定位到了某臺(tái)機(jī)器。
拿到你的用戶ID,系統(tǒng)打算查詢另外一個(gè)微服務(wù)模塊組裝你的個(gè)人信息,比如頭像。
終于,它要處理“吃了么?“幾個(gè)字了,非常的激動(dòng)人心。
這條消息,會(huì)有什么效果呢?她會(huì)回復(fù)你么?還是會(huì)落入無(wú)盡的虛空?
終于,有回復(fù)了。
竟然是那傷人的一串字:”XX開(kāi)啟了好友驗(yàn)證,你還不是她的好友....“。
也好,就讓整個(gè)鏈路上的機(jī)器們,少幾次交互,多休息一下吧。
你狠狠的踢了一下腳下的貓,心想。


































