我們知道歷代iPhone手機出現問題最多的一個就是通知延遲、無提醒,實際上,這個問題不管你是什麼型號,幾代的iOS系統都會出現這個問題,很多人會問,這個問題出現了這麼久,難道蘋果不知道麼?實際上不是不知道,二十無能為力,下面會講到。
說到蘋果系統的通知,我們就要知道蘋果系統的推送原理
首先蘋果系統的通知是由蘋果的APNs(蘋果推送伺服器)統一推送到我們手機的,也就是我們傳送的訊息必須經過app廠商伺服器,然後app廠商伺服器將訊息轉發到APNs伺服器,APNs伺服器在傳送到我們手機上指定的app,最後經過iOS系統處理彈出提示框,原理圖如下:
蘋果的推送通知分為兩種,一種是遠端通知,一種是本地通知,遠端通知包括各個app傳送給你的資訊,微信qq傳送給你的訊息在,這種必須經過網際網路的訊息;本地通知包括手機鬧鐘鈴聲這種不需要經過網際網路的通知,只需要定時設定就能在規定的時間彈出的通知。
我們訊息的延遲是發生在遠端通知裡面的,所以下面我將詳細地解釋發生的原因,以及如何解決!
首先我們要知道訊息的及時推送大多是建立在TCP/ip協議連線的,就像上圖的箭頭就可以看作一條TCP連線的,任何一條斷開,都將無法收到通知推送。
問題出現的原因:
我們現在使用的ip地址大多數為IPV4,IPV4規定了IP的地址長度32,那麼總共就要為了2*32-1個地址,但是沒這些地址已經在2014年左右被分配完了,那麼為什麼我們現在還在使用呢?這就不得不說區域網(內網)的發明了。區域網的出現緩解了IPV4地址不足的壓力,我們現在所辦理的寬頻,不管是哪個運營商,分配給你的都是私網(內網)地址,而且是可以重複使用的,但是我們內網是無法訪問外網(公網) 的,那麼就出現了地址轉換技術(nat轉換)也就是說路由器分配給我們的192.168.0.1這種類似的ip 地址都是內網地址,都無法直接訪問外網,必須要將這種地址轉換為公網地址才能訪問網際網路,我們使用的最多的就是多對1的這種轉換模式,就是多條寬頻對應一個公網IP地址,每條寬頻裡面可以分配許多的內網IP地址,而且可以相同,所有內網的使用者訪問外網都會把分配到的內網IP地址轉換為那一個公網IP地址,所以這個技術非常完美地解決了公網IP地址的不足,因為現在一個公網IP地址可以給非常多的使用者使用,而之前是一人一個公網IP地址。
但是由於我們國內網路環境是非常複雜的,而且網路質量並不是很好,以及這個地址轉換技術也存在一些不足,導致我們在某些使用場景下會很差,推送通知就是其中一個!
雖然IP地址不足得到了一些解決,雖然大部分人都很清楚IP地址的緊缺導致的動態IP分配的必然,卻忽略了由於IP地址不足引起的埠資源不足。
由於需要動態分配IP地址(這裡不僅僅指網際網路入口的IP,還包括區域網內部的IP),路由器的工作原理都是經過埠對映,把內部網路(包括PC、手機、平板、Wifi、2G、3G、4G)IP與埠對映成外部IP(通常是公網IP)和對應的埠,並維持這個對映關係,才能正常地修改、轉發報文資訊,保證內部各個ip、埠與外部的各個ip、埠的通訊。
然而,單個IP地址的埠資源是有限的,理論上限是65535個埠。對於普通寬頻路由器來說,這個已經很充足了。但是!對於大型的網路服務、網路主幹接入點等來說,如果IP資源不足,每個IP幾萬個埠的資源很快會耗盡,從而影響正常通訊。
正因為如此,所有的路由器都會為每個埠對映關係設定老化時間,如果老化時間倒數到0,則埠對映關係失效,該埠被釋放給其他連線使用。如果埠全部耗盡,則無法再新建內部與外部的網路連線。
埠對映老化時間,比很多人想象中的要短很多。一般的家用寬頻路由器,老化時間一般是兩三分鐘;在有線寬頻運營商接入部分,老化時間可能少於兩分鐘。在無線電話網路運營商接入部分(例如GPRS連線),老化時間甚至不超過一分鐘!
也就是說,任何一個網路通訊(不管是TCP或UDP),如果幾分鐘之內沒有網路傳輸,其佔用的IP地址埠將被路由器回收。這個時候該次通訊必將終止,不管TCP還是UDP,什麼都是浮雲。
更可怕的是我們路由器WAN口獲取到的IP如果是內網IP,那麼訊息通知延遲將會異常恐怖!
如果內網到公網之間沒有任何裝置了,那麼路由器的WAN口獲取到的就是公網ip,但是實際上,你的路由器到公網之間隔了非常多的裝置,試想一下,內網到公網之間已經存在老化設定了,如果之間還隔了很多運營商的上層裝置,那麼之間就會存在非常多的老化設定,只有全部在連線的時候,那麼整個連線才是通的,其中任何一個老化時間到了,不管其他的老化設定時間到沒到,整個TCP都將斷開從。這就像在一個開關上串聯了許多的開關,只要其中一個開關是斷開的,那麼燈就無法亮,只有全部閉合,燈泡才會亮起。這就是我們訊息推送的原因,這個比喻可謂是非常的恰當!
因此我們訊息推送在鎖屏下更容易延遲是因為,長時間沒有資料流通,根據老化原則,tcp連線將斷開,直到下次自動連線,這就是蘋果訊息為什麼總是延遲、無法收到訊息的原因。
如何解決
首先要明確一點的是不要相信任何設定就能解決這個問題的,手機上的任何設定都是沒有作用的,不管是重啟,解除安裝重灌都是沒有作用的!千萬不要相信!
我們能做的只有以下兩點:
- 跟運營商索要公網IP,這一點在移動可能很難實現,畢竟移動是租用的電信的主幹網路,索要公網IP是要收費的,該公網IP能解決是因為,我們的內網和外網之間直接沒有那麼多隔閡了,之間只存在一個ip 老化設定,可以忽略不計,這個時候推送就非常的及時了,不在存在推送延遲等問題。
- 將路由器橋接,這麼做的目的也是為了減少私網到公網之間的隔閡,就那上面的比喻來說,這麼做的目的相當於減少了電燈泡之間的開關,IP老化時間設定減少,TCP連線沒有那麼容易斷開了,但是這麼做只能是減少中間裝置的轉發,而不能達到直接索要公網IP的那種效果,但是確確實實推送延遲的問題減少了很多
總結:訊息延遲是由於內網與外網直接的轉發裝置過多,導致TCP連線效能大幅度降低,從而導致訊息不通知、延遲等問題,我們能做的只能是索要公網IP和將路由器橋接,儘量減少中間裝置的轉發從而解決推送延遲等問題