1、面試題用瀏覽器請求一個鏈接的時候,經歷了哪些過程(DNS解析過程)?2、面試官心里分析
這個問題,其實就是跟之前的那個一樣,他就是考察考察你的基本功,看你對基本的網(wǎng)絡通信知識有沒有了解。
而且話說回來,考察一個人的基本功,就這個問題應該是相當經典和直接的一個問題,你理解清楚了,那么網(wǎng)絡通信這塊的一些基本概念,你基本都了解了。
3、面試題剖析
如果你閱讀過昨天發(fā)布文章,就應該知道網(wǎng)絡七層模型大概都是怎么回事了,然后四層模型其實就是會話層、表示層和應用層,合并為了一個應用層,同時沒把物理層算在內
并且我們也大概知道每一層的協(xié)議和作用,網(wǎng)絡通信的時候都是怎么回事了,現(xiàn)在我們來看看假設通過瀏覽器發(fā)送一個請求,你訪問到那個網(wǎng)站對應的機器,然后人家再給你一個響應的全過程。
現(xiàn)在我們先假設,我們給電腦設置了幾個東西:ip地址:192.168.31.37子網(wǎng)掩碼:255.255.255.0網(wǎng)關地址:192.168.31.1DNS地址:8.8.8.8這時,我們打開一個瀏覽器,請求www.baidu.com地址,這個時候找DNS服務器,DNS服務器解析域名之后,返回一個ip地址,比如172.194.26.108。
接著會判斷兩個ip地址是不是一個子網(wǎng)的,用子網(wǎng)掩碼255.255.255.0,對兩個ip地址做與運算,拿到192.168.31.0和172.194.26.0,明顯不是一個子網(wǎng)的。
如圖:
那就得發(fā)送一個數(shù)據(jù)包給網(wǎng)關,其實你就認為是我們的路由器吧,就是192.168.31.1,而且我們是可以拿到網(wǎng)關ip地址的mac地址的,現(xiàn)在我們從應用層出發(fā),通過瀏覽器訪問一個網(wǎng)站,是走應用層的http協(xié)議的,并且要把瀏覽器發(fā)出的請求打包成數(shù)據(jù)包,要把哪些東西給放到數(shù)據(jù)包中去呢?
http協(xié)議分為幾個部分:
請求方法+URL地址+http版本
比如
GEThttp://172.194.26.108/testHTTP/1.1,類似這種請求頭,類似下面這種:
Host:upload.jiangsu.ioProxy-Connection:keep-aliveUser-Agent:Mozilla/5.0
等等。。。
請求體,比如常見的可以放一個json這就構成了一個http請求報文瀏覽器請求一個地址,先按照應用層的http協(xié)議,封裝一個應用層數(shù)據(jù)包,數(shù)據(jù)包里就放了http請求報文,這個時候會將這個http請求報文打包成一個數(shù)據(jù)包,僅僅只是數(shù)據(jù)包的數(shù)據(jù)部分,此時是數(shù)據(jù)包是沒有頭的。上面根據(jù)http協(xié)議搞一個http請求報文,然后搞一個數(shù)據(jù)包出來,就是網(wǎng)絡模型中到的應用層干的事兒了。接著就是跑傳輸層來了,這個層是tcp協(xié)議,這個tcp協(xié)議會讓你設置端口,發(fā)送方的端口隨機選一個,接收方的端口一般是默認的80端口。
這個時候,會把應用層數(shù)據(jù)包給封裝到tcp數(shù)據(jù)包中去,而且會加一個tcp頭,這個tcp數(shù)據(jù)包是對應一個tcp頭的,這個tcp頭里就放了端口號信息。如圖:
接著跑到網(wǎng)絡層來了,走ip協(xié)議,這個時候會把tcp頭和tcp數(shù)據(jù)包,放到ip數(shù)據(jù)包里去,然后再搞一個ip頭,ip頭里本機和目標機器的ip地址。這里本機ip地址是192.168.31.37,
目標機器是172.194.26.108。
因為,通過ip協(xié)議,可以判斷說,兩個ip地址不是在一個子網(wǎng)內的,所以此時只能將數(shù)據(jù)包先通過以太網(wǎng)協(xié)議廣播到網(wǎng)關上去,通過網(wǎng)關再給他發(fā)送出去,如圖:
接著是數(shù)據(jù)鏈路層,這塊走以太網(wǎng)協(xié)議,這里是把ip頭和ip數(shù)據(jù)包封到以太網(wǎng)數(shù)據(jù)包里去,然后再加一個以太網(wǎng)數(shù)據(jù)包的頭,頭里放了本機網(wǎng)卡mac地址,和網(wǎng)關的mac地址。但是以太網(wǎng)數(shù)據(jù)包的限制是1500個字節(jié),但是假設這個時候ip數(shù)據(jù)包都5000個字節(jié)了,那么需要將ip數(shù)據(jù)包切割一下。這個時候一個以太網(wǎng)數(shù)據(jù)包要切割為4個數(shù)據(jù)包,每個數(shù)據(jù)包包含了以太網(wǎng)頭、ip頭和切割后的ip數(shù)據(jù)包,4個數(shù)據(jù)包的大小分別是1500,1500,1500,560。ip頭里包含了每個數(shù)據(jù)包的序號。如圖:
這4個以太網(wǎng)數(shù)據(jù)包都會通過交換機發(fā)到你的網(wǎng)關上,然后你的路由器是可以聯(lián)通別的子網(wǎng)的,這個是時候你的路由器就會轉發(fā)到別的子網(wǎng)的可能也是某個路由器里去,然后以此類推吧,N多個路由器或者你叫網(wǎng)關也行,N多個網(wǎng)關轉發(fā)之后,就會跑到百度的某臺服務器,接收到4個以太網(wǎng)數(shù)據(jù)包。百度服務器接收到4個以太網(wǎng)數(shù)據(jù)包以后,根據(jù)ip頭的序號,把4個以太網(wǎng)數(shù)據(jù)包里的ip數(shù)據(jù)包給拼起來,就還原成一個完整的ip數(shù)據(jù)包了。接著就從ip數(shù)據(jù)包里面拿出來tcp數(shù)據(jù)包,再從tcp數(shù)據(jù)包里取出來http數(shù)據(jù)包,讀取出來http數(shù)據(jù)包里的各種協(xié)議內容,接著就是做一些處理,然后再把響應結果封裝成htp響應報文,封裝在http數(shù)據(jù)包里,再一樣的過程,封裝tcp數(shù)據(jù)包,封裝ip數(shù)據(jù)包,封裝以太網(wǎng)數(shù)據(jù)包,接著通過網(wǎng)關給發(fā)回去。如下圖: