HTTP請(qǐng)求

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)求報(bào)文添加了一些附加信息,由“名:值”對(duì)組成,每行一對(duì),名和值之間使用冒號(hào)分隔。
    請(qǐng)求頭主要存放客戶端想給服務(wù)端的附加信息。

    請(qǐng)求頭如下:
    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ù)
    Get請(qǐng)求就沒(méi)有請(qǐng)求數(shù)據(jù)

    如圖為POST方法的請(qǐng)求報(bào)文
    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ù)

用于存放需要返回給客戶端的數(shù)據(jù)信息
responst-data.jpg

HTTP、Socket、TCP的區(qū)別

首先看下這三者在TCP/IP協(xié)議中的位置關(guān)系:

圖片來(lái)自網(wǎng)絡(luò):
HTTP-Socket-TCP.jpg

解析圖片:

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的三次握手

如圖:
TCP握手.jpg

解析如下:
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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容