第一步:瀏覽器生成http請求信息(第五層)
1.分解url
當用戶輸入網址時,瀏覽器會以一定的規則分解網址,
以 http://www.cemabenteng.com/dir/index.html 為例進行分解,
http為請求的協議名稱,www.cemabenteng.com為請求的web服務器,dir/index.html為請求的資源,
(如果是靜態資源,則dir為該服務器上的目錄,index.html為該目錄上的資源,如果是動態資源,則服務器會根據請求的資源名稱動態提供資源)
2.生成http請求消息
消息格式: <方法 URI http版本>
<消息頭>
<消息體>
2.1 方法
當用戶輸入網址,或者點擊超鏈接請求服務器時,使用的是GET方法
當提交form表單時,使用form頁面設置的方法
2.2 URI
即上例中的dir/index.html
2.3 http版本
一般為1.1
2.4 消息頭
與請求相關的一些信息,例如我們熟知的cookie,User-Agent(使用的瀏覽器類型及版本)等。
2.5 消息體
消息體存放請求中攜帶的數據,因為GET方法所攜帶的數據都在URL中,因此消息體沒有內容。而POST方法所攜帶的數據就存放於此。
3.域名解析
生成消息后,瀏覽器會調用操作系統的DNS客戶端向DNS服務器查詢域名對應的IP地址。
3.1 瀏覽器將域名(即上例中的www.cemabenteng.com)發送給DNS服務器,
3.2 DNS客戶器將域名生成域名查詢消息並發送給tcpip協議驅動,
3.3 tcpip協議驅動使用網卡將消息發送給最近的DNS服務器,
3.4 最近的DNS服務器將消息發送給根服務器,然后逐級向下查詢,直到查詢到結果返回。
ps:DNS查詢使用UDP協議,只發送一個包,而由於包大小有限,只能容下13個根服務器信息,因此世界上只有13個根服務器,國內只有根服務器鏡像。
4.委托操作系統發送http請求
瀏覽器將IP地址和請求消息發送給操作系統,委托操作系統發送出http請求。
第二步:TCP模塊發送請求(第四層)
1.創建套接字
操作系統在接到請求后,首先會申請一塊用於存放一個套接字所需的內存空間,套接字是存放了一些通信相關的控制信息的集合。
然后向這個內存空間寫入一些初始狀態,並把該套接字的唯一標識告訴應用程序,即瀏覽器。
2.連接服務器
連接服務器就是通信雙方交換控制信息。操作系統首先接受瀏覽器給出的服務器地址,然后申請數據緩存空間並創建TCP頭部,通過
委托ip模塊,向服務器傳達開始通信的請求。服務器會返回連接成功的信息,之后會向套接字中寫入服務器的ip等信息,並標識狀態為已連接。
最后客戶端返回接收相應成功的信息給服務器,連接就算成功完成了。當沒有收到確認信息時,會重新發送,多次失敗后才會向外報錯。
(這就像一個快遞公司,有很復雜的機制)
3.發送數據
操作系統收到數據后會將數據存放在的發送數據緩存區中,並等待接收后續數據,只有當接收的數據達到一個網絡包的大小的時候,或者達到最大等待時間之后,
才會委托ip模塊發送出去。瀏覽器數據量小、對性能要求高,一般會設置為直接發送。一般的http請求數據用一個網絡包就夠了,但有時提交的表單數據較大時,會拆分成
多個網絡包發送。
第三步:IP模塊發送請求(第三層)
1.生成IP頭部
IP模塊在發送數據前,會生成IP頭部,再附上要發送的數據。IP頭部包含IP地址等信息。
2.生成MAC頭部
生成IP頭部后,還會在前面加上MAC頭部。它包含了MAC地址等信息。MAC地址需使用IP通過ARP協議查詢。每次轉發過程都會更換下一個網絡設備的MAC地址。
第四步:MAC模塊發送請求(第二層)
1.生成報頭
mac模塊會在網絡包的開頭加上報頭和起始幀分界符。報頭是一串固定頻率的時鍾信號,它用於確定數據每一位的讀取時機。
報頭后面是起始幀分界符,它的末尾序列比起報頭有一點變化,用來標記報頭的結束,網絡包的開始。
2.生成校驗序列
除了開頭的報頭,末尾還會加上幀校驗序列,校驗序列是通過整個包計算出來的,用於校驗包的正誤。類似身份證的校驗碼。
3.生成電信號
幀組裝完畢后,便會轉換成通用的電信號並委托PHY模塊發送。
第五步:PHY模塊發送請求(第一層)
最終網卡中的PHY模塊會將通用電信號轉換成網絡傳輸所需的格式,通過網線發送出去。經過網絡轉發后,最終到達服務器。
。。。
最后,服務器反向重復上述步驟,把電信號逐步轉換回http請求信息並進行處理。
ps:上述內容純屬博主個人理解,如有謬誤,還望指出。