1. TCP/IP協(xié)議
TCP/IP 協(xié)議分為四層:應用層项玛,傳輸層貌笨,網(wǎng)絡層,鏈路層襟沮。
1.1 TCP協(xié)議
TCP協(xié)議是面向連接锥惋,保證高可靠性(數(shù)據(jù)無丟失昌腰,數(shù)據(jù)無失序,數(shù)據(jù)無錯誤膀跌,數(shù)據(jù)無重復到達)的傳輸層協(xié)議遭商。
首先在網(wǎng)絡傳輸中,一幀以太網(wǎng)數(shù)據(jù)包的格式如下:
TCP頭的格式:
序號分為發(fā)送序號(Sequence Number)和接收序號(Acknowledgment Number)捅伤。
發(fā)送序號:用來標識TCP 源端向TCP目的端發(fā)送的數(shù)據(jù)字節(jié)流劫流,它表示在這個報文段中的第一個數(shù)據(jù)字節(jié)的順序號。每當建立一個新的連接時丛忆,SYN標志變?yōu)?祠汇,Sequence Number包含由這個主機選擇的該連接的初始序列號ISN(Initial Sequence Number)。
接收序號:包含TCP目的端所期望收到的下一個順序號蘸际。因此座哩,確認序號應該是上次已經(jīng)成功收到的順序號加1。只有當ACK的標志位1時確認序號才有效粮彤。TCP為應用層提供全雙工服務根穷,這意味數(shù)據(jù)能在兩個方向上獨立地進行傳輸。因此导坟,連接的每一端必須保持每個方向上的傳輸數(shù)據(jù)順序號屿良。
三次握手:在客戶端與服務器端建立TCP網(wǎng)絡連接時,客戶機首先發(fā)出一個SYN消息惫周,服務器端返回一個SYN+ACK應答表示收到了這個消息尘惧,最后客戶機再以ACK消息響應。
a.請求端(通常稱為客戶)發(fā)送一個SYN段指明客戶打算連接的服務器的端口递递,以及初始序號(ISN,在這個例子中為1415531521)喷橙。這個SYN段為報文段1。
b.服務器發(fā)回包含服務器的初始序號的SYN報文段(報文段2)作為應答登舞。同時贰逾,將確認序號設置為客戶的ISN加1以對客戶的SYN報文段進行確認。一個SYN將占用一個序號
c.客戶必須將確認序號設置為服務器的ISN加1以對服務器的SYN報文段進行確認(報文段3)
為什么要使用三次握手菠秒?
三次握手是為了防止已失效的連接請求報文段突然又傳送到了服務端疙剑,因而產(chǎn)生錯誤 。
client 發(fā)出的第一個連接請求報文段并沒有丟失践叠,而是在某個網(wǎng)絡結(jié)點長時間的滯留了言缤,以致延誤到連接釋放以后的某個時間才到達 server。本來這是一個早已失效的報文段禁灼。但 server 收到此失效的連接請求報文段后管挟,就誤認為是 client 再次發(fā)出的一個新的連接請求。于是就向 client 發(fā)出確認報文段弄捕,同意建立連接僻孝。假設不采用 “三次握手”拳芙,那么只要 server 發(fā)出確認,新的連接就建立了皮璧。由于現(xiàn)在 client 并沒有發(fā)出建立連接的請求,因此不會理睬 server 的確認分飞,也不會向 server 發(fā)送數(shù)據(jù)悴务。但 server 卻以為新的運輸連接已經(jīng)建立,并一直等待 client 發(fā)來數(shù)據(jù)譬猫。這樣讯檐,server 的很多資源就白白浪費掉了。采用 “三次握手” 的辦法可以防止上述現(xiàn)象發(fā)生染服。作者:HioHio鏈接:https://www.zhihu.com/question/24853633/answer/573627478來源:知乎著作權(quán)歸作者所有别洪。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處柳刮。?
四次揮手斷開連接:
a.現(xiàn)在的網(wǎng)絡通信都是基于socket實現(xiàn)的挖垛,當客戶端將自己的socket進行關閉時,內(nèi)核協(xié)議棧會向服務器自動發(fā)送一個FIN置位的包秉颗,請求斷開連接痢毒。我們稱首先發(fā)起斷開請求的一方稱為主動斷開方。
b.服務器端收到請客端的FIN斷開請求后蚕甥,內(nèi)核協(xié)議棧會立即發(fā)送一個ACK包作為應答哪替,表示已經(jīng)收到客戶端的請求
c.服務器運行一段時間后,關閉了自己的socket菇怀。這個時候內(nèi)核協(xié)議棧會向客戶端發(fā)送一個FIN置位的包凭舶,請求斷開連接
d.客戶端收到服務端發(fā)來的FIN斷開請求后,會發(fā)送一個ACK做出應答爱沟,表示已經(jīng)收到服務端的請求
為什么使用四次揮手帅霜?
關閉連接時,服務器收到對方的FIN報文時钥顽,僅僅表示對方不再發(fā)送數(shù)據(jù)了但是還能接收數(shù)據(jù)义屏,而自己也未必全部數(shù)據(jù)都發(fā)送給對方了,所以己方可以立即關閉蜂大,也可以發(fā)送一些數(shù)據(jù)給對方后闽铐,再發(fā)送FIN報文給對方來表示同意現(xiàn)在關閉連接,因此奶浦,己方ACK和FIN一般都會分開發(fā)送兄墅,從而導致多了一次。?
滑動窗口協(xié)議(用于流量控制和傳輸效率的提升):
TCP協(xié)議在工作時澳叉,如果發(fā)送端的TCP協(xié)議軟件每傳輸一個數(shù)據(jù)分組后隙咸,必須等待接收端的確認才能夠發(fā)送下一個分組沐悦,由于網(wǎng)絡傳輸?shù)臅r延,將有大量時間被用于等待確認五督,導致傳輸效率低下藏否。為此TCP在進行數(shù)據(jù)傳輸時使用了滑動窗口機制。
TCP滑動窗口用來暫存兩臺計算機間要傳送的數(shù)據(jù)分組充包。每臺運行TCP協(xié)議的計算機有兩個滑動窗口:一個用于數(shù)據(jù)發(fā)送副签,另一個用于數(shù)據(jù)接收。發(fā)送端待發(fā)數(shù)據(jù)分組在緩沖區(qū)排隊等待送出基矮。被滑動窗口框入的分組淆储,是可以在未收到接收確認的情況下多送出的部分〖医剑滑動窗口左端標志X的分組本砰,是已經(jīng)被接收端確認收到的分組。隨著新的確認到來钢悲,窗口不斷向右滑動点额。
文章參考:blog.chinaunix.net/uid-26833883-id-3627644.html
TCP協(xié)議有兩個比較重要的控制算法,一個是流量控制譬巫,另一個就是阻塞控制咖楣。
TCP協(xié)議通過滑動窗口來進行流量控制,它是控制發(fā)送方的發(fā)送速度從而使接受者來得及接收并處理芦昔。而擁塞控制是作用于網(wǎng)絡诱贿,它是防止過多的包被發(fā)送到網(wǎng)絡中,避免出現(xiàn)網(wǎng)絡負載過大咕缎,網(wǎng)絡擁塞的情況珠十。
TCP 利用滑動窗口實現(xiàn)流量控制。流量控制是為了控制發(fā)送方發(fā)送速率凭豪,保證接收方來得及接收焙蹭。接收方發(fā)送的確認報文中的窗口字段可以用來控制發(fā)送方窗口大小,從而影響發(fā)送方的發(fā)送速率嫂伞。將窗口字段設置為 0孔厉,則發(fā)送方不能發(fā)送數(shù)據(jù)。
擁塞控制
在某段時間帖努,若對網(wǎng)絡中某一資源的需求超過了該資源所能提供的可用部分撰豺,網(wǎng)絡的性能就要變壞。這種情況就叫擁塞拼余。擁塞控制就是為了防止過多的數(shù)據(jù)注入到網(wǎng)絡中污桦,這樣就可以使網(wǎng)絡中的路由器或鏈路不致過載。擁塞控制所要做的都有一個前提匙监,就是網(wǎng)絡能夠承受現(xiàn)有的網(wǎng)絡負荷凡橱。擁塞控制是一個全局性的過程小作,涉及到所有的主機,所有的路由器稼钩,以及與降低網(wǎng)絡傳輸性能有關的所有因素顾稀。相反镣陕,流量控制往往是點對點通信量的控制包竹,是個端到端的問題。流量控制所要做到的就是抑制發(fā)送端發(fā)送數(shù)據(jù)的速率吼野,以便使接收端來得及接收绍载。為了進行擁塞控制,TCP 發(fā)送方要維持一個 擁塞窗口(cwnd) 的狀態(tài)變量滔蝉。擁塞控制窗口的大小取決于網(wǎng)絡的擁塞程度击儡,并且動態(tài)變化。發(fā)送方讓自己的發(fā)送窗口取為擁塞窗口和接收方的接受窗口中較小的一個蝠引。
TCP的擁塞控制采用了四種算法阳谍,即 慢開始 、 擁塞避免 螃概、快重傳 和 快恢復矫夯。
1.2 TCP如何保證可靠性
(1)超時重傳機制:TCP發(fā)送端在發(fā)出一個報文后,會啟動一個定時器吊洼,用來等待目的端確認這個報文训貌。若未能及時收到這個報文確認,TCP發(fā)送端會重新發(fā)送這個報文冒窍。
(2)通過校驗和進行錯誤檢測:校驗和覆蓋了整個的TCP報文段:TCP首部和TCP數(shù)據(jù)递沪。這是一個強制性的字段,一定是由發(fā)端計算和存儲综液,并由收端進行驗證款慨。
(3)流量控制:通過滑動窗口機制確保發(fā)送方發(fā)送的數(shù)據(jù)不會超過接收方的緩沖區(qū)。
(接收方會通過確認報文告知發(fā)送方自己窗口的大忻ā)檩奠。
(4)TCP棄重:TCP報文段作為IP數(shù)據(jù)報來傳輸,而IP數(shù)據(jù)報有可能重復附帽,因此TCP能夠丟棄重復數(shù)據(jù)(對于序號小于接收方的期望序號的報文埠戳,直接丟棄)。
(5)重排序:TCP報文段作為IP數(shù)據(jù)報來傳輸士葫,而IP數(shù)據(jù)報有可能失序乞而,因此TCP報文段的到達也可能會失序。如果必要慢显,TCP將對收到的數(shù)據(jù)進行重新排序爪模,將收到的數(shù)據(jù)以正確的順序交給應用層欠啤。(TCP通過緩沖區(qū)和報文序號進行亂序重組)
(6)擁塞控制:當網(wǎng)絡擁塞時,減少數(shù)據(jù)的發(fā)送
參考資料
2.?TCP擁塞控制算法