前言
簡單編寫一下tcp例子。
正文
我們常說IOS有7層,實際上也只有4層,或者這樣說簡單的說是4層。
首先是資料鏈路層,首先這一層解決了什麼問題呢?為什麼要有這一層呢?
首先要拋開有作業系統的意識,因為它為我們做了太多東西了,擺在你面前的只有兩個終端和一根網線。
資料鏈路層定義了在單個鏈路上如何傳輸資料。這些協議與被討論的各種介質有關。示例:ATM,FDDI等。資料鏈路層必須具備一系列相應的功能,主要有:如何將資料組合成資料塊,在資料鏈路層中稱這種資料塊為幀,幀是資料鏈路層的傳送單位;如何控制幀在物理通道上的傳輸,包括如何處理傳輸差錯,如何調節傳送速率以使與接收方相匹配;以及在兩個網路實體之間提供資料鏈路通路的建立、維持和釋放的管理。
這裡最好奇的是封裝成幀:
封裝成幀(framing):就是在一段資料的前後分別新增首部和尾部,這樣就構成了一個幀。接收端在收到物理層上交的位元流後,就能根據首部和尾部的標記,從收到的位元流中識別幀的開始和結束。
這樣就相當於有切割了,我們一直傳輸的是0和1,比如我們按照順序傳輸的是01101001010101010101010101010。
接收機也的確收到了這個資訊了,但是沒法知道具體含義啊。這就很尷尬了。
但是我這樣傳輸,如果在前面加標記說是開始,然後加標記結束,這樣不就是ok的啊。然後我們都用預設的utf8,這樣不就形成了一段話啊。
簡直完美極了。這個想法,我自己都能想出來。就像在古代,也有飛行的想法,在人身上裝兩個翅膀唄。
這就是想法是美好的,但是怎麼做呢? 我應該設定什麼標誌讓其知道是開始呢?會不會和我的傳送的資料衝突呢?
(1)如何識別幀的開始與結束;(2)在夾雜著重傳的資料幀中,接收方在接收到重傳的資料幀時是識別成新的資料幀,還是識別成已傳幀的重傳幀呢?
現在有了想法,那就來解決問題。
首先解決一個這樣的問題,那就是SOH和EOT的問題。
那就是設定01(二進位制是00000001)和04(二進位制是00000100),分別為幀開始的標誌和幀結束的標誌後。
那麼如果我資料中也存在01和04怎麼辦呢? 這個時候就要轉義了。如果出現了01和04那麼就要轉成別的了。
這個知道轉義符的都怎麼哈,就不用太多解釋了。
解決方法:傳送端的資料鏈路層在資料中出現控制字元”SOH”和”EOT”的前面插入一個轉義字元”ESC”(其十六進位制編碼是1B)。而在接收端的資料鏈路層在將資料送往網路層之前刪除這個插入的轉義字元。這種方法稱為位元組填充(byte stuffing)或字元填充(character stuffing)。如果轉義字元也出現在資料當中,那麼解決方法仍然是在轉義字元的前面插入一個轉義字元。因此,當接收端收到連續的兩個轉義字元時,就刪除其中前面的一個。
如下圖:
然後還有一些幀的問題需要解決了,這裡也不可能列舉,實際上還有幀的丟失、幀的重複等幀的問題了。
現在假如幀的問題解決了,解決了點與點的問題,那麼還有一個問題就是假如一臺機器連線了幾臺機器。
那麼我要向起一臺機器傳送訊息怎麼辦呢? 這個時候就有一下協議產生了,比較著名的是乙太網協議了。
它就是說在相連線的機器,每個都傳送訊息,檢查mac是否相等,就收到,不是就丟棄。
這都是有歷史的,總之呢,現在相鄰的機器可以互相傳送訊息了。
但是後來電腦越來越多,然後呢,如果要向每臺電腦傳送資訊的話,那是不是有點問題啊,這樣層層傳送下去,就很不方便。
也就有了網路層了,之所以叫網路層就是電腦越來越多,像網狀結構一樣,ip協議也就是為了解決這樣的問題的。
那就是因為乙太網這種協議不適合網際網路了。所以說,網路層解決了目的主機和源主機的通訊。
好了,現在每兩臺機器之間可以通訊了,那麼是不是就ok了呢?
為什麼tcp這樣的傳輸層協議出現呢? 目的主機和源主機能夠通訊了這很好。
但是就是有這樣的需求,第一條訊息必須比第二條資訊後到。我要傳輸大資料啊,你這不行啊,ip協議發包是有限制的啊。
後面就有很多公司有自己的協議了。比較出名的就是tcp了,解決了傳輸大資料的問題,按照順序傳輸,我給你組裝唄。
這一層解決了,資料制定了資料傳輸的規則,所以叫做傳輸層唄。
理論上你要大資料有資料了,傳輸規則你也定了,理論上資料傳輸是沒有問題的呀,資料傳輸得到了保障啊。
你有啥問題,你可以提的嘛。這時候隨著軟體的發展哈,還就真的有新的問題了。
軟體行業就有問題哈,你這個資料能到是沒有問題了。但是這個資料格式有問題啊。
一開始你傳123給我,我傳456給你,大家都玩得比較開心的。
後來軟體越來越複雜了,就有了很多格式了,後來不同格式多了就有了協議了。舉個例子,比如http。
因為是解決應用的問題,所以叫做應用層。
結
總之,如果向學習哪一層,就看哪一層是做什麼的,解決什麼問題。下一章就是具體的例子了。