導航:首頁 > 源碼編譯 > s型增長速率演算法

s型增長速率演算法

發布時間:2024-10-26 20:16:18

① 計算機網路(5)| 運輸層

從通信和處理信息的角度看,運輸層是向它上面的應用層提供通信服務的,它屬於面向通信部分的最高層,同時也是用戶功能中的最低層。當網路的邊緣部分中的兩台主機使用網路的核心部分的功能進行端到端的通信時,只有主機的協議棧才有運輸層,而網路核心部分中的路由器在轉發分組時都只用好弊輪到下三層的功能。

運輸層的兩個主要協議 TCP/IP 都是互聯網的正式標准,即:
(1)用戶數據報協議UDP
(2)傳輸控制協議TCP

TCP則是面向連接的服務。在傳送數據之前必須先建立連接,數據傳送結束後要釋放連接。TCP不提供廣播或者多播服務。由於TCP要提供可靠的面向連接的運輸服務,因此需要增加很多的開銷。

TCP/IP的運輸層用一個16位埠號來標志一個埠。埠號只有本地意義。它是為了標志本計算機應用層中的各個進程在和運輸層交互時的層間介面。

運輸層的埠號分為以下兩類:
(1)伺服器端使用的埠號: 它主要分為系統埠號0~1023和登記埠號1024~49151。

(2)客戶端使用的埠號: 49152~65535,這類埠號僅在客戶端進程運行時才動態選擇。當伺服器收到客戶端進程的報文時,就知道客戶端進程的埠號。因而可以把數據發送給客戶進程。

用戶數據報協議相比於IP的數據報服務就是只增加了復用、分用和差錯檢測功能。UDP的主要特點是:
(1)UDP是無連接的, 發送數據之前不需要建立連接,因此減少開銷和發送數據之前的時延。
(2)UDP使用盡最大努力交付, 即不保證可靠交付,因此主機不需要維持復雜的連接狀態表。
(3)UDP是面向報文的。 發送方的UDP對應用交下來的報文,添加首部後就向下交付給IP層。不對報文做任何處理,因此當報文過長時,IP層可能需要進行分片處理。
(4)UDP沒有擁塞控制, 網路出現的擁塞不會使源主機的發送速率減低。
(5)UDP支持一對一、一對多、多對一和多對多的交互通信。
(6)UDP的首部開銷小, 只有8個位元組。

UDP有兩個欄位:數據欄位和首部欄位。先介紹首部欄位,它是由4個欄位組成的,每個欄位只有2個位元組,總共有8個位元組。各個欄位的意義如下:
(1)源埠: 源埠號。在需要對方回信時選用。不需要時可用全0。
(2)目的埠: 目的埠號。在這終點交付報文時必須使用。
(3)長度: UDP用戶數據報的長度,其最小值是8(只有首部)。
(4)檢驗和: 檢測UDP用戶數據報在傳輸中是否有錯,有錯則丟棄。

當在傳卜瞎送用戶數據報時,如果接收方UDP發現收到的報文中目的埠號不正確(即不存在對應於該埠號的應用進程),就丟棄該報文,並由網際控制報文協議ICMP發送「埠不可達」差錯報文給發送方。

TCP的主要特點如下:
(1)TCP是面向連接的運輸層協議。 應用程序在使用TCP協議之前,必須先建立TCP連接。傳送數據完畢後,必須釋放TCP連接。
(2)每一條TCP連接只能有兩個端點。 每一條TCP連接只能是點對點的。
(3)TCP提供可靠交付的服務。 通過TCP連接傳送的數據,無差錯、不丟失、不重復,並且按序到達。
(4)TCP提供全雙友信工通信。 TCP允許通信雙方的應用進程在任何時候都能發送數據。
(5)面向位元組流。 TCP中的流指的是流入到進程或進程流出的位元組序列。雖然應用程序和TCP的交互是一次一個數據塊,但TCP把應用程序交下來的數據看成一連串的無結構的位元組流。TCP不保證發送方發送的數據塊和接收方接收的數據塊一致,但保證程序接收到的位元組流和程序發送的位元組流一致。

TCP連接的端點叫做套接字或者插口。套接字是指將埠號拼接到IP地址之後,即:

每一條TCP連接唯一的被通信兩端的兩個端點所確定。即:

如圖所示,A發送分組M1,發送完畢就暫停發送,等待B的確認,B收到了M1就向A發死你確認。A在收到了對M1的確認之後,就再發送下一個分組M2,以此類推。

如圖所示,當B接收M1時檢測出了差錯,就丟棄M1,其他什麼也不做。而A只要超過了一段時間沒有收到確認,就會認為剛才發送的分組丟失了,因而重傳前面發送過的分組,這就叫做超時重傳,而實現超時重傳則需要A為每一個已發送的分組都設置一個超時計時器。
需要注意以下三點:
(1)A在發送完一個分組後,必須暫時保留已發送的分組的副本。
(2)分組和確認分組必須編號,這樣才能明確哪一個發出的分組收到了確認。
(3)超時計時器設置的重傳時間應當比數據在分組傳輸的平均往返時間更長。

