1006 計算機網路學習 第一篇
前言
工作中,時不時會接觸到跟計算機網路有關的問題,雖然很多時候,不需要我去解決,但是也發現,如果我能看懂聽懂,那我就能更好的理解系統,以及學到更多的東西。但是現在由於我懂得太少,以至於白白錯過了好些知識。因此,下定決心好好學習計算機網路!
工作遇到的問題
前段時間在工作中弄的一個模組,是跟情報板有關的。系統的功能就是定時從訊息佇列根據訂閱的主題獲取資料(路況資訊),然後通過soekct通訊將資訊傳送到相應的機器(後面稱為下位機)上,然後下位機就會將路況資訊顯示到大螢幕上。當時有的下位機是連線網線的,有的下位機由於環境不支援所以只能通過連線WiFi的方式連網。 當時遇到的問題就是,有線的渠道,我們系統傳送資訊過去,下位機能收到。而無線的方式,系統傳送資料過去,下位機收不到。一直在排查問題,但是一直沒能找出是哪裡出問題。最後發現問題是在這邊系統和那邊下位機之間的路由上。由於路由分段傳送資料的時間間隔出廠設定是7秒,導致下位機接收資料時段間間接資料過長,而無法正常接收資料。最後通過修改路由的傳送分段資訊的時間間隔,解決了這個問題。
當時一臉懵逼。路由是個什麼東西?資料為什麼會分段傳輸?也開始意識到,計算機網路的知識很重要,也發現,自己欠缺的知識太多了,只停留在程式語言上是不行的。
如果能讓我回頭再讀大學,我一定會好好學計算機網路,當然,作業系統和計算機組成原理也很重要!。既然時光不能倒退,那就現在再把計算機網路給學一遍吧。
零散的知識的學習
下面記錄一下零散的知識,主要關於ping指令、ICMP協議、MTU、MSS、乙太網幀。也算是學習計算機網路的一個開頭吧。
下面是整理的一些收穫。
ping指令和ICMP
首先是ping指令,在測試mtu值的時候用到了ping命令,雖然開始的時候測出了mtu值,但是發現自己好多東西都沒搞懂。
帶著最初的疑問:為什麼是mtu是1500,而ping指令寫的是1472,一邊思考,一邊查閱各種相關文章,又引出了各種問題,然後發現自己計算機網路的知識真的忘得一乾二淨了。
譬如說,ping是什麼,為什麼寫個ping www.baidu.com
就可以知道該url能不能訪問。譬如說,為什麼mtu是1500,而ping指令是這麼寫:ping -l 1472 -f www.baidu.com
,為什麼是1472,另外的28位元組去哪了。ping和ICMP協議有關聯?
首先,從ping指令入手,ping指令常用來判斷目標伺服器是否能訪問,通過ping ip地址來測試。ping是簡稱,全稱是什麼?package internet grope,譯為因特網包探索器。ping的過程使用的協議就是ICMP協議。
ICMP是簡寫,全稱是什麼?Internet Control Message Protocol,譯為Internet控制報文協議,是TCP/IP協議族的一個子協議,用於在IP主機、路由之間傳遞控制資訊。控制資訊指的是網路通不通、主機是否可達、路由是否可用等網路本身的訊息。而ICMP協議規定,目的主機必須返回ICMP回送應答訊息給源主機。如果源主機在一定時間內收到應答,則認為主機可達。
因此,當我們執行ping www.baidu.com
時,當目的主機即域名www.baidu.com
所在的主機可達時,會返回應答報文。正是因為ping的底層是通過ICMP協議,所以可以起到測試目的主機是否可達的作用。
當我們通過ping -l 1472 -f www.baidu.com
時,表示什麼?表示的是向目的主機發送一個報文資料指定為1472位元組且不可分片的ICMP報文。因此。這個1472表示的是ICMP報文資料域資訊為1472位元組。
MTU是什麼
MTU是簡稱,全稱是Maximum Transmission Unit,譯為最大傳輸單元。是資料鏈路層的一個概念。MTU限制的是資料鏈路層的payload,即上層協議的大小,例如IP、ICMP等。
一個標準的乙太網資料幀的大小是:1518位元組。頭資訊佔14位元組,尾部CRC佔4位元組,另外的1500位元組就是MTU,就是留給上層協議傳輸資料的大小。 資料幀結構分為三部分:幀頭+資料部分+幀尾,具體如EthernetII幀的結構 = DMAC(6Bytes) + SMAC(6Bytes) + Type(2Bytes) + Data + CRC(4Bytes)。 對了,資料幀,是資料鏈路層的傳輸單元。區域網中,一般是乙太網幀,除此之外,還有其他型別的幀。資料幀資料鏈路層之上,是網路層。即資料鏈路層的payload,裝載的就是網路層的資料。
那當mtu是1500時,為什麼ping -l 1472 -f www.baidu.com
這裡寫的是1472呢?前面說了,這個命令的含義是向域名為www.baidu.com的主機發送報文資料域為1472位元組的ICMP報文。因此,這個1472表示的是ICMP的報文資料域資訊的大小。這個數值表示的是ICMP報文的資料域大小。
那當mtu為1500時,它和1472這個數字之間的關聯是怎樣的呢?
mtu1500位元組 = ip報頭(20位元組)+ icmp報頭(8位元組)+icmp報文資料域最大值(1472位元組)。 前面說了,ICMP報文是包含在IP資料報中的。因此ICMP報文中是以ip報頭開頭,然後緊接著icmp報頭,這裡共佔28位元組。因此,ICMP報協議在實際傳輸過程中資料包為:20位元組IP報頭+8位元組ICMP報頭+ICMP報文資料域(最大值為mtu-28位元組)。即ICMP報文的最大值位為mtu值。
如何檢視閘道器的mtu值?通過netsh interface ipv4 show subinterfaces
,如:
[c:\~]$ netsh interface ipv4 show subinterfaces
MTU MediaSenseState 傳入位元組 傳出位元組 介面
------ --------------- --------- --------- -------------
4294967295 1 0 122675 Loopback Pseudo-Interface 1
1500 1 1894223553 42059628 WLAN
1500 5 0 0 本地連線* 1
1500 5 0 0 本地連線* 3
可以看到,預設的mt都是1500。這裡因為本機使用的是wifi上網,因此只有WLAN那行的傳入位元組和傳出位元組不為0,其他的本地連線1和本地連線3都為0。
一個有助於理解的MTU的例子
這裡舉一個具體的例子說明IP包分片的原理。乙太網的MTU值是1500 bytes,假設傳送者的協議高層向IP層傳送了長度為3008 bytes的資料報文,則該報文在新增20 bytes的IP包頭後IP包的總長度是 3028 bytes,因為3028 > 1500,所以該資料報文將被分片, 注意:分片時僅僅對上層的資料進行分片,不需要對原來的IP首部分片,所以要分片的資料長度只有3008,而不是3028. 這特別容易出錯。 分片過程如下:
- 首先計算最大的IP包中IP淨荷的長度 =MTU-IP包頭長度=1500-20= 1480 bytes。
- 然後把3008 bytes按照1480 bytes的長度分片,將要分為3片,3008= 1480+1480+48。
- 最後傳送者將為3個分片分別新增IP包頭,組成3個IP包後再發送,3個IP包的長度分別為1500 bytes、1500 bytes和 68 bytes。 從以上分片例子可以看出第一、二個分片包組成的IP包的長度都等於MTU即1500 bytes。
mtu值過大過小會怎樣? 如果本機的mtu比閘道器的mtu大,大的資料包就會被拆開來傳送,這樣會產生很多資料包碎片,增加丟包率,降低網路速度。如果本機的mtu比網管的mtu小,則不能充分利用資源,沒有發揮出最大傳輸能力。
MSS及其與MTU的關係
MSS是簡稱,全稱是Maximum Segment Size,譯為最大報文段長度。MTU是資料鏈路層的概念,而MSS是傳輸層中TCP協議的一個概念。前面我們說的ping用的是ICMP協議,即ICMP報文,但並非所有報文都是使用ICMP協議,還有TCP協議。ICMP協議是不傳遞使用者資料的,TCP報文才傳送使用者資料。當資料鏈路層的payload即資料域裝在的是IP報文中是TCP報文時,當使用的是乙太網幀,即資料幀的大小是1518位元組時,mtu是1500位元組,即IP報文的最大值時1500位元組。那麼此時最大報文段長度MSS=1500位元組的MTU - 20位元組的IP報頭 - 20 位元組的TCP報頭=1460位元組,即MSS=1460位元組。MSS就是TCP資料包每次能夠傳輸的最大資料分段。
網路層協議如IP協議會根據MTU值來決定是否要把上傳傳下來的資料進行分片。IP協議是TCP/IP協議簇中最為核心的協議。在區域網環境中,IP協議往往被封裝在乙太網幀中傳輸,而所有的TCP、UDP、ICMP、IGMP資料都被封裝在IP資料報中傳輸。
感想
這篇文章是在原本寫的兩篇文章上再整理的,因為發現之前寫的太過零散。一開始覺得,看懂了,但是一寫下來,發現自己千頭萬緒,十分凌亂。似懂非懂。寫的很勉強,但是,也在做筆記的過程中,思路逐漸變得清晰。能把一些資訊關聯起來,串起來理解。
雖然寫的很不容易,不過可能在別人眼裡還是很零散吧。哈哈我盡力了。也有了不少收穫。可能文章會有錯漏之處,如有看到,還請指出。下面是參考文章,有的寫的真的很棒但是感覺自己沒看懂多少,一遍沒看懂,再看再看再看,慢慢就理解了。
我也在想,別人常說程式設計師科班出身和半路出家,思維、知識體系還是差很多的。我想,說的就是對計算機網路、作業系統、計算機組成原理這些知識的瞭解吧。如果說,我連這些知識都忘關了,那我和半路出家的又有什麼區別?
最後還想說,寫這種文章真的不容易啊,心裡更加佩服那些能把計算機網路寫的很有趣的大神了,真的太厲害了。