當前位置:首頁 » 網路連接 » 網路是如何長連接的
擴展閱讀
蘋果電腦運行cdr會卡頓 2025-06-29 17:13:25

網路是如何長連接的

發布時間: 2022-09-02 14:04:07

⑴ 網路如何持續連接,在開機的狀態下就是連接的呢

方法1、設置開機自動撥號,撥號連接自動保存用戶密碼,不顯示進度。
方法2、路由撥號。硬路由、軟路由、伺服器均可。

⑵ 網路是如何連接的

網路是如何連接的

從瀏覽器輸入一個網址到瀏覽器返回響應這中間發生了什麼?即假設把整個網路當做一個黑盒,輸入是url,輸出的是response,那麼在這個黑盒裡面發生了什麼?一串url是怎麼請求到網路上的資源的?我們都知道tcp/ip協議,但是他們在整個網路傳輸過程中,具體承擔什麼角色?他們的原理是什麼?對於tezign而言,為什麼切換不同的host就能訪問到不同的環境,都知道是dns,雖然訪問的是相同的域名,但是在不同的host下被解析成不同的ip,進而訪問到不同的機器上。但是ip是怎麼找到機器的?應用程序發送的數據是怎麼被傳輸到伺服器上的等等,這中間的過程其實都是非常復雜的。

