天天看點

碼出高效:Java開發手冊-第1章(4)

1.5 TCP/IP

1.5.1 網絡協定

在計算機誕生後,從單機模式應用發展到将多台計算機連接配接起來,形成計算機網絡,使資訊共享、多機協作、大規模計算等成為現實,曆經了20 多年的時間。計算機網絡需要解決的第一個問題是如何無障礙地發送和接收資料。而這個發送和接收資料的過程需要相應的協定來支撐,按互相可以了解的方式進行資料的打包與解包,使不同廠商的裝置在不同類型的作業系統上實作順暢的網絡通信。

TCP/IP(Transmission Control Protocol / Internet Protocol)中文譯為傳輸控制協定/ 網際網路互聯協定,這個大家族裡的其他知名協定還有HTTP、HTTPS、FTP、SMTP、UDP、ARP、PPP、IEEE 802.x 等。TCP/IP 是目前流行的網絡傳輸協定架構,從嚴格意義上講它是一個協定族,因為TCP、IP 是其中最為核心的協定,是以就把該協定族稱為TCP/IP。而另一個是耳熟能詳的ISO/OSI 的七層傳輸協定,其中OSI(Open System Interconnection)的出發點是想設計出計算機世界通用的網絡通信基本架構,它已經被淘汰,本節略過。

TCP/IP 是在不斷解決實際問題中成長起來的協定族,是經過市場檢驗的事實标準,已經很難被取代。就像即使鍵盤的布局不那麼合理,比如字母A 被設計在左手小指位置,不利于敲擊,但原來的鍵盤布局已經成為群體習慣的事實标準。TCP 分層架構圖如圖1-12 所示,為了表示網絡拓撲圖在連接配接層面上的機器對等理念,故圖1-12中采用A 機器和B 機器的說法,而不是伺服器和用戶端的說法。

碼出高效:Java開發手冊-第1章(4)

圖1-12 TCP/IP 協定分層架構

    • 鍊路層:單個0、1是沒有意義的,鍊路層以位元組為機關把0與1進行分組,定義資料幀,寫入源和目标機器的實體位址、資料、校驗位來傳輸資料。圖1-13所示是以太網的幀協定。
碼出高效:Java開發手冊-第1章(4)

圖1-13 鍊路層封包結構

MAC 位址長6 個位元組共48 位,通常使用十六進制數表示。使用ifconfig -a 指令即可看到MAC 位址。如圖1-14 所示的f4:5c:89,即前24 位由管理機構統一配置設定,後24 位由廠商自己配置設定,保證網卡全球唯一。網卡就像家庭位址一樣,是計算機世界範圍内的唯一辨別。

碼出高效:Java開發手冊-第1章(4)

圖1-14 MAC 位址

    • 網絡層:根據IP定義網絡位址,區分網段。子網内根據位址解析協定(ARP)進行MAC 尋址,子網外進行路由轉發資料包,這個資料包即IP 資料包。
    • 傳輸層:資料包通過網絡層發送到目标計算機後,應用程式在傳輸層定義邏輯端口,确認身份後,将資料包交給應用程式,實作端口到端口間通信。最典型的傳輸層協定是UDP 和TCP。UDP 隻是在IP 資料包上增加端口等部分資訊,是面向無連接配接的,是不可靠傳輸,多用于視訊通信、電話會議等(即使少一幀資料也無妨)。與之相反,TCP 是面向連接配接的。所謂面向連接配接,是一種端到端間通過失敗重傳機制建立的可靠資料傳輸方式,給人感覺是有一條固定的通路承載着資料的可靠傳輸。
    • 應用層:傳輸層的資料到達應用程式時,以某種統一規定的協定格式解讀資料。比如,E-mail 在各個公司的程式界面、操作、管理方式都不一樣,但是都能夠讀取郵件内容,是因為SMTP 協定就像傳統的書信格式一樣,按規定填寫郵編及收信人資訊。

