TCPIP学习笔记
TCP的連接
狀態變化
?
各個狀態的意義如下:
LISTEN - 偵聽來自遠方TCP端口的連接請求;?
SYN-SENT -在發送連接請求后等待匹配的連接請求;?
SYN-RECEIVED - 在收到和發送一個連接請求后等待對連接請求的確認;
ESTABLISHED- 代表一個打開的連接,數據可以傳送給用戶;?
FIN-WAIT-1 - 等待遠程TCP的連接中斷請求,或先前的連接中斷請求的確認;
FIN-WAIT-2 - 從遠程TCP等待連接中斷請求;?
CLOSE-WAIT - 等待從本地用戶發來的連接中斷請求;
CLOSING -等待遠程TCP對連接中斷的確認;?
LAST-ACK - 等待原來發向遠程TCP的連接中斷請求的確認;?
TIME-WAIT -等待足夠的時間以確保遠程TCP接收到連接中斷請求的確認;
CLOSED - 沒有任何連接狀態;
三次握手(wireshark抓包如下)
?
說明:1.發送方與接收方各自維護自身的seq與ack
2.關于mass指的是包最大發送數據量,決定了要分幾個包進行發送。Mass加上TCP頭和IP頭的長度就能得到MTU。
3.win表示自身還能接受多少字節的數據。
4.發送方根據ack當中期望收到的下一個字節的序號以及窗口,還有已經發送的字節序號,可以算出還可以發送的字節數。
5.FIN攜帶這個標志的包表示正在請求終止連接。
帶寬與速率、滑動窗口之間的關系
滑動窗口:用于接收方通知發送方自己可以接受的數據大小。
擁塞窗口:用于發送方主動控制發送速率。
帶寬:單位時間內從發送端到接受端所能通過的最高速率。
設滑動窗口大小為W, 發送端和接收端的帶寬為B, RTT為Tr。
TCP發送數據時受滑動窗口的限制,當TCP將滑動窗口中的數據都發出后,在收到第一個ACK之前,滑動窗口大小是0,不能再發送數據了,必須等待ACK包使滑動窗口移動。那么在理想情況下,ACK包應該在什么時候到達呢?顯然,就是在數據發出后的RTT時間后,ACK包到達。這也就是說,現在在不考慮丟包和擁塞情況下,TCP在一個RTT時間內能發出的最大數據量為W,所以不考慮帶寬限制下,TCP能一個時刻能達到的最大速度是 V = W/Tr
如果假設Tr是一個定值,那么決定TCP速率的唯一因素就是TCP的滑動窗口大小。現在再考慮帶寬限制,前面說過當馬路上擺滿車的時候,就無法再往里放車了,同理,TCP發送端在Tr/2時間內,能往通道上放的數據量為 V*Tr/2,當 V*Tr/2<=B*Tr/2時,單向通道容積不構成瓶頸,速率的限制主要來源于窗口大小限制。而當V*Tr/2>B*Tr/2時,則就受到容積限制,即此時速率限制來源于帶寬限制。
把V*Tr/2<=B*Tr/2和V*Tr/2>B*Tr/2兩邊的Tr/2約掉,再把V = W/Tr代入,則可以得到 :
W <= B*Tr 及 W > B*Tr
B*Tr就是帶寬時延乘積,取W為TCP能支持窗口的最大值Wmax,當Wmax <= B*Tr時,此時發送和接收端之間的通道就是所謂的長肥管道,即帶寬時延乘積大的通道。在我們平時生活中使用的寬帶網絡,ADSL等環境下,因為帶寬都比較小,從而B*Tr也比較小,再加上網絡情況比較復雜,擁塞情況比較常見,所以這些網絡環境下,TCP速率的主要限制因素在于帶寬,丟包率等。長肥管道一般不太常見,多見于一些單位使用的專線網絡,在這些網絡中速率的主要限制因素就是窗口大小了,這也是傳統TCP在這些網絡環境中不能充分利用帶寬的原因所在(因為傳統TCP的窗口大小是用2字節表示的,所以最大只有65535(不考慮窗口擴大選項)),除了專線網絡外,隨著網絡硬件技術的發展,萬兆交換機的出現,局域網中也可能會出現帶寬時延乘積較大的情況。
總結,在W<B*Tr時,影響TCP發送數據速率的最直接的因素是滑動窗口的大小,TCP的流量控制策略(比如超時時窗口設置為1,重復ACK時窗口減半)最終都是通過控制窗口大小來控制速率,而慢啟動,擁塞避免這些流量控制算法實際上就是控制窗口增長方式的算法,也就是控制的是加速度大小。當W>B*Tr時,則影響速率的因素就是帶寬了。
重傳的研究
網絡之所以能限制發送窗口,是因為它一口氣收到太多數據時會發生擁塞。
擁塞窗口的維護:
?
發生超時重傳之后:
?
快速重傳:當發送方得到三個或以上重復確認時,就意識到相應的包已經丟,立即重傳。之所以限定三個或者以上可以在很大程度上避免因亂序而觸發快速重傳。
說明:
?
轉載于:https://www.cnblogs.com/wangzhenghua/p/10254877.html
總結
- 上一篇: PostgreSQL JDBC SQLW
- 下一篇: [AH2017/HNOI2017]礼物(