乙個標準的 url 語法通常都建立在由 9 部分構成的通用格式上,瀏覽器會從使用者輸入的 url 字串中解析對應的內容:
://:@:;?#
複製**
其中比較重要的有:
如果上面提到的host
部分為網域名稱,則需要通過dns
對其進行解析。
查詢本地 host 檔案
使用者可以在本地的 host 檔案中指定網域名稱和 ip 位址的對應關係,所以瀏覽器會先去本地的 host 檔案中尋找是否存在對應的 ip 位址,如果存在,則向該位址傳送請求。
dns 解析
最終,我們通過 dns 解析獲得了主機的 ip 位址
三次握手的過程是老生常談了,資料比較多,這裡就不具體贅述了,只列出大致過程:
客戶端傳送syn
報文,請求建立連線
服務端傳送ack
報文和syn
報文,表示同意客戶端的建立連線請求,同時自己也請求建立連線
客戶端傳送ack
報文,表示請求已收到
使用 apr 協議定位目標位址
在乙太網中,一台主機要把資料幀傳送到同一區域網上的另一台主機時,裝置驅動程式必須知道乙太網位址才能傳送資料。而我們只知道ip位址,這時就需要採用 arp 協議將 ip 位址對映為乙太網位址。 在傳送第乙個 syn 報文時,ip 層會通過 arp 協議查詢出目標主機的 mac 位址。 (tcp/ip協議——arp詳解)在第一次握手時傳送的第乙個
syn
報文首先會通過connect()
函式到達 ip 層,之後 ip 層會通過查詢路由表獲取目標主機的 mac 位址並將其快取,然後該 mac 位址會被通過send()
函式交給網路介面進行封裝,最終將資料傳送出去。
ps:引用資料的文章非常詳細的解釋了不同情況下該過程的工作細節,建議認真閱讀一遍。
如果請求使用的是https
協議,則在建立 tcp 連線後,需要通過四次握手在其之上再建立一條加密隧道,即ssl
。
客戶端:
服務端:
客戶端:
伺服器:
四次握手通過非對稱加密的方式使客戶端和服務端獲得並持有相同的session key
,並通過該 key 值對之後的會話過程進行對稱加密。
瀏覽器使用前兩步獲得的資訊構造請求報文
,並通過第三步建立起來的 tcp 連線向服務端傳送 http 請求。 其中,請求報文
的基本格式為:
複製**
這三部分分別為起始行、首部和主體,通過瀏覽器請求發起的預設為get
請求,所以沒有主體部分。
下面展示了乙個假想的 http 報文,其中第一行為起始行,二三行為首部:
複製**服務端**即為nginx
、apache
等伺服器軟體,它們會根據配置檔案將請求對映為伺服器上具體的檔案,並根據檔案型別對其進行處理返回。
如果檔案是型別為.html
、.txt
、.xml
的靜態檔案,則只需將其內容作為響應的entity-body
直接返回給客戶端。
如果檔案型別為.php
、.jsp
、.asp
等動態檔案,則需要對其進行解析。這裡我們只講解對.php
檔案的操作,以nginx
伺服器為例。
nginx 生成響應報文,返回給客戶端。響應報文和請求報文只有起始行的語法有所不同:
複製**
客戶端傳送fin
報文,表示自己的所有資料已傳輸完畢
服務端返回ack
報文,表示請求已收到
服務端傳送fin
報文,表示自己的所有資料也都已經傳輸完畢
服務端返回ack
報文,表示請求已收到,並進入time_wait
狀態
瀏覽器會解析返回的 html / css / js 等檔案,並最終將頁面展現在使用者面前。
通過瀏覽器請求乙個網域名稱IP
瀏覽器內部都有dns客戶端,它先查詢本地dns快取中是否有該網域名稱的ip,如果有就直接去訪問該ip。如果沒有,該dns客戶端先要查詢自己主機所設定的dns伺服器,然後去該dns伺服器去查詢ip。如果該dns伺服器本地快取中有該網域名稱的a記錄 網域名稱與ip位址的對應記錄 則直接返回給瀏覽器中的d...
瀏覽器訪問乙個位址的過程
1.若dns快取中沒有相關資料,則ie瀏覽器先向dns 伺服器發出dns請求 這一過程的目的是獲取www.sina.com這個網域名稱所對應的ip位址 ie瀏覽器向本機dns模組發出dns請求,dns模組生成相關的dns報文 dns模組將生成的dns報文傳遞給傳輸層的udp協議單元 udp協議單元將...
瀏覽器訪問本地檔案
之前一直苦惱無法在瀏覽器訪問本地檔案,尤其是寫的網頁需要呼叫外部資料的時候,今天學習到可以用python很方便的解決問題 如果有python3環境,直接在對應的資料夾下執行 這裡是ubuntu環境,如果是windows應該在命令列也可以 python3 m http.server 其中 是埠號,我們...