本文已收錄GitHub,更有互聯網大廠面試真題,面試攻略,高效學習資料等java
首先熟悉一下, 什麼是網絡,網絡是幾乎能夠實時相互發送和接收數據的計算機和其餘設備的集合。網絡一般用線纜鏈接,數據爲轉換爲電磁波,經過線纜移動。不過,無線網絡會經過無線電波傳輸數據,許多長距離的傳輸如今會用經過玻璃纖維發送可見光的光纖電纜來完成。node
網絡中的每臺機器爲一個節點(node)。大多數節點是計算機,可是打印機、路由器、網橋、網關、ATM機也都是節點。每一個網絡節點都有地址 (address),這是用於惟一標識節點的一個字節序列。每一個地址中的字節越多,可用的地址就越多,就能夠有更多的設備同時連入網絡。git
不一樣的網絡會以不一樣的方式分配地址。以太網(Ethernet)地址與物理以太網硬件關聯。以太網硬件的生產廠家使用預分配的廠商編碼確保他們的硬件地址或與其餘廠家的硬件地址不衝突。每家廠商都要負責保證不會生產出兩塊地址相同的以太網卡。程序員
全部現代計算機網絡都是包交換(分組交換)網絡:流經網絡的數據分割成小塊,稱爲包(packet,也稱分組),每一個包都單獨加以處理。每一個包都包含了由誰發送和將發往何處的信息。github
計算機來回傳遞數據時還有另外一個重要的一個點,那就是協議,協議(protocol)是定義計算機如何通訊的一組明確的規則:包括地址格式、數據如何分包等。針對網絡通訊的不一樣方面,定義有不少不一樣的協議。例如:Hypertext Transfer Protocol(HTTP)。面試
經過網絡發送數據是一項複雜的操做,必須仔細地協調網絡的物理特性以及所發送數據的路基特徵。爲了對應用程序開發人員和最終用戶隱藏這種複雜性,網絡通訊的不一樣方面被分解爲多個層。每一層表示爲物理硬件(即線纜和電流)與所傳輸信息之間的不一樣抽象層次。在理論上,每一層只與緊挨其上和其下的層對話。將網絡分層,這樣就能夠修改甚至替換某一層的軟件,只要層與層之間的接口保持不變,就不會影響到其餘層。編程
上面的圖顯示了網絡中可能存在的協議棧。網絡
有幾種不一樣的分層模型,分別適合特定類型網絡的須要。我這邊主要介紹適用於Internet的標準TCP/IP四層模型,以下圖所示:app
主機網絡層定義了一個特定的網絡接口(如以太網或WiFi天線)如何經過物理鏈接向本地網絡或世界其餘地方發送IP數據報。主機網絡層中,由鏈接不一樣計算機的硬件(線纜、光纖電纜、無線電波或煙信號)組成的部分有時稱爲網絡的物理層。Java程序員不須要擔憂這一層,除非出現了問題,好比插頭從計算機後面掉了下來,或者有人挖斷了你與外部世界之間的T-1線。換句話說,Java歷來都看不到物理層。ide
網際層主機網絡層的下一層,這也是做爲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置於IP之上,使鏈接的兩端可以確認接收IP包,以及請求重傳丟失或被破壞的包。此外,TCP容許接收端的包按發送時的順序從新組合在一塊兒。
不過,TCP會有很大的開銷。所以,若是有些狀況丟失個別包不會徹底破壞數據的話,也可使用UDP發送數據包,而不須要TCP提供保證。UDP是不可靠協議,它不能保證包必定會到達目的地,也不保證包會以發送時的相同順序到達。可是它開銷小,速度快,也能夠在應用層的UDP數據流中創建糾錯碼,來解決數據丟失問題。
能夠在IP之上運行不少其餘協議。可是Java支持的協議只有TCP和UDP,以及創建在TCP和UDP之上的應用層協議。全部其餘傳輸層、網際層和更底層的協議,如ICMP、IGMP、ARP、RARP、RSVP和其餘洗衣在Java程序中都只能經過鏈接到原生代碼來實現。
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與防火牆沒有太大關係,除非防火牆老是礙你事。