Java程序員面試必備的網絡編程基本網絡概念

本文已收錄GitHub,更有互聯網大廠面試真題,面試攻略,高效學習資料等

網絡

首先熟悉一下, 什麼是網絡,網絡是幾乎可以實時相互發送和接收數據的計算機和其他設備的集合。網絡通常用線纜連接,數據爲轉換爲電磁波,通過線纜移動。不過,無線網絡會通過無線電波傳輸數據,許多長距離的傳輸現在會用通過玻璃纖維發送可見光的光纖電纜來完成。

網絡中的每臺機器爲一個節點(node)。大多數節點是計算機,但是打印機、路由器、網橋、網關、ATM機也都是節點。每個網絡節點都有地址 (address),這是用於唯一標識節點的一個字節序列。每個地址中的字節越多,可用的地址就越多,就可以有更多的設備同時連入網絡。

不同的網絡會以不同的方式分配地址。以太網(Ethernet)地址與物理以太網硬件關聯。以太網硬件的生產廠家使用預分配的廠商編碼確保他們的硬件地址或與其他廠家的硬件地址不衝突。每家廠商都要負責保證不會生產出兩塊地址相同的以太網卡。

所有現代計算機網絡都是包交換(分組交換)網絡:流經網絡的數據分割成小塊,稱爲包(packet,也稱分組),每個包都單獨加以處理。每個包都包含了由誰發送和將發往何處的信息

計算機來回傳遞數據時還有另一個重要的一個點,那就是協議,協議(protocol)是定義計算機如何通信的一組明確的規則:包括地址格式、數據如何分包等。針對網絡通信的不同方面,定義有很多不同的協議。例如:Hypertext Transfer Protocol(HTTP)。

網絡分層

通過網絡發送數據是一項複雜的操作,必須仔細地協調網絡的物理特性以及所發送數據的路基特徵。爲了對應用程序開發人員和最終用戶隱藏這種複雜性,網絡通信的不同方面被分解爲多個層。每一層表示爲物理硬件(即線纜和電流)與所傳輸信息之間的不同抽象層次。在理論上,每一層只與緊挨其上和其下的層對話。將網絡分層,這樣就可以修改甚至替換某一層的軟件,只要層與層之間的接口保持不變,就不會影響到其他層。

上面的圖顯示了網絡中可能存在的協議棧。

有幾種不同的分層模型,分別適合特定類型網絡的需要。我這邊主要介紹適用於Internet的標準TCP/IP四層模型,如下圖所示:

主機網絡層

主機網絡層定義了一個特定的網絡接口(如以太網或WiFi天線)如何通過物理連接向本地網絡或世界其他地方發送IP數據報。主機網絡層中,由連接不同計算機的硬件(線纜、光纖電纜、無線電波或煙信號)組成的部分有時稱爲網絡的物理層。Java程序員不需要擔心這一層,除非出現了問題,比如插頭從計算機後面掉了下來,或者有人挖斷了你與外部世界之間的T-1線。換句話說,Java從來都看不到物理層。

網際層

網際層主機網絡層的下一層,這也是作爲Java程序員需要考慮的第一層,網際層協議定義了數據位和字節如何組織爲更大的分組,稱爲包,還定義了尋址機制,不同計算機要按這個尋址機制查找對方。網際協議(IP)是世界上使用最廣泛的網際層協議,也是Java唯一理解的網際層協議。

網際協議主要是兩個協議:IPV4和IPV6,IPV4使用32位地址,IPV6使用128位地址,另外還增加了一些技術特性來幫助完成路由。這是兩個完全不同的網絡協議,如果沒有特殊的網關/或隧道協議,即使在相同的網絡上它們也無法做到互操作,不過Java幾乎對你隱藏了所有這些區別。

除了路由和尋址,網際層的第二個作用是支持不同類型的主機網絡層相互對話。Internet路由器會完成WiFi和Ethernet、Ethernet和DSL、DSL和光纖往返等協議之間的轉換。如果沒有網際層或類似的分層,則每個計算機只能與同一類網絡上的其他計算機對話。網際層負責使用同夠協議將異構網絡相互連接。

傳輸層

原始數據報有一些缺點。最顯著的缺點是不能保證可靠傳送,即使能傳送也可能在傳輸中遭到破壞。首部校驗只能檢測首部中的破壞情況,而不能檢測數據報中的數據部分。最後即使數據報能到底目的地而未被破壞,也不一定會以發送時的順序到達。

傳輸層(transport layer)負責確保各包以發送的順序接收,並保證沒有數據丟失或破壞。如果丟包,傳輸層會請求發送方重傳這個包。爲實現這個目標,IP網絡會給每個數據報添加一個附加首部,其中包含有更多信息。

