HTTP請(qǐng)求和響應(yīng)
請(qǐng)求報(bào)文
- 組成:
請(qǐng)求行(request line)
請(qǐng)求頭部 ( header )
空行
請(qǐng)求數(shù)據(jù) -
請(qǐng)求報(bào)文圖request.png
- 請(qǐng)求行
請(qǐng)求行分為三個(gè)部分:請(qǐng)求方法、請(qǐng)求地址、協(xié)議版本
1、請(qǐng)求方法
根據(jù)HTTP標(biāo)準(zhǔn),HTTP請(qǐng)求可以使用多種請(qǐng)求方法。
HTTP1.0定義了三種請(qǐng)求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五種請(qǐng)求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法
方法如圖所示:request-line.jpg
2、請(qǐng)求地址
URI Uniform Resource Identifier 統(tǒng)一資源標(biāo)識(shí)符
URL Uniform Resource Locator 統(tǒng)一資源定位符
格式如下: scheme://[username:password@]HOST:port/path/to/source
http://www.baidu.com
URN Uniform Resource Name 統(tǒng)一資源名稱
URL和URN 都屬于 URI
為了方便就把URL和URI暫時(shí)都通指一個(gè)東西
URL組成:<協(xié)議>://<主機(jī)>:<端口>/<路徑>
端口和路徑有時(shí)可以省略(HTTP默認(rèn)端口號(hào)是80)
如下:request-url.png
3、協(xié)議版本
協(xié)議版本的格式為:HTTP/主版本號(hào).次版本號(hào),常用的有HTTP/1.0和HTTP/1.1 -
請(qǐng)求頭部
請(qǐng)求頭如下:
請(qǐng)求頭部為請(qǐng)求報(bào)文添加了一些附加信息,由“名:值”對(duì)組成,每行一對(duì),名和值之間使用冒號(hào)分隔。
請(qǐng)求頭主要存放客戶端想給服務(wù)端的附加信息。
request-header.jpg
字段解釋:
| 請(qǐng)求頭 | 說(shuō)明 |
|---|---|
| Host | 接受請(qǐng)求的服務(wù)器地址,可以是IP端口號(hào),也可以是域名 |
| User-Agent | 發(fā)送請(qǐng)求的應(yīng)用程序名稱,一般情況是瀏覽器,也有其他類型 |
| Accept | 就是告訴服務(wù)器端,客戶端接受那些MIME類型,服務(wù)端知道客戶端所能接收的數(shù)據(jù)類型,如text/htm |
| Accept-Language | 通知服務(wù)端可以發(fā)送的語(yǔ)言 |
| Accept-Encoding | 通知服務(wù)端可以發(fā)送的數(shù)據(jù)壓縮格式 |
| Accept-Charset | 通知服務(wù)端可以發(fā)送的編碼格式 |
| Keep-Alive | |
| Connection | 指定與連接相關(guān)的屬性,如Connection:Keep-Alive |
| cookie | 每次請(qǐng)求時(shí)都會(huì)攜帶上Cookie以方便服務(wù)器端識(shí)別是否是同一個(gè)客戶端 |
| If-Modified-Since | 是瀏覽器向服務(wù)器端詢問(wèn)某個(gè)資源文件如果自從什么時(shí)間修改過(guò),那么重新發(fā)給我,這樣就保證服務(wù)器端資源文件更新時(shí),瀏覽器再次去請(qǐng)求,而不是使用緩存中的文件 |
| Content-Length | body的長(zhǎng)度,如果body為空則該字段值為0。該字段一般在POST請(qǐng)求中才會(huì)有。 |
| Content-Type | body中的數(shù)據(jù)類型,如application/json; charset=UTF-8 |
什么是MIME(多用途互聯(lián)網(wǎng)郵件擴(kuò)展)?
是一個(gè)互聯(lián)網(wǎng)標(biāo)準(zhǔn),遵循以下格式:major/minor 主類型/次類型,例如:image/jpg、image/gif、text/html
注意:
請(qǐng)求頭部的最后會(huì)有一個(gè)空行,表示請(qǐng)求頭部的結(jié)束,接下來(lái)為請(qǐng)求數(shù)據(jù)
-
請(qǐng)求數(shù)據(jù)
如圖為POST方法的請(qǐng)求報(bào)文
Get請(qǐng)求就沒(méi)有請(qǐng)求數(shù)據(jù)
request-post.jpg
HTTP響應(yīng)報(bào)文
-
組成
如圖所示:
狀態(tài)行
響應(yīng)頭部
空行
響應(yīng)正文
response.png
1、狀態(tài)行
包括:協(xié)議版本,狀態(tài)碼,狀態(tài)碼描述
其中協(xié)議版本和請(qǐng)求報(bào)文一致,狀態(tài)碼為3位數(shù)字,如下:
1xx:指示信息--表示請(qǐng)求已接收,繼續(xù)處理。
2xx:成功--表示請(qǐng)求已被成功接收、理解、接受
3xx:重定向--要完成請(qǐng)求必須進(jìn)行更進(jìn)一步的操作。
4xx:客戶端錯(cuò)誤--請(qǐng)求有語(yǔ)法錯(cuò)誤或請(qǐng)求無(wú)法實(shí)現(xiàn)。
5xx:服務(wù)器端錯(cuò)誤--服務(wù)器未能實(shí)現(xiàn)合法的請(qǐng)求。
2、響應(yīng)頭部
與請(qǐng)求頭部類似,為響應(yīng)報(bào)文添加附加信息
常見(jiàn)響應(yīng)頭如下:
| 響應(yīng)頭 | 說(shuō)明 |
|---|---|
| Server | 服務(wù)器應(yīng)用程序軟件的名稱和版本 |
| Content-Type | 響應(yīng)正文的類型,是圖片還是二進(jìn)制字符串 |
| Content-Language | 響應(yīng)正文使用的語(yǔ)言 |
| Content-Encoding | 響應(yīng)正文使用的數(shù)據(jù)壓縮格式 |
| Content-Charset | 響應(yīng)正文使用的編碼格式 |
| Content-Length | 響應(yīng)正文長(zhǎng)度 |
| Date | 響應(yīng)的日期 |
3、響應(yīng)數(shù)據(jù)