如圖所示,B所發送的對M1確認丟失了,A在設定的超時重傳時間內沒有收到確認,所以無法知道自己發送的分組是怎樣出錯的,所以會重傳M1,而當B又收到了重傳的分組M1,這時應該採取兩個行動:
(1)丟棄這個重復分組M1。
(2)向A發送確認。

還有一種情況就是在傳輸過程中沒有出現差錯,但B對分組M1的確認遲到了,而A會收到重復的確認,A收下後就會丟棄,B仍然會收到重復的M1,並且同樣要丟棄重復的M1,並且重傳確認分組。

停止等待協議的優點是簡單,缺點則是信道的利用率太低。我們用TD表示A發送分組需要的時間,TA表示B發送確認分組需要的時間,RTT為往返時間,則:

為了提高傳輸的效率,發送方可以不使用低效率的停止等待協議,而是採用流水線傳輸的方式。即不必每發完一個分組就停下來等待對方的確認,這樣就可以使信道上一直有數據在不間斷的傳送。

如圖表示的是發送方維持的發送窗口,它指的是位於發送窗口內的5個分組都可以連續發送出去而不需要等待對方的確認。同時連續ARP協議規定,發送方每收到一個確認,就把發送窗口向前滑動一個分組的位置。

對於接收方採用的則是累計確認的方式,即接收方不必對收到的分組逐個發送確認。而是在收到幾個分組後,對按序到達的最後一個分組發送確認,這就表示:到這個分組為止的所有分組都已正確收到了。這種方式的優點是:容易實現,即使確認丟失也不必重傳(意思是發送方不必重傳)。但缺點是不能向發送方反映出接收方已經正確收到的所有分組信息。

TCP雖然是面向位元組流的,但傳送TCP的數據單元卻是報文段。一個TCP報文段可以分為首部和數據兩部分。

為了後面講述的方便,我們假設數據傳輸只在一個方向進行,即A發送數據,B給出確認。

TCP的滑動窗口是以位元組為單位的。如圖所示,現在假定A收到了B發來的確認報文段,其中的窗口是20位元組,而確認號是31,根據這2個數據,A就構造出自己的發送窗口。

發送窗口表示:在沒有收到B的確認的情況下,A可以連續把窗口內的數據都發送出去。凡是已經發送過的數據,在未收到確認之前都必須暫時保留,以便在超時重傳時使用。發送窗口後面的部分表示已發送且已經收到了確認。而發送窗口前沿的部分表示不允許發送的。

現在假定A發送了序號為31~41的數據。這時發送窗口位置並未改變但是發送窗口內靠後面有11個位元組表示已發送但是未收到確認。而發送窗口內靠前面的9個位元組時允許發送但未發送的。如圖所示:

而對於B,它的接收窗口大小是20,在接收窗口外面到30號位置的數據是接收並確認的,因此可以丟棄。在下圖中,B收到了32和33的數據,但它們不是按序到達的,因為並沒有收到31號數據。B只能對按序達收到的數據中的最高序號給出確認,因此B發送的確認報文欄位的確認號依然是31號。

現在假定B收到了序號為31的數據,並把31~33的數據交付主機,然後B刪除這些數據。接著把窗口向前移動3個序號,同時給a發送確認,其中的窗口值仍為20,但確認號變為34。表明B已經收到序號33為止的數據。

因為TCP的發送方在規定的時間內沒有收到確認就要重傳已經發送的報文段,但是重傳時間的選擇卻TCP最復雜的問題之一。為此TCP採用了一種自適應演算法,它記錄了一個報文段發出的時間以及收到相應的確認的時間。這兩個時間之差就是報文段的往返時間RTT,同時TCP保留了RTT的加權平均往返時間RTTs。而RTTD是RTT的偏差加權平均值,它與RTTs和新的RTT樣本之差有關。

超時重傳時間的演算法如下:
第一次測量時,加權平均往返時間取往返時間RTT,以後每次測量到一個新的RTT,按以下公式計算:

第一次測量時,RTT偏差的加權平均等於RTT的一半,以後的測里中,按以下公式計算:

綜上超時重傳時間RTO計算如下:

若收到的報文無差錯,只是未按序號,使用選擇確認SACK可是讓發送方發送那些未收到的數據,而不重復發送已經收到的那些數據。如果要使用選擇確認SACK,那麼在建立TCP連接時,就要在TCP首部的選項中加上「允許SACK」的選項,並且雙方必須都事先商量好。

流量控制就是指讓發送方的發送速率不要太快,要讓接收方來得及接收。而利用滑動窗口機制就可以很方便的在TCP連接上實現對發送方的流量控制。

如上圖所示,接收方B進行了三次流量控制。第一次把窗口減小到rwnd=300,第二次又減到rwnd=100,最後是rwnd=0,即不允許發送方再發送數據了。

