http://www.cnblogs.com/derekchen/archive/2009/07/15/1524415.html
1、IP分片的情況。IP軟件包有一個[分片]和[重組]模塊,一個IP數據報在傳輸中可以被ip軟件包的[分片]模塊分片,在目的接收端B的IP軟件包 的[重組]模塊重新組合。接收端B的IP軟件包如果收到亂序的IP報文,是不會把這個包交付到高層TCP協議的,直到收到同一個IP報文的全部分片。所 以,如果發送端的FIN被分片,接收端B在收到完整的此IP數據報之前,TCP模塊不會收到這個包的任何分片。
2、發送端A發送了一個FIN,這僅代表發送端A想終止傳輸,並不代表另一端B想終止。這就是說,終止雙向鏈接需要4次握手斷開(也有3次握手斷開,類似 3次握手鏈接),比如,發送端A向發送端B發一個查詢請求,發送端A已經沒有更多的數據要發送了,因此可以發送FIN請求一端斷開,也稱為半斷開,然后, 另一端B則需要時間處理請求,再把查詢結果返回給A,最后B發送FIN。
1)首先是A發送FIN,然后收到來自B的對這個FIN的確認,此時,發送端A將不能發送任何數據包,但可以接受B發來的數據包(這是非常常見的傳輸模式,客戶端發完,終止鏈接)。
2)發送端B仍舊可以繼續發送數據包,直到高層沒有更多的數據,發送端B發送FIN,A收到后發送對這個FIN的確認。此時,雙方都不能再傳輸任何數據了。
3、TCP協議規定,對於收到的亂序報文並不丟棄,而是緩存下來(這樣做是為了減少更多的重傳),立即發送希望接受的報文確認。例如:發送端A發送了以下幾個包:第一個:1001-1100,第二個1101-1200,第三個FIN包(序列號是1201,一個虛字節)。
1)第二個包在傳輸的過程中丟失了,接收端收到第三個包后並不丟棄,而是緩存下來,然后,立即發送一個ACK,確認號是1101(這樣做的目的是不必等到發送端A的第二個包超時后重傳,發送端A收到3個同樣的ACK后立即重傳,這是快速重傳的概念)。
2)當發送端A收到3個確認號都是1101或者第二個包的超時計時器到時間后,立即重新發送第二個包(之所以可以重傳,是因為TCP協議在接收端和發送端都各自建立了兩個發送、接收緩存)。
3)這樣,當接收端B收到來自A的第二個包后,緩存中的數據都是按序的了。
4)對於按序包,接收端B對序列號的最后一個字節+1,也就是發送確認號是1202的ACK包。
5)發送端A收到確認號是1202后,便不能再發送任何數據了。
TCP 的傳輸機構有多個定時器。當一個包發送時,重發定時器開始計數;當收到確認信號后,重發定時器停止計數。如果超過設定時間段還沒有收到確認信號,就 重發該包。一個比較棘手的問題是如何設置該時間段。如果太長,當網絡傳輸錯誤增加時將導致不必要的等待時間;如果太短,就會產生過多的重復包從而降低網絡 的反應時間。現代TCP協議根據實際情況對重發定時器進行動態設定。
不 管重發過程執行得多么有效,很少的丟失包就能嚴重地降低TCP連接的流量。每個未收到的包或包的片段只會在重發定時器超時的時候才會丟失。在數據重發 時,接收過程一直在遞送這些重發的數據,這樣就使總體的數據傳輸陷於停頓,直到丟失的數據被取代為止。這些重發過程導致基於TCP的連接有時處於不穩定狀 態。
IP丟包:
1。接受方:在以太網上,服務端有可能響應不過來(大量客戶端有讀寫需求),服務端訪問密集,丟棄包在所難免
2。 發送方:大量客戶端同時請求服務器發送數據,並且通告窗口很大,那么服務器會很快的把分組送到網卡上,考慮一種比較極端的情況,網絡中還有大量流量占用帶寬,致使 服務器不能迅速將數據發送出去,而網卡可以緩存的分組數是有一定限制的,那么肯定會有數據在未發送前就被丟棄了!而接收方對這種情況毫無所知,不會更改通 告窗口的大小,即流量控制不會起作用
3。網絡傳輸
http://bbs.chinaunix.net/thread-4151013-1-1.html
大家好, 最近在看一些tcp/ip重組方面的東西,有一些問題一直是想不明白?
1、tcp重組和ip重組的區別?? 我的理解是ip重組是重組ip碎片,將ip碎片組成一個包。tcp重組是將亂序包排序,不知道這樣理解是不是對的?
對
2、ip碎片包是不是都包含tcp的頭部? 重組的時候是要把這些頭部都偏移掉嗎?
不是,在IP層看來,TCP的負載以及TCP頭都是IP層的負載,IP層不會去做解釋,直接按大小切片。
3、我用socket程序發一個5000字節的數據,用抓包軟件抓數據包看了下,在數據包的ip層頭部沒有看到設置分片標識和偏移量這兩個值,搞不明白這是怎么回事?
因為在TCP層已經根據協商的MSS對數據進行切分,MSS在協商時已經考慮了MTU,因此傳遞給IP層的數據包不需要再進行切分。
如果想看到IP層切分的效果,最簡單的方式是PING命令,同時通過參數指定數據包的大小大於MTU,就可以看到了。你也可以自己寫個UDP的程序去發送大於MTU的數據包。
第三個問題,tcp建立鏈接的時候協商mss,mss的大小考慮了MTU的大小,也就是說mss是小於MTU的,是不是對於tcp的應用來說,ip層是不會進行分片的,tcp層在組裝的時候已經依據mss的大小對應用層數據進行了切割??
是的,TCP不會網IP層發送大於MTU的報文,這個之前chinauxix有討論。