導航:首頁 > 操作系統 > androidkeepalive

androidkeepalive

發布時間:2024-12-31 20:47:05

① 了解 Flutter 3.16 功能更新

Flutter 3.16 版本引入了多處關鍵更新,包括 Material 3 成為默認主題、Impeller 在 android 上的預覽版發布以及為 DevTools 添加擴展支持等。此次更新收到社區積極反饋,三個月內共合並 928 個拉取請求,其中 40 名開發者貢獻了新代碼。


Material 3 更新


Material 庫已升級至 3.10 版本,以匹配最新 Material Design 規范。默認啟用 Material 3,用戶可通過 MaterialApp 主題中的 useMaterial3 屬性選擇退出。新組件、主題和視覺效果引入,以支持 Material 3 風格。演示應用允許用戶試用所有組件並切換 Material 3 模式。


性能改進


新增 Easing 和 Durations 類,改進 Material 3 動效。在 iOS 系統上,用戶現在可在編輯菜單中添加查找、搜索和共享選項。文本縮放系數 TextScaler 提供了支持 Android 14 中的非線性字體縮放功能。SelectionArea 經過更新以支持滑鼠和觸屏設備上的原生手勢。菜單項現在允許清除焦點更改,Mac 平台上的應用會遵循《Apple 人機界面指南》對快捷方式排序。


動畫和測試支持


MatrixTransition widget 為變換轉場動畫提供了新方式,PaintPattern 類用於驗證 CustomPainter 和 Decoration 的繪制調用。滾動更新引入 KeepAlive widget、默認焦點遍歷和隱式滾動支持。二維滾動基礎改進,支持構建 2D 滾動 widget。


Impeller 發展


Impeller 已在 Android 上准備好預覽版,Android 開發者可使用— enable-impeller 標志嘗試。在支持 Vulkan 的設備上,Impeller 表現良好,團隊計劃未來為 OpenGL 後端提供功能,並徵集反饋。Impeller 的 Vulkan 後端在某些設備上顯示出改進的性能和穩定性。


游戲開發工具包


更新的休閑游戲工具包提供了一系列資源,幫助開發者構建概念到發布的游戲,包括紙牌游戲、跑酷游戲以及對 Google Play 游戲服務、應用內購買、廣告等服務的支持。


Web 和 Android 更新


Chrome DevTools 中新增 Flutter 時間軸事件,改善了 Web 應用的調試性能。Android 支持滑鼠滾輪滾動速度與設備匹配,引入預測性返回手勢。應用擴展功能允許開發者使用 Flutter widget 在某些 iOS 應用擴展上繪制界面。


包生態系統


Flutter Favorite 項目重新啟動,新包包括 flame、flutter_animate 等。首次舉辦 package 生態系統網路峰會,超過 50 名非 Google 員工和貢獻者參與討論。基於 Cloud 的 Google 地圖樣式無需代碼更新即可自定義。CameraX 支持改進,macOS 視頻播放器添加支持。


DevTools 更新


DevTools 擴展框架支持新 package,如 Provider、Drift 和 Patrol。版本更新包括性能改進和 DevTools 擴展功能。


即刻體驗


Flutter 3.16 現已發布至穩定渠道,包括 Dart 3.2。只需使用 flutter upgrade 即可獲取最新更新。

② TCP keepalive 和 http keep-alive 以及心跳保活

HTTP的長連接和短連接本質上是TCP長連接和短連接。

短連接
短連接,顧名思義,與長連接的區別就是,客戶端收到服務端的響應後,立刻發送FIN消息,主動釋放連接。也有服務端主動斷連的情況,凡是在一次消息交互(發請求-收響應)之後立刻斷開連接的情況都稱為短連接。

長連接/http keep-alive
也叫持久連接,即一個TCP連接服務多次請求,在TCP層握手成功後,不立即斷開連接,並在此連接的基礎上進行多次消息(包括心跳)交互,直至連接的任意一方(客戶端OR服務端)主動斷開連接,此過程稱為一次完整的長連接。

