網絡基礎 — 淺析IP/TCP協議分片

淺析IP/TCP協議分片






首先我們需要知道一個概念,MTU是鏈路層中的網絡對數據幀的一個限制,以以太網爲例,MTU爲1500個字節. 一個IP數據報在以太網中

傳輸,如果它長度大於該MTU值,就要進行分片傳輸,使得每片數據報的長度小於MTU. 分片傳輸的P數據報不一定按序到達,但IP首

部中的信息能讓這些數據報片按序組裝. IP數據報的分片與重組是在網絡層中進行完成的.


我們所熟知的應用層程序之間進行網絡數據傳輸時,在發送端,數據會從應用層沿着協議棧向下傳輸,通過TCP/IP層,然後經由鏈路

層發送出去,而在接收端,則是相反的順序,數據經由鏈路層接受,然後沿着協議棧向上傳輸,通過IP/TCP層,最後由應用程序進行

讀取. 而在IP層往鏈路層傳輸數據的時候,如果數據大小大於等於我們的MTU時, 通常會在IP層進行一個分片操作. 而我們的TCP的數

據報! 他們需要儘量避免在IP層被分片.因爲如果在IP層進行分片的話,如果其中的某片的數據丟失了,對於保證可靠性的TCP協議

說會增大數據報重傳的概率. 而且你會重傳整個TCP分組,因爲TCP層是不知道IP層進行分片的細節的,它也不關心.




當TCP層進行TCP分組的重傳時,還會直接影響到應用程序的性能,特別是在應用程序使用阻塞IO進行讀寫的時候. 在我們的應用層

程序中,我們可以有自己的發送緩衝區,而TCP層本身也有自己的一個發送緩衝區. 當我們在應用層往TCP層當中寫數據的時候,實

際上是將應用層發送緩衝區的數據拷貝至TCP層的發送緩衝區中. 當TCP層的發送緩衝區滿或者網絡空閒的時候,TCP層就會將其緩

衝區中的數據通過IP層傳到鏈路層的發送隊列中.如果TCP的發送緩衝區滿並且應用層的數據沒有寫完時,內核會將write系統調用

起,並不返回給應用程序,直到應用層的數據全部拷貝至TCP層的緩衝區中. 而由於TCP層要保證數據包的可靠性,既數據包丟

失時要進行重傳,那麼TCP層在往網絡發送TCP分組後,需要在其發送緩衝區中暫時保存發出的TCP分組數據用於後續可能的重傳. 

所以如果你的IP層對TCP的數據進行了分片,導致TCP數據丟失,那麼緩衝區當中的數據無法及時清除,因爲他可能會重發. 那麼就

有可能使得應用層程序一直在write系統調用處掛起等待,引起性能的下降.




TCP層避免數據被IP層分片所做的努力





首先我們回顧一下TCP建立連接的3次握手!


其實呢 在這3次握手中,除了確認SYN之外,通信的兩端還協商了一個值,MSS(最大分段大小)是TCP裏的一個概念. MSS是TCP數據包

每次能夠傳輸的最大數據分段,TCP報文段的長度大於MSS時,就需要進行分段傳輸. TCP協在建立連接的時候通常要協商雙方的MSS

值,每一方都有用於通告它期望接受的MSS選項(MSS選項只出現在SYN報文段中,既TCP三次握手的前兩次). MSS的值一般爲MTU值減

去兩個首部大小所以如果用鏈路層以太網,MSS的值往往爲1460.而Internet上標準的MTU位  676,那麼如果不設置,則MSS的默

值就爲636個字節. 很多時候,MSS的值最好取512的倍數. TCP報文段的分段與重組是在運輸層完成的.


到了這裏有一個問題自然就非常明瞭了,TCP分段的原因是MSS,IP分片的原因是MTU,由於一直有MSS<=MTU,很明顯,分段後每一

TCP報文段TCP段再加上IP首部後的的長度不可能超過MTU,因此也就不需要再網絡層進行IP分片了,因此TCP報文段很少會

IP分片的情況.再來看UDP數據報,由於UDP數據報不需要保證可靠性,所以他不用保存發送的數據包,由於IP層本身也沒有緩衝

區,數據就會直接寫到鏈路層的輸出隊列中,在這種情況中,IP層會不會對來自UDP的數據進行分片,這個取決於UDP的大小和

MTU的比較,如果大於MTU,IP對數據報就會分片,如果小於MTU,IP層直接加上IP頭部發送到鏈路層的輸出隊列中



MSS(最大分段大小)是TCP裏的一個概念. MSS是TCP數據包每次能夠傳輸的最大數據分段,TCP報文段的長度大於MSS時,就需要進行分段

傳輸. TCP協在建立連接的時候通常要協商雙方的MSS值,每一方都有用於通告它期望接受的MSS選項(MSS選項只出現在SYN報文段中,

既TCP三次握手的前兩次). MSS的值一般爲MTU值減去兩個首部大小所以如果用鏈路層以太網,MSS的值往往爲1460.而Internet

上標準的MTU位  676,那麼如果不設置,則MSS的默認值就爲636個字節. 很多時候,MSS的值最好取512的倍數. TCP報文段的分段與

重組是在運輸層完成的.到了這裏有一個問題自然就非常明瞭了,TCP分段的原因是MSS,IP分片的原因是MTU,由於一直有MSS<=MTU,

很明顯,分段後每一段TCP報文段TCP報段再加上IP首部後的的長度不可能超過MTU,因此也就不需要再網絡層進行IP分片了,因此

TCP報文段很少會發生IP分片的情況.再來看UDP數據報,由於UDP數據報不會自己進行分段,因此當長度超過了MTU時,會在網絡層進行

IP分片. 同樣的,ICMP同樣會出現IP分片情況 再來看UDP數據報,由於UDP數據報不會自己進行分段,因此當長度超過了MTU時,會在

網絡層進行IP分片,同樣的,ICMP同樣會出現IP分片的情況.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章