1. TCP簡介
TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連接(連接導向)的、可靠的、基於IP的傳輸層協議,采用三次握手確認建立一個連接。
TCP為了保證報文傳輸的可靠[1],就給每個包一個序號,同時序號也保證了傳送到接收端實體的包的按序接收。然后接收端實體對已成功收到的字節發回一個相應的確認(ACK);如果發送端實體在合理的往返時延(RTT)內未收到確認,那么對應的數據(假設丟失了)將會被重傳。
2. TCP協議三次握手過程分析
TCP是主機對主機層的傳輸控制協議,提供可靠的連接服務,采用三次握手確認建立一個連接:
位碼即tcp標志位,有6種標示:SYN(synchronous建立聯機) ACK(acknowledgement 確認) PSH(push傳送) FIN(finish結束) RST(reset重置) URG(urgent緊急)
Sequence number(順序號碼) Acknowledge number(確認號碼)
第一次握手:主機A發送位碼為syn=1,隨機產生seq number=1234567的數據包到服務器,主機B由SYN=1知道,A要求建立聯機;
第二次握手:主機B收到請求后要確認聯機信息,向A發送ack number=(主機A的seq+1),syn=1,ack=1,隨機產生seq=7654321的包
第三次握手:主機A收到后檢查ack number是否正確,即第一次發送的seq number+1,以及位碼ack是否為1,若正確,主機A會再發送ack number=(主機B的seq+1),ack=1,主機B收到后確認seq值與ack=1則連接建立成功。
完成三次握手,主機A與主機B開始傳送數據。
3. TCP連接建立
在TCP/IP協議中,TCP協議提供可靠的連接服務,采用三次握手建立一個連接。
第一次握手:建立連接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態; 第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。 完成三次握手,客戶端與服務器開始傳送數據.

4. 通俗理解
通俗理解
第一次對話:
前方敵軍火力很猛,團長叫通訊員小張打電話請求總部支援。
小張拿起電話,說:“呼叫總部,這里是獨立團”。不巧電話線被炸斷了,總部接收不到小張傳來的信息的情況下,溝通失敗。
如果總部聽到小張的呼叫,那么第一次對話成功,接下來進行第二次對話。
第二次對話:
總部聽到了小張的話,但是不巧,總部接電話的只有一個外國友軍,來了句"Hello, balabal"。小張農民出身,一句聽不懂,多次嘗試,溝通失敗。說明總部無法做出正確的應答情況下溝通失敗。
如果總部聽到小張的話,並做出正確應答,並且進行反問,:”小張同志,詳細說一下具體情況。 那么第二次握手成功。
通過前兩次對話,說明總部聽懂了小張的話,並且做出正確應答,接下來進行第3次對話。
第三次對話:
小張剛說完話,來了一個子彈,小張同志犧牲了。總部等了許久,沒聽到小張回話,通話結束。說明小張在無法應答的情況下溝通失敗。
如果小張剛好穿了防彈衣,做出應答:"敵人的火力很猛,請求支援。兩人第3次對話成功,兩人建立起順暢的溝通渠道,接下來開始持續通話。
聽過第二次和第三次對話,證明了總部能聽懂小張的話,並且做出正確應答。
可見,小張要和總部溝通,3次通話過程是必須的。TCP采用三次握手來建立連接,也可以理解了。
5. 為什么要建立3次握手,一次連接
為了保證服務端能收接受到客戶端的信息並能做出正確的應答而進行前兩次(第一次和第二次)握手。
為了保證客戶端能夠接收到服務端的信息並能做出正確的應答而進行后兩次(第二次和第三次)握手。
如果只是兩次,就不能客戶端是否收到服務器端的應答。
6. 引用
http://baike.baidu.com/subview/32754/8048820.htm?from_id=8988699&type=syn&fromtitle=TCP%E5%8D%8F%E8%AE%AE&fr=aladdin
http://www.cnblogs.com/CBDoctor/archive/2012/10/17/2727073.html