但是我們應該考慮一種情況,就是當接收方B的存儲已滿時,會向發送方發送零窗口的報文段,接著B的存儲又有了一些空間,B再向A發送一個不為零的窗口值,但這個報文丟失了,結果就是雙方一直等待下去。所以為了解決這個問題,TCP為每一個連接設有一個持續計時器。只要TCP連接的一方收到對方的零窗口通知,就啟動持續計時器,當計時器到期後,就發送一個探測段文段,而對方就在確認這個探測段時給出了現在的窗口值。如果窗口仍然是0,那麼收到這個報文段的一方就重新設置持續計時器,反之則死鎖的僵局就可以打破了。

應用程序把數據傳送到TCP的發送緩存後,TCP在何時發送這些數據?,在TCP的實現中廣泛使用了Nagle演算法。具體演算法如下:
(1)若發送應用進程要把數據逐個位元組地送到TCP的發送緩存,則發送方就把第一個數據位元組先發出去,把後面到達的數據位元組都緩存起來。
(2)方發送方收到對第一個數據位元組的確認後,再把發送緩存中的所有數據組裝成一個報文發送出去,同時繼續對後續到來的數據進行緩存。
(3)只有收到對前一個報文段的確認後才繼續發送下一個報文段。

當數據到達快而網路速度慢時,這種方法可以明顯減少網路帶寬。Nagle還規定:當到達的數據達到窗口的一半或最大報文長度時就立即發送一個報文。

但還還需要考慮一個叫做糊塗綜合征的問題,具體內容是若接收方的緩存已滿,應用進程每次只從緩存中取1個位元組,然後向發送方確認,並把窗口設為1個位元組(緩存只空了1個位元組的空間),接著發送方發來1個位元組,接收方發回確認,仍然將窗口設為1,這樣進行下去,網路的利用率很低。

為了解決這個問題,可以讓接收方等待一段時間,使得或者緩存已有足夠的空間或者等到接收緩存已有一半的空閑空間。此時,接收方就發出確認報文,並向發送方通知當前窗口的大小。

擁塞 是指在某一段時間內,若對網路中某一資源的需求超過了該資源所能提供的可用部分,網路的性能就會變壞的情況。而所謂的 擁塞控制 就是防止過多的數據注入到網路當中,這樣可以使網路中的路由器或者鏈路不致過載,它是一個全局性的過程,涉及到所有的主機和路由器,而流量控制往往是指點對點通信量的控制。擁塞控制所要做的都有一個前提,就是網路能夠承受現有的網路負荷。

TCP進行擁塞控制的演算法有4種:慢開始、擁塞避免、快重傳和快恢復。下面在討論這些演算法時我們假定:
(1)數據是單方向傳送的,對方只傳送確認報文。
(2)接收方總是有足夠大的緩存空間。

發送方維持一個擁塞窗口的狀態變數,其大小取決於擁塞程度,並且動態變化。發送方讓自己的發送窗口小於擁塞窗口(如果考慮接收方的接收能力的話,發送窗口可能小於擁塞窗口)。發送方控制擁塞窗口的原則是:只要網路沒有擁塞,擁塞窗口就再增大一點,以便把更多的分組發送出去,只要出現擁塞,就減小擁塞窗口,以減少注入到網路的分組數。

下面會從「慢開始演算法」講起來討論擁塞窗口的大小如何變化的。

慢開始的演算法思路是:當主機開始發送數據時,由於並不清楚網路的負荷情況,所以如果立即把大量數據位元組注入到網路中,就有可能引起網路擁塞。因此會採用由小逐漸增大發送窗口。即在通常開始發送報文時,先將擁塞窗口cwnd的值設為一個最大報文段MSS的數值,而在每收到一個新的報文段確認後,把擁塞窗口增加至多一個MSS的數值。

如上圖所示,開始時cwnd=1,發送方發送一個M1,接收方收到M1發送確認,發送方收到一個確認後將cwnd加1,此時cwnd=2,因此發送方發送M2和M3兩個報文段,接收方收到後返回兩個確認,因此cwnd增加兩次,此時cwnd=4,接著發送方發送M4~M7四個報文段。依次類推。因此使用慢開始演算法後,每經過一個傳輸輪次,擁塞窗口就加倍。

但是為了防止擁塞窗口cwnd增加過大導致網路擁塞,需要設置一個慢開始門限ssthresh,慢開始門限用法如下:
當cwnd<ssthresh時,使用上述的慢開始演算法。
當cwnd>ssthresh時,停止使用慢開始演算法,使用擁塞避免演算法。
當cwnd=ssthresh時,既可以使用慢開始演算法,也可以使用擁塞避免演算法。
這里的擁塞避免演算法是指讓擁塞窗口緩慢的增大,即每經過一個往返時間RTT就把發送方的擁塞窗口cwnd加1,而不是像慢開始階段那樣加倍增長。

需要注意的是無論在慢開始階段還是擁塞避免階段,只要發送方判斷網路出現擁塞(根據是沒有按時收到確認),立即把慢開始門限ssthresh設為出現擁塞時的發送窗口的一半。然後發送窗口cwnd重新設為1,執行慢開始演算法。目的是迅速減少主機發送到網路分組的分組數。

