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