{eval=Array;=+count(Array);}
謝邀~
我們打開瀏覽器,在地址欄輸入www.wukong.com,幾秒后瀏覽器打開悟空問答的頁面,那么這幾秒鐘內(nèi)發(fā)生了哪些事情,我就帶大家一起看看完整的流程:
瀏覽器首先會對輸入的URL進行驗證,如果不合法的時候,那么會把輸入的文字傳給默認的搜索引擎,比如你只在地址欄輸入“悟空問答”幾個字。
如果URL通過驗證,那么可以解析得到協(xié)議(http或者https)、域名(wukong)、資源(首頁)等信息。
瀏覽器會先檢查域名信息是否在緩存中。
再檢查域名是否在本地的Hosts文件中。
如果還不在,那么瀏覽器會向DNS服務(wù)器發(fā)送一個查詢請求,獲得目標服務(wù)器的IP地址。
這時候瀏覽器獲得了目標服務(wù)器的IP(DNS返回)、端口(URL中包含,沒有就使用默認),瀏覽器會調(diào)用庫函數(shù)socket,生成一個TCP流套接字,也就是完成了TCP的封包。
TCP封包完成之后,就可以傳輸了,在完成“你瞅啥”,“瞅你咋地”,“來,過來嘮嘮”一系列操作之后,瀏覽器和服務(wù)器就完成了TCP的三次握手,建立了連接,后面就可以請求服務(wù)器資源了。
HTTP有很多請求方法,比如:GET/POST/PUT/DELETE等等,我們?yōu)g覽器輸入URL這種,是GET方法。
服務(wù)器接收到GET請求,服務(wù)器根據(jù)請求信息,獲得相應(yīng)的相應(yīng)內(nèi)容。例如我們輸入的是:www.wukong.com,那么意味著訪問首頁文件。
瀏覽器從服務(wù)器拿到了想要訪問的資源,大多數(shù)時候,這個資源就是HTML頁面,當然也可能是一個其他類型的文件。
瀏覽器先對HTML文檔進行解析,生成解析樹(以DOM元素為節(jié)點的樹)。
加載頁面的外部資源,比如JS、CSS、圖片。
遍歷DOM樹,并計算每個節(jié)點的樣式,最終完成渲染,變成我們看到的頁面。
這次請求響應(yīng)之后,會斷開連接,就這樣,完成了一次HTTP的請求。
“我是喲喲吼說科技,專注于數(shù)據(jù)網(wǎng)絡(luò)的回答,歡迎大家與我交流數(shù)據(jù)網(wǎng)絡(luò)的問題”
如題,一個完整的HTTP過程是怎樣的?
一個完整的HTTP過程包括建立連接、數(shù)據(jù)傳輸、斷開連接等七個步驟。
下面喲喲來詳細介紹一下每一步:
HTTP協(xié)議是基于TCP協(xié)議來實現(xiàn)的,因此首先就是要通過TCP三次握手與服務(wù)器端建立連接,一般HTTP默認的端口號為80;
在與服務(wù)器建立連接后,Web瀏覽器會想服務(wù)器發(fā)送請求命令
在瀏覽器發(fā)送請求命令后,還會發(fā)送一些其它信息,最后以一行空白內(nèi)容告知服務(wù)器已經(jīng)完成頭信息的發(fā)送;
在收到瀏覽器發(fā)送的請求后,服務(wù)器會對其進行回應(yīng),應(yīng)答的第一部分是協(xié)議的版本號和應(yīng)答狀態(tài)碼;
與瀏覽器端同理,服務(wù)器端也會將自身的信息發(fā)送一份至瀏覽器;
在完成所有應(yīng)答后,會以Content-Type應(yīng)答頭信息所描述的格式發(fā)送用戶所需求的數(shù)據(jù)信息;
在完成此次數(shù)據(jù)通信后,服務(wù)器會通過TCP四次揮手主動斷開連接。但若此次連接為長連接,那么瀏覽器或服務(wù)器的頭信息會加入keep-alive的信息,會保持此連接狀態(tài),在有其它數(shù)據(jù)發(fā)送時,可以節(jié)省建立連接的時間;
歡迎大家多多關(guān)注我,在下方評論區(qū)說出自己的見解。
前言
今天我們來徹底聊聊,什么是TCP/IP、http、socket、長連接、短連接
TCP/IP是協(xié)議組,分為三個層次:
在網(wǎng)絡(luò)層有:
在傳輸層中有:
在應(yīng)用層有:
TCP包括:
UDP包括:
流程:連接->傳輸數(shù)據(jù)->關(guān)閉連接
HTTP是無狀態(tài)的,瀏覽器和服務(wù)器每進行一次HTTP操作,就建立一次連接,但任務(wù)結(jié)束就中斷連接。
也可以這樣說:短連接是指SOCKET連接后發(fā)送后接收完數(shù)據(jù)后馬上斷開連接。
流程:連接 -> 傳輸數(shù)據(jù) -> 保持連接 -> 傳輸數(shù)據(jù) -> 。。。-> 關(guān)閉連接。
長連接指建立SOCKET連接后不管是否使用都保持連接,但安全性較差。
HTTP也可以建立長連接的,使用Connection:keep-alive,HTTP 1.1默認進行長連接。
HTTP1.1 和 HTTP1.0 相比較而言,最大的區(qū)別就是增加了長連接支持(貌似最新的 http1.0 可以顯示的指定 keep-alive),但還是無狀態(tài)的,或者說是不可以信任的。
長連接多用于操作頻繁,點對點的通訊,而且連接數(shù)不能太多情況。
每個TCP連接都需要三步握手,這需要時間,如果每個操作都是先連接,再操作的話那么處理速度會降低很多。
所以每個操作完后都不斷開,次處理時直接發(fā)送數(shù)據(jù)包就OK了,不用建立TCP連接。
例如:數(shù)據(jù)庫的連接用長連接, 如果用短連接頻繁的通信會造成socket錯誤,而且頻繁的socket 創(chuàng)建也是對資源的浪費。
而像WEB網(wǎng)站的http服務(wù)一般都用短鏈接,因為長連接對于服務(wù)端來說會耗費一定的資源。
而像WEB網(wǎng)站成千上萬甚至上億客戶端的頻繁連接,用短連接會更省一些資源,如果用長連接,而且同時有成千上萬的用戶,如果每個用戶都占用一個連接的話,那可想而知吧。
所以并發(fā)量大,但每個用戶無需頻繁操作情況下需用短連好。
總之,長連接和短連接的選擇要視情況而定。
異步
報文發(fā)送和接收是分開的,相互獨立的,互不影響。這種方式又分兩種情況:
同步
報文發(fā)送和接收是同步進行,既報文發(fā)送后等待接收返回報文。
同步方式一般需要考慮超時問題,即報文發(fā)出去后不能無限等待,需要設(shè)定超時時間,超過該時間發(fā)送方不再等待讀返回報文,直接通知超時返回。
在長連接中一般是沒有條件能夠判斷讀寫什么時候結(jié)束,所以必須要加長度報文頭。讀函數(shù)先是讀取報文頭的長度,再根據(jù)這個長度去讀相應(yīng)長度的報文。
Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口(TCP/IP是協(xié)議,Socket是他們的具體實現(xiàn)和對外api)。
在設(shè)計模式中,Socket其實就是一個門面模式,它把復(fù)雜的TCP/IP協(xié)議族隱藏在Socket接口后面。
對用戶來說,一組簡單的接口就是全部,讓Socket去組織數(shù)據(jù),以符合指定的協(xié)議。
Socket 通信示例
主機 A 的應(yīng)用程序要能和主機 B 的應(yīng)用程序通信,必須通過 Socket 建立連接,而建立 Socket 連接必須需要底層 TCP/IP 協(xié)議來建立 TCP 連接。
建立 TCP 連接需要底層 IP 協(xié)議來尋址網(wǎng)絡(luò)中的主機。
我們知道網(wǎng)絡(luò)層使用的 IP 協(xié)議可以幫助我們根據(jù) IP 地址來找到目標主機,但是一臺主機上可能運行著多個應(yīng)用程序,如何才能與指定的應(yīng)用程序通信就要通過 TCP 或 UPD 的地址也就是端口號來指定。
這樣就可以通過一個 Socket 實例唯一代表一個主機上的一個應(yīng)用程序的通信鏈路了。
當客戶端要與服務(wù)端通信,客戶端首先要創(chuàng)建一個 Socket 實例,操作系統(tǒng)將為這個 Socket 實例分配一個沒有被使用的本地端口號,并創(chuàng)建一個包含本地和遠程地址和端口號的套接字數(shù)據(jù)結(jié)構(gòu)。
這個數(shù)據(jù)結(jié)構(gòu)將一直保存在系統(tǒng)中直到這個連接關(guān)閉。在創(chuàng)建 Socket 實例的構(gòu)造函數(shù)正確返回之前,將要進行 TCP 的三次握手協(xié)議,TCP 握手協(xié)議完成后,Socket 實例對象將創(chuàng)建完成,否則將拋出 IOException 錯誤。
與之對應(yīng)的服務(wù)端將創(chuàng)建一個 ServerSocket 實例,ServerSocket 創(chuàng)建比較簡單只要指定的端口號沒有被占用,一般實例創(chuàng)建都會成功,同時操作系統(tǒng)也會為 ServerSocket 實例創(chuàng)建一個底層數(shù)據(jù)結(jié)構(gòu),這個數(shù)據(jù)結(jié)構(gòu)中包含指定監(jiān)聽的端口號和包含監(jiān)聽地址的通配符,通常情況下都是“*”即監(jiān)聽所有地址。
之后當調(diào)用 accept() 方法時,將進入阻塞狀態(tài),等待客戶端的請求。當一個新的請求到來時,將為這個連接創(chuàng)建一個新的套接字數(shù)據(jù)結(jié)構(gòu),該套接字數(shù)據(jù)的信息包含的地址和端口信息正是請求源地址和端口。
這個新創(chuàng)建的數(shù)據(jù)結(jié)構(gòu)將會關(guān)聯(lián)到 ServerSocket 實例的一個未完成的連接數(shù)據(jù)結(jié)構(gòu)列表中,注意這時服務(wù)端與之對應(yīng)的 Socket 實例并沒有完成創(chuàng)建,而要等到與客戶端的三次握手完成后,這個服務(wù)端的 Socket 實例才會返回,并將這個 Socket 實例對應(yīng)的數(shù)據(jù)結(jié)構(gòu)從未完成列表中移到已完成列表中。所以 ServerSocket 所關(guān)聯(lián)的列表中每個數(shù)據(jù)結(jié)構(gòu),都代表與一個客戶端的建立的 TCP 連接。
Http請求的一次詳解:
客戶端輸入URL
有緩存且較新,客戶端直接讀取本地緩存進行資源展示;
有緩存但是不新,準備http請求包,發(fā)送至服務(wù)端進行緩存校驗;
備注:http1.0中Expire、http1.1中是Cache-Control根據(jù)發(fā)起http請求:
請求報文包含:
a) 請求行
用來說明請求類型(getpostdelete等)、要訪問的資源(URI)以及使用的HTTP版本(1.0還是1.1)
b) 首部(header)
HOST將指出請求的目的地;
User-Agent由瀏覽器來定義,自動發(fā)送;
Connection:通常設(shè)置為keep-Alive, 長連接;
其他首部包括等。
c) 空行
d) 請求實體
3. 提取請求首部HOST通過DNS域名解析獲取服務(wù)IP(DNS緩存遞歸等)
4. 通過IP與默認端口創(chuàng)建TCP連接,進行http請求報文數(shù)據(jù)發(fā)送,其中重點就三次握手進行描述:
客戶端向服務(wù)端發(fā)送syn=1,seq=client請求的ID;
服務(wù)端向客戶端發(fā)送syn=1,seq=服務(wù)端請求的ID,ack=客戶端請求的ID+1;
客戶端向服務(wù)端發(fā)送syn=0,seq=客戶端請求的ID+1,ack=服務(wù)端請求的ID+1,datadata…
5. 服務(wù)端程序接受請求,定向到請求路徑處理請求:
服務(wù)器對請求報文進行解析,并獲取請求的資源及請求方法等相關(guān)信息,根據(jù)方法,資源,首部和可選的主體部分對請求進行處理
元數(shù)據(jù):請求報文首部
<method> <URL> <VERSION>
HEADERS格式name:value
<request body>
示例:
Host: www.chuyuni.cn 請求的主機名稱
Server: Apache/2.4.7
HTTP常用請求方式:MethodGET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS
6.訪問資源:
服務(wù)器獲取請求報文中請求的資源web服務(wù)器,即存放了web資源的服務(wù)器,負責向請求者提供對方請求的靜態(tài)資源,或動態(tài)運行后生成的資源
資源放置于本地文件系統(tǒng)特定的路徑:DocRoot
DocRoot → /var/www/html
/var/www/html/images/logo.jpg
http://www.magedu.com/images/logo.jpg
web服務(wù)器資源路徑映射方式:
(a) docroot (b) alias
(c) 虛擬主機docroot(d) 用戶家目錄docroot
7. 返回處理結(jié)果,準備http響應(yīng):
響應(yīng)報文包含:
a) 狀態(tài)行:http版本(1.1或者1.0),狀態(tài)碼
200:請求正常處理
304:返回上次請求資源未作改動,驗證瀏覽器的緩存機制
400:請求參數(shù)錯誤
401:客戶端無權(quán)訪問,要去輸入用戶名密碼之類的授權(quán)信息
403:禁止訪問(讀寫權(quán)限等影響)
404:請求的資源不存在
500:服務(wù)內(nèi)部錯誤
502:網(wǎng)關(guān)錯誤
503:臨時過載或者維護,導(dǎo)致服務(wù)端無法正常處理請求
b) 首部
報文支持的語言編碼格式等,注意If-Modified-Since:只有當所請求的內(nèi)容在指定的日期之后又經(jīng)過修改才返回它,否則返回304“Not Modified”應(yīng)答,用于服務(wù)端緩存校驗
c) 空行
d) 響應(yīng)報文實體
8. 通過建立的tcp連接來返回相關(guān)的http響應(yīng)報文及http狀態(tài)信息,然后根據(jù)實際情況看是否關(guān)閉連接(Connection的keep-alive)
9. TCP連接關(guān)閉經(jīng)歷4次握手
客戶端主動關(guān)閉連接放發(fā)送FIN進入FIN_WAIT1狀態(tài)
服務(wù)端發(fā)最后的data和ack客戶端接收進入CLOSEWAIT狀態(tài),客戶端進入接受ACK進入FINWAIT2狀態(tài)
服務(wù)端主動發(fā)FIN,客戶端接受FIN并發(fā)送ack進入TIMEWAIT狀態(tài)
服務(wù)器端正式關(guān)閉連接進入close狀態(tài)
10. 客戶端拿到http響應(yīng)的報文信息,經(jīng)過一系列前端處理過程最終將請求的資源進行展示。
作者:夕陽雨晴,歡迎關(guān)注我的我們:偶爾美文,主流Java,為你講述不一樣的碼農(nóng)生活。
專業(yè)問題我來回答,
所謂三次握手(Three-way Handshake),是在建立通信過程中,服務(wù)端和客戶端總共發(fā)送三次數(shù)據(jù)包。三次握手的目的是:建立TCP通信,和對方同步序列號和確認號,交換通信窗口的大小等。
1.建立TCP連接:只有當TCP建立完成后才能進行通信。
2.客戶端向服務(wù)端發(fā)起請求:該階段應(yīng)用層通過HTTP協(xié)議組裝請求包通過傳輸層網(wǎng)絡(luò)層和數(shù)據(jù)鏈路層到達服務(wù)器。
3.客戶端向服務(wù)端發(fā)送請求頭信息:在這一步客戶端將請求頭信息組裝在各類頭部字段中,進行發(fā)送。
4.服務(wù)端向客戶端發(fā)送響應(yīng):服務(wù)端接收到客戶端的請求信息后,做出響應(yīng)來客戶端。
5.服務(wù)端向客戶端發(fā)送響應(yīng)報文的頭部字段:將響應(yīng)數(shù)據(jù)包的頭部字段發(fā)送給客戶端。
6.服務(wù)端向客戶端發(fā)送響應(yīng)數(shù)據(jù):通過Body將響應(yīng)數(shù)據(jù)給客戶單,而這些數(shù)據(jù)才是客戶端要獲取的。
7.關(guān)閉通信線路:數(shù)據(jù)發(fā)送完畢后,如果是短連接將馬上關(guān)閉通信線路,如果是長連接,服務(wù)端會通過同步信息Connection:keep-alive來告訴客戶端。
以上,就是一個完整HTTP請求的流程,其主要在于TCP建聯(lián),后續(xù)都是應(yīng)用層之間的交互來通信。
感覺我的回答對你有幫助,麻煩點贊關(guān)注哈,你的關(guān)注是我繼續(xù)下去的動力對網(wǎng)絡(luò)有興趣的可以留言交流,有疑問的也可以私信,大家一起成長,一起交流,謝謝大家
謝謝邀請。
一次完整的HTTP請求過程是怎么樣的?事實上,題主的這個問題,最開始我也是抱著試一試的心態(tài)進來的,后來發(fā)現(xiàn)整個回答區(qū)基本上都是學(xué)術(shù)回答,講的通俗一點,都是專業(yè)人士在那邊玩,但是……沒幾個民眾能看得懂。就好像評論區(qū)那邊有一個回答的評論是,“在我們發(fā)計算機學(xué)術(shù)信息好像怪怪的。”
我大致把這個問題查了個遍,寫個最通俗的版本給大家看看吧。
其實HTTP請求過程,就是發(fā)送請求—響應(yīng)的過程。
今天你想起來,有事,需要找隔壁老王要個小視頻。于是,你打開了“TCP協(xié)議牌”機器,這是一臺高清組裝的移動電話機。
①TCP告訴你,電話線路連接通道正在接通……
電話接通了,在視頻上出現(xiàn)了隔壁老王那張猥瑣的笑臉。
你開始說話。
- ①你:喂,你能聽到我說話嗎?(第一次握手)
- ②隔壁老王:能能能,我能聽到,那你能聽到我的說話嗎?(第二次握手)
- ③你:哈哈,我也能聽到!那咱們開始吧!(第三次握手)
接下來,就要開始做正事了。
哎呀老王呀,我這邊需要一個小電影,你能給我發(fā)過來嗎?(客戶端發(fā)送請求信息)
2.接著,沒等老王說話,你就把需要的小電影名字、大小、我這網(wǎng)速等等信息給他發(fā)了過去(客戶端發(fā)送頭部信息),末尾還加上了一長串省略空格(以空格做結(jié)尾)。
老王皺皺眉頭。
“行吧!”(服務(wù)器端回應(yīng)請求信息)
“你是要這個小電影《XXX》,番號XXX,1GB大小,某度網(wǎng)盤是吧?行!”(服務(wù)器端回應(yīng)頭部信息)
老王動了動手指,查找了一下儲存卡目錄,翻出小電影。
“我給你發(fā)過去了!”(服務(wù)器端發(fā)送請求數(shù)據(jù))
你:哎呀哎呀,收到了!謝謝老王哈!下次請你吃飯!那我就先關(guān)閉了!(第一次揮手)
老王:最后跟你說一句,少看小電影!(第二次揮手)
老王:那我就先關(guān)閉了?(第三次揮手)
你:行,那你關(guān)閉吧!(第四次揮手)
視頻聊天結(jié)束。你隨即打開收到的抖音小視頻,美滋滋的看起成都小甜甜姐姐起來。
這件事告訴我們:
域名解析 --> 發(fā)起TCP的3次握手 --> 建立TCP連接后發(fā)起http請求 --> 服務(wù)器響應(yīng)http請求,瀏覽器得到html代碼 --> 瀏覽器解析html代碼,并請求html代碼中的資源(如js、css、圖片等) --> 瀏覽器對頁面進行渲染呈現(xiàn)給用戶
一,在瀏覽器地址欄輸入網(wǎng)址
二,解析域名,找到主機的ip地址
三,瀏覽器與主機建立TCP連接
四,瀏覽器向主機發(fā)起GET請求
五,服務(wù)器響應(yīng)請求,返回html頁面
六,瀏覽器開始顯示服務(wù)器返回的頁面,并且在顯示html頁面的時候,如果遇見css文件,js文件,圖片,就又會再次給相應(yīng)地址服務(wù)器發(fā)起請求。
一次完整的http請求過程是怎樣的?
一次完整的http請求可以說相當迷人:
從你輸入網(wǎng)址點擊回車的那一刻開始,一切就開始發(fā)生:
1、首先瀏覽器會解析你輸入的這一串字符;主要是解析協(xié)議(HTTP(s)、ftp:)、域名(www.qq.com)等;如果是合法的網(wǎng)址就繼續(xù)進行;
2、接下啦就是要根據(jù)第一步解析到的域名找到域名指向的IP我們稱之為DNS查詢。當然這也是一個相對有趣的過程,但不是問題重點,此處簡略;
3、找到服務(wù)器的IP地址后寫下來就是http請求的開始:
三次握手建立連接:
客戶端:“在嗎?”;
服務(wù)端:“在啊”;
客服端 :“那我開始連你啦”;開始發(fā)起http請求
建立連接后發(fā)生Http請求,請求內(nèi)容有:
請求行:uri和協(xié)議的版本 (如:GET /index.php HTTP/1.1 )
請求頭部:關(guān)客戶端信息及請求正文信息(長度、編碼格式等)
請求數(shù)據(jù):如:u=admin&pwd=123456 (可為空)
服務(wù)端在收到這些信息后作出相應(yīng)的回答:
狀態(tài):協(xié)議版本+狀態(tài)碼+簡要描述(如:HTTP/1.1 200 OK)
響應(yīng)頭部:Content-Type(必須有:比如Content-Type: text/html), 其他可選:Date 、server 等
響應(yīng)數(shù)據(jù):即服務(wù)器回應(yīng)客戶端的內(nèi)容
打開瀏覽器=》F12 訪問一下百度看一下這個完美的過程吧!
當然其中涉及的到東西遠不止這些,比如瀏覽器靜態(tài)文件的緩存;各個狀態(tài)碼含義;單次請求最大返回資源數(shù);請求字節(jié)長度限制等等。
此處班門弄斧,如有錯誤請批評指正。
9
回答0
回答9
回答9
回答0
回答0
回答0
回答0
回答0
回答0
回答