1. 程式人生 > >Java高階工程師常見面試題(七)-網路通訊

Java高階工程師常見面試題(七)-網路通訊

1. http是無狀態通訊,http的請求方式有哪些,可以自己定義新的請求方式麼。

HTTP是無狀態的,它的底層協議是由狀態的TCP,但是HTTP的一次完整協議動作,裡面是使用有狀態的TCP協議來完成的。而每次協議動作之間沒有任何關係。例如:第7次請求HTTP協議包,並不知道,這個包是為了什麼?它或許是因為上次沒有請求成功而重傳,或許是上次的後續請求,或許是其他的,這些HTTP自身都不知道。

根據HTTP標準,HTTP請求可以使用多種請求方法。

HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法。

HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

序號

方法

描述

1

GET

請求指定的頁面資訊,並返回實體主體。

2

HEAD

類似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭

3

POST

向指定資源提交資料進行處理請求(例如提交表單或者上傳檔案)。資料被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。

4

PUT

從客戶端向伺服器傳送的資料取代指定的文件的內容。

5

DELETE

請求伺服器刪除指定的頁面。

6

CONNECT

HTTP/1.1協議中預留給能夠將連線改為管道方式的代理伺服器。

7

OPTIONS

允許客戶端檢視伺服器的效能。

8

TRACE

回顯伺服器收到的請求,主要用於測試或診斷。

2. socket通訊,以及長連線,分包,連線異常斷開的處理。

3. socket通訊模型的使用,AIO和NIO。

4. socket框架netty的使用,以及NIO的實現原理,為什麼是非同步非阻塞。

Netty是一個高效能、非同步事件驅動的NIO框架,基於JAVA NIO提供的API實現。它提供了對TCP、UDP和檔案傳輸的支援,作為一個非同步NIO框架,Netty的所有IO操作都是非同步非阻塞的,通過Future-Listener機制,使用者可以方便的主動獲取或者通過通知機制獲得IO操作結果。

Java NIO是在jdk1.4開始使用的,它既可以說成“新I/O”,也可以說成非阻塞式I/O。下面是java NIO的工作原理:

1. 由一個專門的執行緒來處理所有的 IO 事件,並負責分發。

2. 事件驅動機制:事件到的時候觸發,而不是同步的去監視事件。

3. 執行緒通訊:執行緒之間通過 wait,notify 等方式通訊。保證每次上下文切換都是有意義的。減少無謂的執行緒切換。

閱讀過一些資料之後,下面貼出我理解的java NIO的工作原理圖:

(注:每個執行緒的處理流程大概都是讀取資料、解碼、計算處理、編碼、傳送響應。)

Java NIO的服務端只需啟動一個專門的執行緒來處理所有的 IO 事件,這種通訊模型是怎麼實現的呢?呵呵,我們一起來探究它的奧祕吧。java NIO採用了雙向通道(channel)進行資料傳輸,而不是單向的流(stream),在通道上可以註冊我們感興趣的事件。一共有以下四種事件:

事件名

對應值

服務端接收客戶端連線事件

SelectionKey.OP_ACCEPT(16)

客戶端連線服務端事件

SelectionKey.OP_CONNECT(8)

讀事件

SelectionKey.OP_READ(1)

寫事件

SelectionKey.OP_WRITE(4)

服務端和客戶端各自維護一個管理通道的物件,我們稱之為selector,該物件能檢測一個或多個通道 (channel) 上的事件。我們以服務端為例,如果服務端的selector上註冊了讀事件,某時刻客戶端給服務端傳送了一些資料,阻塞I/O這時會呼叫read()方法阻塞地讀取資料,而NIO的服務端會在selector中新增一個讀事件。服務端的處理執行緒會輪詢地訪問selector,如果訪問selector時發現有感興趣的事件到達,則處理這些事件,如果沒有感興趣的事件到達,則處理執行緒會一直阻塞直到感興趣的事件到達為止。下面是我理解的java NIO的通訊模型示意圖:

5. 同步和非同步,阻塞和非阻塞。