HTTP、Socket、TCP的區(qū)別
首先看下這三者在TCP/IP協(xié)議中的位置關(guān)系:

解析圖片:
HTTP是應(yīng)用層的協(xié)議,更靠近用戶端;
TCP是傳輸層的協(xié)議;
而socket是從傳輸層上抽象出來(lái)的一個(gè)抽象層,本質(zhì)是接口。
解疑答惑:
1、TCP連接與HTTP連接的區(qū)別
HTTP是基于TCP的,客戶端往服務(wù)端發(fā)送一個(gè)HTTP請(qǐng)求時(shí)第一步就是要建立與服務(wù)端的TCP連接,也就是先三次握手,“你好,你好,你好”。從HTTP 1.1開(kāi)始支持持久連接,也就是一次TCP連接可以發(fā)送多次的HTTP請(qǐng)求。
小總結(jié):HTTP基于TCP
2、TCP連接與Socket連接的區(qū)別
socket層只是在TCP/UDP傳輸層上做的一個(gè)抽象接口層,因此一個(gè)socket連接可以基于TCP連接,也有可能基于UDP。
基于TCP協(xié)議的socket連接同樣需要通過(guò)三次握手建立連接,是可靠的;
基于UDP協(xié)議的socket連接不需要建立連接的過(guò)程,不過(guò)對(duì)方能不能收到都會(huì)發(fā)送過(guò)去,是不可靠的,大多數(shù)的即時(shí)通訊IM都是后者。
小總結(jié):Socket也基于TCP
3、HTTP連接與Socket連接的區(qū)別
HTTP是短連接,Socket(基于TCP協(xié)議的)是長(zhǎng)連接。盡管HTTP1.1開(kāi)始支持持久連接,但仍無(wú)法保證始終連接。而Socket連接一旦建立TCP三次握手,除非一方主動(dòng)斷開(kāi),否則連接狀態(tài)一直保持。
HTTP連接服務(wù)端無(wú)法主動(dòng)發(fā)消息,Socket連接雙方請(qǐng)求的發(fā)送先后限制。這點(diǎn)就比較重要了,因?yàn)樗鼘Q定二者分別適合應(yīng)用在什么場(chǎng)景下。
HTTP采用“請(qǐng)求-響應(yīng)”機(jī)制,在客戶端還沒(méi)發(fā)送消息給服務(wù)端前,服務(wù)端無(wú)法推送消息給客戶端。必須滿足客戶端發(fā)送消息在前,服務(wù)端回復(fù)在后。Socket連接雙方類似peer2peer的關(guān)系,一方隨時(shí)可以向另一方喊話。
4、什么時(shí)候該用HTTP,什么時(shí)候該用socket
用HTTP的情況:雙方不需要時(shí)刻保持連接在線,比如客戶端資源的獲取、文件上傳等。
用Socket的情況:大部分即時(shí)通訊應(yīng)用(QQ、微信)、聊天室、蘋(píng)果APNs等
TCP的三次握手
如圖:
解析如下:
1、Client首先發(fā)送一個(gè)連接試探,這時(shí)候Client進(jìn)入syn_sent狀態(tài),表示客戶端等待服務(wù)器的回復(fù)。
ACK=0 表示確認(rèn)號(hào)無(wú)效,
SYN = 1 表示這是一個(gè)連接請(qǐng)求或連接接受報(bào)文,同時(shí)表示這個(gè)數(shù)據(jù)報(bào)不能攜帶數(shù)據(jù),
seq = x 表示Client自己的初始序號(hào)(seq = 0就代表這是第0號(hào)包),
2、Server監(jiān)聽(tīng)到連接請(qǐng)求報(bào)文后,如同意建立連接,則向Client發(fā)送確認(rèn)。這時(shí)服務(wù)器進(jìn)入syn_rcvd,表示服務(wù)器已經(jīng)收到Client的連接請(qǐng)求,等待client的確認(rèn)。
TCP報(bào)文首部中的SYN 和 ACK都置1 ,
ack = x +1表示期望收到對(duì)方下一個(gè)報(bào)文段的第一個(gè)數(shù)據(jù)字節(jié)序號(hào)是x+1,同時(shí)表明x為止的所有數(shù)據(jù)都已正確收到
(ack=1其實(shí)是ack=0+1,也就是期望客戶端的第1個(gè)包),seq= y 表示Server自己的初始序號(hào)(seq=0就代表這是服務(wù)器這邊發(fā)出的第0號(hào)包)。
3、Client收到確認(rèn)后還需再次發(fā)送確認(rèn),同時(shí)攜帶要發(fā)送給Server的數(shù)據(jù)。一旦收到Client的確認(rèn)之后,這個(gè)TCP連接就進(jìn)入Established狀態(tài),就可以發(fā)起http請(qǐng)求了。
ACK 置1 表示確認(rèn)號(hào)ack= y + 1有效(代表期望收到服務(wù)器的第1個(gè)包),
Client自己的序號(hào)seq= x +1(表示這就是我的第1個(gè)包,相對(duì)于第0個(gè)包來(lái)說(shuō)的)
瀏覽器地址欄輸入url,看到頁(yè)面的過(guò)程
域名解析--> 發(fā)起TCP的3次握手 --> 建立TCP連接后發(fā)起http請(qǐng)求 -->服務(wù)器響應(yīng)http請(qǐng)求,瀏覽器得到html代碼 --> 瀏覽器解析html代碼,并請(qǐng)求html代碼中的資源(如js、css、圖片等)--> 瀏覽器對(duì)頁(yè)面進(jìn)行渲染呈現(xiàn)給用戶
來(lái)自網(wǎng)絡(luò)詳情見(jiàn):
http://www.itdecent.cn/p/a6a63e56a203