在HTTP/1.0中得到了初步的支持,客戶端在請求header中攜帶Connection:Keep-Alive,即是在向服務端請求持久連接。如果服務端接受持久連接,則會在響應header中同樣攜帶Connection: Keep-Alive,這樣客戶端便會繼續使用同一個TCP連接發送接下來的若干請求。(Keep-Alive的默認參數是[timout=5, max=100],即一個TCP連接可以服務至多5秒內的100次請求)

HTTP/1.1開始,即使請求header中沒有攜帶Connection: Keep-Alive,傳輸也會默認以持久連接的方式進行,只有加入"Connection: close "後,才關閉。

http keepalive是客戶端瀏覽器與服務端httpd守護進程協作的結果。

TCP中的KeepAlive
  TCP協議的實現中,提供了KeepAlive報文,用來探測連接的對端是否存活。在應用交互的過程中,可能存在以下幾種情況:

客戶端或伺服器意外斷電,死機,崩潰,重啟;

中間網路已經中斷,而客戶端與伺服器並不知道;

利用保活探測功能,可以探知這種對端的意外情況,從而保證在意外發生時,可以釋放半打開的TCP連接。TCP保活報文交互過程如下:

因此,KeepAlive並不適用於檢測雙方存活的場景,這種場景還得依賴於應用層的心跳。 應用層心跳也具備著更大的靈活性,可以控制檢測時機,間隔和處理流程,甚至可以在心跳包上附帶額外信息。

應用層心跳是檢測連接有效性以及判斷雙方是否存活的有效方式 。但是心跳過於頻繁會帶來 耗電和耗流量 的弊病,心跳頻率過低則會影響連接檢測的實時性。業內關於心跳時間的設置和優化,主要基於如下幾個因素:

理想的情況下,客戶端應當以略小於NAT超時時間的間隔來發送心跳包。 根據微信團隊測試的一些數據,一些常用網路的NAT超時時間如下表所示:

TCP的KeepAlive機制意圖在於保活、心跳,檢測連接錯誤

如何快速區分當前連接使用的是長連接還是短連接
1、凡是在一次完整的消息交互(發請求-收響應)之後,立刻斷開連接(有一方發送FIN消息)的情況都稱為短連接;

2、長連接的一個明顯特徵是會有心跳消息(也有沒有心跳的情況),且一般心跳間隔都在30S或者1MIN左右,用wireshark抓包可以看到有規律的心跳消息交互(可能會存在毫秒級別的誤差)。

什麼時候用長連接,短連接?
1、需要頻繁交互的場景使用長連接,如即時通信工具(微信/QQ,QQ也有UDP),相反則使用短連接,比如普通的web網站,只有當瀏覽器發起請求時才會建立連接,伺服器返回相應後,連接立即斷開。

2、維持長連接會有一定的系統開銷,用戶量少不容易看出系統瓶頸,一旦用戶量上去了,就很有可能把伺服器資源(內存/CPU/網卡)耗盡,所以使用需謹慎。

keep-alive與TIME_WAIT
使用http keep-alvie,可以減少服務端TIME_WAIT數量(因為由服務端httpd守護進程主動關閉連接)。道理很簡單,相較而言,啟用keep-alive,建立的tcp連接更少了,自然要被關閉的tcp連接也相應更少了。

短連接和長鏈接 圖:

參考: https://caofengbin.github.io/2018/03/16/dhcp-and-nat/#4-%E5%BD%B1%E5%93%8D%E5%BF%83%E8%B7%B3%E9%A2%91%E7%8E%87%E7%9A%84%E5%85%B3%E9%94%AE%E5%9B%A0%E7%B4%A0

https://blog.csdn.net/hengyunabc/article/details/44310193

http://wingjay.com/2018/12/05/android-arch-long-link/

https://www.levicc.com/2018/06/30/yi-dong-an-wang-luo-you-hua/

能被我參考的都很優秀,哈哈

③ RouterOSv7WireGuard隧道協議

