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