以Tezign的一個url為例( https://vms-service.tezign.com/material/dam/public/query-common-dic )

當在瀏覽器或者終端等地方輸入這個url,整個請求流程應該如下所示

注意到最前面是https,所以是使用加密的http協議訪問Web伺服器 vms-service.tezign.com 則是被請求的域名 material/dam/public/query-common-dic 則是請求的資源 在這里指的是materila的有結果介面, 當點擊Enter時候, 瀏覽器會根據當前系統版本及設置生成如下的一段Http request,

如果直接輸入的ip則可以跳過這步。伺服器是不知道域名的,域名說白了就是全網共同維護的DNS。

通過DNS查詢ip的操作稱做域名解析,流程為:

每台計算機上都自帶了一個DNS客戶端,由客戶端生成查詢信息(如果瀏覽器訪問速度較慢的話,可以嘗試加上114這個dns)

114.114.114.114 為國內通過的DNS解析伺服器,訪問國內網址好一點

8.8.8.8 為google提供的全球通過DNS解析,訪問國外網址好一點

會首先發送到最近的一台DNS伺服器,如果最近一台沒有相應的域名信息,則根據域名分層進行查找,如vms-service.tezign.com ,這個域名後面其實是隱藏了/. 所以會先發到跟DNS伺服器,在跟服務裡面找到com的地址,然後com的伺服器裡面保存了tezign的信息,將請求進一步轉發到tezign,tezign裡面找到vms-service,然後再進行返回(這裡面澄清一下所謂的全球的只有13台根伺服器,🇺🇸佔了9台,美國可以隨時斷中國的網路,純屬扯斷,並且13台也只是一個泛化的概念,真實的機器可能幾百幾千台鏡像伺服器分布世界各地,中國也是負責F、I、K、L根鏡像伺服器的管理 )

Class: 網路類型 互聯網為IN

記錄類型: A表示的是IP地址

<colgroup><col width="200"><col width="100"><col width="100"><col width="149"></colgroup>
|

域名

|

Class

|

記錄類型

|

響應數據

|
|

vms-service.tezign.com

|

IN

|

A

|

10.80.82.192(env4)

|

首先我們要明確 應用程序並不具備發送任何信息到網路上的能力,包括協議棧也不具備。真正能發的是網卡,但是網卡只認識 0跟1,所以應用程序想要發送的信息,需要經過協議棧進行包裝。

網路中傳輸的最小單位是包:

對於TCP/IP 我們可以這樣理解: 發快遞時候 TCP是快遞單 IP是快遞盒。

快遞單上描述了雙方的各種信息,而快遞盒決定了裡面發送的物品不能超過快遞盒的容量

套接字(Socket)是一個虛擬概念,他的實體其實是各種通信控制信息(簡單的理解就是ip:port),通過兩個套接字可以實現端與端的通信(一台機器上可能同時存在多個socket,但是一個埠同時只能存在一個socket,這也是為什麼有時候tomcat異常退出後 再次啟動報埠被佔用的原因,socket未關閉 埠未被釋放 無法進行下次通信)

要想實現雙方通信必須通信雙方交換各自的同學控制信息(典型的信息ip、port),就像發郵件或者快遞一樣,必填發送人地址 接收方地址,這樣接收方就能根據發送人地址進行回信。

連接的實際操作如下:

根據發送數據量的長度,還有每個包能發送的最大數據量(MSS),就可以算出這次請求發送了多個包,每個包發送的位數是多少到多少。(抓包工具 wireshark )

可以看到滑鼠選中這行seq為20269 len為135,所以第二行seq我20269+135=20404 ack全部為11代表全部為發送或者接收(也可以注意到前面的source與dst 分別代表著發送與接收的ip)

可以看到source與dst分別與上面相反,代表著上面的響應或者發送,可以看到ACK為20404 seq為11正好跟上面完全相反。

他們之間的規律是seq 代表著發送方發送的數據起始位數(第一次發送的起始位並不是0或者1而是一個隨機數),ack代表著接收方接收到的位數+1(如ack為1000則代表接收了999的數據下一次希望接收到1000開頭的數據)

在這里可能很多人想到了三次握手四次揮手,但是不必糾結為什麼是三次,兩次不行嗎。他們的最終目的都是為了數據的安全有效傳輸。

三次握手:

目的: 連接到伺服器的指定埠,並建立TCP連接,同步雙方的序列號和確認號並交換TCP窗口信息

1、第一次握手 客戶端發送一個沒有數據的包(tcp頭 syn = 1 seq = x)給服務端, 代表客戶端進入syn-send(同步已發送)狀態

2、第二次握手 服務端接收報文後,如果同意建立連接會返回一個syn = 1 seq = y = x+1 ack = x +1的數據包,代表服務端也進入syn-send(同步已收到)

3、第三次握手 客戶端接收到服務端的響應後 再次給服務端發送 seq = x + 1 ack = y+1 代表客戶端收到服務端的確認信息,並再次發送給服務端表示 我確認了你的確認 這時雙方都進入 ESTABLISHED狀態,雙方可以傳輸數據了

為什麼客戶端要發送兩次請求給服務端?

第二次返回給服務端的確認信息之前,其實雙方已經都是處於syn-send狀態 已經可以開始通信了,但是因為存在數據丟失(丟包),所以存在重試機制,如果第一次請求失敗,會在一段時間後重試第二次,如果恰好第一次失敗是網路問題或者其他臨時阻塞問題,那麼就會產生同時兩個請求並且 第二次重試的正確請求可能會被遺棄,數據返回到被客戶端放棄的第一次失敗請求上。

刪除階段 可能客戶端主動斷開,也可能服務端主動斷開。

四次揮手:

以客戶端主動發起斷開連接為例

1、第一次揮手:客戶端發送FIN =1 給服務端,表示我沒數據發了,你還有沒有數據發?沒數據就👋🏻了

2、第二次揮手:伺服器發送ACK = 1 表示我收到你的消息了,但是要不要關閉 我還要看一下數據還要不要發,先給你回個信,你先等一會

3、第三次揮手:服務端發送FIN = 1 表示我沒數據了,你關吧

4、第四次揮手:客戶端發送 ACK = 1 表示我關好了 你也關吧。

可能有人覺得第二次揮手是不是沒有必要 可以將第二次跟第三次揮手結合到一個包發送這樣效率不是更高嗎,其實這裡面也有一個問題存在就是,服務端接收到客戶端發送的關閉請求後 並不會立即關閉,但是也不能客戶端傻等著,必須要立即返回一個應答ack 表示信息收到,否則的話 客戶端可能會重發該信息。

整體流程如下:

上面的傳輸 僅僅只是指的將數據通過協議棧組裝成包,通過網卡轉換為光或者電信號進行發送,而從網卡到伺服器這段,則是需要整個互聯網的協助。比如我們在weWork發送的一條信息, 它的旅程應該是在被組裝成包之後,首先會通過ip找到最近的路由器,也就是weWork的路由器,weWork的路由器再會根據包裡面目標地址的ip查找到下一個路由地址 並覆蓋掉包裡面之前的MAC地址(也可以稱為改寫),就這樣通過乙太網依次傳遞直到發送到最終目的地。

操作跟客戶端相反,由網卡接收到光或者電信號,並將其轉換為數字信號0跟1。轉換完成後會檢查包的格式,有沒有被分片,及是否自己為接收方等等信息。

如果都符合的話,數據會被交到tcp模塊進行處理,根據ip port等信息確定該數據是傳輸給哪個套接字的,找到後將數據read到應用程序。

⑶ android怎麼實現HTTP長連接

轉載 這種功能實際上就是數據同步,同時要考慮手機本身、電量、網路流量等等限制因素,所以通常在移動端上有一下兩個解決方案: 1.一種是定時去server查詢數據,通常是使用HTTP協議來訪問web伺服器,稱Polling(輪詢); 2.還有一種是移動端和伺服器建立長連接,使用XMPP長連接,稱Push(推送)。 從耗費的電量、流量和數據延遲性各方面來說,Push有明顯的優勢。但是使用Push的缺點是: 對於客戶端:實現和維護相對成本高,在移動無線網路下維護長連接,相對有一些技術上的開發難度。 對於伺服器:如何實現多核並發,cpu作業調度,數量龐大的長連接並發維護等技術,仍存在開發難點。 在講述Push方案的原理前,我們先了解一下移動無線網路的特點。 移動無線網路的特點: 因為 IP v4 的 IP 量有限,運營商分配給手機終端的 IP 是運營商內網的 IP,手機要連接 Internet,就需要通過運營商的網關做一個網路地址轉換(Network Address Translation,NAT)。簡單的說運營商的網關需要維護一個外網 IP、埠到內網 IP、埠的對應關系,以確保內網的手機可以跟 Internet 的伺服器通訊 GGSN(Gateway GPRS Support Node 網關GPRS支持結點)模塊就實現了NAT功能。 因為大部分移動無線網路運營商都是為了減少網關的NAT映射表的負荷,所以如果發現鏈路中有一段時間沒有數據通訊時,會刪除其對應表,造成鏈路中斷。(關於NAT的作用及其原理可以查看我的另一篇博文:關於使用UDP(TCP)跨區域網,NAT穿透的心得) Push在Android平台上長連接的實現: 既然我們知道我們移動端要和Internet進行通信,必須通過運營商的網關,所以,為了不讓NAT映射表失效,我們需要定時向Internet發送數據,因為只是為了不然NAT映射表失效,所以只需發送長度為0的數據即可。 這時候就要用到定時器,在android系統上,定時器通常有一下兩種: 1.java.util.Timer 2.android.app.AlarmManager 分析: Timer:可以按照計劃或者時間周期來執行相關的任務。但是Timer需要用WakeLock來讓CPU保持喚醒狀態,才能保證任務的執行,這樣子會消耗大量流量;當CPU處於休眠的時候,就不能喚醒執行任務,所以應用於移動端明顯是不合適。 AlarmManager:AlarmManager類是屬於android系統封裝好來管理RTC模塊的管理類。這里就涉及到RTC模塊,要更好地了解兩者的區別,就要明白兩者真正的區別。 RTC(Real- Time Clock)實時鬧鍾在一個嵌入式系統中,通常採用RTC 來提供可靠的系統時間,包括時分秒和年月日等;而且要求在系統處於關機狀態下它也能夠正常工作(通常採用後備電池供電),它的外圍也不需要太多的輔助電路,典型的就是只需要一個高精度的32.768KHz 晶體和電阻電容等。(如果對這方面感興趣,可以自己查閱相關資料,這里就說個大概) 好了,回來正題。所以,AlarmManager又稱全局定時鬧鍾。這意味著,當我用使用AlarmManager來定時執行任務,CPU可以正常地休眠,只有在執行任務是,才喚醒CPU,這個過程是很短時間的。 下面簡單來說明其使用: 1.類似於Timer功能: //獲得鬧鍾管理器 AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); //設置任務執行計劃 am.setRepeating(AlarmManager.ELAPSED_REALTIME, firstTime, 5*1000, sender);//從firstTime才開始執行,每隔5秒再執行 2.實現全局定時功能: //獲得鬧鍾管理器 AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); //設置任務執行計劃 am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 5*1000, sender);//從firstTime才開始執行,每隔5秒再執行 總結:在android客戶端使用Push推送時,應該使用AlarmManager來實現心跳功能,使其真正實現長連接。

⑷ tcp長連接如何實現

關於面向 tcp/ip 協議的可靠連接的網路 socket 編程,必須要按照 tcp/ip協議的 server/client 模型進行編程和調試。

⑸ 安卓網路編程中長連接怎麼實現

double sinx(double x)
{
double result=x,temp=x;
double den=x,fac=1;
int n=1,sign=1;
while((temp>1e-5)||(temp<-1e-5))
{
n++,fac*=n,den*=x;
n++,fac*=n,den*=x;
temp=den/fac;sign=-sign;
result=sign>0?result+temp:result-temp;
}
return result;
}

double cosx(double x)
{
x=1.57079-x;
return sinx(x);
}

main()
{
double a,b,c;
scanf("%lf",&a);
b=sinx(a);
c=cosx(a);
printf("sin(%lf)=%lf,cos(%lf)=%lf",a,b,a,c);
}

網路連接中的長連接和短鏈接是什麼意思

短連接

連接->傳輸數據->關閉連接

比如HTTP是無狀態的的短鏈接,瀏覽器和伺服器每進行一次HTTP操作,就建立一次連接,但任務結束就中斷連接。

具體就是:瀏覽器client發起並建立TCP連接 -> client發送HttpRequest報文 -> server接收到報文->server handle並發送HttpResponse報文給前端,發送完畢之後立即調用socket.close方法

->client接收response報文->client最終會收到server端斷開TCP連接的信號->client 端斷開TCP連接,具體就是調用close方法。


也可以這樣說:短連接是指SOCKET連接後,發送接收完數據後馬上斷開連接。
因為連接後接收了數據就斷開了,所以每次數據接受處理不會有聯系。 這也是HTTP協議無狀態的原因之一。


長連接

連接->傳輸數據->保持連接 -> 傳輸數據-> ...........->直到一方關閉連接,多是客戶端關閉連接。

長連接指建立SOCKET連接後不管是否使用都保持連接,但安全性較差。


HTTP在短鏈接和長連接上的選擇:

HTTP是無狀態的 ,也就是說,瀏覽器和伺服器每進行一次HTTP操作,就建立一次連接,但任務結束就中斷連接。

如果客戶端瀏覽器訪問的某個HTML或其他類型的 Web頁中包含有其他的Web資源,如JavaScript文件、圖像文件、CSS文件等;當瀏覽器每遇到這樣一個Web資源,就會建立一個HTTP會話

HTTP1.1和HTTP1.0相比較而言,最大的區別就是增加了持久連接支持(貌似最新的HTTP1.1 可以顯示的指定 keep-alive),但還是無狀態的,或者說是不可以信任的。
如果瀏覽器或者伺服器在其頭信息加入了這行代碼 Connection:keep-alive


TCP連接在發送後將仍然保持打開狀態,於是,瀏覽器可以繼續通過相同的連接發送請求。保持連接節省了為每個請求建立新連接所需的時間,還節約了帶寬。
實現長連接要客戶端和服務端都支持長連接。


什麼時候用長連接,短連接?
長連接多用於操作頻繁,點對點的通訊,而且連接數不能太多情況。

每個TCP連接都需要三步握手,這需要時間,如果每個操作都是先連接,再操作的話那麼處理速度會降低很多,所以每個操作完後都不斷開,次處理時直接發送數據包就OK了,不用建立TCP連接。

例如:資料庫的連接用長連接, 如果用短連接頻繁的通信會造成socket錯誤,而且頻繁的socket 創建也是對資源的浪費。

WEB網站的http服務一般都用短鏈接,因為長連接對於服務端來說會耗費一定的資源,而像WEB網站這么頻繁的成千上萬甚至上億客戶端的連接用短連接會更省一些資源,如果用長連接,而且同時有成千上萬的用戶,如果每個用戶都佔用一個連接的話,那可想而知吧。所以並發量大,但每個用戶無需頻繁操作情況下需用短連好。

總之,長連接和短連接的選擇要視情況而定。




⑺ 保持長連接是什麼意思

所謂長連接,指在一個連接上可以連續發送多個數據包,在連接保持期間,如果沒有數據包發送,需要雙方發鏈路檢測包。短連接是指通訊雙方有數據交互時,就建立一個連接,數據發送完成後,則斷開此連接,即每次連接只完成一項業務的發送。

長連接多用於操作頻繁,點對點的通訊,而且連接數不能太多情況,。每個TCP連接都需要三步握手,這需要時間,如果每個操作都是先連接,再操作的話那麼處理速度會降低很多,所以每個操作完後都不斷開,下次處理時直接發送數據包就OK了,不用建立TCP連接。例如:資料庫的連接用長連接,如果用短連接頻繁的通信會造成socket錯誤,而且頻繁的socket
創建也是對資源的浪費。

而像WEB網站的http服務一般都用短鏈接,因為長連接對於服務端來說會耗費一定的資源,而像WEB網站這么頻繁的成千上萬甚至上億客戶端的連接用短連接會更省一些資源,如果用長連接,而且同時有成千上萬的用戶,如果每個用戶都佔用一個連接的話,那可想而知吧。所以並發量大,但每個用戶無需頻繁操作情況下需用短連好。

總之,長連接和短連接的選擇要視情況而定。

⑻ 如何高效維持網路長連接:手把手教你實現 自適應的心跳保活機制

通過 長時間保持雙方連接 ,從而:

下面,我將對每種原因進行分析

當進程被殺死後,長連接也會隨之斷開

當移動客戶端網路狀態發生變化時(如移動網路 & Wifi切換、斷開、重連),也會使長連接斷開

如網路狀態差、 DHCP 的租期到期等等,都會使得長連接發生 偶然的斷開

其實,說得簡單點: 高效維持長連接的關鍵在於

整體概括如下:

這是本文的重點,下節開始會詳細解析

對國、內外主流的移動 IM 產品( WhatsApp 、 Line 、微信)進行了心跳機制的簡單分析 & 對比,具體請看下圖

下面,將根據市面上主流的心跳機制,設計 一套心跳機制方案

在下面的方案設計中,將針對這3個問題給出詳細的解決方案。

為了減少流量 & 提高發送效率,需要精簡心跳包的設計

主要從心跳包的內容 & 大小入手,設計原則具體如下

心跳包 = 1個 攜帶少量信息 & 大小在10位元組內 的信息包

為了 防止 NAT 超時 & 減少設備資源的消耗(網路流量、電量、CPU等等), 心跳發送的間隔時間 是 整個 心跳機制方案設計的重點。

心跳發送間隔時間的設計原則如下

下面,我將詳細講解 自適應心跳間隔時間 的設計方案

1.如何自適應計算心跳間隔 從而使得心跳間隔 接近 當前 NAT 超時時間?

註:只有當心跳間隔 接近 NAT 超時時間 時, 才能最大化平衡 長連接不中斷 & 設備資源消耗最低的問題

2.如何檢測 當前網路環境的 NAT 超時時間 發生了變化 ?

註:在檢測到 NAT 超時時間 發生變化後,重新自適應計算心跳間隔 從而使得心跳間隔 接近 NAT 超時時間

該機制的核心在於, 如何 判斷長連接的有效性

在網上流傳著一些用於判斷長連接是否有效的方案,具體介紹如下

至此,關於心跳保活機制已經講解完畢。

很多人認為, TCP 協議自身就有 KeepAlive 機制,為何基於它的通訊鏈接,仍需 在應用層實現額外的心跳保活機制

先來看看 KeepAlive 機制 是什麼

KeepAlive 的機制 不可 替代心跳機制 的具體原因如下:

KeepAlive 機制無法代替心跳機制, 需要在應用層 自己實現心跳機制以檢測長連接的有效性,從而高效維持長連接

不定期分享關於 安卓開發 的干貨,追求 短、平、快 ,但 卻不缺深度