TCP協議實現原理
TCP/IP協議不是TCP和IP這兩個協議的合稱,而是指因特網整個TCP/IP協議族亩进。
從協議分層模型方面來講症虑,TCP/IP由四個層次組成:網絡接口層、網絡層归薛、傳輸層谍憔、應用層。
TCP協議:即傳輸控制協議主籍,它提供的是一種可靠的數據流服務习贫。當傳送受差錯干擾的數據,或舉出網絡故障千元,或網絡負荷太重而使網際基本傳輸系統(tǒng)不能正常工作時苫昌,就需要通過其他的協議來保證通信的可靠。TCP就是這樣的協議幸海。TCP采用“帶重傳的肯定確認”技術來實現傳輸的可靠性祟身。并使用“滑動窗口”的流量控制機制來高網絡的吞吐量。TCP通信建立實現了一種“虛電路”的概念物独。雙方通信之前袜硫,先建立一條鏈接然后雙方就可以在其上發(fā)送數據流。這種數據交換方式能提高效率挡篓,但事先建立連接和事后拆除連接需要開銷婉陷。
傳輸控制協議(Transport Control Protocol)是一種面向連接的,可靠的傳輸層協議瞻凤。面向連接是指一次正常的TCP傳輸需要通過在TCP客戶端和TCP服務端建立特定的虛電路連接來完成憨攒,該過程通常被稱為“三次握手”》Р危可靠性可以通過很多種方法來提供保證肝集,在這里我們關心的是數據序列和確認。TCP通過數據分段(Segment)中的序列號保證所有傳輸的數據可以在遠端按照正常的次序進行重組蛛壳,而且通過確認保證數據傳輸的完整性杏瞻。要通過TCP傳輸數據,必須在兩端主機之間建立連接衙荐。
TCP協議是端到端的傳輸控制協議捞挥,之所以是“端到端”的協議,是因為”路由“是由IP協議負責的忧吟,TCP協議負責為兩個通信端點提供可靠性保證砌函,這個可靠性不是指一個端點發(fā)送的數據,另一個端點肯定能收到(這顯然是不可能的),而是指讹俊,數據的可靠投遞或者故障的可靠通知垦沉。
本文主要講述的是
1、TCP三次握手原理仍劈,以及為什么要三次握手厕倍,兩次握手帶來的不利后果。
2贩疙、TCP四次揮手原理讹弯,為什么要四次揮手。
TCP的可靠性通過以下方式來保證:
1.超時重傳:TCP每發(fā)送出一個報文段后这溅,都會啟動一個定時器组民,對目的端傳回的確認信息進行確認計時,超時后便重傳芍躏。
2.確認信號:當TCP收到一個來自TCP的報文段后邪乍,便會發(fā)送回一個確認信號。
3.檢驗和:TCP將始終保持首部和數據的檢驗和对竣,如果收到的報文段的檢驗和有差錯庇楞,便將其丟棄,希望發(fā)送端超時重傳否纬。
4.重新排序:由于IP數據報的達到可能失序吕晌,因此TCP將會數據進行重新排序,以正確的順序交給應用層临燃。
5.丟棄重復:由于IP數據報有可能重復睛驳,因此TCP將會丟棄重復的數據。
6.流量控制:TCP連接的兩端都有固定大小的緩沖區(qū)空間膜廊,TCP接受端只允許對端發(fā)送本端緩沖區(qū)能容納的數據乏沸。
TCP三次握手原理:
首先,給張圖片爪瓜,建立TCP三次握手的直觀印象蹬跃。
每次握手(發(fā)送數據請求或應答)時,發(fā)送的數據為TCP報文铆铆,TCP段包含了源/目的地址蝶缀,端口號,初始序號薄货,滑動窗口大小翁都,窗口擴大因子,最大報文段長度等谅猾。還有一些標志位:
(1)SYN(Synchronize Sequence Numbers):同步序號
(2)ACK(Acknowledgement Number):應答回復
(3)RST:復位連接柄慰,消除舊有的同步序號
(4)PSH:盡可能的將數據送往接收進程
(5)FIN:發(fā)送方完成數據發(fā)送
(6)URG
·SYN:同步標志
同步序列編號(Synchronize Sequence Numbers)欄有效鳍悠。該標志僅在三次握手建立TCP連接時有效。它提示TCP連接的服務端檢查序列編號先煎,該序列編號為TCP連接初始端(一般是客戶端)的初始序列編號贼涩。在這里,可以把TCP序列編號看作是一個范圍從0到4薯蝎,294,967谤绳,295的32位計數器占锯。通過TCP連接交換的數據中每一個字節(jié)都經過序列編號。在TCP報頭中的序列編號欄包括了TCP分段中第一個字節(jié)的序列編號缩筛。
·ACK:確認標志
確認編號(Acknowledgement Number)欄有效消略。大多數情況下該標志位是置位的。TCP報頭內的確認編號欄內包含的確認編號(w+1瞎抛,Figure-1)為下一個預期的序列編號艺演,同時提示遠端系統(tǒng)已經成功接收所有數據。
·RST:復位標志
復位標志有效桐臊。用于復位相應的TCP連接胎撤。
·URG:緊急標志
緊急(The urgent pointer)標志有效。緊急標志置位断凶,
·PSH:推標志
該標志置位時伤提,接收端不將該數據進行隊列處理,而是盡可能快將數據轉由應用處理认烁。在處理telnet或rlogin等交互模式的連接時肿男,該標志總是置位的。
·FIN:結束標志
帶有該標志置位的數據包用來結束一個TCP回話却嗡,但對應端口仍處于開放狀態(tài)舶沛,準備接收后續(xù)數據。
從圖中窗价,可以看出三次握手的基本步驟是:
第一次握手:客戶端向服務器端發(fā)送連接請求包SYN(syn=j)如庭,等待服務器回應;
第二次握手:服務器端收到客戶端連接請求包SYN(syn=j)后舌镶,將客戶端的請求包SYN(syn=j)放入到自己的未連接隊列柱彻,此時服務器需要發(fā)送兩個包給客戶端;
(1)向客戶端發(fā)送確認自己收到其連接請求的確認包ACK(ack=j+1)餐胀,向客戶端表明已知道了其連接請求
(2)向客戶端發(fā)送連接詢問請求包SYN(syn=k)哟楷,詢問客戶端是否已經準備好建立連接,進行數據通信否灾;
即在第二次握手時服務器向客戶端發(fā)送ACK(ack=j+1)和SYN(syn=k)包卖擅,此時服務器進入SYN_RECV狀態(tài)。
第三次握手:客戶端收到服務器的ACK(ack=j+1)和SYN(syn=k)包后,知道了服務器同意建立連接惩阶,此時需要發(fā)送連接已建立的消息給服務器挎狸;
向服務器發(fā)送連接建立的確認包ACK(ack=k+1),回應服務器的SYN(syn=k)告訴服務器断楷,我們之間已經建立了連接锨匆,可以進行數據通信。
ACK(ack=k+1)包發(fā)送完畢冬筒,服務器收到后恐锣,此時服務器與客戶端進入ESTABLISHED狀態(tài),開始進行數據傳送舞痰。
為什么不能只兩次握手土榴?
有了三次握手的詳細步驟,就可以分析為什么需要三次握手而不是兩次握手了响牛。
三次握手的目的:消除舊有連接請求的SYN消息對新連接的干擾玷禽,同步連接雙方的序列號和確認號并交換TCP窗口大小信息。
設想:如果只有兩次握手呀打,那么第二次握手后服務器只向客戶端發(fā)送ACK包矢赁,此時客戶端與服務器端建立連接。在這種握手規(guī)則下:
假設:如果發(fā)送網絡阻塞聚磺,由于TCP/IP協議定時重傳機制坯台,B向A發(fā)送了兩次SYN請求,分別是x1和x2瘫寝,且因為阻塞原因蜒蕾,導致x1連接請求和x2連接請求的TCP窗口大小和數據報文長度不一致,如果最終x1達到A焕阿,x2丟失咪啡,此時A同B建立了x1的連接,這個時候暮屡,因為AB已經連接撤摸,B無法知道是請求x1還是請求x2同B連接,如果B默認是最近的請求x2同A建立了連接褒纲,此時B開始向A發(fā)送數據准夷,數據報文長度為x2定義的長度,窗口大小為x2定義的大小莺掠,而A建立的連接是x1衫嵌,其數據包長度大小為x1,TCP窗口大小為x1定義彻秆,這就會導致A處理數據時出錯楔绞。
很顯然结闸,如果A接收到B的請求后,A向B發(fā)送SYN請求y3(y3的窗口大小和數據報長度等信息為x1所定義)酒朵,確認了連接建立的窗口大小和數據報長度為x1所定義桦锄,A再次確認回答建立x1連接,然后開始相互傳送數據蔫耽,那么就不會導致數據處理出錯了结耀。
TCP釋放連接需四次揮手
先看圖,直觀的了解下:
需四次揮手原因:由于TCP的半關閉特性匙铡,TCP連接時雙全工(即數據在兩個方向上能同時傳遞)饼记,因此,每個方向必須單獨的進行關閉慰枕。這個原則就是:當一方完成它的數據發(fā)送任務后就能發(fā)送一個FIN來終止這個方向上的連接。當一端收到一個FIN后即纲,它必須通知應用層另一端已經終止了那個方向的數據傳送具帮。即收到一個FIN意味著在這一方向上沒有數據流動了。
目的:保證服務器與客戶端都能完全的接受對方發(fā)送的數據低斋。
假設客戶機A向服務器B請求釋放TCP連接蜂厅,則:
第一次揮手:主機A向主機B發(fā)送FIN包;A告訴B膊畴,我(A)發(fā)送給你(B)的數據大小是N掘猿,我發(fā)送完畢,請求斷開A->B的連接唇跨。
第二次揮手:主機B收到了A發(fā)送的FIN包稠通,并向主機A發(fā)送ACK包;B回答A买猖,是的改橘,我總共收到了你發(fā)給我N大小的數據,A->B的連接關閉玉控。
第三次揮手:主機B向主機A發(fā)送FIN包飞主;B告訴A,我(B)發(fā)送給你(A)的數據大小是M高诺,我發(fā)送完畢碌识,請求斷開B->A的連接。
第四次揮手:主機A收到了B發(fā)送的FIN包虱而,并向主機B發(fā)送ACK包筏餐;A回答B(yǎng),是的薛窥,我收到了你發(fā)送給我的M大小的數據胖烛,B->A的連接關閉眼姐。