快重傳演算法要求接收方每收到一個失序的報文段後就立即發送重復確認,如下圖接收了M1和M2後,又接收到一個M4,M4屬於失序報文,則發送對M2的重復確認。發送方只要連續收到三次確認重復就立即重傳對方未收到的報文段M3。

與快重傳演算法配合的還有快恢復演算法,過程如下:
(1)當發送方連續收到三個重復確認時,就把慢開始門限ssthresh減半,這是為了防止網路擁塞,接著並不執行慢開始演算法。
(2)由於上圖這種情況很可能不是因為網路擁塞引起的,因此這里不執行慢開始演算法(即不把擁塞窗口cwnd設為1,這樣速度太慢),而是把cwnd值設置為慢開始門限ssthresh減半後的數值,然後開始執行擁塞避免演算法。

TCP的運輸連接有是三個階段:連接建立、數據傳送和連接釋放。在TCP的連接過程中要解決以下三個問題:
(1)要使每一方能夠確知對方的存在。
(2)要允許雙方協商一些參數(如最大窗口值、是否使用窗口擴大選項和時間戳選項以及服務質量)。
(3)能夠對運輸實體資源進行分配。

TCP建立連接的過程叫做握手,握手需要在客戶和伺服器之間交換3個TCP報文段。如圖是三報文握手建立的連接過程:

A最後還要發送一次確認的原因是為了防止已經失效的連接請求報文段突然又傳送到了B,因而產生錯誤。試想一種情況:如果只有第一次和第二次握手,第二次B向A發送的確認丟失了,此時B進入了連接建立狀態,A沒有收到確認,過一段時間後會再次向B發送連接請求,B收到後又會再次建立連接,白白浪費B的資源。

A在TIME-WAIT狀態等待2MSL(MSL,最長報文段壽命),主要是因為以下兩點考慮:首先是為了保證A發送的最後一個ACK報文段能夠到達B,因為這個ACK報文段可能丟失,此時B會重傳連接釋放報文,如果A已經關閉,則無法收到這個報文。其次,當A在發送完最後一個ACK報文段後,再經過時間2MSL,就可以使本連接持續時間內產生的所有報文段都從網路中消失。這樣,下一個新連接中不會出現這種舊的連接請求報文段。

在圖中每一個方框即TCP可能具有的狀態。每個方框中的大寫英文字元串時TCP標准所使用的的TCP連接狀態名。狀態之間的箭頭表示可能發生的狀態變遷。箭頭旁邊的字表明引起這種變遷的原因,或表明發生狀態變遷後又出現什麼動作,在圖中粗實線箭頭表示對客戶進程的正常變遷,粗虛線箭頭表示對伺服器進程的正常變遷,細線箭頭表示異常變遷。

② 公務員考試中資料分析題有沒有什麼快速解題方法

資料分析十大速算技巧★【速算技巧一:估演算法】
要點:"估演算法"毫無疑問是資料分析題當中的速算第一法,在所有計算進行之前必須考慮
能否先行估算。所謂估算,是在精度要求並不太高的情況下,進行粗略估值的速算
方式,一般在選項相差較大,或者在被比較數據相差較大的情況下使用。估算的方
式多樣,需要各位考生在實戰中多加訓練與掌握。
進行估算的前提是選項或者待比較的數字相差必須比較大,並且這個差別的大小決
定了"估算"時候的精度要求。
★【速算技巧二:直除法】
「直除法」是指在比較或者計算較復雜分數時,通過「直接相除」的方式得到商的首位(首一位或首兩位),從而得出正確答案的速算方式。「直除法」在資料分析的速算當中有非常廣泛的用途,並且由於其「方式簡單」而具有「極易操作」性。
「直除法」從題型上一般包括兩種形式:
一、比較多個分數時,在量級相當的情況下,首位最大/小的數為最大/小數;
二、計算一個分數時,在選項首位不同的情況下,通過計算首位便可選出正確答案。
「直除法」從難度深淺上來講一般分為三種梯度:
一、簡單直接能看出商的首位;
二、通過動手計算能看出商的首位;
三、某些比較復雜的分數,需要計算分數的「倒數」的首位來判定答案。
根據首兩位為1.5*得到正確答案為C。
★【速算技巧三:截位法】
所謂"截位法",是指"在精度允許的范圍內,將計算過程當中的數字截位(即只看或
者只取前幾位),從而得到精度足夠的計算結果"的速算方式。
在加法或者減法中使用"截位法"時,直接從左邊高位開始相加或者相減(同時注意
下一位是否需要進位與借位),直到得到選項要求精度的答案為止。
在乘法或者除法中使用"截位法"時,為了使所得結果盡可能精確,需要注意截位近
似的方向:
一、 擴大(或縮小)一個乘數因子,則需縮小(或擴大)另一個乘數因子;
二、 擴大(或縮小)被除數,則需擴大(或縮小)除數。
如果是求"兩個乘積的和或者差(即a×b±c×d)",應該注意:

