一、談一談你對 TCP/IP 四層模型,OSI 七層模型的理解?
為了增強通用性和兼容性,計算機網路都被設計成層次機構,每一層都遵守一定的規則,
因此有了OSI這樣一個抽象的網路通信參考模型,按照這個標準使計算機網路系統可以互相連接,
物理層:通過網線、光纜等這種物理方式將電腦連接起來,傳遞的資料是位元流,0101010100,
資料鏈路層:首先,把位元流封裝成資料幀的格式,對0、1進行分組,電腦連接起來之后,資料都經過網卡來傳輸,而網卡上定義了全世界唯一的MAC地址,然后再通過廣播的形式向局域網內所有電腦發送資料,再根據資料中MAC地址和自身對比判斷是否是發給自己的,
網路層:廣播的形式太低效,為了區分哪些MAC地址屬于同一個子網,網路層定義了IP和子網掩碼,通過對IP和子網掩碼進行與運算就知道是否是同一個子網,再通過路由器和交換機進行傳輸,IP協議屬于網路層的協議,
傳輸層:有了網路層的MAC+IP地址之后,為了確定資料包是從哪個行程發送過來的,就需要埠號,通過埠來建立通信,比如TCP和UDP屬于這一層的協議,
會話層:負責建立和斷開連接
表示層:為了使得資料能夠被其他的計算機理解,再次將資料轉換成另外一種格式,比如文字、視頻、圖片等,
應用層:最高層,面對用戶,提供計算機網路與最終呈現給用戶的界面

TCP/IP則是四層的結構,相當于是對OSI模型的簡化,
1.資料鏈路層,也有稱作網路訪問層、網路介面層,他包含了OSI模型的物理層和資料鏈路層,把電腦連接起來,
2.網路層,也叫做IP層,處理IP資料包的傳輸、路由,建立主機間的通信,
3.傳輸層,就是為兩臺主機設備提供端到端的通信,
4.應用層,包含OSI的會話層、表示層和應用層,提供了一些常用的協議規范,比如FTP、SMPT、HTTP等,
總結下來,就是物理層通過物理手段把電腦連接起來,資料鏈路層則對位元流的資料進行分組,網路層來建立主機到主機的通信,傳輸層建立埠到埠的通信,應用層最終負責建立連接,資料格式轉換,最終呈現給用戶,
二、說說 TCP 3次握手的程序?
建立連接前server端需要監聽埠,所以初始狀態是LISTEN,
1.client端建立連接,發送一個SYN同步包,發送之后狀態變成SYN_SENT
2.server端收到SYN之后,同意建立連接,回傳一個ACK回應,同時也會給client發送一個SYN包,發送完成之后狀態變為SYN_RCVD
3.client端收到server的ACK之后,狀態變為ESTABLISHED,回傳ACK給server端,server收到之后狀態也變為ESTABLISHED,連接建立完成,

三、為什么要3次?2次,4次不行嗎?
因為TCP是雙工傳輸模式,不區分客戶端和服務端,連接的建立是雙向的程序,
如果只有兩次,無法做到雙向連接的建立,從建立連接server回復的SYN和ACK合并成一次可以看出來,他也不需要4次,
揮手為什么要四次?因為揮手的ACK和FIN不能同時發送,因為資料發送的截止時間不同,
四、那么四次揮手的程序呢?
1.client端向server發送FIN包,進入FIN_WAIT_1狀態,這代表client端已經沒有資料要發送了
2.server端收到之后,回傳一個ACK,進入CLOSE_WAIT等待關閉的狀態,因為server端可能還有沒有發送完成的資料
3.等到server端資料都發送完畢之后,server端就向client發送FIN,進入LAST_ACK狀態
4.client收到ACK之后,進入TIME_WAIT的狀態,同時回復ACK,server收到之后直接進入CLOSED狀態,連接關閉,但是client要等待2MSL(報文最大生存時間)的時間,才會進入CLOSED狀態,

五、為什么要等待2MSL 的時間才關閉?
1.為了保證連接的可靠關閉,如果server沒有收到最后一個ACK,那么就會重發FIN,
2.為了避免埠重用帶來的資料混淆,如果client直接進入CLOSED狀態,又用相同埠號向server建立一個連接,上一次連接的部分資料在網路中延遲到達server,資料就可能發生混淆了,
六、TCP 怎么保證傳輸程序的可靠性?
校驗和:發送方在發送資料之前計算校驗和,接收方收到資料后同樣計算,如果不一致,那么傳輸有誤,
確認應答,序列號:TCP進行傳輸時資料都進行了編號,每次接收方回傳ACK都有確認序列號,
超時重傳:如果發送方發送資料一段時間后沒有收到ACK,那么就重發資料,
連接管理:三次握手和四次揮手的程序,
流量控制:TCP協議報頭包含16位的視窗大小,接收方會在回傳ACK時同時把自己的即時視窗填入,發送方就根據報文中視窗的大小控制發送速度,
擁塞控制:剛開始發送資料的時候,擁塞視窗是1,以后每次收到ACK,則擁塞視窗+1,然后將擁塞視窗和收到的視窗取較小值作為實際發送的視窗,如果發生超時重傳,擁塞視窗重置為1,這樣做的目的就是為了保證傳輸程序的高效性和可靠性,
七、說下瀏覽器請求一個網址的程序?
1.首先通過DNS服務器把域名決議成IP地址,通過IP和子網掩碼判斷是否屬于同一個子網
2.構造應用層請求http報文,傳輸層添加TCP/UDP頭部,網路層添加IP頭部,資料鏈路層添加以太網協議頭部
3.資料經過路由器、交換機轉發,最終達到目標服務器,目標服務器同樣決議資料,最終拿到http報文,按照對應的程式的邏輯回應回去,

