1.若DNS緩存中沒有相關數據,則IE瀏覽器先向DNS服務器發出DNS請求:
這一過程的目的是獲取www.sina.com這個域名所對應的IP地址;
IE瀏覽器向本機DNS模塊發出DNS請求,DNS模塊生成相關的DNS報文;
DNS模塊將生成的DNS報文傳遞給傳輸層的UDP協議單元;
UDP協議單元將該數據封裝成UDP數據報,傳遞給網絡層的IP協議單元;
IP協議單元將該數據封裝成IP數據包,其中目的IP地址為DNS服務器的IP地址;
封裝好的IP數據包將傳遞給數據鏈路層的協議單元進行發送;
發送時如果ARP緩存中沒有相關數據,則發送ARP廣播請求,等待ARP回應;
得到ARP回應后,將IP地址與路由下一跳MAC地址對應的信息寫入ARP緩存表;
寫入緩存后,以路由下一跳地址填充目的MAC地址,並以數據幀形式轉發;
這個轉發過程可能會進行多次,這取決於DNS服務器在校園網中的位置;
DNS請求被發送到DNS服務器的數據鏈路層協議單元;
DNS服務器的數據鏈路層協議單元解析收到的數據幀,將其內部所含有的IP數據包傳遞給網絡層IP協議單元;
DNS服務器的IP協議單元解析收到的IP數據包,將其內部所含有的UDP數據報傳遞給傳輸層的UDP協議單元;
DNS服務器的UDP協議單元解析收到的UDP數據包,將其內部所含有的DNS報文傳遞給該服務器上的DNS服務單元;
DNS服務單元收到DNS請求,將域名解析為對應的IP地址,產生DNS回應報文;
(所有應用層報文必須通過傳輸層、網絡層和數據鏈路層,因此在下面的敘述中,我將簡化這一過程的敘述,簡化形式如下面的樣子,其中單箭頭為本機內部傳遞,雙箭頭為網絡上的發送)
DNS回應報文→UDP→IP→MAC→→請求域名解析的主機;
請求域名解析的主機收到數據幀,該數據幀→IP→UDP→DNS→IE瀏覽器;
將域名解析的結果以域名和IP地址對應的形式寫入DNS緩存表。
2.IE瀏覽器與www.sina.com.cn建立TCP連接:
IE瀏覽器向www.sina.com.cn發出TCP連接請求報文;
該請求TCP報文中的SYN標志位被設置為1,表示連接請求;
該TCP請求報文→IP(DNS)→MAC(ARP)→→校園網關→→www.sina.com.cn主機;
該TCP請求報文經過IP層時,填入的目的IP地址就是上面DNS過程獲得的IP地址;
經過數據鏈路層時,若MAC地址不明,還要進行上面所敘述的ARP過程;
www.sina.com.cn收到的數據幀→IP→TCP,TCP協議單元會回應請求應答報文;
該請求應答TCP報文中的SYN和ACK標志位均被設置為1,表示連接請求應答;
該TCP請求應答報文→IP→MAC(ARP)→→校園網關→→請求主機;
請求主機收到數據幀→IP→TCP,TCP協議單元會回應請求確認報文;
該請求應答TCP報文中的ACK標志位被設置為1,表示連接請求確認;
該TCP請求確認報文→IP→MAC(ARP)→→校園網關→→www.sina.com.cn主機;
www.sina.com.cn收到的數據幀→IP→TCP,連接建立完成;
在這個過程中,任何一個報文出錯或超時,都要進行重傳;
這個過程被稱為TCP建立連接的三次握手。
3.IE瀏覽器開始HTTP訪問過程
IE瀏覽器向www.sina.com.cn發出HTTP-GET方法報文;
該HTTP-GET方法報文→TCP→IP→MAC→→校園網關→→www.sina.com.cn主機;
www.sina.com.cn收到的數據幀→IP→TCP→HTTP,HTTP協議單元會回應HTTP協議格式封裝好的HTML超文本形式數據;
HTTP-HTML數據→TCP→IP→MAC(ARP)→→校園網關→→請求主機;
請求主機收到的數據幀→IP→TCP→HTTP→IE瀏覽器,瀏覽器會以網頁形式顯示HTML超文本,就是我們所看到的網頁。
4.斷開TCP連接
IE瀏覽器向www.sina.com.cn發出TCP連接結束請求報文;
該請求TCP報文中的FIN標志位被設置為1,表示結束請求;
該TCP結束請求報文→IP→MAC(ARP)→→校園網關→→www.sina.com.cn主機;
www.sina.com.cn收到的數據幀→IP→TCP,TCP協議單元會回應結束應答報文;
該結束應答TCP報文中的FIN和ACK標志位均被設置為1,表示結束應答;
該TCP結束應答報文→IP→MAC(ARP)→→校園網關→→請求主機;
這個過程需要雙向進行,因此www.sina.com.cn主機也會按上述流程再做一次;
整個過程被稱為TCP斷開連接的四次握手。
呵呵,好麻煩的一個過程對不對?我也寫了好長時間誒,希望對你有所幫助!
-------------------------------------------------------------
這個人很耐心,已經解釋得很詳細了。不過我是個吹毛求疵的人,非得把每個細節都弄得很清楚。其中最讓我糾結的是ip地址轉換到mac地址的過程。或許你說那不就是arp協議嗎?那你就想的簡單了點。
首先ip地址是網絡層(layer 3)的概念,mac地址是數據鏈路層(layer 2)的概念。
網絡層主要任務是路由,而數據鏈路層是提供相鄰兩個網絡實體間端到端的數據傳輸,可以理解成為局域網內兩台機器間的數據傳輸。
數據鏈路層的作用范圍是局域網,那么其mac地址肯定是局域網內某台機器的mac地址。並且arp協議的作用范圍也是局域網。但是ip數據包的目的地址未必都是局域網內的,如果不是,在局域網內進行arp廣播查詢該ip地址對應的mac地址,肯定沒有人回應,因為大家誰都不擁有這個ip地址。
於是先要知道ip地址是不是同一個局域網里的,這個不難,使用子網掩碼就可以確定。如果是同一個局域網,那么就可以arp了。那如果不是呢??
這就要靠網絡層了。到這時候我才驚訝地發現,路由表不是只在路由器上才有的(以前我可都是這么以為的),本機上照樣有,而且也有路由過程。在 windows下CMD下輸入命令“route print”,就可以看到本機上的路由表(linux下是"route")。部分路由表項如下(我機器的ip是10.77.100.113,子網掩碼是 255.255.255.0 ):
----------------------
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 10.77.100.1 10.77.100.113 10
10.77.100.0 255.255.255.0 10.77.100.113 10.77.100.113 10
----------------------
最后一條其實意思就是,如果ip地址是同一個局域網中的地址,則直接發送到該ip地址就可以了(表中看起來是路由給自己,我估計是這個意思,linux下就是一個星號表示的,更能理解)。
中間那條其實就是默認路由路徑(因為任何一個ip地址 AND 0.0.0.0 后肯定都是 0.0.0.0 的),其意思就是,如果其他路由項都不符合,則發送到默認網關。
扯遠一點。默認情況下,windows機器不會充當路由器的功能,它不會轉發(forward)自己接受到的但是目的地址不是自己的包。但是這是可以設置的,通過開啟路由轉發功能,就能充當一個路由器了。這樣,局域網中另一台機器就可以把默認網關設置為你的ip,然后他的所有到外網的包都先交給你,然后你再路由轉發出去。貌似多次一舉,但是這樣你的機器可以控制別人的上網功能。譬如一個家里,老爸把他兒子的機器的默認網關設置為自己的機器的,當這個狡猾的老爸不想讓兒子上網的時候,就關閉自己機器的路由轉發功能,可憐的兒子就上不了網了,而且不知道為什么。-_-!!
譬如XP下可以修改注冊表項:HKEY_LOCAL_MACHINE \SYSTEM\CurrentControlSet\Services\Tcpip \Parameters 中的 IPEnableRouter=1。
順便說說命令“route -f”,它可以刪除路由表中涉及默認網關的項。我曾經使用該命令刪除掉中間那條,結果訪問外網就不行了,實際錯誤就是找不到路由項。
和同宿舍一個哥們討論該問題,當他發現“route -f”可以讓機器不能上外網時,立馬說可以用這個搞惡作劇啊,讓人上不了網,估計沒幾個人能找出問題來,只有重啟機器。我汗-_-!!
所以ip地址轉換到mac地址的過程就更清晰了:
------------------------
1、首先得到ip包需要送達的目的地址 ip-des ;
2、查路由表,根據匹配 ip-des 的路由表項得到下一跳(next hop)的中間目的地址 ip-next (可以保證 ip-next 是局域網中的地址);
3、在arp緩存中查找 ip-next 對應的mac地址,如果緩存中沒有,再到局域網中使用arp協議進行詢問;
4、得到了mac地址,一切就好辦了----將mac地址放到幀頭,發送數據。
------------------------
由此看出絕不是僅僅arp那么簡單。
幾個有用的命令(注意linux下需要root權限):
------------------------
查看本地路由表:
windows: route print
linux: route
查看本地arp緩存:
windows: arp -a
linux: arp
------------------------