“阻塞”與“非阻塞”與“同步”與“非同步”不能簡單的從字面埋解,提供一個從分散式系統角度的回答。

1. 同步與非同步

同步和非同步關注的是訊息通訊機制(synchronous communication/ asynchronous communication)

所謂同步,就是在發出一個呼叫時,在沒有得到結果之前,該呼叫就不返回。但是一旦呼叫遐回, 就得到返回值了。

換句話說,就是由呼叫者主動等待這個呼叫的結果。

而非同步則是相反,呼叫在發出之後,這個呼叫就直接返回了,所以沒有返回結果。換句話說,當一 個非同步過程呼叫發出後,呼叫者不會立刻得到結果。而是在呼叫發出後,被呼叫者通過狀態、通知來通知呼叫者,或通過回撥函式處理這個呼叫。

典型的非同步程式設計模型比如Node.js

舉個通俗的例子:

你打電話問書店老闆有沒有《分散式系統》這本書,如果是同步通訊機制,書店老闆會說,你稍等,“我查一下”,然後開始查啊查,等查好了 (可能是5秒,也可能是一天)告訴你結果(返回結果)。

而非同步通訊機制,書店老闆直接告訴你我查一下啊,查好了打電話給你,然後直接掛電話了(不返回結果)。然後查好了,他會主動打電話給你。在這裡老闆通過回電這神方式來回調。

2. 阻塞與非阻塞

阻塞和非阻塞關注的是程式在等待呼叫結果(訊息,返回值)時的扶態。

阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。呼叫執行緒只有在得到結果之後才會返回。

非阻塞呼叫指在不能立刻得到結果之前,該呼叫不會阻塞當前執行緒。

還是上面的例子, 你打電話問書店老闆有沒有《分散式系統》這本書,你如果是阻塞式呼叫,你會一直把自己掛起,直到得到這本書有沒有的結果,如果是非阻塞式呼叫,你不管老闆有沒有告訴你,你自己先一邊去玩 了,當然你也要偶爾過幾分鐘check—下老闆有沒有遐回結果。

在這裡阻塞與非阻塞與是否同步非同步無關。跟老闆通過什麼方式回答你結果無關

6. OSI七層模型,包括TCP,IP的一些基本知識

1. OSI七層和TCP/IP四層的關係

1.1 OSI引入了服務、介面、協議、分層的概念,TCP/IP借鑑了OSI的這些概念建立TCP/IP模型。

1.2 OSI先有模型,後有協議,先有標準,後進行實踐;而TCP/IP則相反,先有協議和應用再提出了模型,且是參照的OSI模型。

1.3 OSI是一種理論下的模型,而TCP/IP已被廣泛使用,成為網路互聯事實上的標準。

TCP:transmission control protocol 傳輸控制協議

UDP:user data protocol 使用者資料報協議

OSI七層網路模型

TCP/IP四層概念模型  

對應網路協議

應用層(Application)

應用層

HTTP、TFTP, FTP, NFS, WAIS、SMTP

表示層(Presentation)

Telnet, Rlogin, SNMP, Gopher

會話層(Session)

SMTP, DNS

傳輸層(Transport)

傳輸層

TCP, UDP

網路層(Network)

網路層

IP, ICMP, ARP, RARP, AKP, UUCP

資料鏈路層(Data Link)

資料鏈路層

FDDI, Ethernet, Arpanet, PDN, SLIP, PPP

物理層(Physical)

IEEE 802.1A, IEEE 802.2到IEEE 802.11

7. http中,get post的區別

  • GET在瀏覽器回退時是無害的,而POST會再次提交請求。
  • GET產生的URL地址可以被Bookmark,而POST不可以。
  • GET請求會被瀏覽器主動cache,而POST不會,除非手動設定。
  • GET請求只能進行url編碼,而POST支援多種編碼方式。
  • GET請求引數會被完整保留在瀏覽器歷史記錄裡,而POST中的引數不會被保留。
  • GET請求在URL中傳送的引數是有長度限制的,而POST麼有。
  • 對引數的資料型別,GET只接受ASCII字元,而POST沒有限制。
  • GET比POST更不安全,因為引數直接暴露在URL上,所以不能用來傳遞敏感資訊。
  • GET引數通過URL傳遞,POST放在Request body中。