八、知道HTTPS的作業原理嗎?
1.用戶通過瀏覽器請求https網站,服務器收到請求,選擇瀏覽器支持的加密和hash演算法,同時回傳數字證書給瀏覽器,包含頒發機構、網址、公鑰、證書有效期等資訊,
2.瀏覽器對證書的內容進行校驗,如果有問題,則會有一個提示警告,否則,就生成一個亂數X,同時使用證書中的公鑰進行加密,并且發送給服務器,
3.服務器收到之后,使用私鑰解密,得到亂數X,然后使用X對網頁內容進行加密,回傳給瀏覽器
4.瀏覽器則使用X和之前約定的加密演算法進行解密,得到最終的網頁內容

九、負載均衡有哪些實作方式?
DNS:這是最簡單的負載均衡的方式,一般用于實作地理級別的負載均衡,不同地域的用戶通過DNS的決議可以回傳不同的IP地址,這種方式的負載均衡簡單,但是擴展性太差,控制權在域名服務商,
Http重定向:通過修改Http回應頭的Location達到負載均衡的目的,Http的302重定向,這種方式對性能有影響,而且增加請求耗時,
反向代理:作用于應用層的模式,也被稱作為七層負載均衡,比如常見的Nginx,性能一般可以達到萬級,這種方式部署簡單,成本低,而且容易擴展,
IP:作用于網路層的和傳輸層的模式,也被稱作四層負載均衡,通過對資料包的IP地址和埠進行修改來達到負載均衡的效果,常見的有LVS(Linux Virtual Server),通常性能可以支持10萬級并發,
按照型別來劃分的話,還可以分成DNS負載均衡、硬體負載均衡、軟體負載均衡,
其中硬體負載均衡價格昂貴,性能最好,能達到百萬級,軟體負載均衡包括Nginx、LVS這種,
十、說說 BIO/NIO/AIO 的區別?
BIO:同步阻塞IO,每一個客戶端連接,服務端都會對應一個處理執行緒,對于沒有分配到處理執行緒的連接就會被阻塞或者拒絕,相當于是一個連接一個執行緒,

NIO:同步非阻塞IO,基于Reactor模型,客戶端和channel進行通信,channel可以進行讀寫操作,通過多路復用器selector來輪詢注冊在其上的channel,而后再進行IO操作,這樣的話,在進行IO操作的時候再用一個執行緒去處理就可以了,也就是一個請求一個執行緒,

AIO:異步非阻塞IO,相比NIO更進一步,完全由作業系統來完成請求的處理,然后通知服務端開啟執行緒去進行處理,因此是一個有效請求一個執行緒,
十一、那么你怎么理解同步和阻塞?
首先,可以認為一個IO操作包含兩個部分:
1.發起IO請求
2.實際的IO讀寫操作
同步和異步在于第二個,實際的IO讀寫操作,如果作業系統幫你完成了再通知你,那就是異步,否則都叫做同步,
阻塞和非阻塞在于第一個,發起IO請求,對于NIO來說通過channel發起IO操作請求后,其實就回傳了,所以是非阻塞,
十二、談一下你對Reactor模型的理解?
Reactor模型包含兩個組件:
1.Reactor:負責查詢、回應IO事件,當檢測到IO事件時,分發給Handlers處理,
2.Handler:與IO事件系結,負責IO事件的處理,
它包含幾種實作方式:
單執行緒 Reactor
這個模式reactor和handler在一個執行緒中,如果某個handler阻塞的話,會導致其他所有的handler無法執行,而且無法充分利用多核的性能,

單 Reactor 多執行緒
由于decode、compute、encode的操作并非IO的操作,多執行緒Reactor的思路就是充分發揮多核的特性,同時把非IO的操作剝離開,
但是,單個Reactor承擔了所有的事件監聽、回應作業,如果連接過多,還是可能存在性能問題,

多 Reactor 多執行緒
為了解決單Reactor的性能問題,就產生了多Reactor的模式,其中mainReactor建立連接,多個subReactor則負責資料讀寫,

作者 | 艾小仙
本文來自博客園,作者:古道輕風,轉載請注明原文鏈接:https://www.cnblogs.com/88223100/p/Network-Interview-Questions.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/538457.html
標籤:其他
上一篇:隱匿自己的c2服務器(一)