三、 擴大(或縮小)加號的一側,則需縮小(或擴大)加號的另一側;
四、 擴大(或縮小)減號的一側,則需擴大(或縮小)減號的另一側。
到底採取哪個近似方向由相近程度和截位後計算難度決定。
一般說來,在乘法或者除法中使用"截位法"時,若答案需要有N位精度,則計算過程
的數據需要有N+1位的精度,但具體情況還得由截位時誤差的大小以及誤差的抵消
情況來決定;在誤差較小的情況下,計算過程中的數據甚至可以不滿足上述截位方
向的要求。所以應用這種方法時,需要考生在做題當中多加熟悉與訓練誤差的把握
,在可以使用其它方式得到答案並且截位誤差可能很大時,盡量避免使用乘法與除
法的截位法。
【速算技巧四:化同法】
要點:所謂"化同法",是指"在比較兩個分數大小時,將這兩個分數的分子或分母化為相同
或相近,從而達到簡化計算"的速算方式。一般包括三個層次:

一、 將分子(或分母)化為完全相同,從而只需要再看分母(或分子)即可;
二、 將分子(或分母)化為相近之後,出現"某一個分數的分母較大而分子較小"或
"某一個分數的分母較小而分子較大"的情況,則可直接判斷兩個分數的大小。
三、 將分子(或分母)化為非常接近之後,再利用其它速算技巧進行簡單判定。
事實上在資料分析試題當中,將分子(或分母)化為完全相同一般是不可能達到的
,所以化同法更多的是"化為相近"而非"化為相同"。
★【速算技巧五:差分法】

「差分法」是在比較兩個分數大小時,用「直除法」或者「化同法」等其他速算方式難以解決時可以採取的一種速算方式。

適用形式:
兩個分數作比較時,若其中一個分數的分子與分母都比另外一個分數的分子與分母分別僅僅大一點,這時候使用「直除法」、「化同法」經常很難比較出大小關系,而使用「差分法」卻可以很好地解決這樣的問題。
基礎定義:
在滿足「適用形式」的兩個分數中,我們定義分子與分母都比較大的分數叫「大分數」,分子與分母都比較小的分數叫「小分數」,而這兩個分數的分子、分母分別做差得到的新的分數我們定義為「差分數」。例如:324/53.1與313/51.7比較大小,其中324/53.1就是「大分數」,313/51.7就是「小分數」,而324-313/53.1-51.7=11/1.4就是「差分數」。
「差分法」使用基本准則——
「差分數」代替「大分數」與「小分數」作比較:
1、若差分數比小分數大,則大分數比小分數大;
2、若差分數比小分數小,則大分數比小分數小;
3、若差分數與小分數相等,則大分數與小分數相等。
比如上文中就是「11/1.4代替324/53.1與313/51.7作比較」,因為11/1.4>313/51.7(可以通過「直除法」或者「化同法」簡單得到),所以324/53.1>313/51.7。
特別注意:
一、「差分法」本身是一種「精演算法」而非「估演算法」,得出來的大小關系是精確的關系而非粗略的關系;
二、「差分法」與「化同法」經常聯系在一起使用,「化同法緊接差分法」與「差分法緊接化同法」是資料分析速算當中經常遇到的兩種情形。
三、「差分法」得到「差分數」與「小分數」做比較的時候,還經常需要用到「直除法」。
四、如果兩個分數相隔非常近,我們甚至需要反復運用兩次「差分法」,這種情況相對比較復雜,但如果運用熟練,同樣可以大幅度簡化計算。
★【速算技巧六:插值法】
"插值法"是指在計算數值或者比較數大小的時候,運用一個中間值進行"參照比較"
的速算方式,一般情況下包括兩種基本形式:
一、在比較兩個數大小時,直接比較相對困難,但這兩個數中間明顯插了一個可以
進行參照比較並且易於計算的數,由此中間數可以迅速得出這兩個數的大小關系。
比如說A與B的比較,如果可以找到一個數C,並且容易得到A>C,而B<C,即可以判定
A>B。
二、在計算一個數值f的時候,選項給出兩個較近的數A與B難以判斷,但我們可以
容易的找到A與B之間的一個數C,比如說A<CC,則我們知道
f=B(另外一種情況類比可得)。
★【速算技巧七:湊整法】
"湊整法"是指在計算過程當中,將中間結果湊成一個"整數"(整百、整千等其它方
便計算形式的數),從而簡化計算的速算方式。"湊整法"包括加/減法的湊整,也包
括乘/除法的湊整。

在資料分析的計算當中,真正意義上的完全湊成"整數"基本上是不可能的,但由於
資料分析不要求絕對的精度,所以湊成與"整數"相近的數是資料分析"湊整法"所真
正包括的主要內容。
★【速算技巧八:放縮法】
要點:
"放縮法"是指在數字的比較計算當中,如果精度要求並不高,我們可以將中間結果
進行大膽的"放"(擴大)或者"縮"(縮小),從而迅速得到待比較數字大小關系的
速算方式。
要點:
若A>B>0,且C>D>0,則有:

1) A+C>B+D
2) A-D>B-C
3) A×C>B×D
4) A/D>B/C