RouterOS v7加入了WireGuard,WireGuard是一個極簡而快速的加密VPN協議。其設計目標是比IPsec更快、更精簡和高效,同時性能要比OpenVPN提升很多。WireGuard被設計成一種通用VPN,可以在多個平台上運行,適合許多不同的環境。最初是為Linux內核發布的,後支持跨平台(Windows, macOS, BSD, iOS, Android),能進行廣泛的部署。

從官方測試性能看,WireGurad對於IPsec優勢非常明顯,而對於OpenVPN幾乎是碾壓。

在部署方面,WireGurad各個節點是Peer對等體的概念,而非是Server與Client關系,相互之間是對等的,一個節點既可以是發起者,也可以是接收者,比如網上提到VPN的拓撲方案中,可以是點對點,點對多點的中心覆蓋,而WireGuard不一樣了,不僅可以點對點,也可以點對多點,每個節點同時可連接多個 Peer,看到過有人通過WireGuard建立全互聯模式,三層的Mesh網狀網路。

WireGuard只支持UDP協議,不支持傳統的TCP-over-TCP隧道,因為TCP網路性能並不理想,如果對TCP連接有需求,將wiredguard的UDP包轉換為TCP,並可以使用如udptunnel和udp2raw來協助完成。

關於NAT穿透,通常情況下,WireGuard網路在未被使用的情況下,會盡量保持「安靜」。在大多數情況下,它只在Peer對等體,希望發送數據包時傳輸數據,當它沒有被要求發送數據包時,它就停止發送,直到再次被請求。在點對點公網IP連接的網路環境是這樣的,然而,當一個Peer端位於NAT或防火牆之後時,即使它不發送任何數據包的情況下,也希望能接收傳入的數據包。因為NAT和防火牆會跟蹤「會話連接」,他必須通過定期發送數據包來維持NAT/防火牆連接會話映射的有效,即UDP的timeout時間,即被稱為keepalive。WireGuard可以開啟此選項,每隔一秒向對端點發送一個keepalive報文,當然適用於各種NAT/防火牆的合理間隔在25秒。默認設置keepalive是關閉狀態,因為公網IP連接的用戶不需要這個功能。

WireGuard加密使用ChaCha20,驗證使用Poly1305,它幾乎在所有通用CPU上的運行速度都非常快。雖然未被專用硬體支持(IPsec支持硬體加速),但在CPU上的矢量指令(vector instructions)與AES-NI指令處於相同的優先順序(有時甚至更快)。

總結下WireGuard的特點:

是基於UDP協議連接,具備網路性能優勢

運行在Linux內核,在性能上優於IPsec和OpenVPN

每個節點通過公鑰識別進行驗證,加密採用的是ChaCha20Poly1305。

每個節點是平等的,既可以作為server,又可以作為client

兩端僅需要一個配置公網IP,另一端在nat後也能連接,nat後的節點,僅需要對端節點公鑰,以及公網IP (endpoint)和埠(endpoint port),而公網節點只需要填寫連接端的公鑰即可

從測試結果看未使用IPsec加密的L2TP的傳輸帶寬性能最好,超過了WireGuard,但在使用IPsec的L2TP加密後,性能遠不如WireGuard,我平時喜歡使用SSTP在RouterOS設備之間建立連接,因為SSTP埠靈活,在RouterOS建立隧道無需證書,但SSTP的傳輸性能在RouterOS支持的所有隧道協議中性能是最差的,現在v7有了WireGuard就不一樣了。

④ android socket有幾種方法

