所以,我們需要一種機制,能夠從IP地址得到MAC地址。
這里又可以分成兩種情況。第一種情況,如果兩臺主機不在同一個子網絡,那么事實上沒有辦法得到對方的MAC地址,只能把數據包傳送到兩個子網絡連接處的"網關"(gateway),讓網關去處理。
第二種情況,如果兩臺主機在同一個子網絡,那么我們可以用ARP協議,得到對方的MAC地址。ARP協議也是發出一個數據包(包含在以太網數據包中),其中包含它所要查詢主機的IP地址,在對方的MAC地址這一欄,填的是FF:FF:FF:FF:FF:FF,表示這是一個"廣播"地址。它所在子網絡的每一臺主機,都會收到這個數據包,從中取出IP地址,與自身的IP地址進行比較。如果兩者相同,都做出回復,向對方報告自己的MAC地址,否則就丟棄這個包。
總之,有了ARP協議之后,我們就可以得到同一個子網絡內的主機MAC地址,可以把數據包發送到任意一臺主機之上了。
五、傳輸層
5.1 傳輸層的由來
有了MAC地址和IP地址,我們已經可以在互聯網上任意兩臺主機上建立通信。
接下來的問題是,同一臺主機上有許多程序都需要用到網絡,比如,你一邊瀏覽網頁,一邊與朋友在線聊天。當一個數據包從互聯網上發來的時候,你怎么知道,它是表示網頁的內容,還是表示在線聊天的內容?
也就是說,我們還需要一個參數,表示這個數據包到底供哪個程序(進程)使用。這個參數就叫做"端口"(port),它其實是每一個使用網卡的程序的編號。每個數據包都發到主機的特定端口,所以不同的程序就能取到自己所需要的數據。
"端口"是0到65535之間的一個整數,正好16個二進制位。0到1023的端口被系統占用,用戶只能選用大于1023的端口。不管是瀏覽網頁還是在線聊天,應用程序會隨機選用一個端口,然后與服務器的相應端口聯系。
"傳輸層"的功能,就是建立"端口到端口"的通信。相比之下,"網絡層"的功能是建立"主機到主機"的通信。只要確定主機和端口,我們就能實現程序之間的交流。因此,Unix系統就把主機+端口,叫做"套接字"(socket)。有了它,就可以進行網絡應用程序開發了。
5.2 UDP協議
現在,我們必須在數據包中加入端口信息,這就需要新的協議。最簡單的實現叫做UDP協議,它的格式幾乎就是在數據前面,加上端口號。
UDP數據包,也是由"標頭"和"數據"兩部分組成。
"標頭"部分主要定義了發出端口和接收端口,"數據"部分就是具體的內容。然后,把整個UDP數據包放入IP數據包的"數據"部分,而前面說過,IP數據包又是放在以太網數據包之中的,所以整個以太網數據包現在變成了下面這樣:
UDP數據包非常簡單,"標頭"部分一共只有8個字節,總長度不超過65,535字節,正好放進一個IP數據包。
5.3 TCP協議
UDP協議的優點是比較簡單,容易實現,但是缺點是可靠性較差,一旦數據包發出,無法知道對方是否收到。
為了解決這個問題,提高網絡可靠性,TCP協議就誕生了。這個協議非常復雜,但可以近似認為,它就是有確認機制的UDP協議,每發出一個數據包都要求確認。如果有一個數據包遺失,就收不到確認,發出方就知道有必要重發這個數據包了。
因此,TCP協議能夠確保數據不會遺失。它的缺點是過程復雜、實現困難、消耗較多的資源。
TCP數據包和UDP數據包一樣,都是內嵌在IP數據包的"數據"部分。TCP數據包沒有長度限制,理論上可以無限長,但是為了保證網絡的效率,通常TCP數據包的長度不會超過IP數據包的長度,以確保單個TCP數據包不必再分割。
六、應用層
應用程序收到"傳輸層"的數據,接下來就要進行解讀。由于互聯網是開放架構,數據來源五花八門,必須事先規定好格式,否則根本無法解讀。
"應用層"的作用,就是規定應用程序的數據格式。
舉例來說,TCP協議可以為各種各樣的程序傳遞數據,比如Email、WWW、FTP等等。那么,必須有不同協議規定電子郵件、網頁、FTP數據的格式,這些應用程序協議就構成了"應用層"。
這是最高的一層,直接面對用戶。它的數據就放在TCP數據包的"數據"部分。因此,現在的以太網的數據包就變成下面這樣。
至此,整個互聯網的五層結構,自下而上全部講完了。這是從系統的角度,解釋互聯網是如何構成的。下一次,我反過來,從用戶的角度,自上而下看看這個結構是如何發揮作用,完成一次網絡數據交換的。