這四個關系式即上述四個例子所想要闡述的四個數學不等關系,是我們在做題當中
經常需要用到的非常簡單、非常基礎的不等關系,但卻是考生容易忽略,或者在考
場之上容易漏掉的數學關系,其本質可以用"放縮法"來解釋。
★【速算技巧九:增長率相關速演算法】
計算與增長率相關的數據是做資料分析題當中經常遇到的題型,而這類計算有一些常用的速算技巧,掌握這些速算技巧對於迅速解答資料分析題有著非常重要的輔助作用。

兩年混合增長率公式:
如果第二期與第三期增長率分別為r1與r2,那麼第三期相對於第一期的增長率為:
r1+r2+r1× r2

增長率化除為乘近似公式:
如果第二期的值為A,增長率為r,則第一期的值A′:
A′=A/1+r≈A×(1-r)
(實際上左式略大於右式,r越小,則誤差越小,誤差量級為r2)

平均增長率近似公式:
如果N年間的增長率分別為r1、r2、r3……rn,則平均增長率:
r≈r1+r2+r3+……rn/n
(實際上左式略小於右式,增長率越接近,誤差越小)
求平均增長率時特別注意問題的表述方式,例如:
1.「從2004年到2007年的平均增長率」一般表示不包括2004年的增長率;
2.「2004、2005、2006、2007年的平均增長率」一般表示包括2004年的增長率。

「分子分母同時擴大/縮小型分數」變化趨勢判定:
1.A/B中若A與B同時擴大,則①若A增長率大,則A/B擴大②若B增長率大,則A/B縮小;A/B中若A與B同時縮小,則①若A減少得快,則A/B縮小②若B減少得快,則A/B擴大。
2.A/A+B中若A與B同時擴大,則①若A增長率大,則A/A+B擴大②若B增長率大,則A/A+B縮小;A/A+B中若A與B同時縮小,則①若A減少得快,則A/A+B縮小②若B減少得快,則A/A+B擴大。

多部分平均增長率:
如果量A與量B構成總量「A+B」,量A增長率為a,量B增長率為b,量「A+B」的增長率為r,則A/B=r-b/a-r,一般用「十字交叉法」來簡單計算:
A:a r-b A
r =
B:b a-r B
注意幾點問題:
1.r一定是介於a、b之間的,「十字交叉」相減的時候,一個r在前,另一個r在後;
2.算出來的A/B=r-b/a-r是未增長之前的比例,如果要計算增長之後的比例,應該在這個比例上再乘以各自的增長率,即A′/B′=(r-b)×(1+a)/(a-r)×(1+b)。
等速率增長結論:
如果某一個量按照一個固定的速率增長,那麼其增長量將越來越大,並且這個量的數值成「等比數列」,中間一項的平方等於兩邊兩項的乘積。
★【速算技巧十:綜合速演算法】
「綜合速演算法」包含了我們資料分析試題當中眾多體系性不如前面九大速算技巧的速算方式,但這些速算方式仍然是提高計算速度的有效手段。

平方數速算:
牢記常用平方數,特別是11~30以內數的平方,可以很好地提高計算速度:
121、144、169、196、225、256、289、324、361、400
441、484、529、576、625、676、729、784、841、900

尾數法速算:
因為資料分析試題當中牽涉到的數據幾乎都是通過近似後得到的結果,所以一般我們計算的時候多強調首位估算,而尾數往往是微不足道的。因此資料分析當中的尾數法只適用於未經近似或者不需要近似的計算之中。歷史數據證明,國考試題資料分析基本上不能用到尾數法,但在地方考題的資料分析當中,尾數法仍然可以有效地簡化計算。
錯位相加/減:
A×9型速算技巧:A×9=A×10-A;如:743×9=7430-743=6687
A×9.9型速算技巧:A×9.9=A×10+A÷10;如:743×9.9=7430-74.3=7355.7
A×11型速算技巧:A×11=A×10+A;如:743×11=7430+743=8173
A×101型速算技巧:A×101=A×100+A; 如:743×101=74300+743=75043

乘/除以5、25、125的速算技巧:
A×5型速算技巧:A×5=10A÷2;A÷5型速算技巧:A÷5=0.1A×2
例8739.45×5=87394.5÷2=43697.25
36.843÷5=3.6843×2=7.3686

A× 25型速算技巧:A×25=100A÷4;A÷ 25型速算技巧:A÷25=0.01A×4
例7234×25=723400÷4=180850
3714÷25=37.14×4=148.56

A×125型速算技巧:A×125=1000A÷8;A÷125型速算技巧:A÷125=0.001A×8
例8736×125=8736000÷8=1092000
4115÷125=4.115×8=32.92

減半相加:
A×1.5型速算技巧:A×1.5=A+A÷2;
例3406×1.5=3406+3406÷2=3406+1703=5109

「首數相同尾數互補」型兩數乘積速算技巧:
積的頭=頭×(頭+1);積的尾=尾×尾
例:「23×27」,首數均為「2」,尾數「3」與「7」的和是「10」,互補
所以乘積的首數為2×(2+1)=6,尾數為3×7=21,即23×27=621
這種題是沒有意義的
請補充完善 可以先查閱下資料

