TCP/IP学习笔记(九)TCP报文段首部格式
TCP為了實現穩定可靠的傳輸,自然是需要在發送數據時附帶一些信息,對端接收到報文段后將用戶數據分離開存放在接收緩沖區,然后根據附加信息決定接下來的行為。所以即使TCP是面向字節流的傳輸協議,但是傳輸的基本單元卻是報文段。
報文段由報文首部和數據組成,報文首部最小占20字節最多占60字節,固定的20字節包含各種連接信息,可擴展的40字節存放各種選項值
源端口和目的端口
各占2個字節,分別寫入源端口號和目的端口號。比如客戶端端口號10000,服務器端口號9999,那么客戶端發送的報文段中源端口號為10000,目的端口號為9999。服務器發送的報文段相反
序列號
占4個字節,范圍是[0:232[0:232]。表示數據的第一個字節的序列號,由于TCP的數據交互是基于序列號的(控制滑動窗口),發送方通過序列號控制發送數據以及超時重傳,接收方通過序列號控制亂序重排
接收方可以根據第一個字節序列號 + 數據個數算出最后一個字節的序列號,并將其加一用作應答
當序列號增加到232?1232?1后,會重新從0開始,由于232232字節為4GB,可以保證重復使用的序列號代表的數據已經成功到達對端
確認號
占4個字節,表示期望下次收到的序列號。比如服務器收到客戶端發來的報文段,其序列號字段值為501,并通過計算可知數據長度為200,所以服務器可以算出最后一個字節的序列號為700。這表明服務器正確收到了客戶端發送的序列號到700為止的數據,因此,服務器期望下次收到的序列號為701,并將其作為確認號放入應答報文段中
確認號和序列號范圍相同,當溢出時從0開始
數據偏移
占4位(注意這個單位是位,不是字節),表示TCP報文段的第一個數據距離報文段起始處有多遠。由于TCP報文段首部長度不確定,20到60字節不等,所以需要一個字段用于找到數據起始處
數據偏移代表的是4字節的倍數,由于4位二進制最大可以表示15,所以數據偏移最大為4 * 15 = 60,這也是TCP報文段首部的最大長度
保留
占6位,目前不使用
控制位
TCP報文段首部存在6個控制位,用于說明報文段的性質,每個控制字段占1位
緊急URG
表示報文段中的數據是緊急數據,需要馬上處理。接收方收到這種類型的報文段后,不會像正常流程那樣將數據追加到接收緩沖區末尾,而是插到緩沖區開始的位置,這樣應用程序就可以立即讀取緊急數據
比如鍵入Ctrl + C時,就會將這條中斷信息放在緩沖區頭部,否則,只有當應用程序將之前的數據全部處理完才能夠接收這個終止信息
該控制位需要配合緊急指針一同使用
確認ACK
只有當ACK位被置1時確認號才有用。TCP規定,連接建立后發送的所有報文段ACK位都必須置1
推送PSH
當發送方希望數據可以立即發送給對端時,TCP會將報文段首部的PSH位置1,接收方同樣將PSH位置1的報文段中的數據盡快告知應用程序
該控制位很少使用,因為TCP會自己決定什么時候應該使用PUSH操作
復位RST
用于復位,表示連接出現錯誤,應當立即關閉。當TCP接收到復位報文段后會通知應用程序連接被復位,隨后關閉連接
同步SYN
連接建立的過程中用于同步序列號,告知對方自己的起始序列號。可以根據對方的序列號初始化緩沖區起點(滑動窗口)
SYN=1,ACK=0時表示一個連接請求報文段,SYN=1,ACK=1表示一個連接接收報文段
終止FIN
用于釋放連接,報文段中FIN控制位為1表示已經將數據發送完畢,等待關閉連接
窗口
占2個字節,表示發送該報文段的一方能夠接收的字節數,用于控制對端發送數據的個數(控制對端滑動窗口)
窗口值范圍為[0,:216?1][0,:216?1]
檢驗和
占2個字節,用于檢驗報文段是否出錯。發送方根據發送的報文段計算檢驗和填入報文段首部,接收方根據接收的報文段重新計算,如果不匹配,表明報文段出錯
緊急指針
占2個字節,表示緊急數據的個數,因為報文段中可以既包含緊急數據也可以包含普通數據,該字段用于區分二者
只有緊急URG控制位置1時才有效
選項
長度可變, 最長為40字節,當沒有使用選項字段時,TCP報文段首部共20字節。
TCP選項比較常用的是MSS,即最大報文段長度。需要注意的是MSS指的是數據的最大長度而不是TCP報文段長度。在將數據發送之前,會根據MSS將數據進行合理的切分,即單次發送的報文段中的數據不能超過MSS,所以MSS應該適當調大一些以降低網絡中的報文段個數
總結
以上是生活随笔為你收集整理的TCP/IP学习笔记(九)TCP报文段首部格式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每天一道LeetCode-----给定二
- 下一篇: 每天一道LeetCode-----计算给