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