③ TCP那些事兒

目錄:

以前我也認為TCP是相當底層的東西,我永遠不需要去了解它。雖然差不多是這樣,但是實際生活中,你依然可能遇見和TCP演算法相關的bug,這時候懂一些TCP的知識就至關重要了。( 本文也可以引申為,系統調用,操作系統這些都很重要,這個道理適用於很多東西
這里推薦一篇小短文, 人人都應該懂點TCP

使用TCP協議通信的雙方必須先建立TCP連接,並在內核中為該連接維持一些必要的數據結構,比如連接的狀態、讀寫緩沖區、定時器等。當通信結束時,雙方必須關閉連接以釋放這些內核數據。TCP服務基於流,源源不斷從一端流向另一端,發送端可以逐位元組寫入,接收端可以逐位元組讀出,無需分段。

需要注意的幾點:

TCP狀態(11種):
eg.

以上為TCP三次握手的狀態變遷

以下為TCP四次揮手的狀態變遷

伺服器通過 listen 系統調用進入 LISTEN 狀態,被動等待客戶端連接,也就是所謂的被動打開。一旦監聽到SYN(同步報文段)請求,就將該連接放入內核的等待隊列,並向客戶端發送帶SYN的ACK(確認報文段),此時該連接處於 SYN_RECVD 狀態。如果伺服器收到客戶端返回的ACK,則轉到 ESTABLISHED 狀態。這個狀態就是連接雙方能進行全雙工數據傳輸的狀態。
而當客戶端主動關閉連接時,伺服器收到FIN報文,通過返回ACK使連接進入 CLOSE_WAIT 狀態。此狀態表示——等待伺服器應用程序關閉連接。通常,伺服器檢測到客戶端關閉連接之後,也會立即給客戶端發送一個FIN來關閉連接,使連接轉移到 LAST_ACK 狀態,等待客戶端對最後一個FIN結束報文段的最後一次確認,一旦確認完成,連接就徹底關閉了。

客戶端通過 connect 系統調用主動與伺服器建立連接。此系統調用會首先給伺服器發一個SYN,使連接進入 SYN_SENT 狀態。
connect 調用可能因為兩種原因失敗:1. 目標埠不存在(未被任何進程監聽)護著該埠被 TIME_WAIT 狀態的連接佔用( 詳見後文 )。2. 連接超時,在超時時間內未收到伺服器的ACK。
如果 connect 調用失敗,則連接返回初始的 CLOSED 狀態,如果調用成功,則轉到 ESTABLISHED 狀態。
客戶端執行主動關閉時,它會向伺服器發送一個FIN,連接進入 TIME_WAIT_1 狀態,如果收到伺服器的ACK,進入 TIME_WAIT_2 狀態。此時伺服器處於 CLOSE_WAIT 狀態,這一對狀態是可能發生辦關閉的狀態(詳見後文)。此時如果伺服器發送FIN關閉連接,則客戶端會發送ACK進行確認並進入 TIME_WAIT 狀態。

流量控制是為了控制發送方發送速率,保證接收方來得及接收。

接收方發送的確認報文中的窗口欄位可以用來控制發送方窗口大小,從而影響發送方的發送速率。將窗口欄位設置為 0,則發送方不能發送數據。

如果網路出現擁塞,分組將會丟失,此時發送方會繼續重傳,從而導致網路擁塞程度更高。因此當出現擁塞時,應當控制發送方的速率。這一點和流量控制很像,但是出發點不同。 流量控制是為了讓接收方能來得及接收,而擁塞控制是為了降低整個網路的擁塞程度。

TCP 主要通過四種演算法來進行擁塞控制: 慢開始、擁塞避免、快重傳、快恢復。

在Linux下有多種實現,比如reno演算法,vegas演算法和cubic演算法等。
發送方需要維護一個叫做擁塞窗口(cwnd)的狀態變數,注意擁塞窗口與發送方窗口的區別:擁塞窗口只是一個狀態變數,實際決定發送方能發送多少數據的是發送方窗口。
為了便於討論,做如下假設:

發送的最初執行慢開始,令 cwnd=1,發送方只能發送 1 個報文段;當收到確認後,將 cwnd 加倍,因此之後發送方能夠發送的報文段數量為:2、4、8 ...

注意到慢開始每個輪次都將 cwnd 加倍,這樣會讓 cwnd 增長速度非常快,從而使得發送方發送的速度增長速度過快,網路擁塞的可能也就更高。設置一個慢開始門限 ssthresh,當 cwnd >= ssthresh 時,進入擁塞避免,每個輪次只將 cwnd 加 1。

如果出現了超時,則令 ssthresh = cwnd/2,然後重新執行慢開始。

在接收方,要求每次接收到報文段都應該對最後一個已收到的有序報文段進行確認。例如已經接收到 M1 和 M2,此時收到 M4,應當發送對 M2 的確認。

在發送方,如果收到三個重復確認,那麼可以知道下一個報文段丟失,此時執行快重傳,立即重傳下一個報文段。例如收到三個 M2,則 M3 丟失,立即重傳 M3。

在這種情況下,只是丟失個別報文段,而不是網路擁塞。因此執行快恢復,令 ssthresh = cwnd/2 ,cwnd = ssthresh,注意到此時直接進入擁塞避免。

慢開始和快恢復的快慢指的是 cwnd 的設定值,而不是 cwnd 的增長速率。慢開始 cwnd 設定為 1,而快恢復 cwnd 設定為 ssthresh。

  發送端的每個TCP報文都必須得到接收方的應答,才算傳輸成功。

  TCP為每個TCP報文段都維護一個重傳定時器。
  發送端在發出一個TCP報文段之後就啟動定時器,如果在定時時間類未收到應答,它就將重發該報文段並重置定時器。

  因為TCP報文段最終在網路層是以IP數據報的形式發送,而IP數據報到達接收端可能是亂序或者重復的。TCP協議會對收到的TCP報文進行重排、整理,確保順序正確。

TCP報文段所攜帶的應用程序數據按照長度分為兩種: 交互數據 成塊數據

對於什麼是粘包、拆包問題,我想先舉兩個簡單的應用場景:

對於第一種情況,服務端的處理流程可以是這樣的:當客戶端與服務端的連接建立成功之後,服務端不斷讀取客戶端發送過來的數據,當客戶端與服務端連接斷開之後,服務端知道已經讀完了一條消息,然後進行解碼和後續處理...。對於第二種情況,如果按照上面相同的處理邏輯來處理,那就有問題了,我們來看看 第二種情況 下客戶端發送的兩條消息遞交到服務端有可能出現的情況:

第一種情況:

服務端一共讀到兩個數據包,第一個包包含客戶端發出的第一條消息的完整信息,第二個包包含客戶端發出的第二條消息,那這種情況比較好處理,伺服器只需要簡單的從網路緩沖區去讀就好了,第一次讀到第一條消息的完整信息,消費完再從網路緩沖區將第二條完整消息讀出來消費。

第二種情況:

服務端一共就讀到一個數據包,這個數據包包含客戶端發出的兩條消息的完整信息,這個時候基於之前邏輯實現的服務端就蒙了,因為服務端不知道第一條消息從哪兒結束和第二條消息從哪兒開始,這種情況其實是發生了TCP粘包。

第三種情況:

服務端一共收到了兩個數據包,第一個數據包只包含了第一條消息的一部分,第一條消息的後半部分和第二條消息都在第二個數據包中,或者是第一個數據包包含了第一條消息的完整信息和第二條消息的一部分信息,第二個數據包包含了第二條消息的剩下部分,這種情況其實是發送了TCP拆,因為發生了一條消息被拆分在兩個包裡面發送了,同樣上面的伺服器邏輯對於這種情況是不好處理的。

我們知道tcp是以流動的方式傳輸數據,傳輸的最小單位為一個報文段(segment)。tcp Header中有個Options標識位,常見的標識為mss(Maximum Segment Size)指的是,連接層每次傳輸的數據有個最大限制MTU(Maximum Transmission Unit),一般是1500比特,超過這個量要分成多個報文段,mss則是這個最大限制減去TCP的header,光是要傳輸的數據的大小,一般為1460比特。換算成位元組,也就是180多位元組。

tcp為提高性能,發送端會將需要發送的數據發送到緩沖區,等待緩沖區滿了之後,再將緩沖中的數據發送到接收方。同理,接收方也有緩沖區這樣的機制,來接收數據。

發生TCP粘包、拆包主要是由於下面一些原因:

既然知道了tcp是無界的數據流,且協議本身無法避免粘包,拆包的發生,那我們只能在應用層數據協議上,加以控制。通常在制定傳輸數據時,可以使用如下方法:

寫了一個簡單的 golang 版的tcp伺服器實例,僅供參考:
例子

參考和推薦閱讀書目:

注釋:

eg.

閱讀全文

與s型增長速率演算法相關的資料

熱點內容
建築考二建刷視頻用什麼app 瀏覽:233
取消紙質文件夾密碼 瀏覽:769
程序員級別提升 瀏覽:432
編譯運行後停止工作 瀏覽:779
白虎通pdf 瀏覽:673
linux開啟關閉埠 瀏覽:228
單片機加一個晶元 瀏覽:723
vs編譯方式 瀏覽:211
安卓的掌盟盒子可以查什麼 瀏覽:864
上下學app有什麼好處 瀏覽:363
程序員做信貸項目的好跳槽嗎 瀏覽:252
粘土伺服器的禮盒為什麼開不了 瀏覽:506
樂高機器人pdf 瀏覽:863
退出scala命令 瀏覽:366
不管什麼情況下軍人必須服從命令 瀏覽:267
雲計算和伺服器模式有什麼區別 瀏覽:524
s型增長速率演算法 瀏覽:979
c語言迷宮演算法入門 瀏覽:242
android列表動畫 瀏覽:362
外企演算法面試 瀏覽:321