GET和POST本質上沒有區別

GET和POST是什麼?HTTP協議中的兩種傳送請求的方法。

HTTP是什麼?HTTP是基於TCP/IP的關於資料如何在全球資訊網中如何通訊的協議。

HTTP的底層是TCP/IP。所以GET和POST的底層也是TCP/IP,也就是說,GET/POST都是TCP連結。GET和POST能做的事情是一樣一樣的。你要給GET加上request body,給POST帶上url引數,技術上是完全行的通的。 

因此,GET和POST本質上就是TCP連結,並無差別。但是由於HTTP的規定和瀏覽器/伺服器的限制,導致他們在應用過程中體現出一些不同。 

GET和POST還有一個重大區別,簡單的說:

GET產生一個TCP資料包;POST產生兩個TCP資料包。

對於GET方式的請求,瀏覽器會把http header和data一併傳送出去,伺服器響應200(返回資料);

而對於POST,瀏覽器先發送header,伺服器響應100 continue,瀏覽器再發送data,伺服器響應200 ok(返回資料)。

因為POST需要兩步,時間上消耗的要多一點,看起來GET比POST更有效。因此Yahoo團隊有推薦用GET替換POST來優化網站效能。但這是一個坑!跳入需謹慎。為什麼?

1. GET與POST都有自己的語義,不能隨便混用。

2. 據研究,在網路環境好的情況下,發一次包的時間和發兩次包的時間差別基本可以無視。而在網路環境差的情況下,兩次包的TCP在驗證資料包完整性上,有非常大的優點。

3. 並不是所有瀏覽器都會在POST中傳送兩次包,Firefox就只發送一次。

8. 說說http,tcp,udp之間關係和區別。

TCP/IP是個協議組,可分為四個層次:網路介面層、網路層、傳輸層和應用層。

在網路層有IP協議、ICMP協議、ARP協議、RARP協議和BOOTP協議。

在傳輸層中有TCP協議與UDP協議。

在應用層有HTTP、FTP、TELNET、SMTP、DNS等協議。

TCP  傳送控制協議(Transmission Control Protocol):

TCP是傳輸層的一個協議,基於IP協議,用來傳輸類似HTTP的資訊。如果把IP協議類比為一個“公路”的話,那TCP協議可以看成是在公路上行駛的“卡車”。TCP協議是面向連線的協議,通過三次握手機制,儘量保證連線的可靠性。tcp的連結需要進行三次握手,釋放連線需要四次揮手。

UDP 使用者資料報協議 (User Datagram Protocol) :

  UDP也是傳輸層的一個協議。但是與TCP不同的是,UDP不是面向連線的,並不保證傳輸的可靠性,沒有TCP的建立連線的三次握手機制,對於傳輸效率上面有了提升。

個人理解:

這個就比較簡單粗暴了,A要給B傳資料,然後就直接傳了。

HTTP 超文字傳輸協議(HyperText Transfer Protocal):

  HTTP是在應用層的一個協議,本身就是一個協議,是從Web伺服器傳輸超文字到本地瀏覽器的傳輸協議。 

  HTTP協議基於請求\響應模型的,並且是基於TCP協議的。

  HTTP連線最顯著的特點是客戶端傳送的每次請求都需要伺服器回送響應,在請求結束後,會主動釋放連線。從建立連線到關閉連線的過程稱為“一次連線”。

1、客戶端瀏覽器通過DNS解析到www.taobao.com的IP地址a,通過這個IP地址找到客戶端到伺服器的路徑。客戶端瀏覽器發起一個HTTP會話到a,然後通過TCP進行封裝資料包,輸入到網路層。

