輸入一個URL后發生了什么?
- 1.DNS應用層協議決議域名
- 2.傳輸層TCP建立連接
- 3.應用層客戶端發送HTTP請求
- 4.網路層
- 5.資料鏈路層
- 6.服務器處理請求
- 7.關閉TCP連接
- 8.瀏覽器決議HTML,瀏覽器布局渲染
1.DNS應用層協議決議域名
網路的傳輸是靠ip地址,而我們輸入的一般是域名如www.baidu.com,所以我們需要用DNS把域名轉換為對應的ip地址,
客戶端先檢查本地hosts是否有對應的IP地址,若找到則回傳回應的IP地址,若沒找到則請求上級DNS服務器,直至找到或到根節點,
2.傳輸層TCP建立連接
“三次握手”的程序是,發送端先發送一個帶有SYN(synchronize)標志的資料包給接收端,在一定的延遲時間內等待接收的回復,接收端收到資料包后,傳回一個帶有SYN/ACK標志的資料包以示傳達確認資訊,接收方收到后再發送一個帶有ACK標志的資料包給接收端以示握手成功,在這個程序中,如果發送端在規定延遲時間內沒有收到回復則默認接收方沒有收到請求,而再次發送,直到收到回復為止,
3.應用層客戶端發送HTTP請求
Http請求報文結構
http報文結構由請求行,請求頭,空行、請求正文組成(Get請求,沒有請求正文)
請求行:請求方法、url、版本號
請求頭:Host:接收請求的服務器地址,可以是ip也可以是埠號
User-Agent:發送請求的應用程式名稱
Connection:指定與連接相關的屬性,Connection:Keep-Alive
Accept-Charset:指定可接收的編碼格式
Accept-Encoding:指定可接收的資料壓縮格式
Accept-Language:指定可以接收的語言
可能會有Cookie,保存用戶的登錄資訊,在服務器回應時會在Cookie中存放sessionid來標識這個用戶,
空行:表示請求頭結束
請求正文:可選,get就沒有請求正文
4.網路層

整個跨設備資料傳輸程序如下:
A發出目的地為C的IP資料報,查詢本地路由表發現下一跳為E
A將資料報發送給E
E查詢本地路由表發現下一跳為F,將資料報發送給F
F查詢本地路由表發現目的地C,是和自己直接連接的,然后將資料報發送給C
ip資料包會通過路由表來規劃一系列到達目標ip的路線,IP資料包的傳輸程序也和問路一樣:
當IP資料包, 到達路由器時, 路由器會先查看目的IP;
路由器決定這個資料包是能直接發送給目標主機, 還是需要發送給下一個路由器;
依次反復, 一直到達目標IP地址,
如何判斷要轉發給哪個路由器?
每個路由器都維護一個路由表,會根據目的ip查詢路由表,如果查到了就從指定的網路介面進行發送(路由器上有很多網線介面);如果沒找到,就從默認的WAN口轉發給下一個路由器,
5.資料鏈路層
下邊結合資料鏈路層和網路層,看整個程序:
第一步:
A發出目的地為C的IP資料報,查詢路由表發現下一跳為E
A將IP資料報交給資料鏈路層,并告知目的MAC地址是E
資料鏈路層填充源MAC地址A和目的MAC地址E
資料鏈路層通過物理層將資料發送給E
第二步:
E的資料鏈路層接收到資料幀,把資料幀傳輸給網路層
E查詢路由表,發現下一跳為F
E把資料交給資料鏈路層并告知目的MAC地址為F
E的資料鏈路層封裝資料幀并發送(此時源MAC地址和目的MAC地址就會發生變化,源MAC地址為E,目的MAC地址為F)
第三步:
F的資料鏈路層接收到資料幀,把資料幀交給網路層
F查詢路由表,發現下一跳為C
F把資料交給資料鏈路層,并告知目的MAC地址為C
F的資料鏈路層封裝資料幀并發送
根據網路層可知下一個路由器的IP地址,ARP協議可以將IP地址決議成對應的MAC地址,當通信的雙方不在同一個局域網時,需要多次中轉才能到達最終的目標,在中轉的程序中需要通過下一個中轉站的MAC地址來搜索下一個中轉目標,
6.服務器處理請求
服務接收到客戶端發送的HTTP請求后,查找客戶端請求的資源,并回傳回應,
Http回應報文結構
http回應報文由狀態行、回應頭、空行、回應正文四部分組成
狀態行:協議版本、狀態碼、狀態描述,之間用空格分開
回應頭:Server:服務器應用程式軟體的名稱和版本號
Content-Type:相應正文的型別(是圖片還是二進制)
Content-Length:相應正文的長度
Content-Charset:相應正文的使用編碼
Content-Encoding:相應正文使用的資料壓縮格式
Content-Language:相應正文使用的語言
空行:表示回應頭結束
回應正文
7.關閉TCP連接

客戶端主動呼叫close,向服務器發送結束報文段FIN,服務器回傳確認報文段ACK,當服務器處理完之前的資料后呼叫close,發送結束報文段FIN,客戶端收到并回傳ACK,服務器收到ACK后徹底關閉連接,
客戶端的記時等待TIME_WAIT 是為了防止ACK丟包,
8.瀏覽器決議HTML,瀏覽器布局渲染
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292456.html
標籤:其他
上一篇:LabVIEW條形碼識別
