引
打開瀏覽器锄开,在地址欄輸入URL,回車称诗,出現(xiàn)網(wǎng)站內容萍悴。這是我們幾乎每天都在做的事,那這個過程中到底是什么原理呢寓免?HTTP癣诱、TCP、DNS袜香、IP這些耳熟能詳?shù)拿~都在什么時候起著什么作用呢撕予?在這里整體梳理一遍。
整個過程基本分做下面幾個部分:
- 1蜈首、域名解析成IP地址实抡;
- 2、與目的主機進行TCP連接(三次握手)欢策;
- 3吆寨、發(fā)送與收取數(shù)據(jù);
- 4踩寇、與目的主機斷開TCP連接(四次揮手)啄清;
下面分別進行詳細說明。
域名解析成IP地址
首先說什么是域名解析俺孙?
我們在瀏覽器地址欄中輸入的都是類似“www.baidu.com”辣卒、“www.qq.com”等等容易記憶的英文域名掷贾,但這些字母你直接交給整個網(wǎng)絡線路去尋找目的主機找得到嗎?找不到荣茫,因為每個主機在網(wǎng)絡中的位置都是以IP標識的想帅,IP才是主機在網(wǎng)絡中的位置,域名只是為了方便用戶記憶而已啡莉,這就要求瀏覽器能夠識別域名并且將其轉化為對應的IP地址港准。
所以瀏覽器會有一個DNS緩存,其中記錄了一些域名與IP的對應關系票罐,供瀏覽器快速查找需要的IP叉趣。但是這個DNS緩存不可能存下所有的域名-IP地址泞边,何況IP地址有時候還會變化该押,因此當在DNS緩存中沒有找到的時候,就要先向DNS服務器請求域名解析阵谚,我們常聽到的DNS服務器很大的作用就是進行域名解析蚕礼。
值得一提的是,DNS域名解析時用的是UDP協(xié)議梢什。
整個域名解析的過程如下:
- 1奠蹬、瀏覽器向本機DNS模塊發(fā)出DNS請求,DNS模塊生成相關的DNS報文嗡午;
- 2囤躁、DNS模塊將生成的DNS報文傳遞給傳輸層的UDP協(xié)議單元;
- 3荔睹、UDP協(xié)議單元將該數(shù)據(jù)封裝成UDP數(shù)據(jù)報狸演,傳遞給網(wǎng)絡層的IP協(xié)議單元;
- 4僻他、IP協(xié)議單元將該數(shù)據(jù)封裝成IP數(shù)據(jù)包宵距,其目的IP地址為DNS服務器的IP地址;
- 5吨拗、封裝好的IP數(shù)據(jù)包將傳遞給數(shù)據(jù)鏈路層的協(xié)議單元進行發(fā)送满哪;
- 6、發(fā)送時在ARP緩存中查詢相關數(shù)據(jù)劝篷,如果沒有哨鸭,就發(fā)送ARP廣播(包含待查詢的IP地址,收到廣播的主機檢查自己的IP娇妓,符合條件的主機將含有自己MAC地址的ARP包發(fā)送給ARP廣播的主機)請求兔跌,等待ARP回應;
- 7峡蟋、得到ARP回應后坟桅,將IP地址與路由的下一跳MAC地址對應的信息寫入ARP緩存表华望;
- 8、寫入緩存后仅乓,以路由下一跳的地址填充目的MAC地址赖舟,以數(shù)據(jù)幀形式轉發(fā);
- 9夸楣、轉發(fā)可能進行多次宾抓;
- 10、DNS請求到達DNS服務器的數(shù)據(jù)鏈路層協(xié)議單元豫喧;
- 11石洗、DNS服務器的數(shù)據(jù)鏈路層協(xié)議單元解析數(shù)據(jù)幀,將內部的IP數(shù)據(jù)包傳遞給網(wǎng)絡層IP協(xié)議單元紧显;
- 12讲衫、DNS服務器的IP協(xié)議單元解析IP數(shù)據(jù)包,將內部的UDP數(shù)據(jù)報傳遞給傳輸層UDP協(xié)議單元孵班;
- 13涉兽、DNS服務器的UDP協(xié)議單元解析收到的UDP數(shù)據(jù)報,將內部的DNS報文傳遞給DNS服務單元篙程;
- 14枷畏、DNS服務單元將域名解析成對應IP地址,產生DNS回應報文虱饿;
- 15拥诡、DNS回應報文->UDP->IP->MAC->我的主機;
- 16氮发、我的主機收到數(shù)據(jù)幀渴肉,將數(shù)據(jù)幀->IP->UDP->瀏覽器;
- 17折柠、將域名解析結果以域名和IP地址對應的形式寫入DNS緩存表宾娜。
其中提到了一個ARP的概念,類似于DNS將域名翻譯成IP扇售,ARP則是將IP翻譯成MAC地址前塔,我們知道了IP后晃虫,需要通過主機的MAC地址來更具體的找到主機浓镜。同樣的也有一個ARP緩存,其中存儲了一些IP與MAC地址的對應關系滑废,如果緩存中找不到困乒,就會進行廣播來查找MAC地址寂屏,收到廣播的主機會檢查自己的IP是否是待查找的IP,是的話就返回自己的MAC地址。
如果做開發(fā)迁霎,往往還會接觸到端口這個概念吱抚,那端口是什么呢?這里是指TCP/IP協(xié)議中的端口考廉,端口號的范圍從0到65535秘豹,比如用于瀏覽網(wǎng)頁服務的80端口,用于FTP服務的21端口等等昌粤,都有一些固定的端口號既绕,被占用后就不能被別的服務拿來傳輸數(shù)據(jù)了。
與目的主機進行TCP連接(三次握手)
得到域名對應的IP地址后涮坐,也就表示可以將數(shù)據(jù)送達目的主機了凄贩,這時候才開始我們常說的三次握手建立連接。
HTTP的請求時使用TCP進行傳輸?shù)母ざ铮梢员WC可靠傳輸疲扎,并且有序,而TCP是有連接的傳輸廓译,也就是在傳輸數(shù)據(jù)之前评肆,會建立我的主機與目的主機之間的連接债查,然后才能傳輸數(shù)據(jù)非区,傳輸完成后,還有斷開連接盹廷。這也就是TCP的三次握手和四次揮手征绸,大致過程如下圖所示:
具體的三次握手建立連接的過程如下表述,其中數(shù)據(jù)包的傳輸過程類似上文請求DNS服務器時的過程俄占,就簡單的表示一下:
- 1管怠、向目的主機發(fā)送TCP連接請求報文;
- 2缸榄、該TCP報文中SYN標志位設為1渤弛,表示連接請求;
- 3甚带、該TCP報文通過IP(DNS)->MAC(ARP)->網(wǎng)關->目的主機她肯;
- 4、目的主機收到數(shù)據(jù)幀鹰贵,通過IP->TCP晴氨,TCP協(xié)議單元回應請求應答報文;
- 5碉输、該報文中SYN和ACK標志設為1籽前,表示連接請求應答;
- 6、該TCP報文通過IP(DNS)->MAC(ARP)->網(wǎng)關->我的主機枝哄;
- 7肄梨、我的主機收到數(shù)據(jù)幀,通過IP->TCP挠锥,TCP協(xié)議單元回應請求確認報文峭范;
- 8、該TCP報文通過IP(DNS)->MAC(ARP)->網(wǎng)關->目的主機瘪贱;
- 9纱控、目的主機收到數(shù)據(jù)幀,通過IP->TCP菜秦,連接建立完成甜害。
三次握手的過程就是一去一回一去,互相確認一下球昨,就建立連接啦尔店。這個過程中任何一個報文出錯或者超時,都要進行重傳主慰。
發(fā)送與收取數(shù)據(jù)
如上所說嚣州,只有建立連接后才能開始傳輸數(shù)據(jù),數(shù)據(jù)其實有多種傳輸方式共螺,比如分段啊分組啊分時啊等等该肴。而一個數(shù)據(jù)包的傳輸過程如下所示,以HTTP的GET方法請求為例:
- 1藐不、瀏覽器向域名發(fā)出GET方法報文匀哄;
- 2、該GET方法報文通過TCP->IP(DNS)->MAC(ARP)->網(wǎng)關->目的主機雏蛮;
- 3涎嚼、目的主機收到數(shù)據(jù)幀,通過IP->TCP->HTTP挑秉,HTTP協(xié)議單元會回應HTTP協(xié)議格式封裝好的HTML形式數(shù)據(jù)法梯;
- 4、該HTML數(shù)據(jù)通過TCP->IP(DNS)->MAC(ARP)->網(wǎng)關->我的主機犀概;
- 5立哑、我的主機收到數(shù)據(jù)幀,通過IP->TCP->HTTP->瀏覽器阱冶,瀏覽器以網(wǎng)頁形式顯示HTML內容刁憋。
其他的HTTP方法在傳輸數(shù)據(jù)時方法都類似,只是所攜帶的內容不同木蹬。
與目的主機斷開TCP連接(四次揮手)
數(shù)據(jù)傳輸完成后需要斷開連接至耻,與建立時不同若皱,斷開連接需要多一次,有四次揮手尘颓,至于為什么走触,看完過程我們再講。
這里再把圖拿過來幫助理解:
過程如下:
- 1疤苹、瀏覽器向目的主機發(fā)出TCP連接結束請求報文互广,此時進入FIN WAIT狀態(tài);
- 2卧土、該報文FIN標志位設為1惫皱,表示結束請求;
- 3尤莺、TCP結束請求報文通過IP(DNS)->MAC(ARP)->網(wǎng)關->目的主機旅敷;
- 4、目的主機收到數(shù)據(jù)幀颤霎,通過IP->TCP媳谁,TCP協(xié)議單元回應結束應答報文;
- 5友酱、當前只是進行回應晴音,因為目的主機可能還有數(shù)據(jù)要傳,并不急著斷開連接缔杉;
- 6锤躁、該報文中ACK標志位設為1,表示收到結束請求壮吩;
- 7进苍、目的數(shù)據(jù)發(fā)送完所有數(shù)據(jù)后加缘,向我的主機發(fā)出TCP連接結束請求報文鸭叙;
- 8、該報文FIN標志位設為1拣宏,表示結束請求沈贝;
- 9、TCP結束請求報文通過IP(DNS)->MAC(ARP)->網(wǎng)關->我的主機勋乾;
- 10宋下、我的主機收到數(shù)據(jù)幀,通過IP->TCP辑莫,TCP協(xié)議單元回應結束應答報文学歧,此時進入TIME WAIT狀態(tài),因為不相信網(wǎng)絡是可靠的各吨,如果目的主機沒收到還可以重發(fā)枝笨;
- 11、該報文中的FIN標志位均設為1,表示結束應答横浑;
- 12剔桨、該TCP回應報文通過IP(DNS)->MAC(ARP)->網(wǎng)關->目的主機;
- 13徙融、目的主機關閉連接洒缀;
- 14、TIME WAIT等待結束后欺冀,沒有收到回復树绩,說明目的正常關閉了,我的主機也關閉連接隐轩。
這里的過程是以我的主機主動發(fā)起結束請求開始的葱峡,實際上也可以由目的主機主動發(fā)起,那么過程就會跟上面相反龙助,但細節(jié)差不多砰奕。
FIN_WAIT狀態(tài)是主動發(fā)起請求時等待確認信息,而TIME_WAIT狀態(tài)是收到結束請求后發(fā)送確認信息后等待看是否需要重發(fā)提鸟。
現(xiàn)在來說說為什么斷開連接時需要四次揮手呢军援?因為建立連接時目的主機可以直接發(fā)送SYN(同步)+ACK(應答)報文。而當斷開時称勋,目的主機收到FIN后可能還有數(shù)據(jù)要發(fā)胸哥,并不一定直接斷開,所以先發(fā)送一次應答赡鲜,告知我的主機收到了請求空厌,等確認所有數(shù)據(jù)都發(fā)完了,再發(fā)送FIN银酬,同時等待我的主機應答嘲更,這里的FIN和ACK就不能一起發(fā)送,所以需要四次揩瞪。
結
以上就是URL訪問網(wǎng)站時的網(wǎng)絡傳輸全過程赋朦,歸納起來就是:
首先要通過域名找到IP,如果緩存里沒有就要請求DNS服務器李破;得到IP后開始于目的主機進行三次握手來建立TCP連接宠哄;連接建立后進行HTTP訪問,傳輸并獲取網(wǎng)頁內容嗤攻;傳輸完后與目的主機四次揮手來斷開TCP連接毛嫉。