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