這一層上主要有兩個協議。第一個是傳輸控制協議(Transmission Control Protocol,TCP),這是一個開銷很高的協議,支持對丟失或破壞的數據進行重傳,並按照發送時的順序進行傳送。第二個協議是用戶數據報協議(User Datagram Protocol ,UDP),它允許接收方檢測被破壞的包,但不保證這些包以正確的順序傳送(或者包有可能根本未傳送)。但是,UDP通常比TCP快。TCP稱爲可靠(reliable)協議;UDP是不可靠(unreliable)協議。

應用層

向用戶傳送數據的層稱爲應用層(application layer)。它下面的三層共同定義了數據如何從一臺計算機傳輸到另一臺計算機。應用層確定了數據傳輸後的操作。有用戶Web的HTTP,還有用戶電子郵件的SMTP、POP、IMAP、;用於文件傳輸的FTP、FSP、TFTP,用於文件訪問的NFS;用於文件共享的Gnutella和BitTorrent;用於語音通信的會話啓動協議(Session Initiation Protocol,SIP)和Skype等。此外你的程序可以在必要時定義自己的應用層協議。

IP、TCP、UDP

IP設計爲允許任意兩點之間有多個路由,可以繞過被破壞的路由器實現數據包的路由。由於兩點間存在多個路由,並且兩點間的最短路徑可能由於網絡業務流量或其他因素而隨時間改變,所以構成某個特定數據流的包可能不會採用相同的路由。另外,即使它們全部到達,也可能不會以發送的順序到達。爲了改進這種基本機制,將TCP置於IP之上,使連接的兩端能夠確認接收IP包,以及請求重傳丟失或被破壞的包。此外,TCP允許接收端的包按發送時的順序重新組合在一起。

不過,TCP會有很大的開銷。因此,如果有些情況丟失個別包不會完全破壞數據的話,也可以使用UDP發送數據包,而不需要TCP提供保證。UDP是不可靠協議,它不能保證包一定會到達目的地,也不保證包會以發送時的相同順序到達。但是它開銷小,速度快,也可以在應用層的UDP數據流中建立糾錯碼,來解決數據丟失問題。

可以在IP之上運行很多其他協議。但是Java支持的協議只有TCP和UDP,以及建立在TCP和UDP之上的應用層協議。所有其他傳輸層、網際層和更底層的協議,如ICMP、IGMP、ARP、RARP、RSVP和其他洗衣在Java程序中都只能通過連接到原生代碼來實現。

IP地址和域名

IPv4網絡中的每臺計算機都有一個4字節的數字標識。一般寫爲點分四段格式,如192.1.32.90,這4個數中,每個數都是一個無符號字節,範圍從0到255。IPv4網絡中的每臺計算機都有一個唯一的4節地址。當數據通過網絡傳輸時,包的首部會包括要發往的機器地址(目的地址)和發送這個包的機器地址(源地址)。沿路的路由器通過檢查目的地址來選擇發送數據包的最佳路由。包括源地址是爲了讓接收方知道要向誰回覆。

雖然計算機可以輕鬆地處理數字,但人類對於記憶數字卻不在行。因此開發了域名系統(Domain Name System,DNS)用來將人類易於記憶的主機名(如www.12345.com)轉換爲數字Internet地址(如208.201.243.99)。當Java程序訪問網絡時,他們需要同時處理數字地址和相應的主機名。這些方法由java.net.InetAddress類提供。

端口

如果每臺計算機一次只做一件事情,那麼地址可能就足夠了。但是,現代計算機同時要做很多不同的事情。電子郵件需要與FTP請求分開,而FTP又要與Web業務流分開。這是通過端口(port)實現的。每臺有IP地址的計算機都有幾千個邏輯端口(確切地講,每個傳輸層協議有65535個端口)。這些只是計算機內存中的抽象,不表示任何物理實物,與USB端口不同。每個端口由1到65535之間的一個數字標識。每個端口可以分配給一個特定的服務。

防火牆

Internet上有些頑皮的人。爲了把他們關在門外,在本地網絡建立一個訪問點,檢查所有進出該訪問點的業務流通常很有用。位於Internet和本地網絡之間的一些硬件和軟件會檢查所有進出的數據,以保證其合法性,這就稱爲防火牆(firewall)。防火牆通常是將本地網絡連接到更大的Internet的路由器的一部分,還可以完成其他任務,如網絡地址轉換。此外,防火牆也可以是單獨的機器。防火牆主要還是負責檢查傳入或傳出其網絡接口的各個包,根據一組規則接收或拒絕這些包。

過濾通常是基於網絡地址和端口的。Java與防火牆沒有太大關係,除非防火牆總是礙你事。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章