2、在客戶端的傳輸層,把HTTP會話請求分成報文段,新增源和目的埠,如伺服器使用80埠監聽客戶端的請求,客戶端由系統隨機選擇一個埠如5000,與伺服器進行交換,伺服器把相應的請求返回給客戶端的5000埠。然後使用IP層的IP地址查詢目的端。

3、客戶端的網路層不用關係應用層或者傳輸層的東西,主要做的是通過查詢路由表確定如何到達伺服器,期間可能經過多個路由器,這些都是由路由器來完成的工作,我不作過多的描述,無非就是通過查詢路由表決定通過那個路徑到達伺服器。

4、客戶端的鏈路層,包通過鏈路層傳送到路由器,通過鄰居協議查詢給定IP地址的MAC地址,然後傳送ARP請求查詢目的地址,如果得到迴應後就可以使用ARP的請求應答交換的IP資料包現在就可以傳輸了,然後傳送IP資料包到達伺服器的地址。

10. HTTP協議、  HTTPS協議,SSL協議及完整互動過程;

SSL

1.安全套接字(Secure Socket Layer,SSL)協議是Web瀏覽器與Web伺服器之間安全交換資訊的協議。

2.SSL協議的三個特性

Ø  保密:在握手協議中定義了會話金鑰後,所有的訊息都被加密。

Ø  鑑別:可選的客戶端認證,和強制的伺服器端認證。

Ø  完整性:傳送的訊息包括訊息完整性檢查(使用MAC)。

3.SSL的位置

HTTPS

1.HTTPS基於SSL的HTTP協議。

2.HTTPS使用與HTTP不同的埠(HTTP:80 , HTTPS:443,一個加密、身份驗證層(HTTP與TCP之間))。

3.提供了身份驗證與加密通訊方法,被廣泛用於網際網路上安全敏感的通訊。

互動過程

客戶端在使用HTTPS方式與Web伺服器通訊時有以下幾個步驟,如圖所示。

1)    客戶端請求建立SSL連線,並將自己支援的一套加密規則傳送給網站。

2)    網站從中選出一組加密演算法與HASH演算法,並將自己的身份資訊以證書的形式發回給瀏覽器。證書裡面包含了網站地址,加密公鑰,以及證書的頒發機構等資訊

3)    獲得網站證書之後瀏覽器要做以下工作:

Ø  驗證證書的合法性

Ø  如果證書受信任,瀏覽器會生成一串隨機數的密碼,並用證書中提供的公鑰加密。

Ø  使用約定好的HASH計算握手訊息,

Ø  使用生成的隨機數對訊息進行加密,最後將之前生成的所有資訊傳送給網站。

4)    網站接收瀏覽器發來的資料之後要做以下的操作:

Ø  使用自己的私鑰將資訊解密取出密碼

Ø  使用密碼解密瀏覽器發來的握手訊息,並驗證HASH是否與瀏覽器發來的一致。

Ø  使用密碼加密一段握手訊息,傳送給瀏覽器

5)    瀏覽器解密並計算握手訊息的HASH,如果與服務端發來的HASH一致,此時握手結束。

6)    使用隨機密碼和對稱加密演算法對傳輸的資料加密,傳輸。

4.     加密與HASH演算法如下:

1)     非對稱加密演算法:RSA,DSA/DSS,用於在握手過程中加密生成的密碼。

2)     對稱加密演算法:AES,RC4,3DES,用於對真正傳輸的資料進行加密。

3)     HASH演算法:MD5,SHA1,SHA256,驗證資料的完整性。

5.     HTTP與HTTPS的區別:

1)     https協議需要申請證書。

2)     http是超文字傳輸協議,明文傳輸;https使用的是具有安全性的SSL加密傳輸協議。

3)     http埠80,;https埠443。

4)     http連線簡單無狀態;https由SSL+HTTP協議構件的可進行加密傳輸、身份驗證的網路協議。

11. tcp的擁塞,快回傳,ip的報文丟棄

12. https處理的一個過程,對稱加密和非對稱加密

參考問題10

13. head各個特點和區別

感覺問題有問題,估計是問http請求方法的區別,參考問題1