/***第一種:客戶端Socket通過構造方法連接伺服器***/
//客戶端Socket可以通過指定IP地址或域名兩種方式來連接伺服器端,實際最終都是通過IP地址來連接伺服器
//新建一個Socket,指定其IP地址及埠號
Socket socket = new Socket("192.168.0.7",80);
/***Socket 客戶端 一些常用設置***/
//客戶端socket在接收數據時,有兩種超時:1.連接伺服器超時,即連接超時;2.連接伺服器成功後,接收伺服器數據超時,即接收超時
//*設置socket 讀取數據流的超時時間
socket.setSoTimeout(5000);
//發送數據包,默認為false,即客戶端發送數據採用Nagle演算法
//但是對於實時交互性高的程序,建議其改為true,即關閉Nagle演算法,客戶端每發送一次數據,無論數據包大小都會將這些數據發送出去
socket.setTcpNoDelay(true);
//設置客戶端socket關閉時,close()方法起作用時延遲1分鍾關閉,如果1分鍾內盡量將未發送的數據包發送出去
socket.setSoLinger(true, 60);
//設置輸出流的發送緩沖區大小,默認是8KB,即8096位元組
socket.setSendBufferSize(8096);
//設置輸入流的接收緩沖區大小,默認是8KB,即8096位元組
socket.setReceiveBufferSize(8096);
//作用:每隔一段時間檢查伺服器是否處於活動狀態,如果伺服器端長時間沒響應,自動關閉客戶端socket
//防止伺服器端無效時,客戶端長時間處於連接狀態
socket.setKeepAlive(true);
/*** Socket客戶端向伺服器端發送數據 ****/
//客戶端向伺服器端發送數據,獲取客戶端向伺服器端輸出流
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
//代表可以立即向伺服器端發送單位元組數據
socket.setOOBInline(true);
//數據不經過輸出緩沖區,立即發送
socket.sendUrgentData(65);//"A"
//向伺服器端寫數據,寫入一個緩沖區
//註:此處字元串最後必須包含「\r\n\r\n」,告訴伺服器HTTP頭已經結束,可以處理數據,否則會造成下面的讀取數據出現阻塞
//在write()方法中可以定義規則,與後台匹配來識別相應的功能,例如登錄Login()方法,可以寫為write("Login|test,123 \r\n\r\n"),供後台識別;
bw.write("Login|test,123 \r\n\r\n");
//發送緩沖區中數據,必須有
bw.flush();

/*** Socket客戶端讀取伺服器端響應數據 ****/
//socket.isConnected代表是否連接成功過
if((socket.isConnected() == true) && (socket.isClosed() == false)){//判斷Socket是否處於連接狀態
//客戶端接收伺服器端的響應,讀取伺服器端向客戶端的輸入流
InputStream is = socket.getInputStream();
//緩沖區
byte[] buffer = new byte[is.available()];
//讀取緩沖區
is.read(buffer);
//轉換為字元串
String responseInfo = new String(buffer);
//日誌中輸出
Log.i("TEST", responseInfo);
} //關閉網路
socket.close();
/***第二種:通過connect方法連接伺服器***/
Socket socket_other = new Socket();
//使用默認的連接超時
socket_other.connect(new InetSocketAddress("192.168.0.7",80));
//連接超時2s
socket_other.connect(new InetSocketAddress("192.168.0.7",80),2000);
//關閉socket
socket_other.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

閱讀全文

與androidkeepalive相關的資料

熱點內容
雲伺服器設置埠轉發 瀏覽:579
數學分析復旦pdf 瀏覽:274
用什麼能改列印伺服器 瀏覽:143
上海不動產權證怎麼加密碼 瀏覽:585
linux推薦版本 瀏覽:572
安卓網格布局有什麼特點 瀏覽:324
生化危機用什麼app看 瀏覽:916
布穀鳥搜索演算法matlab 瀏覽:136
伺服器的燈如何設置 瀏覽:862
單片機控制門流程圖 瀏覽:304
滬漂女程序員跳槽 瀏覽:306
百度石榴演算法指的是 瀏覽:784
怎麼將文件壓縮得盡可能小 瀏覽:447
linux開發常用命令 瀏覽:831
我的世界java版如何進入伺服器 瀏覽:897
如何把jpg轉換pdf格式 瀏覽:290
華為p10plus圖片加密 瀏覽:369
宏傑文件夾加密密碼忘了 瀏覽:620
dos命令rd 瀏覽:667
怎麼把wps上的演算法格式改了 瀏覽:806