昨天晚上群里有位同學提了工作中遇到的問題,如下所示:遇到這樣一個問題。就是協商的mss 是1460。但服務只收到1461- 1645之間的數據。 運維反饋是調低了mtu值後,問題未重現。如果堅持閱讀公眾號寫過關於TCP、IP分片的文章,仔細看這副圖片就能還原問題的現場。Alice有1645字節需要傳輸給Bob,由於使用了MSS=1460,所以1645字節被分成兩個包裹1、2:包裹1,對應圖片中的第4行(1514),對應字節數1-1460字節,Pia! 包裹扔出去了。包裹2,對應圖片中的第5行(238),對應字節數1461-1645字節,Pia! 包裹又扔出去了。包裹2已經安全抵達Bob,否則不會彈射出第6行這個ACK報文。因為包裹1的尺寸(1460)> 包裹2 的尺寸(184)。很顯然,是由於包裹1的尺寸 + 20字節IP頭+ 20字節TCP頭 = 1500 >互聯網上某條鏈路的MTU! 大概率 IP報文頭的DF= 1,所以被互聯網該網絡設備丟棄了。接下來Alice一直在嘗試重傳6次,到達重傳上限值,發送Reset將TCP連接重置。當然抵達Bob的第二個包裹最後也沒有什麼用,一旦Bob接收到Reset指令,立馬釋放包裹2。當然互聯網不光有三層的路由器設備,還有二層的交換機設備。如果交換機設備的MTU <1500,且包裹1會途徑該交換機,無論DF= 0還是DF=1,包裹1都會被丟棄。中國電信AS號假設 = 10,中國聯通AS號假設=20,問:中國電信BGP路由器將BGP路由,發給中國聯通,中國聯通會將中國電信的路由,再發給中國電信嗎?是否啟用水平分割原則?當然不會發,當然也會啟用水平分割原則,且水平分割原則比普通的路由協議還要嚴格。中國電信發給中國聯通的BGP路由,都會攜帶一個AS-Path =10的屬性值。同時中國電信還會將凡是攜帶as-path =20過濾掉(Filter Out)。換句話說,凡是攜帶聯通AS= 20的路由,都不會發給中國聯通,這是第一道保險(Out-Bound Filter)。聯通又不傻,對於電信發給自己的路由啟用入向過濾(In-Bound Filter)。凡是路由攜帶AS-Path = 20(聯通自己的AS號)的統統扔掉,這是第二道保險。聯通將BGP路由表發給電信時,和電信一樣的操作,凡是攜帶中國電信AS號的(10),全部過濾掉,不能發給電信。電信接收聯通BGP路由時,首先過濾掉攜帶自己AS號(10)的路由表,丟棄處理。接收其它所有路由表。即使聯通將電信BGP路由(AS-PATH =10)發給中國移動(AS= 30)。那麼中國移動向中國電信分享BGP表時,一樣會將攜帶電信AS號(AS-PATH =10)的路由過濾掉。電信入向過濾掉AS-Path =10 的所有路由,這就是BGP大名鼎鼎的雙保險組合。即使其中一個節點出現問題,也有另外一個保險防止路由的環路。至於如何學好計算機網絡,首先要堅持閱讀文章。多思考,帶着問題去學習。深度學習要閱讀RFC文檔、協議白皮書。另外,計算機網絡是一門有科技含量的學科,不要妄自菲薄,淡泊明志才是真!
鑽石舞台 發表在 痞客邦 留言(0) 人氣()