宏觀
1、客戶端瀏覽器通過DNS解析到www.baidu.com的IP地址202.108.22.5,通過這個IP地址找到客戶端到服務器的路徑。客戶端瀏覽器發起一個HTTP會話到202.108.22.5,然后通過TCP進行封裝數據包,輸入到網絡層。
2、在客戶端的傳輸層,把HTTP會話請求分成報文段,添加源和目的端口,如服務器使用80端口監聽客戶端的請求,客戶端由系統隨機選擇一個端口如5000,與服務器進行交換,服務器把相應的請求返回給客戶端的5000端口。然后使用IP層的IP地址查找目的端。 (建立tcp連接)
3、客戶端的網絡層不用關心應用層或者傳輸層的東西,主要做的是通過查找路由表確定如何到達服務器,期間可能經過多個路由器,這些都是由路由器來完成的工作,我不作過多的描述,無非就是通過查找路由表決定通過那個路徑到達服務器。 (IP的重要功能是尋址和路由)
4、客戶端的鏈路層,包通過鏈路層發送到路由器,通過鄰居協議查找給定IP地址的MAC地址,然后發送ARP請求查找目的地址,如果得到回應后就可以使用ARP的請求應答交換的IP數據包現在就可以傳輸了,然后發送IP數據包到達服務器的地址。(IP地址轉為MAC)
事件順序
由域名→IP 地址
尋找 IP 地址的過程依次經過了瀏覽器緩存、系統緩存、hosts文件、路由器緩存、 遞歸搜索根域名服務器。
建立 TCP/IP 連接(三次握手具體過程)
由瀏覽器發送一個 HTTP 請求
經過路由器的轉發,通過服務器的防火牆,該 HTTP 請求到達了服務器(下面的過程其實就是這一步)
服務器處理該 HTTP 請求,返回一個 HTML 文件
瀏覽器解析該 HTML 文件,並且顯示在瀏覽器端
這里需要注意:
o HTTP 協議是一種基於 TCP/IP 的應用層協議,進行 HTTP 數據請求必須先建立 TCP/IP 連接
o 可以這樣理解:HTTP 是轎車,提供了封裝或者顯示數據的具體形式;Socket 是發動機,提供了網絡通信的能力。
o 兩個計算機之間的交流無非是兩個端口之間的數據通信 , 具體的數據會以什么樣的形式展現是以不同的應用層協議來定義的。
參考鏈接:瀏覽器輸入一個網址(www.baidu.com)后執行的全過程
微觀
首先應該知道網絡七層模型大概都是怎么回事了,然后四層模型其實就是會話層、表示層和應用層,合並為了一個應用層,同時沒把物理層算在內。
並且我們也大概知道每一層的協議和作用,網絡通信的時候都是怎么回事了,現在我們來看看假設通過瀏覽器發送一個請求,你訪問到那個網站對應的機器,然后人家再給你一個響應的全過程。
現在我們先假設,我們給電腦設置了幾個東西:
ip地址:192.168.31.37
子網掩碼:255.255.255.0
網關地址:192.168.31.1
DNS地址:8.8.8.8
這時,我們打開一個瀏覽器,請求www.baidu.com地址,這個時候找DNS服務器,DNS服務器解析域名之后,返回一個ip地址,比如172.194.26.108。
接着會判斷兩個ip地址是不是一個子網的,用子網掩碼255.255.255.0,對兩個ip地址做與運算,拿到192.168.31.0和172.194.26.0,明顯不是一個子網的。
如圖:
那就得發送一個數據包給網關,其實你就認為是我們的路由器吧,就是192.168.31.1,而且我們是可以拿到網關ip地址的mac地址的,現在我們從應用層出發,通過瀏覽器訪問一個網站,是走應用層的http協議的,並且要把瀏覽器發出的請求打包成數據包,要把哪些東西給放到數據包中去呢?
先介紹一下http協議 :
這就構成了一個http請求報文瀏覽器請求一個地址,先按照應用層的http協議,封裝一個應用層數據包,數據包里就放了http請求報文,這個時候會將這個http請求報文打包成一個數據包,僅僅只是數據包的數據部分,此時是數據包是沒有頭的。上面根據http協議搞一個http請求報文,然后搞一個數據包出來,就是網絡模型中到的應用層干的事兒了。
接着就是跑傳輸層來了,這個層是tcp協議,這個tcp協議會讓你設置端口,發送方的端口隨機選一個,接收方的端口一般是默認的80端口。
這個時候,會把應用層數據包給封裝到tcp數據包中去,而且會加一個tcp頭,這個tcp數據包是對應一個tcp頭的,這個tcp頭里就放了端口號信息。如圖:
接着跑到網絡層來了,走ip協議,這個時候會把tcp頭和tcp數據包,放到ip數據包里去,然后再搞一個ip頭,ip頭里本機和目標機器的ip地址。
這里本機ip地址是192.168.31.37,
目標機器是172.194.26.108。
因為,通過ip協議,可以判斷說,兩個ip地址不是在一個子網內的,所以此時只能將數據包先通過以太網協議廣播到網關上去,通過網關再給他發送出去,如圖:
這4個以太網數據包都會通過交換機發到你的網關上,然后你的路由器是可以聯通別的子網的,這個是時候你的路由器就會轉發到別的子網的可能也是某個路由器里去,然后以此類推吧,N多個路由器或者你叫網關也行,N多個網關轉發之后,就會跑到百度的某台服務器,接收到4個以太網數據包。
百度服務器接收到4個以太網數據包以后,根據ip頭的序號,把4個以太網數據包里的ip數據包給拼起來,就還原成一個完整的ip數據包了。接着就從ip數據包里面拿出來tcp數據包,再從tcp數據包里取出來http數據包,讀取出來http數據包里的各種協議內容,接着就是做一些處理,然后再把響應結果封裝成http響應報文,封裝在http數據包里,再一樣的過程,封裝tcp數據包,封裝ip數據包,封裝以太網數據包,接着通過網關給發回去。