TCP首部格式
tcp數據是被封裝在IP數據包中的,和udp類似,在IP數據包的數據部分。tcp數據包的格式如下:
源端口號和目的端口號(尋址)與udp中類似,用於尋找發端和收端應用進程。這兩個值加上IP首部中的源端IP地址和目的端IP地址唯一確定一個,在網絡編程中,一般一個IP地址和一個端口號組合稱為一個套接字(socket)。
序號(seq):用來標識從TCP發端向TCP收端發送的數據字節流,它表示在這個報文段中的第一個數據字節。在tcp中tcp用序號對每個字節進行計數(這個值與發送的幀數沒有關系,而是與發送的數據字節數有關系,后面會有說明)。
確認序號(seq+1):包含發送確認的一端所期望收到的下一個序號。因此,確認序號應當是上次已成功收到數據字節序號加 1(不是單純的序號加1,還包括數據字節數)。
首部長度:用於記錄tcp數據報首部的長度,一般為20字節,實際值為首部長度除以4。
源端口號和目的端口號(尋址)與udp中類似,用於尋找發端和收端應用進程。這兩個值加上IP首部中的源端IP地址和目的端IP地址唯一確定一個,在網絡編程中,一般一個IP地址和一個端口號組合稱為一個套接字(socket)。
序號(seq):用來標識從TCP發端向TCP收端發送的數據字節流,它表示在這個報文段中的第一個數據字節。在tcp中tcp用序號對每個字節進行計數(這個值與發送的幀數沒有關系,而是與發送的數據字節數有關系,后面會有說明)。
確認序號(seq+1):包含發送確認的一端所期望收到的下一個序號。因此,確認序號應當是上次已成功收到數據字節序號加 1(不是單純的序號加1,還包括數據字節數)。
首部長度:用於記錄tcp數據報首部的長度,一般為20字節,實際值為首部長度除以4。
下面的是標志位對應的功能:
URG: 緊急指針( urgent pointer)有效。
ACK: 確認序號有效。
PSH: 接收方應該盡快將這個報文段交給應用層。
RST: 重建連接。
SYN: 同步序號用來發起一個連接。
FIN: 發端完成發送任務。
窗口大小:用於流量控制。
檢驗和:檢驗和覆蓋了整個的 TCP報文段: TCP首部和TCP數據,與udp相似需要計算偽首部。
(1)每個TCP段都包括源端和目的端的端口號,用於尋找發送端和接收端的應用進程。這兩個值加上IP首部的源端IP地址和目的端IP地址唯一確定一個TCP連接。
(2)序號用來標識從TCP發送端向接收端發送的數據字節流,它表示在這個報文段中的第一個數據字節。如果將字節流看作在兩個應用程序間的單向流動,則TCP用序號對每個字節進行計數(seq)。
(3)當建立一個新連接時,SYN標志變1。序號字段包含由這個主機選擇的該連接的初始序號ISN,該主機要發送數據的第一個字節的序號為這個ISN加1,因為SYN標志使用了一個序號。
(4)既然每個被傳輸的字節都被計數,確認序號包含發送確認的一端所期望收到的下一個序號。因此,確認序號應當時上次已成功收到數據字節序號加1。只有ACK標志為1時確認序號字段才有效。(ack)
(5)發送ACK無需任何代價,因為32位的確認序號字段和ACK標志一樣,總是TCP首部的一部分。因此一旦一個連接建立起來,這個字段總是被設置,ACK標志也總是被設置為1。
(6)TCP為應用層提供全雙工的服務。因此,連接的每一端必須保持每個方向上的傳輸數據序號。
(7)TCP可以表述為一個沒有選擇確認或否認的滑動窗口協議。因此TCP首部中的確認序號表示發送方已成功收到字節,但還不包含確認序號所指的字節。當前還無法對數據流中選定的部分進行確認。
(8)首部長度需要設置,因為任選字段的長度是可變的。TCP首部最多60個字節。
(9)6個標志位中的多個可同時設置為1
◆URG-緊急指針有效
◆ ACK-確認序號有效
◆ PSH-接收方應盡快將這個報文段交給應用層
◆ RST-重建連接
◆ SYN-同步序號用來發起一個連接
◆ FIN-發送端完成發送任務
(10)TCP的流量控制由連接的每一端通過聲明的窗口大小來提供。窗口大小為字節數,起始於確認序號字段指明的值,這個值是接收端期望接收的字節數。窗口大小是一個16為的字段,因而窗口大小最大為65535字節。
(11)檢驗和覆蓋整個TCP報文端:TCP首部和TCP數據。這是一個強制性的字段,一定是由發送端計算和存儲,並由接收端進行驗證。TCP檢驗和的計算和UDP首部檢驗和的計算一樣,也使用偽首部。
(12)緊急指針是一個正的偏移量,序號字段中的值相加表示緊急數據最后一個字節的序號。TCP的緊急方式是發送端向另一端發送緊急數據的一種方式。
(13)最常見的可選字段是最長報文大小MMS,每個連接方通常都在通信的第一個報文段中指明這個選項。它指明本端所能接收的最大長度的報文段。
Wireshark抓包分析TCP結構
利用wireshark抓取一個tcp數據包,查看其具體數據結構和實際的數據:
TCP是一種面向連接的、可靠的、基於字節流的傳輸層通信協議。
面向連接: 面向連接意味着使用tcp的應用程序在傳輸數據前必須先建立連接,就如打電話一樣,要先進行撥號,等待對方響應才能開始說話。
可靠性:tcp協議通過下列方式來提高可靠性:
· 1.應用數據被分割成TCP認為最適合發送的數據塊。這和UDP完全不同,應用程序產生的數據報長度將保持不變。由TCP傳遞給IP的信息單位稱為報文段或段。(定長)
· 2.當TCP發出一個段后,它啟動一個定時器,等待目的端確認收到這個報文段。如果不能及時收到一個確認,將重發這個報文段。(定時重發)
· 3.當TCP收到發自TCP連接另一端的數據,它將發送一個確認。這個確認不是立即發送,通常將推遲幾分之一秒。(確認機制)
· 4.TCP將保持它首部和數據的檢驗和。這是一個端到端的檢驗和,目的是檢測數據在傳輸過程中的任何變化。如果收到段的檢驗和有差錯,TCP將丟棄這個報文段和不確認收到此報文段(希望發端超時並重發)。(檢驗和較檢)
· 5.既然TCP報文段作為IP數據報來傳輸,而IP數據報的到達可能會失序,因此TCP報文段的到達也可能會失序。如果必要,TCP將對收到的數據進行重新排序,將收到的數據以正確的順序交給應用層。(必要時重新排序)
· 6.既然I P數據報會發生重復,TCP的接收端必須丟棄重復的數據。(去重)
· 7.TCP還能提供流量控制。TCP連接的每一方都有固定大小的緩沖空間。TCP的接收端只允許另一端發送接收端緩沖區所能接納的數據。這將防止較快主機致使較慢主機的緩沖區溢出。(流量控制)
字節流:兩個應用程序通過TCP連接交換8 bit字節構成的字節流。
另外,TCP對字節流的內容不作任何解釋。TCP不知道傳輸的數據字節流是二進制數據,還是ASCII字符或者其他類型數據。對字節流的解釋由TCP連接雙方的應用層解釋。
---------------------
原作者:鄭學煒
原文:https://blog.csdn.net/u014590757/article/details/79901948