總結一下,程式在發送消息時,應用層按既定的協定打包資料,随後由傳輸層加上雙方的端口号,由網絡層加上雙方的IP 位址,由鍊路層加上雙方的MAC 位址,并将資料拆分成資料幀,經過多個路由器和網關後,到達目标機器。簡而言之,就是按“端口→ IP 位址→ MAC 位址”這樣的路徑進行資料的封裝和發送,解包的時候反過來操作即可。

1.5.2 IP 協定

IP 是面向無連接配接、無狀态的,沒有額外的機制保證發送的包是否有序到達。IP首先規定出IP 位址格式,該位址相當于在邏輯意義上進行了網段的劃分,給每台計算機額外設定了一個唯一的詳細位址。既然鍊路層可以通過唯一的MAC 位址找到機器,為什麼還需要通過唯一的IP 位址再來辨別呢?簡單地說,在世界範圍内,不可能通過廣播的方式,從數以千萬計的計算機裡找到目标MAC 位址的計算機而不逾時。在資料投遞時就需要對位址進行分層管理。舉個例子,一個重要快遞從美國發出,要發給中國浙江省台州市某小區的X 先生。快遞公司需要先确定中國的轉運中心(如浙江某轉運中心),然後再從轉運中心逐級配送到各個下級轉運點。當快遞到達該小區後,快遞員大喊一聲:“X 先生領快遞啦!”雖然小區裡包括X 先生在内的所有人都聽到了快遞員的喊聲,但隻有X 先生收取快遞并當面打開确認,其他人确定不是叫自己則不用理會。IP 位址如圖1-15 所示,即30.38.48.22,右邊為實體層發送和接收資料的統計。

碼出高效:Java開發手冊-第1章(4)

圖1-15 IP 位址

IP 位址屬于網絡層,主要功能在WLAN 内進行路由尋址,選擇最佳路由。IP 封包格式如圖1-16 所示,共32 位4 個位元組,通常用十進制數來表示。IP 位址的掩碼0xffffff00 表示255.255.255.0,掩碼相同,則在同一子網内。IP 協定在IP 報頭中記錄源IP 位址和目标IP 位址,如圖1-16 所示。

碼出高效:Java開發手冊-第1章(4)

圖1-16 IP 封包格式

協定結構比較簡單,重點說一下資料包的生存時間,即TTL(Time To Live),該字段表示IP 封包被路由器丢棄之前可經過的最多路由總數。TTL 初始值由源主機設定後,資料包在傳輸過程中每經過一個路由器TTL 值則減1,當該字段為0 時,資料包被丢棄,并發送ICMP 封包通知源主機,以防止源主機無休止地發送封包。這裡擴充說一下ICMP(Internet Control Message Protocol),它是檢測傳輸網絡是否通暢、主機是否可達、路由是否可用等網絡運作狀态的協定。ICMP 雖然并不傳輸使用者資料,但是對評估網絡健康狀态非常重要,經常使用的ping、tracert 指令就是基于ICMP 檢測網絡狀态的有力工具。圖1-16中TTL 右側是挂載協定辨別,表示IP 資料包裡放置的子資料包協定類型,如6代表TCP、17 代表UDP 等。

IP 封包在網際網路上傳輸時,可能要經曆多個實體網絡,才能從源主機到達目标主機。比如在手機上給某個PC 端的朋友發送一個資訊,經過無線網的IEEE 802.1x認證,轉到光纖通信上,然後進入内部企業網802.3,并最終到達目标PC。由于不同硬體的實體特性不同,對資料幀的最大長度都有不同的限制,這個最大長度被稱為最大傳輸單元,即MTU(Maximum Transmission Unit)。那麼在不同的實體網之間就可能需要對IP 封包進行分片,這個工作通常由路由器負責完成。

IP 是TCP/IP 的基石,幾乎所有其他協定都建立在IP 所提供的服務基礎上進行傳輸,其中包括在實際應用中用于傳輸穩定有序資料的TCP。