HTML前端连接go语言后段,一次完整的浏览器请求响应过程-Go语言中文社区
寫在前面
本篇博客旨在理解在瀏覽器中輸入url地址后,瀏覽器和服務(wù)器之間都干了些什么。
整個(gè)流程如下:
域名解析,獲取IP地址
建立TCP連接,瀏覽器發(fā)送html請(qǐng)求
服務(wù)器web相應(yīng),發(fā)回html響應(yīng)
釋放TCP連接,瀏覽器解析html,渲染呈現(xiàn)頁面
域名解析,獲取IP地址
輸入網(wǎng)址后,瀏覽器會(huì)根據(jù)域名獲取IP地址。怎么獲取IP地址呢?
瀏覽器要首先獲取DNS。那什么是DNS呢?
DNS(Domain Name System)即網(wǎng)絡(luò)名稱系統(tǒng),它是一個(gè)將域名和IP地址相互映射的分布式數(shù)據(jù)庫。簡(jiǎn)單地說,DNS就是一種域名和IP地址查對(duì)表,通過搜尋DNS法則,獲得當(dāng)前域名對(duì)應(yīng)的IP地址,反之亦然。
瀏覽器查詢DNS緩存的方式采用遞進(jìn)式查找,即
瀏覽器緩存–>系統(tǒng)緩存–>路由器緩存–>ISP DNS緩存
建立TCP連接,瀏覽器發(fā)送html請(qǐng)求
瀏覽器通過DNS查找到url對(duì)應(yīng)的ip地址之后,通過握手協(xié)議與服務(wù)器建立TCP連接,隨后向服務(wù)器發(fā)送http請(qǐng)求。
建立TCP連接
socket
socket是對(duì)TCP/IP協(xié)議的封裝,本身不是一個(gè)協(xié)議,而是一個(gè)調(diào)用接口(API),是對(duì)TCP/IP協(xié)議的抽象,提供了方便的基本函數(shù)接口。
socket建立連接
建立socket連接至少需要一對(duì)*套接字,其中一個(gè)運(yùn)行在客戶端,稱為ClientSocket。另一個(gè)運(yùn)行在服務(wù)器端,稱為ServerSocket。
套接字連接過程如下:
1. 服務(wù)器監(jiān)聽:服務(wù)器端處于實(shí)時(shí)監(jiān)控狀態(tài),等待客戶端連接請(qǐng)求。
2. 客戶端請(qǐng)求:客戶端套接字提出連接請(qǐng)求,提供要連接的服務(wù)器套接字的地址和端口號(hào)。
3. 連接確認(rèn):當(dāng)服務(wù)器監(jiān)聽到客戶端請(qǐng)求后,就建立一個(gè)新的線程,把服務(wù)器端套接字的描述發(fā)送給客戶端,等待客戶端確認(rèn)。建立連接后,服務(wù)器繼續(xù)保持監(jiān)聽狀態(tài),等待接受其他客戶端套接字請(qǐng)求。
請(qǐng)求報(bào)文
一個(gè)http請(qǐng)求報(bào)文由請(qǐng)求行< request-line >、請(qǐng)求頭部< headers >、空行< blank-line >、請(qǐng)求數(shù)據(jù)< request-body >4個(gè)部分組成。下圖是請(qǐng)求報(bào)文的一般格式。
請(qǐng)求行
請(qǐng)求行由請(qǐng)求方法字段、URL字段、HTTP協(xié)議版本三個(gè)字段組成,用空格分開。例如
GET /index.html HTTP/1.1
#常見的請(qǐng)求方法除了GET還有POST,兩者區(qū)別是前者將數(shù)據(jù)存放在url中并以?間隔,后者將數(shù)據(jù)封裝在HTTP請(qǐng)求數(shù)據(jù)中,以名稱/值的形式出現(xiàn)。
請(qǐng)求頭部
請(qǐng)求頭部通知服務(wù)器有關(guān)客戶端請(qǐng)求的信息,由關(guān)鍵字/值對(duì)組成,每行一對(duì),關(guān)鍵字和值之間用:分隔。
空行
最后一個(gè)請(qǐng)求頭部之后需要一個(gè)空行,發(fā)送回車符和換行符,通知服務(wù)器以下不再有請(qǐng)求頭部。
請(qǐng)求數(shù)據(jù)
請(qǐng)求數(shù)據(jù)不用于GET方法 ,而用于POST方法中。
服務(wù)器web相應(yīng),發(fā)回html響應(yīng)
響應(yīng)報(bào)文
一個(gè)http響應(yīng)報(bào)文由狀態(tài)行< status-line >、響應(yīng)頭部< headers >、空行< blank-line >和響應(yīng)數(shù)據(jù)< response-body >4個(gè)部分組成,響應(yīng)報(bào)文的一般格式如下圖:
狀態(tài)行
狀態(tài)行由HTTP協(xié)議版本、服務(wù)器返回的響應(yīng)狀態(tài)碼以及對(duì)應(yīng)的文本描述組成。
狀態(tài)碼由三位數(shù)字組成,第一位定義了響應(yīng)的類別。
1xx:信息性狀態(tài)碼,表示服務(wù)器已接收了客戶端請(qǐng)求,客戶端可繼續(xù)發(fā)送請(qǐng)求。
2xx:成功狀態(tài)碼,表示服務(wù)器已成功接收到請(qǐng)求并進(jìn)行處理。
3xx:重定向狀態(tài)碼,表示服務(wù)器要求客戶端重定向。
4xx:客戶端錯(cuò)誤狀態(tài)碼,表示客戶端的請(qǐng)求有非法內(nèi)容。
5xx:服務(wù)器錯(cuò)誤狀態(tài)碼,表示服務(wù)器未能正常處理客戶端的請(qǐng)求而出現(xiàn)意外錯(cuò)誤。
響應(yīng)頭部
語法規(guī)則與請(qǐng)求頭部相同,略。
空行
略
響應(yīng)數(shù)據(jù)
服務(wù)器返回給客戶端的文本信息。
釋放TCP連接,瀏覽器解析html,渲染呈現(xiàn)頁面
略。
參考文獻(xiàn)
總結(jié)
以上是生活随笔為你收集整理的HTML前端连接go语言后段,一次完整的浏览器请求响应过程-Go语言中文社区的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为防火墙做单臂路由_华为单臂路由配置详
- 下一篇: HTML 模态框