long time ago,通訊並不發達,兩國之間的貿易卻絡繹不絕。但碼頭始終有限,若是貿然的把貨物運過去,若是這時候有別的商家已經佔領了碼頭。這樣不得不排隊了。後來,他們訓練了一種海鳥,運送以前,先用海鳥報個信: 算法
一開始這個方式挺好用的,直到有一年夏天,五弟找上門來了:我等了你一天,你的貨呢?我交了錢借用了一天的碼頭,都白交了。二哥:我也着急呀,你一直沒回信,我都等了兩天,我不知道咋肥四,就沒發了。應該是回信的那隻鳥,被大風颳走了。最近海上天氣很差,想必我放的那隻鳥也是歷經千辛萬苦纔去到你那。這樣吧,五弟,我改一下流程吧:緩存
五弟琢磨了一下,前面的鳥可以一來一回,二哥能看出海上沒有危險。我收到二哥的消息後也能看出海上無風雨,這時我再去借碼頭,也能節省一些時間,妙,實在妙,仍是二哥聰明,只是二哥要比我多訓練一倍的鳥。五弟哪裏的話,浪費這點資源算什麼呢。服務器
三次握手就這樣誕生了。網絡
過了一些時日,五弟又來找二哥商量了:碼頭上的倉庫空間,人力始終有限,二哥一次派了這麼多艘船來,五弟實在忙不過來,船都堵在渡口,人家的船進不來,出不去啊。爲了此事二哥想了一宿,找來了五弟商量:五弟呀,這個確實是個頭疼的問題呀。併發
最簡單的辦法就是一開始你就告訴我你能處理多少貨,我就派一批船過去。等你處理完了通知我,我再派一批過去。可是這種方式應變能力過低了,假設港口一開始沒這麼堵,可是可能還有一些商家在海上來往,結果我這一批派過去,就致使堵塞擁擠了。這個應變能力能理太差了,要提升這個應變能力,就不能派太多的船涌進港口,只能一小批,一小批的派了。指針
這樣你每次收到貨以後,就讓回來的船告訴我你那裏剩餘多少空間,我好安排下一趟船隻。五弟撓撓頭,不明白。二哥敲了下這木魚腦殼道:假設咱們要運送720的貨,你碼頭的倉庫最多能存360的貨物,我每次派100的貨物,固然個人每艘船隻能載重是10(MTU 最大傳輸單元限制)。cdn
藉助窗口解決了流量控制的問題。中間件
再加上海上風雲莫測,每次來回的時間不是固定的。只能動態的估算這個值了。這樣,每批次的船隻一來一回算一個單位(RTT)。而後根據這個RTT的時間計算超時時間(RTO)。當發生了重發,就會將超時時間加倍。防止太頻繁重傳致使更加擁擠。blog
可是這樣的會有一個問題,假設7號船一直沒回來,這時候再派一個7號船過去,許久後,終於回來了,那麼這艘船是第一艘的仍是重發的那艘呢?忽略說能認出船老大的陳獨秀同窗(摳鼻)。隊列
這是一個苦差事,具體怎麼算,仍是請位大師來算吧。此事算了了。
五弟又過了找二哥了:運720的貨都跑了8趟了,那送7200的貨那還不得九九八十一趟啊。這效率不行啊,二哥道:你想到的我也想到了,一開始我並不知道海上的擁擠狀況,因此不敢派太多的船,我想了一個辦法,先發的慢一點,探測一下狀況,而後再慢慢提速。假設我一開始派n艘船。
這樣,就能夠解決效率低的問題了。
固然,不可能一直是增長。這樣擁堵只是時間問題。因此須要一個閾值。
擁塞避免算法的思路就是下降加速度,讓它緩慢的增加。
以上都是正常的狀況,當發生了重傳,說明發生了擁擠,就不能再發這麼多船了,這時候cwnd減半,從新進入慢啓動。
好了,故事就講到這裏了。
當出現了RTO超時重傳,由於ack都收不到了,因此它的處理會比較猛烈:
cwnd決定了發送窗口的大小,若是隻是出現了輕度的擁堵,就直接猛烈縮小窗口,進入慢啓動後,cwnd恢復的很慢,這顯然得不償失,因此須要一種主動觸發重傳的機制,就有了後來的快速重傳和快速恢復。
僅僅只是靠超時重傳,並不能發生了包丟失,卻要等到超時纔開始重傳,這顯然效率不夠,因此須要找到重傳的規律。雖然咱們發的包是有序的,可是IP包是無序的,因此會致使到達的包出現無序的狀況。先來看下下面一組數據。
要保證可靠性,就必需要保證順序和完整,來看看事故發生現場。
從上面的狀況能夠看出不論是亂序仍是丟包,都會收到重複的ack的。在快速重傳算法中,當收到三次重複的ack,就認定它是丟包了。但實際上,三次重複ack並不能判斷出是丟包或亂序,只能說出現了問題,它只是在效率和過早重傳之間的一個權衡。
收到了三次重複的ack,進入快速重傳須要作幾件事情:
因爲快速重傳有多是由於順序的問題而誤判,或者只是輕微的擁堵,致使進入了擁塞避免階段,這時候爲了達到快速恢的目的,將會中止發送後面的數據,只發送重傳數據,爲了提升恢復效率,將會使用快速恢算法。
爲了保證快速重傳效率,進入快速恢復階段會有如下幾個步驟。
總的來講就是騰出空間,馬不停蹄。
在上面的重傳原理介紹中,咱們還忽視了一個問題,例如客戶端在發送1,2,3,4,5,6,7包時,2,4,6,包丟了,這種狀況仍是比較常見的,這時候就會面臨一個問題,究竟是一個一個重傳,仍是將2後面的包都重發過去。
後退n幀協議雖然效率高,可是遇到大場面,在網絡比較差或者帶寬比較低的狀況,若是仍然使用這個協議會致使狀況更加惡劣,這種狀況停等協議雖然效率比較低,可是仍是比較適用的。
窗口的滑動
TCP提供體積可變的滑動窗口機制,支持端對端的流量控制:
在傳輸的過程當中,窗口是滑動的
看下圖5-15,TCP鏈接階段,雙方協商窗口的尺寸,同時接收方預留數據緩存區看圖5-16,假設窗口的閾值是一半,因此A發送11個幀,發送後,等待確認,發送窗口位置不變。這時候發生了丟包,32,33沒有收到。雖然31已經收到了,窗口理論上能夠往右移動一個位置,可是爲了節省寬帶,不會每個幀都回復ack,而是累積幾個以後在發出,因此31不會回覆ack,窗口就卡在這了。
看圖5-17,這時候30-33的已經確認了,因此窗口能夠往右滑動三幀。37,38,40也許延遲還未收到。
看圖5-18,在重傳機制生效以前,A繼續發送了後面的數據,這時候窗口已經所有用完,A會中止發送數據,等待B的窗口可用,B處理完以後會等待A發送數據,這樣就形成了雙方在等待,爲了解決這個問題,TCP使用了Zero Window Probe技術,縮寫ZWP。在窗口尺寸變成0以後,發送端會發送ZWP包詢問接收端是否有足夠的空間能夠發送數據了,TCP使用持續計時器,若是結果仍然爲0,則重置定時器繼續等待。
標誌位
鏈接過程的狀態
服務器維護了一個半鏈接的隊列,該隊列爲每一個客戶端的SYN包(SYN=X)開設一個條目,表示服務器已經收到SYN包,並向客戶端發出確認,正在等待客戶端的確認包。當服務器收到客戶端的確認包時,刪除該條目,該鏈接進入ESTABLISHED狀態。
兩臺電腦之間通訊都須要把數字信號01轉化成電信號,再調製成電磁波(好比光)。電磁波自己沒法承載信息的,可是咱們能夠控制電磁波的變化(幅度AM,頻率FM,相位PM),讓這些變化能夠表明0和1。也就是說在信號線中走的是電磁波,因此在佈線的時候要注意線與線之間的串擾。
電磁波有不少頻段好比2515MHz-2675MHz、4800MHz-4900MHz,在空氣中存在不少不一樣頻段的波,因此須要進行定寬調頻,也就是說肯定帶寬,而後再進行濾波,所謂的濾波就是經過濾波算法,好比卡爾曼濾波,根據截止頻率是否靠近特徵頻率以及衰減程度來分類的,最後轉換成01信號。帶寬又叫頻寬是指在固定的的時間可傳輸的資料數量,亦即在傳輸管道中能夠傳遞數據的能力。在數字設備中,頻寬一般以 bps表示,即每秒可傳輸之位數。
截止頻率
用來講明電路頻率特性指標的特殊頻率。當保持電路輸入信號的幅度不變,改變頻率使輸出信號降至最大值的0.707倍,或某一特殊額定值時該頻率稱爲截止頻率。在高頻端和低頻端各有一個截止頻率,分別稱爲上截止頻率和下截止頻率。兩個截止頻率之間的頻率範圍稱爲通頻帶。
將信號轉化成字節,再將字節組裝成幀。再以太網鏈路上的數據包被稱爲以太幀,在802.3標準理,規定了一個以太幀的數據部分(Playload)的最大長度是1500個字節(MTU),另外,以太網幀最小長度爲64字節。