TCP(Transmission Control Protocol 傳輸控制協議)是1種面向連接的、可靠的、基于字節流的傳輸層通訊協議。
TCP 報文段的報頭有 10 個必須的字段和 1 個可選字段。報頭最少為 20 字節。報頭后面的數據是可選項。
1)源端口(16位)
標識發送報文的計算機端口或進程。1個 TCP 報文段必須包括源端口號,使目的主機知道應當向何處發送確認報文。
2)目的端口(16位)
標識接收報文的目的主機的端口或進程。
3) 序號(也叫序列號)(32位)
用于標識每一個報文段,使目的主機可確認已收到指定報文段中的數據。當源主機用于多個報文段發送1個報文時,即便這些報文到達目的主機的順序不1樣,序列號也能夠使目的主機按順序排列它們。
在 SYN 標志未置位時,該字段唆使了用戶數據區中第1個字節的序號;在 SYN 標志置位時,該字段唆使的是初始發送的序列號。
在建立連接時發送的第1個報文段中,雙方都提供1個初始序列號。TCP 標準推薦使用以 4ms 間隔遞增 1 的計數器值作為這個初始序列號的值。使用計數器可以避免連接關閉再重新連接時出現相同的序列號。
對那些包括數據的報文段,報文段中第1個數據字節的數量就是初始序列號,其后數據字節按順序編號。如果源主機使用一樣的連接發送另外一個報文段,那末這個報文段的序列號等于前1個報文段的序列號與前1個報文段中數據字節的數量之和。例如,假定源主機發送 3 個報文段,每一個報文段有 100 字節的數據,且第1個報文段的序列號是 1000,那末第2個報文段的序列號就是 1100(1000 + 100),第3個報文段的序列號就是 1200(1100 + 100)。
如果序列號增大至最大值將復位為 0。
4)確認號(32位)
目的主機返回確認號,使源主機知道某個或幾個報文段已被接收。如果 ACK 控制位被設置為 1,則該字段有效。確認號等于順序接收到的最后1個報文段的序號加 1,這也是目的主機希望下次接收的報文段的序號值。返回確認號后,計算機認為已接收到小于該確認號的所有數據。
例如,序列號等于前1個報文段的序列號與前1個報文段中數據字節的數量之和。例如,假定源主機發送 3 個報文段,每一個報文段有 100 字節的數據,且第1個報文段的序列號是 1000,那末接收到第1個報文段后,目的主機返回含確認號1100 的報頭。接收到第2個報文段(其序號為 1100 )后,目的主機返回確認號 1200。接收到第3個報文段后,目的主機返回確認號 1300 。
目的主機不1定在每次接收到報文段后都返回確認號。在上面的例子中,目的主機可能等到所有 3 個報文段都收到后,再返回1個含確認號 1300 的報文段,表示已接收到全部 1200 字節的數據。但是如果目的主機再發回確認號之前等待時間太長,源主機會認為數據沒有到達目的主機,并自動重發。
上面的例子中,如果目的主機接收到了報文段號為 1000 的第1個報文段和報文段號為 1200 的最后1個報文段,則可返回確認號 1100,但是再返回確認號 1300 之前,應當等待報文段號為 1100 的中間報文段。
5) 數據偏移(首部長度)(4位)
TCP 報文段的數據起始處距離 TCP 報文段的起始處有多遠,即首部長度。由于 TCP 報頭的長度隨 TCP 選項字段內容的不同而變化,因此報頭中包括1個指定報頭字段的字段。該字段以 32 比特為單位,所以報頭長度1定是 32 比特的整數倍,有時需要在報頭末尾補 0 。如果報頭沒有 TCP 選項字段,則報頭長度值為 5 ,表示報頭1個有 160 比特,即 20 字節。
6)保存位(6位)
由跟在數據偏移字段后的 6 位構成, 全部為 0 。
7)控制位(6位)
緊急 URG:此位置 1,表明緊急指針字段有效,它告知系統此報文段中有緊急數據,應盡快傳送。
確認 ACK:僅當 ACK = 1 時確認號字段才有效,TCP 規定,在連接建立后所有轉達的報文段都必須把 ACK 置 1。
推送 PSH:當兩個利用進程進行交互式的通訊時,有時在1真個利用進程希望在鍵入1個命令后立即就可以夠收到對方的響應。在這類情況下,TCP 就能夠使用推送(push)操作,這時候,發送方 TCP 把 PSH 置 1 ,并立即創建1個報文段發送出去,接收方收到 PSH = 1 的報文段,就盡快地(即“推送”向前)交付給接收利用進程,而不再等到全部緩存都填滿后再向上交付。
復位 RST:用于復位相應的 TCP 連接
同步 SYN:僅在3次握手建立 TCP 連接時有效。當 SYN = 1 而 ACK = 0 時,表明這是1個連接要求報文段,對方若同意建立連接,則應在相應的報文段中使用 SYN = 1 和 ACK = 1。因此,SYN 置 1 就表示這是1個連接要求或連接接受報文。
終止 FIN:用來釋放1個連接。當 FIN = 1 時,表明此報文段的發送方的數據已發送終了,并要求釋放運輸連接。
8)窗口(16位)
此字段用來進行流量控制,這個值是本機期望1次接收的字節數,即發送數據的窗口大小。告知對方在不等待確認的情況下,可以發來多大的數據。這里表示的最大長度是2^16 - 1 = 65535,如需要使用更大的窗口大小,需要使用選項中的窗口擴大因子選項。
指發送本報文段的1方的接收窗口(而不是自己的發送窗口)。
9)校驗和(16位)
源主機和目的主機根據 TCP 報文段和偽報頭的內容計算校驗和。在偽報頭中寄存著來自 IP 報頭和 TCP 報文段長度信息。與 UDP 1樣,偽報頭其實不在網絡中傳輸,并且在校驗和中包括偽報頭的目的是為了避免目的主機毛病地接收存在路由的毛病數據報。
偽首部,又稱為偽包頭(Pseudo Header):是指在 TCP 的分段或 UDP 的數據報格式中,在數據報首部前面增加源 IP 地址、目的 IP 地址、IP 分組的協議字段、TCP 或 UDP 數據報的總長度等共12字節,所構成的擴大首部結構。此偽首部是1個臨時的結構,它既不向上也不向下傳遞,僅僅只是為了保證可以校驗套接字的正確性。
10)緊急指針(16位)
僅在 URG = 1 時才成心義,它指出本報文段中的緊急數據的字節數(緊急數據結束后就是普通數據),即指出了緊急數據的末尾在報文中的位置,注意:即便窗口為零時也可發送緊急數據。
如果 URG 為 1 ,則緊急指針標志著緊急數據的結束。其值是緊急數據最后 1 字節的序號,表示報文段序號的偏移量。例如,如果報文段的序號是 1000,前 8 個字節都是緊急數據,那末緊急指針就是 8 。緊急指針1般用處是使用戶可中斷進程。
11)選項、填充字段
可能包括“窗口擴大因子”、“時間戳”等選項。長度可變,最長可達 40 字節,當沒有使用選項時,TCP 首部長度是 20 字節。
填充用于保證任選項為 32bit 的整數倍。
12)數據(長度可變)
TCP 首部結束以后的部份
UDP 是 User Datagram Protocol 的簡稱, 中文名是用戶數據報協議,是1種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。
1)源端口(2 字節):發送方端口號
2)目的端口(2 字節 ):接收方端口號
3)報文長度(2 字節):UDP 用戶數據報的總長度,以字節為單位。
4)校驗和(2 字節):檢測 UDP 用戶數據報在傳輸中是不是有錯,有錯就拋棄。
用于校驗 UDP 數據報的數字段和包括 UDP 數據報首部的“偽首部”。
偽首部,又稱為偽包頭(Pseudo Header):是指在 TCP 的分段或 UDP 的數據報格式中,在數據報首部前面增加源 IP 地址、目的 IP 地址、IP 分組的協議字段、TCP 或 UDP 數據報的總長度等共12字節,所構成的擴大首部結構。此偽首部是1個臨時的結構,它既不向上也不向下傳遞,僅僅只是為了保證可以校驗套接字的正確性。
5)數據:UDP 的數據部份如果不為偶數需要用 0 彌補,就是說,如果數據長度為奇數,數據長度加“1”。
上一篇 struts2標簽截取字符串
下一篇 Java移除字符串中的重復字符