TCP滑動窗口協(xié)議_第1頁
TCP滑動窗口協(xié)議_第2頁
TCP滑動窗口協(xié)議_第3頁
TCP滑動窗口協(xié)議_第4頁
TCP滑動窗口協(xié)議_第5頁
免費預覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、TCP 滑動窗口協(xié)議TCP 的首部中有一個很重要的字段就是 16 位長的窗口 大小,它出現(xiàn)在每一個 TCP 數(shù)據(jù)報中,配合 32 位的確認序 號,用于向?qū)Χ送ǜ姹镜?socket 的接收窗口大小。 也就是說, 如果本地 socket 發(fā)送一個 TCP 數(shù)據(jù),其 32 位確認序號是 5, 窗口大小是 5840 ,則用于告訴對端,對端已經(jīng)發(fā)出的4個字節(jié)的數(shù)據(jù)已經(jīng)收到并確認, 接下來, 本地 socket 最多能 夠接收從第 5 個字節(jié)開始的 5840 個字節(jié)長度的數(shù)據(jù)。這是 由接收方進行的一種流量控制,接收方通過告訴發(fā)送方自己 所能夠接收數(shù)據(jù)的大小,達到控制發(fā)送方發(fā)送速度的目的。 結(jié)構體 stru

2、ct tcp_sock 中有很多成員數(shù)據(jù)跟滑動窗口協(xié)議相 關,需要注意的是這里講的滑動窗口都是指本地 socket 的接 收窗口。 成員 window_clamp 表示滑動窗口的最大值, 滑動窗口的大小在變化的過程中不能超出這個值。 它在 TCP 連接建立的時候被初始化,被置為最大的 16 位整數(shù)左移窗 口的擴大因子,因為滑動窗口在 TCP 首部中以 16 位表示, window_clamp 太大會導致滑動窗口不能在 TCP 首部中表示。 成員 rx_opt 是一個 struct tcp_options_received 結(jié)構體,它 有兩個成員 snd_wscale 和 rcv_wscale

3、,分別表示來自對端 通告的滑動窗口擴大因子 (本地發(fā)送數(shù)據(jù)報時需要遵守 ),和 本地接收滑動窗口的擴大因子。 snd_wscale 從來自對端的第 一個 SYN 中獲取。 rcv_wscale 在本地 socket 建立連接時初 始化,它賦值的原則是使 16 位整數(shù)的最大值左移 rcv_wscale 后,至少可以達到整個接收緩存的最大值。接收緩存最大值 在協(xié)議棧中由全局變量 mysysctl_rmem_max 表示,它是 256*(256+sizeof(struct sk_buff) 后的值,為 107520 ,但 sysctl_tcp_rmem3 所表示的接收緩存的上限更大,為 174760

4、 ,所以,取后者,這樣的話, rcv_wscale 的值幾乎 可以說是固定的, 為 2 。所以 window_clamp 的值就是 65535 << 2 = 262140 ??梢姡?window_clamp 的值超出了接收 緩存的最大值, 但這沒有關系, 因為在滑動窗口增長的時候, 會考慮接收緩存的大小這個因素的。 rcv_wnd 表示當前 的接收窗口的大小,這個值在接收到來自對端的數(shù)據(jù)后,會 變動的。它的初始值取接收緩存大小的 3/4 跟 MAX_TCP_WINDOW 之間的最小值, MAX_TCP_WINDOW 在系統(tǒng)中的定義為 32767U 。然后,還要根據(jù) mss 的值作一

5、 個調(diào)整,調(diào)整邏輯是:如果 mss 大于 3*1460 ,則如果當前 的 rcv_wnd 大于兩倍的 mss ,就取兩倍的 mss 作為 rcv_wnd 的值;如果 mss 大于 1460 ,則如果當前的 rcv_wnd 大于 3 倍的 mss ,就取 3 倍的 mss 作為 rcv_wnd 的新值;否則, 如果rcv_wnd大于4倍的 mss,就取4倍的 mss作為rcv_wnd 的新值,我們的實驗環(huán)境的 mss 值為 1448( 因為 tcp 首部有 12 字節(jié)的時間戳選項 ),所以 rcv_wnd 最后被調(diào)整為一個閥值,其初始值就置為 rcv_wnd 。它跟 rcv_wnd 配合工 作,

6、當本地 socket 收到數(shù)據(jù)報,并滿足一定條件時,增長 rcv_ssthresh 的值,在下一次發(fā)送數(shù)據(jù)報組建 TCP 首部時, 需要通告對端當前的接收窗口大小, 這時需要更新 rcv_wnd , 此時 rcv_wnd 的取值不能超過 rcv_ssthresh 的值。兩者配合, 達到一個滑動窗口大小緩慢增長的效果。 rcv_wup 記錄 滑動窗口的左邊沿,即落在滑動窗口中的最小的一個序號。 這樣的話, rcv_wup+rcv_wnd 即為滑動窗口的右邊沿, rcv_wup+rcv_wnd-rcv_nxt 即為滑動窗口的空白部分。它的 初始值為 0 ,在移動滑動窗口時被更新。 以上是關于接 收

7、滑動窗口的幾個相關數(shù)據(jù),下面我們看看它們是如何運用 在 TCP 協(xié)議的通訊中的。 每次發(fā)送一個 TCP 數(shù)據(jù)報, 都要構建 TCP 首部,這時,會調(diào)用 mytcp_select_window 選擇窗口大小,窗口大小選擇的基本思想是接收緩存剩余空 間大小的 3/4 ,但是不能超過 rcv_ssthresh 的大小。但是, 如果這個新選擇的窗口大小比當前窗口的剩余大小還小,則 以當前窗口的剩余大小作為新窗口的大小。同時右移左邊沿, 令 rcv_wup=rcv_nxt 。這個新選擇的窗口是受 rcv_ssthresh 限制的,一般不會有什么問題,但我們可以看到代碼中還是 作了一些上限判斷, 如果擴大

8、因子為 0, 則窗口大小不能超過 32767U ,否則不能超過 65535 左移擴大因子后的值。 每次接收到來自對端的一個 TCP 數(shù)據(jù)報,且數(shù)據(jù)報長度大于 128 字節(jié)時,我們需要調(diào)用 mytcp_grow_window ,增加 rcv_ssthresh 的值,一般每次為 rcv_ssthresh 增長兩倍的 mss ,增加的條件是 rcv_ssthresh 小于 window_clamp, 并且 rcv_ssthresh 小于接收緩存剩余空間的 3/4 ,同時 mytcp_memory_pressure 沒有被置位 ( 即接收緩存中的數(shù)據(jù) 量沒有太大 )。 mytcp_grow_window 中對新收到的 skb 的長 度還有一些限制,并不總是增長 rcv_ssthresh 的值。具體見 函數(shù)代碼。 以上是關于接收窗口,下面簡單看一下發(fā)送 窗口。關于發(fā)送窗口,在 struct tcp_sock 中也有一些成員數(shù) 據(jù)相關。 snd_wl1 記錄發(fā)送窗口更新時,造成窗口更新 的那個 ACK 數(shù)據(jù)報的第一個序號。它主要用于在下一次判 斷是否需要更新發(fā)送窗口。 snd_wnd 是發(fā)送窗口的大小, 直

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論