前面用兩節(jié)內(nèi)容的篇幅介紹了TCP協(xié)議首部格式,TCP的基本功能都是靠其首部這些字段的支持。那么在固定首部之后,還有長度可變的選項字段,可以提供一些附加功能。既然是長度可變,說明選項肯定不止一個,這里面有些比較重要的,也是常用的選項,我們也有必要學(xué)習(xí)一下。
最大報文段長度(MSS)
MSS是TCP最初規(guī)定的一種選項,該字段的值規(guī)定了TCP報文數(shù)據(jù)部分的最大長度。這是一個值得注意的點,雖然它的名字是報文段長度,但實際上它是指去除了首部的數(shù)據(jù)部分的最大長度,我們是不是可以把它理解成是一種傳輸層TCP的“MTU值”呢。
從數(shù)據(jù)鏈路層的角度來看,我們知道以太網(wǎng)最初規(guī)定最小幀長的目的是:為了能在爭用期時間之內(nèi)檢測到數(shù)據(jù)幀的是否發(fā)生碰撞的情況。如果是很短的幀,那么在檢測碰撞的時候有可能就會發(fā)生問題。那如果我們從另一方面來看,如果是數(shù)據(jù)部分很短的幀,只有1個字節(jié)的數(shù)據(jù),加上幀首部和幀尾部等開銷,那么整體的網(wǎng)絡(luò)利用率就不高,因為大部分的網(wǎng)絡(luò)資源都用在傳輸開銷上面。
類似的道理,傳輸層TCP要設(shè)置一個最大報文段長度也是為了解決網(wǎng)絡(luò)利用率不高的問題。我們可以想一下這種情況:
如果在極端情況下,應(yīng)用層傳遞下來的數(shù)據(jù)只有1個字節(jié),傳輸層TCP要給它加上首部(最少20字節(jié)),到了網(wǎng)絡(luò)層加上IP首部(最少20字節(jié)),到了數(shù)據(jù)鏈路層還要加上幀首部。這樣來看的話,利用率就很低。相當(dāng)于是用了一個大盒子里面裝了一個小的瓜子。
所以從這個角度看,MSS應(yīng)該設(shè)置的盡量大一些,盡量提高網(wǎng)絡(luò)利用率。那么應(yīng)該設(shè)置到什么樣的程度呢?當(dāng)然不能設(shè)置的太大,因為還要考慮到數(shù)據(jù)鏈路層規(guī)定了MTU值,如果在傳輸層把MSS設(shè)置的太大,那么整個的TCP報文就大,到了網(wǎng)絡(luò)層之后這些都變成了IP包的數(shù)據(jù)部分,太大的數(shù)據(jù)部分通不過數(shù)據(jù)鏈路層的MTU,所以IP就要進(jìn)行數(shù)據(jù)包的分片,分的片太多就有一定的安全隱患,因為只要接收端少收到其中一個片,整個的IP包就組裝不成,無法向上層交付。
所以把MSS要設(shè)置為一個合適的大小,需要通信雙方在TCP連接建立時進(jìn)行確定,雙方都把自己能夠支持的MSS寫入這一字段,以后就按照這個數(shù)值傳送數(shù)據(jù)。但如果沒有對這個值做出設(shè)置,那MSS就取默認(rèn)值:536字節(jié)。
選擇確認(rèn)(SACK)
“選擇確認(rèn)”要和我們前面學(xué)習(xí)過的“連續(xù)ARQ的選擇重傳”聯(lián)想起來,選擇確認(rèn)的意思是說:如果數(shù)據(jù)傳輸中,丟失了一些報文段,使得接收方接收的時候“缺少”中間的一些報文段,這時候接收方可以不把它們?nèi)縼G棄,而是可以先暫存下來,但是要告訴發(fā)送方丟失了哪些數(shù)據(jù)。這種“告訴”的方法就是使用選擇確認(rèn)。
我們前面學(xué)習(xí)確認(rèn)號的時候,知道了確認(rèn)號的意思是我期望接下來收到的數(shù)據(jù)序號,選擇確認(rèn)也是這樣的。比如發(fā)送的是序號為1~4000的數(shù)據(jù),但是接收方只收到了1~1000、1500~3000、3500~4000。那么接收方就要發(fā)送確認(rèn)號為1001、3001、4001的選擇確認(rèn),以便讓發(fā)送方知道哪些數(shù)據(jù)是正常收到的。
如果使用選擇確認(rèn),那么原來首部中的“確認(rèn)號”字段用法仍然不變,只是增加了SACK選項。所以在建立TCP連接的時候,通信雙方必須都約定好“允許SACK”。
用戶超時(UTO)
“用戶超時”選項用來設(shè)置TCP“超時定時器”的超時時間。前面在學(xué)習(xí)ARQ自動重傳的時候,我們分析過,超時定時器的時間應(yīng)該設(shè)置的比平均往返時間長一點是比較合理的。但這并不是固定的,TCP通信雙方可以通過“用戶超時”選項設(shè)置一個超時數(shù)值,并將設(shè)置的這個數(shù)值告訴對方。這個數(shù)值指出了:發(fā)送方愿意等待對方發(fā)來ACK的時間,也就是超時的時間。
窗口縮放(WSOPT)
在學(xué)習(xí)TCP報文首部格式的時候,我們知道了“窗口”的概念,窗口值指的是接收窗口的大小,實際上也就是接收緩存能夠容納對方發(fā)來多少數(shù)據(jù)。
那么,“窗口縮放”選項,顧名思義就是可以擴(kuò)大接收窗口的大小,也可以將擴(kuò)大后的窗口縮小回來。TCP首部“窗口值”字段長度是16位,也就意味著窗口最大是2^16大小,如果使用窗口縮放選項,則允許窗口可以擴(kuò)大為2^30的大小。
當(dāng)然,是否使用“窗口縮放”選項,由通信雙方在TCP建立連接時進(jìn)行協(xié)商,如果有一方使用了窗口擴(kuò)大,當(dāng)它不再需要擴(kuò)大其窗口時,可以使窗口大小再回到2^16。
以上就是TCP首部中常用的幾個選項,當(dāng)然我們前面還學(xué)過一個“時間戳”的選項,具有防止序號繞回的功能,這也是一種選項。到這里,TCP首部就基本學(xué)完了(但是還沒全部學(xué)完,“檢驗和”放到后面和UDP一起學(xué)習(xí))。下一節(jié)我們學(xué)習(xí)TCP建立連接的過程。文章來源:http://www.zghlxwxcb.cn/news/detail-661985.html
參考教材:W.Richard Stevens《TCP/IP詳解? ?卷一:協(xié)議》文章來源地址http://www.zghlxwxcb.cn/news/detail-661985.html
到了這里,關(guān)于45、TCP的幾個常用選項的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!