心跳包必要性與策略選擇

2021-10-22 23:40:01 字數 3754 閱讀 9993

一、cs模型中如何相互知曉狀態

為什麼需要心跳包?

在傳統的cs模型中,客戶端與服務端相互傳送訊息的過程中,是需要知道相互之間的狀態的,因為客戶端隨時可能給服務端傳送訊息。在聊天過程中,是不可能客戶端隨時給服務端傳送訊息,真實情況是服務端收到某個客戶端的訊息之後推送過來。在這個過程中,伺服器需要知道客戶端是否可用的。

服務端要想知道客戶端是否可用,最大的問題在於可能客戶端異常地斷開了,但是伺服器沒有收到斷開的這個情況,所以伺服器沒有釋放這個socket,它認為還連線著,此時,他會向該客戶端傳送訊息,而在傳送訊息之後會發生異常。其實該過程是乙個浪費的,因為服務端已準備好資料準備傳送,但是傳送的時候才失敗,現在重新進行乙個重連,重新建立資料報,這是乙個非常浪費的過程。這是我們需要心跳包的原因。

二、從tcp理論來說不需要心跳包-客戶端伺服器直連

如果將客戶端與服務端同時部署在自己的電腦上,兩個程序之間通過socket相互傳遞訊息的時候,這時候是不需要心跳包來維持的。只要程序不斷開,隨時可用傳送和接收資料。

需要心跳包的情況:

--程式崩潰、防火牆

--網路運營商(isp) --> nat路由器(對映狀態表)

程式崩潰的時候,可能會觸發服務端沒有收到程式崩潰的情況,服務端也不知道需要釋放客戶端的資源。

計算機與計算機之間相互是有防火牆的,而這個防火牆隨時可以做到乙個策略,隨時可以斷開socket連線,而斷開的時候可能不會進行四次揮手,服務端或者客戶端沒有收到連線斷開的訊息,此時會認為連線還可用,隨時還想傳送資料,傳送的時候才知道連線不可用。

引起網路斷開的大頭是網路運營商isp,它在傳輸資料的過程中有乙個東西叫nat路由器。路由器的主要作用是將客戶端所有的狀態通過nat路由器進行對映,然後再通過對映的埠進行連線伺服器,這個過程中存在乙個對映表過期的情況,一旦對映表過期了,就是資料不能通過nat路由器進行**了,所以資料最終傳送的時候會出現無法傳送的情況,此時socket連線也是連線異常的狀態。此時,socket連線是接收不到斷開連線的訊息的。

三、nat路由器的原理

isp是網路運營商,它有乙個非常大型的路由器,這個大型路由器組建了乙個大型區域網,大型區域網連線了所有的電腦、手機、印表機等所有可以聯網的裝置,甚至也可以是路由器。家裡的路由器就是連線到了網路運營商的大型路由器上。每個電腦都被分配了區域網的某個ip位址,以及通訊都是連線到路由器上面的。這樣的情況下,比如電腦的ip 192.168.0.101其實是區域網的ip位址,它僅僅只是在路由器上掛了乙個號,用於說明它是路由器下面的哪個子的電腦。

路由器有乙個對外的公共的ip位址 82.10.250.19,伺服器也是乙個外網位址,兩個外網位址之間是可以直接進行連線的。連線之後所有的資訊都是通過路由器進行傳輸的,也就是說對伺服器而言,所有的電腦裝置都是被遮蔽的,它只知道有乙個大的客戶端向它進行了連線,這個大的客戶端就是82.10.250.19。

四、電腦與伺服器之間的連線

電腦通過區域網連線路由器,這個路由器有乙個全域性對外的ip位址82.10.250.19,然後通過網路運營商連線到server伺服器。server的ip位址一定是公網的ip位址才可以連線到。如果服務端是區域網的ip位址的話,對於nat路由器來說是無法訪問到的,它必須連線到對外的公共的ip位址。

五、nat路由器的對映表

對於某個客戶端而言,只要客戶端的ip位址沒變,同時客戶端對外的埠沒變,那麼nat路由器對外公布的往其它server連線的ip和位址將不會改變。也就是說,乙個客戶端通過nat路由器之後,如果此時nat路由器是乙個80埠,那麼它連線到server1的時候使用的是80埠去連線,連線到server2的時候也是使用80埠去連線。只要客戶端的ip位址和埠不變,那麼它就將是這樣乙個結構。

這樣的結構是乙個一對多的結構,對於nat路由器而言,它是乙個一對多的(多個服務端)。

