1. TCP建⽴連接的過程
三次握⼿:
- 第⼀次握⼿(客戶端發送syn包到服務器端):客戶端發送syn包到服務器端,進⼊syn_send狀態,等待服務器端的確認;
- 第⼆次握⼿(服務器返回syn+ack包給客戶端):服務器端收到客戶端的syn包,發送syn+ack包給客戶端,進⼊syn_recv狀態;
- 第三次握⼿(客服端返回ack包給服務端):客戶端收到服務器端的syn+ack包,發送個ack包到服務器端,⾄此,客戶端與服務器端進⼊established狀態;
- 握⼿過程中傳送的包不包含任何數據,連接建⽴後纔會開始傳送數據,理想狀態下,TCP連接⼀旦建⽴,在通信雙⽅的任何⼀⽅主動關閉連接前,TCP連接都會⼀直保持下去。
2. TCP斷開連接的過程
四次ഀ⼿:
- 第一次揮⼿:主動關閉⽅發送fin包到被動關閉⽅,告訴被動關閉⽅我不會再給你發送數據了;
- 第⼆次揮⼿:被動關閉⽅收到syn包,發送ack給對⽅,確認序號爲收到序號+1;
- 第三次揮⼿:被動關閉⽅也也發送fin包給主動關閉⽅,告訴對⽅我也不會給你發送數據了;
- 第四次揮⼿:主動關閉⽅收到syn包,發送ack給對⽅,⾄此,完成四次揮⼿;
3. 瀏覽器發⽣302跳轉背後的邏輯?
瀏覽器在原請求地址的響應的Location域找到要跳轉的URI執⾏跳轉。
瀏覽器輸⼊URL後發⽣了什麼:
- DNS域名解析;
- 建⽴TCP連接;
- 發送HTTP請求;
- 服務器處理請求;
- 返回響應結果;
- 關閉TCP連接;
- 瀏覽器解析HTML;
- 瀏覽器佈局渲染;
4. HTTP協議的交互流程。 HTTP和HTTPS的差異, SSL的交互流程?
Http協議:
- 建⽴TCP連接;
- 發送HTTP請求;
- 服務器處理請求;
- 返回響應結果;
- 關閉TCP連接;
http三次握⼿:
第⼀次握⼿:客戶端發送syn包(syn=j)到服務器,並進⼊SYN_SEND狀態,等待服務器確認;
第⼆次握⼿:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時⾃⼰也發送⼀個SYN包(syn=k),即SYN+ACK包,此時服務器進⼊SYN_RECV狀態;
第三次握⼿:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進⼊ESTABLISHED狀態,完成三次握⼿。
HTTPS協議:
- HTTPS協議就是基於SSL的HTTP協議
- HTTPS使⽤與HTTP不同的端⼝(HTTPS80 , HTTPSS443)提供了身份驗證與加密通信⽅法,被⼴泛⽤於互聯⽹上安全敏感的通信。
1.客戶端請求SSL連接,並將⾃⼰⽀持的加密規則發給⽹站。
2.服務器端將⾃⼰的身份信息以證書形式發回給客戶端。證書⾥⾯包含了⽹站地址,加密公鑰,以及證書的頒發機構。
3.獲得證書後,客戶要做以下⼯作
- 驗證證書合法性
- 如果證書受信任,客戶端會⽣成⼀串隨機數的密碼,並⽤證書提供的公鑰進⾏加密。
將加密好的隨機數發給服務器。
4.獲得到客戶端發的加密了的隨機數之後,服務器⽤⾃⼰的私鑰進⾏解密,得到這個隨機數,把這個隨機數作爲對稱加密的密鑰。(利⽤⾮對稱加密傳輸對稱加密的密鑰)
5.之後服務器與客戶之間就可以⽤隨機數對各⾃的信息進⾏加密,解密。
注意的是:證書是⼀個公鑰,這個公鑰是進⾏加密⽤的。⽽私鑰是進⾏解密⽤的。公鑰任何都知道,私鑰只有⾃⼰知道。這是⾮對稱加密。⽽對稱加密就是鑰匙只有⼀把,我們都知道。之所以⽤到對稱加密,是因爲對稱加密的速度更快。⽽⾮對稱加密的可靠性更⾼。
流程:客戶端請求–服務端發送證書(公鑰)–客戶端驗證證書,並⽣成隨機數,通過公鑰加密後發送給服務端–服務端⽤私鑰解密出隨機數–對稱加密傳輸數據。
HTTP與HTTPS的區別:
- HTTPS協議需要申請證書。
- HTTP是明⽂傳輸;HTTPS使⽤的是具有安全性的SSL加密傳輸協議
- HTTP端⼝是80;HTTPS端⼝號是443
- HTTP連接簡單⽆狀態;HTTPS由SSL+HTTP協議構件的可進⾏加密傳輸、身份驗證的⽹絡協議。
5. Rest和Http什麼關係?⼤家都說Rest很輕置,你對Rest⻛格如何理解?
Http是⼀種協議,Rest是⼀種軟件架構⻛格。
URL定位資源,⽤HTTP動詞(GET,POST,DELETE,DETC)描述操作。
GET表示查詢、POST表示新建、PUT表示更新、DELETE表示刪除等。
- GET /api/v1/user 獲取⽤戶列表
- GET /api/v1/user/1 獲取ID爲1的⽤戶
- POST /api/v1/user 新建⽤戶
- PUT /api/v1/user/1 更新ID爲1的⽤戶信息
- DELETE /api/v1/user/1 刪除ID爲1的⽤戶
1、概念:REST(英⽂:Representational State Transfer,簡稱REST,表現層狀態轉化),指的是⼀組架構約束條件和原則。滿⾜這些約束條件和原則的應⽤程序或設計就是 RESTful。
2、⼀種軟件架構⻛格,設計⻛格⽽不是標準,只是提供了⼀組設計原則和約束條件。它主要⽤於客戶端和服務器交互類的軟件。基於這個⻛格設計的軟件可以更簡潔,更有層次,更易於實現緩存等機制。
3、Restful架構:
- 每⼀個URI代表⼀種資源;
- 客戶端和服務器之間,傳遞這種資源的某種表現層;
- 客戶端通過四個HTTP動詞(GET⽤來獲取資源,POST⽤來新建資源(也可以⽤於更新資源),PUT⽤來更新資源,DELETE⽤來刪除資源。),對服務器端資源進⾏操作,實現"表現層狀態轉化”。
6. TCP的滑動窗⼝協議有什麼⽤?講講原理。
滑動窗⼝協議是傳輸層進⾏流控的⼀種措施,接收⽅通過通告發送⽅⾃⼰的窗⼝⼤⼩,從⽽控制發送⽅的發送速度,從⽽達到防⽌發送⽅發送速度過快⽽導致來不及接受。
7. HTTP協議都有哪些⽅法?
- GET 請求獲取由Request-URI所標識的資源。
- POST 在Request-URI所標識的資源後附加新的數據。
- HEAD 請求獲取由Request-URI所標識的資源的響應消息報頭。
- OPTIONS 請求查詢服務器的性能,或查詢與資源相關的選項和需
求。 - PUT 請求服務器存儲⼀個資源,並⽤Request-URI作爲其標識。
- DELETE 請求服務器刪除由Request-URI所標識的資源。
- TRACE 請求服務器回送收到的請求信息,主要⽤語測試或診斷。
8. 交換機與路由器的區別?
1、⼯作層次不同
- 最初的交換機⼯作在OSI模型中的數據鏈路層,⼯作原理簡單路由器⼯作在OSI模型中的⽹絡層,得更多協議信息,做更智能的轉發決策
2、數據轉發所依據的對象不同
- 交換機是利⽤物理地址(MAC地址),確定轉發的⽬的地址。(MAC固化硬件,⼀般不可更改)
- 路由器是利⽤IP地址,確定轉發的⽬的地址。(IP通常爲⽹關或系統⾃動分配的)
3、是否可以分割⼴播域
- 傳統的交換機可以分割衝突域,不能分割⼴播域,⽽路由器可以分割⼴播域
- 由交換機連接的⽹段仍然屬於同⼀⼴播域,⼴播數據報會在交換機連接的所有⽹段上傳播,某些情況導致通信擁和安全漏洞。連接到路由器上的⽹段被分配成不同的⼴播域,所以,⼴播數據不穿過路由器
- 雖然三層交換機可以分割⼴播域,但是⼦⼴播域之間不能通信,還是需要路由器
4、路由器提供了防⽕牆的服務
- 路由器僅僅轉發特定地址的數據包,不傳送不⽀持路由協議的數據包,不傳送未知⽬標⽹絡數據包,從⽽可以防⽌⼴播⻛暴。
5、表
- ⼆層交換機上存在MAC表,三層交換機上存在路由表、MAC表、ARP表,路由器上存在路由表和ARP表。
- 總之,交換機在具體的城域⽹中扮演着VLAN透傳的⻆⾊,就是橋。路由器的每⼀個端⼝都是⼀個獨⽴的⼴播域和衝突域,⽽交換機是隻有⼀個⼴播域和端⼝數量的衝突域。
9. Socket⽹絡通信、NIO流以及多線程處理技術,Netty、Mina?
1、socket⽹絡通信:(NIO流以及多線程處理技術):
- BIO:阻塞式,線程池初始時創建⼀定量線程,超過則等待;
- NIO:⾮阻塞式,不同的線程⼲專業的事情,提⾼系統吞吐量;
- NIO+異步處理:讓少量的線程做⼤量的事情;
2、Mina:
Apache Mina是⼀個能夠幫助⽤戶開發⾼性能和⾼伸縮性⽹絡應⽤程序的框架。它通過Java nio技術基於TCP/IP和UDP/IP協議提供了抽象的、事件驅動的、異步的API。採⽤⾮阻塞⽅式的異步傳輸,⽀持批量傳輸數據。mina框架簡單⾼效,完成了底層的線程管理,內置
編碼器能夠滿⾜⼤多數⽤戶的需求,省去了消息編碼和解碼的⼯作。
3、Netty:
本質是JBoss開發的⼀個jar包,⽬的是開發⾼性能、⾼可靠性的⽹絡服務和客戶端服務;提供異步⾮阻塞的、事件驅動的⽹絡應⽤程序的NIO框架和⼯具;處理socket;通過Future-Listener機制,⽤戶可以⽅便的主動獲取或者通過通知機制獲得IO操作結果。
10. http協議(報⽂結構,斷點續傳,多線程下載,什麼是⻓連接)
概念:
- i. HTTP協議是Hyper Text Transfer Protocol(超⽂本傳輸協議)的縮寫,是⽤於從萬維⽹(WWW:World Wide Web )服務器傳輸超⽂本到本地瀏覽器的傳送協議。
- ii. HTTP是⼀個基於TCP/IP通信協議來傳遞數據(HTML ⽂件, 圖⽚⽂件, 查詢結果等)。
- iii. HTTP是⼀個屬於應⽤層的⾯向對象的協議,由於其簡捷、快速的⽅式,適⽤於分佈式超媒體信息系統。它於1990年提出,經過⼏年的使⽤與發展,得到不斷地完善和擴展。⽬前在WWW中使⽤的是HTTP/1.0的第六版,HTTP/1.1的規範化⼯作正在進⾏之中,⽽且HTTP-NG(Next Generation of HTTP)的建議已經提出。
- iv. HTTP協議⼯作於客戶端-服務端架構爲上。瀏覽器作爲HTTP客戶端通過URL向HTTP服務端即WEB服務器發送所有請求。Web服務器根據接收到的請求後,向客戶端發送響應信息。
主要特點:
- 簡單快速:客戶向服務器請求服務時,只需傳送請求⽅法和路徑。請求⽅法常⽤的有GET、HEAD、POST。每種⽅法規定了客戶與服務器聯繫的類型不同。由於HTTP協議簡單,使得HTTP服務器的程序規模⼩,因⽽通信速度很快。
- 靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。
- ⽆連接:⽆連接的含義是限制每次連接只處理⼀個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開連接。採⽤這種⽅式可以節省傳輸時間。
- ⽆狀態:HTTP協議是⽆狀態協議。⽆狀態是指協議對於事務處理沒有記憶能⼒。缺少狀態意味着如果後續處理需要前⾯的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增⼤。另⼀⽅⾯,在服務器不需要先前信息時它的應答就較快。
- ⽀持B/S及C/S模式。
11. get與post區別
- 表單的method如果爲get,那麼所有的參數信息都會顯示在瀏覽器的地址欄,當我們使⽤瀏覽器地址欄輸⼊⽹址的⽅式來發送請求時,那麼該請求⼀定是get⽅式
- 對於get⽅式,底層是將所有參數附加在請求資源的後⾯⼀起傳遞的,對於post⽅式,底層是將所有參數附加在請求參數的最後⼀⾏的下⼀⾏的下⼀⾏ Get請求的數據是被附在url之後(HTTP協議頭中),POST請求數據則放置在HTTP包的包體head中;
- 對於get,post⽅式,servlet不同處理:doGet(),doPost();
- 瀏覽器處理:重複訪問使⽤GET⽅法請求的⻚⾯,瀏覽器會使⽤緩存處理後續請求。使⽤POST⽅法的form提交時,瀏覽器基於POST將產⽣永久改變的假設,將讓⽤戶進⾏提交確認。
12. Nginx性能調優
- 增加同時打開⽂件數open files數量;
- 處理⼤量靜態⽂件的磁盤I/O時(此時worker進程是單線程的),增加CPU核⼼數Worker Processes數量,提⾼計算能⼒;
- 如果⽹站流量很⾼,則可以提升worker進程連接數Worker Connections(默認1024);
- 控制keep alive在10s-20s之間,減少連接的時間開銷;
- 合理設置open file cache時間提⾼處理效率;
- 提⾼⽹路帶寬;
- 開啓壓縮傳輸數據gzip,設置壓縮級別gzip_comp_level爲1-2,再⾼效果不明顯並且浪費CPU了;
- 擴展機器數量。
13. rpc和http的區別,使⽤場景:
<傳輸協議>
- RPC,可以基於TCP協議,也可以基於HTTP協議
- HTTP,基於HTTP協議
<傳輸效率>
- RPC,使⽤⾃定義的TCP協議,可以讓請求報⽂體積更⼩,或者使⽤HTTP2協議,也可以很好的減少報⽂的體積,提⾼傳輸效率
- HTTP,如果是基於HTTP1.1的協議,請求中會包含很多⽆⽤的內容,如果是基HTTP2.0,那麼簡單的封裝以下是可以作爲⼀個RPC來使⽤的,這時標準RPC框架更多的是服務治理
<性能消耗,主要在於序列化和反序列化的耗時>
- RPC,可以基於thrift實現⾼效的⼆進制傳輸
- HTTP,⼤部分是通過json來實現的,字節⼤⼩和序列化耗時都⽐thrift要更消耗性能
<負載均衡>
- RPC,基本都⾃帶了負載均衡策略
- HTTP,需要配置Nginx,HAProxy來實現
<服務治理(下游服務新增,重啓,下線時如何不影響上游調⽤者)>
- RPC,能做到⾃動通知,不影響上游
- HTTP,需要事先通知,修改Nginx/HAProxy配置
總結:RPC主要⽤於公司內部的服務調⽤,性能消耗低,傳輸效率⾼,服務治理⽅便。HTTP主要⽤於對外的異構環境,瀏覽器接⼝調⽤,APP接⼝調⽤,第三⽅接⼝調⽤等。