流重組講解四部曲(一)- IP、TCP流重組概念理解
1、IP碎片重組的理解
在TCP/IP分層中,資料鏈路層用MTU(最大傳輸單元)來限制所能傳輸的資料包大小,MTU是指一次傳送的資料最大長度,不包括資料鏈路層資料幀的幀頭。如乙太網的MTU為1500位元組。
傳送的IP資料報的大小超過了MTU時,IP層就需要對資料進行分片;網路傳輸中IP層不能保證包傳輸是有序進行的,IP協議可能出現將單個包傳輸多次的情況,因此可能出現分片丟失、重疊以及亂序到達等情況,最終在目的地進行碎片重組。
三個可能存在的疑問點:
1.1 MTU是不是越大越好?
因為協議資料單元的包頭和包尾的長度是固定的,MTU越大,則一個協議資料單元承載的有效資料就越長,通訊效率也越高;而且傳送相同的使用者資料所需的資料包個數也越低。
MTU也不是越大越好,因為MTU越大,傳送一個數據包的延遲也越大;並且資料包中位元位發生錯誤的概率也越大。
所以要權衡通訊效率和傳輸延遲選擇合適的MTU。
1.2 什麼情況下可能出現IP分片亂序到達?
IP層不能保證包傳輸是有序進行的。一方面同一資料報的不同分片可能經由不同路徑到達相同的目的地,即傳輸鏈路的不同;另一方面對於高效能路由器而言,常採用並行資料鏈路,不同的處理延時也有可能導致IP分片亂序到達。
1.3 碎片重組只能發生在最終接收端,那麼IP分片是否也只能發生在起始傳送端?
碎片重組只能發生在最終接收端原因有兩點。第一個原因,在網路中不進行重組要比重組更能減輕路由器轉發軟體(或硬體)的負擔。第二個原因,同一資料報的不同分片可能經由不同路徑到達相同的目的地,如果發生這種情況,路徑上的路由器通常沒有能力來重組原始的資料報,因為它們都只能看到所有分片的一個子集。
當IP層接收到一個要傳送的IP資料報時,它會判斷該資料報應該從哪個本地介面傳送(通過查詢一個轉發表)以及要求的MTU是多少。IP比較外出介面的MTU和資料的大小,如果資料報太大則進行分片。IPv4中的分片可以在原始傳送方主機和端到端路徑上的任何中間路由器上進行。值得一提的是,資料報分片自身也可以被分片。IPv6中的分片有些不一樣,它只允許源主機進行分片。
2、TCP重組的理解
應用層向TCP層傳送用於網間傳輸的資料流,TCP則把資料流分割成適當長度的報文段,最大報文段大小(MSS)通常受乙太網MTU限制;對於TCP來說應儘量避免IP分片,TCP協議在實現的時候往往用MTU值減去IP資料包頭部和TCP資料段頭部長度代替MSS,一般為1460位元組;所以通常TCP分段不會再出現IP分片的情況。
MSS是TCP協議定義的一個選項,MSS選項用於在TCP連線建立時,收發雙方協商通訊時每一個報文段所能承載的最大資料長度。
因為TCP使用IP來傳遞它的報文段,IP不提供重複消除和保證次序正確的功能,所以TCP重組主要處理包失序和包重複等問題。TCP是一個位元組流協議,TCP絕不會以雜亂的次序給接收應用程式傳送資料。因此,TCP接收端可能會被迫先保持大序列號的資料不交給應用程式,直到缺失的小序列號的報文段被填滿,最終按序將資料提交給應用程式,這也是TCP重組的目的。
一個可能存在的疑問點:
2.1 TCP分段為什麼要避免IP分片?
因為如果在IP層進行分片的話,如果其中的某片資料丟失了,對於保證可靠性的TCP協議來說,會增大重傳資料包的機率,而且只能重傳整個TCP分組(進行IP分片前的資料包),因為TCP層是不知道IP層進行分片的細節的,也不關心。
2.2 TCP出現包部分重複的原因?
當TCP超時重傳,它並不需要完全重傳相同的報文段。TCP允許執行重新組包,傳送一個更大的報文段來提高效能,因此可能導致部分資料重複!