這樣的結構安全性是比較低的,因為只要客戶端的ip位址和埠不變,那麼nat路由器的ip位址和埠就不變,那麼server1、server2只要連線過一次客戶端,那麼它就可以反向連線客戶端。也就是說,可以通過client連線server1,也可以通過server2來主動反向連線client,這是乙個雙向的方式。這樣的方式,資料傳輸快,但是安全性較低。

客戶端ip和埠不變,但是連線的server端是變化的,那麼它對外的埠就是不同的。server1只能通過上面的埠來收發資料,server2也只能通過下面的埠來收發資料。如果server2想通過server1的埠來反向連線客戶端,是不會成功的。因此,它的安全性相對來說比較高。

六、nat超時時間

如果移動在3g/2g網路下,如果資料在5分鐘之內不進行任何的資料收發,那麼,nat內部維持的對映表將會自動被刪除掉。所以,必須在5分鐘之內進行一次資料的收發,確保維持這個對映表。其它依次類推。

七、心跳包的作用

客戶端與伺服器之間相互告知狀態

通過定時傳送資訊,讓中間的運營商的nat路由表得以維持;避免路由表過期帶來的異常中斷

由於其約定性、定時性所以稱為心跳包

八、心跳策略選擇

1、tcp :  keepalive 7200 2h ack(每間隔7200s傳送一次,2小時傳送一次,傳送之後會有ack的回送包,從而達到確認連線活躍性的目的)

tcp : keepalive僅代表連線得以保持,而不代表對方的業務層是否可以消費資料

(當兩個socket連線之後,當乙個socket給另乙個socket傳送乙個keepalive連線訊息的時候,這個資料報僅僅只在tcp的傳輸層就被消費掉了,然後回送乙個ack的回送包,但是這個訊息並不會上公升到業務層。這樣的機制可以確保對上層的無感知性,但同時不能保證業務層已經崩潰了。業務層可能由於某些原因導致死鎖或者宕機,而底層的socket連線還是暢通的,這種情況下整個系統是癱瘓的,但是通過keepalive進行連線,此時得到的狀態是正常的。這種情況是不對的,應該得到系統的準確狀態,同時,由於每隔2個小時傳送一次,此時運營商nat的連線早已中斷了,這個連線一般而言傳送這個keepalive訊息的時候收到的是已經錯誤中斷的訊息)

http : keep-alive 意圖在於連線復用,同乙個連線上序列方式傳遞請求-響應資料

2、這個資料報只能傳送乙個位元組,傳遞的是乙個int值,取的是低八位。

另乙個客戶端可以通過so_oobinline來設定是否感知業務層。但是如果要感知業務層,需要把它往業務層拋去 ,業務層收到這個資料之後,由於它的區間是在0~255之間,跟整個業務層的衝撞是非常非常大的,從而導致整個業務層的邏輯進行調整,這是非常危險的,一般不這樣處理。

但是也可以不往業務層拋,僅僅用來確認連線是否可靠,此時,比前面的keepalive更加優秀。

九、心跳資料報

十、

銀行選擇電子招標採購的必要性

從很多方面上看,銀行是個特殊的行業,原因是 在大多數情況下,銀行的 商也是它的客戶。這很容易為個別員工 部門以及整個銀行的利益造成衝突。例如,設施管理的 商未能履行合同義務,導致銀行蒙受巨大損失,在普通的情況下,銀行的首席招採官首先會更換新的 商,但如果 商是銀行的客戶,並且最近收到新的倉庫資金,銀...

linux設定MTU的必要性與重要性

問題場景描述 最近在搞乙個很菜的程式 ftp上傳檔案。但是這個 很菜的程式搞的我腦袋疼了 半個月。在linux上面部署了我的程式,上傳檔案在1kb以下順利上傳,但是1kb以上上傳不上去。程式部署在windows上面沒有問題,還有就是我的程式上傳我自己搭建的ftp伺服器也沒有問題。所以判斷出在網路上面...

計畫的執行與回顧的重要性與必要性

現在以每個季度為節點制定職業技能的強化計畫,總體來說效果比較好!但是還是存在如下幾個問題 首先這個計畫是給自己用的,所以一定要切實可行!自己制定的時候是按照每天晚上都能抽出3小時來學習,週末抽出14小時來的。但是實際上並沒有辦法做到這一點,大概率是保持每天晚上兩小時,週末10個小時。所以計畫就一定要...