1.數據包說明服務器
1)源端口號(16位):它(連同源主機IP地址)標識源主機的一個應用進程。併發
2)目標端口號(16位):它(連同源主機IP地址)標識目的主機的一個應用進程。這兩個值加上IP報頭中的源主機IP地址和目的主機IP地址惟一肯定一個TCP鏈接。spa
3)順序號 seq(32位):用來標識從TCP源端向TCP目標端發送的數據字節流,它表示在這個報文段中第一個數據字節的順序號。若是將字節流看做在兩個應用程序間的單向流動,則TCP用順序號對每一個字節進行計數。序號是32bit的無符號數,序號到達2的32次方-1後又從0開始。當創建一個新的連接時,SYN標誌變1,順序號字段包含由這個主機選擇的該鏈接的初始順序號ISN指針
4)確認號 ack(32位):包含發送的一端所指望收到的下一順序號。所以,確認序號應當是上次已成功收到數據字節順序號+1。只有ACK標誌爲1時,確認號字段纔有效。TCP爲應用層提供全雙工服務,這意味數據能在兩個方向上獨立的進行傳輸。所以,鏈接的每一端必須保持每一個方向上的傳輸數據順序號。blog
5)TCP報文長度(4位):給出報頭中32bit字的數目,它實際上指明數據從哪裏開始。須要這個值是由於任選字段的長度是可變的。這個字段佔4bit,所以TCP最多有60字節的首部。然而,沒有任選字段,正常的長度爲20字節。進程
6)保留位(6位):保留給未來使用,目前必須置爲0。同步
7)控制位(6位):在TCP報頭中有6個標誌比特,他們中多個可同時被設置爲1。依次爲:it
URG:爲1表示緊急指針有效,爲0則忽略緊急指針值。服務器端
ACK:爲1表示確認號有效,爲0表示報文中不包含確認信息,忽略確認號字段。請求
PSH:爲1表示是帶有PUSH標誌的數據,指示接收方應該儘快將這個報文段交給應用層而不用等待緩衝區裝滿。
RST:用於復位因爲主機崩潰或其餘緣由而出現錯誤的鏈接。它還能夠用於拒絕非法的報文段和拒絕鏈接請求。通常狀況下,若是收到一個RST爲1的報文,那麼必定發生了某些問題。
SYN:同步序號,爲1表示鏈接請求,用於創建鏈接和使順序號同步(synchronize)。
FIN:用於釋放鏈接,爲1表示發送方已經沒有數據發送了,即關閉本方數據流。
8)窗口大小(16位):數據字節數,表示從確認號開始,本報文的源方能夠接收的字節數,即源方接收窗口大小。窗口大小是一個16bit字段,於是窗口大小最大爲65535字節。
9)校驗和(16位):此校驗和是對整個的TCP報文段,包括TCP頭部和TCP數據,以16位字進行計算所得。這是一個強制性的字段,必定是由發送端計算和存儲,並由接收端進行驗證。
10)緊急指針(16位):只有當URG標誌置1時緊急指針纔有效。TCP的緊急方式是發送端向另外一端發送緊急數據的一種方式。
11)選項:最多見的可選字段是最長報文大小,又稱爲MSS。每一個鏈接方一般都在通訊的第一個報文段(爲創建鏈接而設置SYN標誌的那個段)中指明這個選項,它指明本端所能接收的最大長度的報文段。選項長度不必定是32位字的整數倍,因此要加填充位,使得報頭長度成爲整字數。
12)數據:TCP報文段中的數據部分是可選的。在一個鏈接創建和一個鏈接終止時,雙方交換的報文段僅有TCP首部。若是一方沒有數據發送,也使用沒有任何數據的首部來確認收到的數據。在處理超時的許多狀況中,也會發送不帶任何數據的報文段。
2.客戶端與服務器間的通訊
三次握手:
第一次握手:創建鏈接。客戶端發送鏈接請求報文段,將位碼SYN設置爲1,seq爲x;而後客戶端進入SYN_SEND狀態,等待服務器的確認;
第二次握手:服務器收到客戶端的SYN報文段,並對這個SYN報文段進行確認,設置ACK爲x+1(即收到的seq+1);同時本身還要發送SYN請求信息,將SYN設置爲一、seq爲y;服務器端將全部信息放到一個報文段(即SYN+ACK報文段)中,一併發送給客戶端,此時服務器進入SYN_RECV狀態。
第三次握手:客戶端收到服務器的SYN+ACK報文段後將ACK設置爲y+1,seq爲z,向服務器發送ACK報文段,這個報文段發送完後,客戶端和服務器都進入確認狀態,完成三次握手。
爲何要三次握手?答:三次握手的目的是創建可靠的通訊通道。
四次揮手:
第一次揮手:首先客戶端發送一個FIN,用來關閉客戶端到服務器的數據傳送,而後等待服務器的確認。其終止標誌位FIN=1,序列號seq=x;
第二次揮手:服務端收到這個FIN後,它會發回一個ACK給客戶端,確認號ACK爲收到的序號seq+1,服務端進入CLOSE_WAIT狀態;
第三次揮手:服務器數據傳送完成後,會發送一個FIN給客戶端,用來關閉服務端到客戶端的數據傳送,其終止標誌位FIN=1,序列號seq=y,服務端進入LAST_ACK狀態;
第四次揮手:客戶端收到FIN後,客戶端進入TIME_WAIT狀態,併發回一個ACK報文確認,確認序號seq爲收到的序號加1,服務端進入關閉狀態,完成四次揮手。
TCP創建鏈接要進行三次握手,而斷開鏈接要進行四次?這是因爲TCP的半關閉形成的。由於TCP鏈接是全雙工的(即數據可在兩個方向上同時傳遞),因此進行關閉時每一個方向上都要單獨進行關閉。這個單方向的關閉就叫半關閉。當一方完成它的數據發送任務,就發送一個FIN來向另外一方通告將要終止這個方向的鏈接。