介紹TCP爲應用層提供的服務,以及TCP首部中的各個字段。網絡
TCP數據被封裝在一個IP數據報中,如圖:指針
TCP首部的數據格式,若是不計選項字段,它一般是20個字節:blog
(1)16位源端口號和16位目的端口號:每一個TCP段都包含源端和目的端的端口號,用於尋找發端和收端應用進程。這兩個值加上IP首部中的源端IP地址和目的端IP地址惟一肯定一個TCP鏈接。進程
(2)32位序號:用來標示從TCP發端向TCP收端發送的數據字節流,它表示在這個報文段中的第一個數據字節,TCP用序號對每一個字節進行計數。序號是32位無符號數,序號到達2^32-1後又從0開始。當創建一個新的鏈接時,SYN標示變爲1,序號字段包含由這個主機選擇的該鏈接的初始序號ISN(Initial Sequence Number)。該主機要發送數據的第一個字節序號爲這個ISN加1,由於SYN標誌消耗了一個序號。TCP爲應用層提供全雙工服務,這意味數據能在兩個方向上獨立地進行傳輸,所以,鏈接的每一端必須保持每一個方向上的傳輸數據序號。同步
(3)32位確認序號:既然每一個傳輸的字節都被計數,確認序號包含發送確認的一端所指望收到的下一個序號。所以,確認序號應當是上次已成功收到數據字節序號加1。只有ACK=1時確認序號字段纔有效。TCP首部中的確認序號標示發方已成功收到字節,但還不包括確認序號所指的字節。當前還沒法對數據流中選定的部分進行確認。例如,若是1~1024字節已經成功收到,下一報文段中包含序號從2049~3072的字節,收端並不能確認這個新的報文段。它所能作的就是發回一個確認序號爲1025的ACK,它也沒法對一個報文段進行否定。例如,若是收到包含1025~2048字節的報文段,但它的校驗和錯誤,TCP接收端所能作的就是發回一個確認序號爲1025的ACK。it
(4)4位首部長度:首部長度給出首部中32bit(4字節)的數目。須要這個值是由於選項字段長度是可變的,這個字段佔4位,所以,TCP最多有(1111)=15*4=60字節的首部,然而,沒有選項字段,正常的長度是20字節。im
(5)保留(6位):時間戳
(6)URG:緊急指針有效d3
(7)ACK:發送ACK無需任何代價,由於32位的確認序號字段和ACK標誌同樣,老是TCP首部的一部分。所以,咱們看到一旦一個鏈接創建起來,這個字段老是被設置,ACK標誌也老是被設置爲1。通信
(8)PSH:接收方應該儘快將這個報文段交給應用層
(9)RST:重建鏈接
(10)SYN:同步序號用來發起一個鏈接
(11)FIN:發端完成發送任務
(12)16位窗口大小:TCP的流量控制由鏈接的每一端經過聲明的窗口大小來提供。窗口大小爲字節數,起始於確認序號字段指明的值,這個值是接受端正指望接收的字節。窗口大小是一個16位字段,所以窗口大小最大爲65535字節。
(13)16位校驗和:校驗和覆蓋整個TCP報文段:TCP首部和TCP數據,這個一個強制性的字段,必定是由發端計算和存儲,並由收端進行校驗。
(14)16位緊急指針:只有URG=1時緊急指針纔有效,緊急指針是一個正的偏移量,和序號字段中的值相加標示緊急數據最後一個字節的序號。TCP的緊急方式是發送端向另外一端發送緊急數據的一種方式。
(15)選項:最多見的可選字段是最大報文長度MSS(Maximum Segment Size),每一個鏈接方一般都在通訊的第一個報文段中指明這個選項。
(16)數據:TCP實際報文。TCP報文段中的數據部分是可選的。在一個鏈接創建和一個鏈接終止時,雙方交換的報文段僅有TCP首部,若是一方沒有數據要發送,也使用沒有任何數據的首部來確認收到的數據,在處理超時的許多狀況下,也會發送不帶任何數據報文段。
TCP首部能夠包含選項部分,最初TCP規範中定義的選項是:(1)選項表結束(2)無操做(3)最大報文段長度
幾乎每一個SYN報文段中都遇到過MSS選項。
最新的TCP規範中定義了新的TCP選項:(1)選項表結束(2)無操做(3)最大報文段長度(4)窗口擴大因子(5)時間戳
如圖:
每一個選項的開始是1字節kind字段,說明選項的類型。kind字段是0和1的選項僅佔1個字節。
其餘選項在kind字節後還有len字節,它說明的長度是指總長度,包括kind字節和len字節。
設置無操做選項的緣由在於容許發送方填充字段爲4字節的倍數。
好比:<mss 512, nop, wscale 0, nop, nop, timestamp 146647 0>
MSS選項設置爲521,自己佔用4字節。後面是NOP,接着是窗口擴大選項。第一個NOP用來將窗口擴大選項填充爲4字節的邊界。
一樣,10字節的時間戳選項放在兩個NOP後,佔12字節。
在好比實際抓包:
儘管TCP和UDP都使用相同的網絡層(IP),TCP卻嚮應用層提供與UDP徹底不一樣的服務。
TCP提供一種面向鏈接的、可靠的字節流服務。
面向鏈接意味着兩個使用TCP的應用在彼此交換數據以前必須先創建一個TCP鏈接。