一幅图片引发的离婚大战
本文轉載自程序員技術
今天看到這兩幅圖片,不禁哈哈大笑。互聯網上很多段子或者笑話,其實最能引起笑果的往往來自于真實生活,而不是那些為了笑果而編造的段子。
微信真的會因為網絡不好而造成信息的前后顛倒嗎?
真的會。
為什么呢?
馬化騰說微信就是一個郵箱,只是這個郵箱比較快,讓你感受不到這是一個郵箱,而讓你有一種即時通信的錯覺。
微信這個郵箱是這么來工作的:
Alice登錄微信服務器,認證身份,上線狀態。這是一個基于TCP的長連接,安全加密。所謂長連接,就是Alice只要不是手機沒電或者關機狀態,這個長連接一直都是運行且雙向可以通信的。這個負責登錄的服務器,簡稱登錄服務器。
Alice給Bob發了一段文字,“Are you kidding me?”敲回車。這段文字是通過上文的長連接發送的嗎?
不是的。而是通過一個短連接發送的,這個短連接是Alice點開Bob頭像才建立的,這是一個 TCP + MMTLS(安全加密)+ http封裝的短連接。
然后這個消息就被短連接以http格式發出去了。這個消息是直接發給Bob的嗎?
不是的,而是發給Bob的郵箱。
Bob的郵箱是在Bob的手機里、還是微信存儲服務器里?
微信服務器。
這樣做有什么好處呢?
假如Bob在飛機上,手機關機,Alice消息依然可以將消息發出。如果直接發給Bob手機,手機都關機了,那就壓根無法建立連接,自然連消息都發不出。當然好處還有許多,比如Alice與Bob的手機都位于NAT設備的后方,他們之間的直接通信不一定100%成功。
如果Bob是在線狀態,登錄服務器會第一時間通過TCP長連接,通知Bob微信郵箱里有信,至于這封信存在郵箱的什么地方,這是一個http格式的鏈接。Bob微信會與鏈接所對應的存儲服務器建立短鏈接,將消息下載并顯示到本地窗口,然后關閉短連接。
如果Bob是離線狀態,微信服務器其實也不急的,反正消息呆在存儲服務器,不會飛的。等Bob下飛機上線了第一時間通知Bob微信就好了。
以上就是微信的工作流程。接下來講為何微信會發生消息后發先至的情況?
微信每次敲完一段文字,點擊“發送“,這個消息就觸發了一次:
-
短連接的建立
-
消息的傳輸
-
短連接的斷開
這個是標準的三步曲。當你再次發一段文字時,又觸發了一次三步曲。兩次的三步曲是相互獨立的。
在網絡暢通時,Alice第一個消息很快就發到Bob的郵箱,并被Bob微信呈現在窗口里。
Alice第二個消息發出的晚,自然到達得晚,這是非常好理解的。
但是當網絡不好時,第一個三步曲的消息報文不是那么幸運,丟了,然后Alice的手機一直在重傳這個消息。Alice又發送第二個消息,運氣特別好,沒有丟,結果比第一個消息早到了幾秒。
既然微信講究及時通信,微信會第一時間通知Bob的微信,只是這個消息通知順序,先是第二個消息,然后才是第一個消息。這樣就造成了微信消息時序的顛倒。
最后,每一段消息內部文字并沒有顛倒,對嗎?
這就是TCP的功勞,因為短連接依然使用的是TCP做為傳輸協議,TCP最擅長做的就是保證每一個字節按照先后順序到達。TCP是一個可靠協議,可以修復由于網絡暫時的中斷而造成的字節丟失。但是如果Alice向Bob郵箱上傳信的時候,網絡發生了長時間的中斷,超出了TCP最大修復時間,這時微信會提示Alice,消息發送失敗!
總結
以上是生活随笔為你收集整理的一幅图片引发的离婚大战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Day28-Linux入门01
- 下一篇: 《学习之道》读后感