建立連接配接-三次握手
第一次握手:建立連接配接時,用戶端發送syn包(syn=j)到伺服器,并進入SYN_SENT狀态,等待伺服器确認;SYN:同步序列編号(Synchronize Sequence Numbers)。
第二次握手:伺服器收到syn包,必須确認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀态;
第三次握手:用戶端收到伺服器的SYN+ACK包,向伺服器發送确認包ACK(ack=k+1),此包發送完畢,用戶端和伺服器進入ESTABLISHED(TCP連接配接成功)狀态,完成三次握手。
完成三次握手,用戶端與伺服器開始傳送資料。以上稱為三次握手。
<a href="http://s3.51cto.com/wyfs02/M02/71/7D/wKiom1XRq9aBYiBIAAFbSqrASQ4353.jpg" target="_blank"></a>
145.254.160.237向65.208.228.223發送seq,同時SYN标志位設定為1;
65.208.228.223接收到請求封包,回複seq和ack(ack=seq+1),同時SYN和ACK标志位設定為1;
請求端接收到确認封包報,回複ACK進行确認,同時seq=seq+1和ack;
初始化序列号:與作業系統有關,作業系統開機時通過某個算法将序列号上漲,在某一時刻進行三次握手,握手建立成功之後,初始化系列号增長跟傳輸位元組數有關系。不在通過原來的算法增長。
四次揮手:
由于TCP連接配接是全雙工的,是以每個方向都必須單獨進行關閉。這原則是當一方完成它的資料發送任務後就能發送一個FIN來終止這個方向的連接配接。收到一個 FIN隻意味着這一方向上沒有資料流動,一個TCP連接配接在收到一個FIN後仍能發送資料。首先進行關閉的一方将執行主動關閉,而另一方執行被動關閉[1] 。
TCP用戶端發送一個FIN,用來關閉客戶到伺服器的資料傳送。
伺服器收到這個FIN,它發回一個ACK,确認序号為收到的序号加1。和SYN一樣,一個FIN将占用一個序号。
伺服器關閉用戶端的連接配接,發送一個FIN給用戶端。
用戶端發回ACK封包确認,并将确認序号設定為收到序号加1。
<a href="http://s3.51cto.com/wyfs02/M00/71/7E/wKiom1XR1MHTdiOnAACUjKTqHCw651.jpg" target="_blank"></a>
TIME_WAIT狀态也成為2MSL等待狀态。每個TCP實作必須選擇一個封包段最大生存時間MSL(Maximum Segment Lifetime)。它是任何封包段被丢棄前在網絡内的最長時間。
RFC中之處MSL為2分鐘,然後現實中常用值是30秒,1分鐘或者2分鐘。
對于一個具體實作所給定的MSL值,處理原則是:當TCP執行一個主動關閉,并發回最後一個ACK,該連結必須在TIME_WAIT狀态停留的時間為2倍的MSL。這樣可讓TCP再次發送最後的ACK以防止這個ACK丢失。
這種2MSL等待的另一個結果就是這個TCP連接配接在2MSL等待時間,這個連接配接的socket不能再被使用,隻能在2MSL結束之後才能再被使用。
在連接配接處于2MSL等待時,任何遲到的封包段将被丢棄,因為處于2MSL等待的,有該插口對(socket pair)定義的連結在這段時間内不能再被使用。
最大封包長度
當建立一個連接配接時,每一方都有用于通告它期望接收的MSS選項(MSS隻能出現在SYN封包段中)。如果一方不接收來自另一方的MSS值,則MSS就定為預設的536位元組。
一般來說,如果沒有分段發生,MSS還是越大越好。封包段越大允許每個封包段傳送的資料就越多,相對IP和TCP首部有更高的網絡使用率。當TCP發送一個SYN時,或者因為一個本地應用程序想發起一個連接配接,或者是因為另一端的主機收到了一個連接配接請求,它能将MSS值設定為外出口的MTU長度減去IP首部和TCP首部,對于一個以太網,MSS值可達到1460位元組。
TCP 提供面向連接配接、可靠的位元組流服務
面向連接配接意味着兩個使用TCP的應用在彼此交換資料前先建立一個TCP連接配接
TCP通過下列方式提供可靠性:
1.應用資料被分割成TCP認為最合适發送的資料塊(一般情況下,TCP的包不會超過1500,因為TCP會在三次握手時候協商最大傳輸單元)
2.當TCP發送一個段後,它啟動一個定時器,等待目的端确認收到這個封包段。如果不能及時收到一個确認,将重發這個封包段。(發一個包,等待确認,如果不對這個包進行确認,會在一定時間内進行重發)
3.當TCP收到發自TCP連接配接另一端的資料,它将發送一個确認,這個确認不是立即發送,通常将推遲幾分之一秒。(收到包之後,不會立即确認,會等待幾分之一秒之後)
4.TCP将保持它首部和資料的校驗和(計算校驗和時需要加入僞首部進行驗證校驗和)
5.既然TCP封包段作為IP資料報來傳輸,而IP資料報的到達可能會失序,是以TCP封包段的到達也可能會失序。如果必要,TCP将對收到的資料進行重新排序,将收到的資料以正确的順序交給應用層。
6.既然IP資料報發生重複,TCP的接收端必須丢棄重複的資料。()
7.TCP還能提供流量控制。TCP連接配接的每一方都有固定大小的緩沖空間。TCP的接收端隻允許另一端發送接收端緩沖區所能接納的資料。這将防止較快主機緻使較慢主機的緩沖區溢出。(緩存溢出或者緩存不夠,會通知發起方,發起方就不會再繼續發送)
每個TCP段都包含源端口和目的端口号,用于尋找發端和接受端應用程序。這兩個值加上IP首部中的源IP位址和目的IP位址唯一确定一個TCP連接配接。
一個IP位址和一個端口号也成為一個插口(socket),插口對(socketpair)(包含客戶IP位址、用戶端口号、伺服器IP位址和伺服器端口号的四元組)可唯一确定網際網路絡中每個TCP連接配接的雙方
序号用來辨別從TCP發送端向TCP發送端發送的資料位元組流,它辨別在這個封包段中的第一個數字位元組。如果将位元組流看做在兩個應用程式間的單向流動,則TCP用序号對每個位元組進行計數。序号是32bit的無符号數,序号到達23^2-1後從0開始。SYN标志消耗了一個序号,算一個位元組,同樣FIN也算一個位元組,其他ACK,RST均不算。
确認序号應當是上次已經成功收到資料位元組序号加1.隻有ACK标志為1時确認序号字段才有效。
發送ACK無需任何代價,因為32bit的确認序号字段和ACK标志一樣,總是TCP首部的一部分。是以,我們看到一旦一個連接配接建立起來,這個字段總是被設定,ACK标志也總是被設定為1.
TCP為應用層提供全雙工服務。這意味資料能在兩個方向上獨立地進行傳輸。是以,連接配接的每一端必須保持每個方向上的傳輸資料序号。
TCP首部最多有60位元組的首部,沒有任何選項字段,正常長度都是20位元組。
TCP的流量控制由連接配接的每一端通過聲明的視窗大小來提供。視窗大小為位元組數,起始于确認序号字段指明的值,這個值是接收端正期望接收的位元組。視窗大小是一個16bit字段,因而視窗大小最大為65535位元組。
檢驗和覆寫整個的TCP封包段:TCP首部和TCP資料。這是一個強制性的字段,一定是由發起段計算和存儲,并有接收端進行驗證。TCP檢驗和的計算和UDP的計算相似。
隻有當URG标志置為1時緊急指針才有效。緊急指針是一個正的偏移量,和序号字段中的值相加表示緊急資料最後一個位元組的序号。TCP的緊急方式是發送端向另一端發送緊急資料的一種方式。
最常見的可選字段是最長封包大小,又稱為MSS(Maximum SegmentSize)。每個連結方通常都在通信的第一個封包段(為建立連接配接而設定SYN标志的那個段)中指明這個選項。它表明本端所能接收最大長度的封包段。
TCP封包段的資料部分是可選的。在一個連接配接建立和一個連接配接終止時,雙方交換的封包段僅有TCP首部。如果一方沒有資料要發送,也使用沒有任何資料的首部來确認收到的資料。在處理超市的許多情況中,也會發送不帶任何資料的封包段。
本文轉自 安安安安森 51CTO部落格,原文連結:http://blog.51cto.com/smallc/1685328,如需轉載請自行聯系原作者