TCP的可靠性
TCP提供了一種面向連接的、可靠的字節(jié)流服務锰瘸。TCP的可靠性主要有下面方式所保證的眨补。
- 應用數據被分割成TCP認為最適合發(fā)送的數據快甘晤。而UDP的數據報長度將保持不變塞弊。由TCP傳遞給IP的信息單位稱為報文段诀黍。(可靠性體現(xiàn)在哪了咒精?)
- 當TCP發(fā)出一個段后,它將啟動一個定時器,等待目的段確認收到這個段后。如果不能及時收到一個確認,將重發(fā)這個報文段。
- 當TCP收到來自TCP連接另一端的數據,它將發(fā)送一個確認。這個確認不是立即發(fā)送,通常推遲幾分之一秒急迂。(為什么阴幌?)
- TCP將保持它首部和數據的檢驗和(首部正常20個字節(jié)懒闷,最多60個字節(jié))玩焰。這是一個端到端的檢驗和蒿赢,目的是檢測數據在傳輸過程中的變化皂冰。如果收到的段的檢驗和有差錯舶胀。TCP將丟棄這個報文段和不確認收到轩端。(希望發(fā)送端超時和重傳) Q:為何不去糾正而是選擇重傳弥臼?
- TCP報文段傳輸中可能會失序,如有必要的話兆旬,TCP會對收到的失序數據重新排列后交給應用層脚祟。
- TCP如果接受到重復的數據后铭乾,會丟棄它笛质。
- TCP還能提供流量控制,TCP連接的每一方都有一個固定大小的緩沖空間潭袱。TCP只允許另一端最多發(fā)送接受端緩沖區(qū)大小的數據。這將防止發(fā)送端發(fā)的快而接受端接受的慢而造成的緩沖區(qū)溢出。
三次握手
當一端建立連接而發(fā)送它的SYN時,會為連接選擇一個初始序號。ISN會隨著時間而變化医咨,因此每個連接會有不同的ISN角虫。ISN可以看做一個32位的計數器枫虏,每4ms加1。這樣可以防止在網絡中延遲的分組以后又被傳送妓忍,從而導致某個連接的一方對它作出錯誤的解釋。
為什么TCP建立連接是要三次握手凌停?而不是兩次或者四次拉队?
很多面試官喜歡問這個問題事哭。為什么一定要三次?因為三次是建立一個可靠連接的最少所需次數干旧。為什么兩次不行呢舔稀?
TCP可靠傳輸的精髓在哪里?就在與建立連接的雙方最開始需要將自己的初始序號告知了對方事富,并確保對方一定收到。以后發(fā)送和ACK確認都是在最開始的初始序號上增加,每發(fā)送一個字節(jié)列肢,序號增加1。如果只有兩次握手的話费封,我們來看看會發(fā)生什么研叫。
第一次握手:執(zhí)行主動連接的客戶端發(fā)送自己的SYN,ISN序號過去。
第二次握手:服務端收到后湖员,知道客戶端的初始序號。發(fā)送ACK回應盏阶,同時發(fā)送自己的SYN , ISN序號蒋腮。
到此兩次握手結束。此時只有服務端可以確保收到客戶端的初始ISN绢慢,而客戶端并不一定收到服務端的初始ISN胰舆。如果服務端一方向客戶端一方發(fā)送數據了怎么辦够话?由于不知道服務端的初始ISN,客戶端就無法對收到的數據ACK確認,就不能進行數據的傳輸了。
那為什么不能四次握手呢?因為不需要磺送,四次握手中的第二馅袁,第三次可以合并成一次化漆。
那為什么要四次揮手呢?四次揮手的二三兩次難道不能合并嗎页徐?因為TCP支持半關閉苏潜。當一端發(fā)送FIN后執(zhí)行關閉后,另一端沒有關閉变勇,那么執(zhí)行關閉的一方依然可以接受到數據恤左,要牢記TCP是全雙工的。如果只有三次揮手,那么一方FIN后飞袋,另一方發(fā)送FIN戳气,ACK,兩邊就都關閉了巧鸭。就無法支持半關閉了瓶您。
四次揮手
TIME_WAIT等待狀態(tài)
TIME_WAIT要等待一個2MSL時間,MSL是任何報文段被丟棄到網絡中最大生存時間纲仍。這個時間是有限的览闰,因為TCP報文段是以IP數據段在網絡中傳輸的,而IP有限制其生存的時間的TTL字段巷折。通常MSL為30秒,1分鐘或者2分鐘崖咨。
為什么需要等待2MSL呢锻拘?因為最后一個ACK可能會在網絡傳輸中丟失。如果發(fā)送了最后一個MSL就立刻關閉連接的話击蹲,此時若ACK丟失署拟,那么服務端將會一直超時重傳而一直得不到回應。有了等待2MSL時間歌豺,如果最后一個ACK丟失推穷,服務器第一次超時重傳,這時客戶端由于還沒有關閉类咧,就能發(fā)送ACK回應了馒铃。