HTTP協議,HTTP請求和響應,TCP三次和四次握手

目錄

 

1.HTTP協議是什麼?

2.HTTP主要特點

3.HTTP請求和響應

3.1HTTP請求

3.2HTTP響應

3.3HTTP請求和響應流程

3.4HTTP響應狀態碼分類 

3.5HTTP請求方法

4.TCP三次握手和四次握手

4.1三次握手過程(建立連接)

4.2四次揮手過程理解(釋放連接)

5.HTTP七層協議


1.HTTP協議是什麼?

a.(HTTP協議作用?)HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用於從萬維網(WWW:World Wide Web )服務器傳輸超文本到本地瀏覽器的傳送協議。

b.(HTTP協議傳輸內容?)HTTP是一個基於TCP/IP通信協議來傳遞數據(HTML 文件, 圖片文件, 查詢結果等)。

c.(HTTP協議的發展?)HTTP是一個屬於應用層的面向對象的協議,由於其簡捷、快速的方式,適用於分佈式超媒體信息系統。它於1990年提出,經過幾年的使用與發展,得到不斷地完善和擴展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規範化工作正在進行之中,而且HTTP-NG(Next Generation of HTTP)的建議已經提出。

HTTP協議工作於客戶端-服務端架構爲上。瀏覽器作爲HTTP客戶端通過URL向HTTP服務端即WEB服務器發送所有請求。Web服務器根據接收到的請求後,向客戶端發送響應信息。

2.HTTP主要特點

a.HTTP是無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開連接。採用這種方式可以節省傳輸時間。

b.HTTP是媒體獨立的:這意味着,只要客戶端和服務器知道如何處理的數據內容,任何類型的數據都可以通過HTTP發送。客戶端以及服務器指定使用適合的MIME-type內容類型。

c.HTTP是無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果後續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。

d.HTTP簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯繫的類型不同。由於HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。

e.支持B/S(Browser/Server)及C/S(Client/Server)模式。

3.HTTP請求和響應

3.1HTTP請求

客戶端發送一個HTTP請求到服務器的請求消息包括以下格式:請求行(request line)、請求頭部(header)、空行和請求數據四個部分組成,下圖給出了請求報文的一般格式。

HTTP請求實例(基於Charles抓包數據):

POST /service.asmx/user_notepad?t=1589500883638 HTTP/1.1
Host: 127.0.0.1:9001
Content-Length: 122
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36
content-type: application/json
Origin: http://127.0.0.1:9001
Referer: http://127.0.0.1:9001/app88/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: ASP.NET_SessionId=rxhnzy5kvnmzkzxbcgzqqpja
Connection: keep-alive

{
  "user_id": 721,
  "vin_num": "AAJJU7FX6H5008783",
  "content": "123",
  "apikey": "f2a3a7c9a7cf3a500d8cdd6bfdff9ebe"
}

a.第一行請求行,包含請求方法(POST),請求路徑(/service.asmx/user_notepad?t=1589500883638),HTTP協議版本(HTTP/1.1);

b.第二行請求頭,跟在請求行後面,說明請求服務器的附加信息;從第二行起爲請求頭部,HOST將指出請求的目的地;User-Agent,服務器端和客戶端腳本都能訪問它,它是瀏覽器類型檢測邏輯的重要基礎;該信息由你的瀏覽器來定義,並且在每個請求中自動發送等等;

User-Agent會告訴網站服務器,訪問者是通過什麼工具來請求的,如果是爬蟲請求,一般會拒絕,如果是用戶瀏覽器,就會應答;

User-Agent通用格式:

Mozilla/5.0 (平臺) 引擎版本 瀏覽器版本號

c.第三部分,空行,請求頭後面必須是空行;

即使第四部分的請求數據爲空,也必須有空行。

d.第四部分,請求數據;

3.2HTTP響應

HTTP響應也由四個部分組成,分別是:狀態行、消息報頭、空行和響應正文;

a.第一部分:狀態行,由HTTP協議版本號, 狀態碼, 狀態消息三部分組成;

第一行爲狀態行,(HTTP/1.1)表明HTTP版本爲1.1版本,狀態碼爲200,狀態消息爲(ok)

b.第二部分:消息報頭,用來說明客戶端要使用的一些附加信息;

第二行和第三行爲消息報頭;

Date:生成響應的日期和時間;

Content-Type:指定了MIME類型的HTML(text/html),編碼類型是UTF-8;

c.第三部分:空行,消息報頭後面的空行是必須的;

d.第四部分:響應正文,服務器返回給客戶端的文本信息;
空行後面的html或者JSON部分爲響應正文;

HTTP響應實例(基於Charles抓包數據):

HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Access-Control-Allow-Methods: OPTIONS,POST,GET
Access-Control-Allow-Headers: Origin,X-Requested-With,Content-Type,Accept
Access-Control-Allow-Origin: *
Date: Fri, 15 May 2020 00:01:30 GMT
Content-Length: 116
Proxy-Connection: keep-alive

{"d":"{\"head\":{\"status\":0,\"msg\":\"成功\",\"record_count\":0,\"sub_status\":0,\"ext1\":\"\"},\"Body\":\"\"}"}

3.3HTTP請求和響應流程

HTTP是基於客戶/服務器模式,且面向連接的。典型的HTTP事務處理有如下的過程:
(1)客戶與服務器建立連接;
(2)客戶向服務器提出請求;
(3)服務器接受請求,並根據請求返回相應的文件作爲應答;
(4)客戶與服務器關閉連接。
客戶與服務器之間的HTTP連接是一種一次性連接,它限制每次連接只處理一個請求,當服務器返回本次請求的應答後便立即關閉連接,下次請求再重新建立連接。這種一次性連接主要考慮到WWW服務器面向的是Internet中成幹上萬個用戶,且只能提供有限個連接,故服務器不會讓一個連接處於等待狀態,及時地釋放連接可以大大提高服務器的執行效率。 
HTTP是一種無狀態協議,即服務器不保留與客戶交易時的任何狀態。這就大大減輕了服務器記憶負擔,從而保持較快的響應速度。HTTP是一種面向對象的協議。允許傳送任意類型的數據對象。它通過數據類型和長度來標識所傳送的數據內容和大小,並允許對數據進行壓縮傳送。當用戶在一個HTML文檔中定義了一個超文本鏈後,瀏覽器將通過TCP/IP協議與指定的服務器建立連接。 
從技術上講是客戶在一個特定的TCP端口(端口號一般爲80)上打開一個套接字。如果服務器一直在這個周知的端口上傾聽連接,則該連接便會建立起來。然後客戶通過該連接發送一個包含請求方法的請求塊。
HTTP規範定義了9種請求方法,每種請求方法規定了客戶和服務器之間不同的信息交換方式,常用的請求方法是GET和POST。服務器將根據客戶請求完成相應操作,並以應答塊形式返回給客戶,最後關閉連接。

3.4HTTP響應狀態碼分類 

HTTP狀態碼由三個十進制數字組成,第一個十進制數字定義了狀態碼的類型,後兩個數字沒有分類的作用。HTTP狀態碼共分爲5種類型:

1xx:指示信息--表示請求已接收,繼續處理
2xx:成功--表示請求已被成功接收、理解、接受
3xx:重定向--要完成請求必須進行更進一步的操作
4xx:客戶端錯誤--請求有語法錯誤或請求無法實現
5xx:服務器端錯誤--服務器未能實現合法的請求

常見狀態碼:

200 OK                        //客戶端請求成功
400 Bad Request               //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized              //請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用 
403 Forbidden                 //服務器收到請求,但是拒絕提供服務
404 Not Found                 //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error     //服務器發生不可預期的錯誤
503 Server Unavailable        //服務器當前不能處理客戶端的請求,一段時間後可能恢復正常

更多狀態碼:https://www.runoob.com/http/http-status-codes.html

3.5HTTP請求方法

根據 HTTP 標準,HTTP 請求可以使用多種請求方法。

HTTP1.0 定義了三種請求方法: GET, POST 和 HEAD方法。

HTTP1.1 新增了六種請求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。

GET    請求指定的頁面信息,並返回實體主體。
HEAD    類似於 GET 請求,只不過返回的響應中沒有具體的內容,用於獲取報頭。
POST    向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST 請求可能會導致新的資源的建立和/或已有資源的修改。
PUT    從客戶端向服務器傳送的數據取代指定的文檔的內容。
DELETE    請求服務器刪除指定的頁面。
CONNECT    HTTP/1.1 協議中預留給能夠將連接改爲管道方式的代理服務器。
OPTIONS    允許客戶端查看服務器的性能。
TRACE    回顯服務器收到的請求,主要用於測試或診斷。
PATCH    是對 PUT 方法的補充,用來對已知資源進行局部更新 。

4.TCP三次握手和四次握手

序列號seq:佔4個字節,用來標記數據段的順序,TCP把連接中發送的所有數據字節都編上一個序號,第一個字節的編號由本地隨機產生;給字節編上序號後,就給每一個報文段指派一個序號;序列號seq就是這個報文段中的第一個字節的數據編號。

    確認號ack:佔4個字節,期待收到對方下一個報文段的第一個數據字節的序號;序列號表示報文段攜帶數據的第一個字節的編號;而確認號指的是期望接收到下一個字節的編號;因此當前報文段最後一個字節的編號+1即爲確認號。

    確認ACK:佔1位,僅當ACK=1時,確認號字段纔有效。ACK=0時,確認號無效

    同步SYN:連接建立時用於同步序號。當SYN=1,ACK=0時表示:這是一個連接請求報文段。若同意連接,則在響應報文段中使得SYN=1,ACK=1。因此,SYN=1表示這是一個連接請求,或連接接受報文。SYN這個標誌位只有在TCP建產連接時纔會被置1,握手完成後SYN標誌位被置0。

    終止FIN:用來釋放一個連接。FIN=1表示:此報文段的發送方的數據已經發送完畢,並要求釋放運輸連接

    PS:ACK、SYN和FIN這些大寫的單詞表示標誌位,其值要麼是1,要麼是0;ack、seq小寫的單詞表示序號。
字段    含義
URG    緊急指針是否有效。爲1,表示某一位需要被優先處理
ACK    確認號是否有效,一般置爲1。
PSH    提示接收端應用程序立即從TCP緩衝區把數據讀走。
RST    對方要求重新建立連接,復位。
SYN    請求建立連接,並在其序列號的字段進行序列號的初始值設定。建立連接,設置爲1
FIN        希望斷開連接。

4.1三次握手過程(建立連接)

第一次握手:建立連接時,客戶端發送syn包(syn=x)到服務器,並進入SYN_SENT狀態,等待服務器確認;SYN:同步序列編號(Synchronize Sequence Numbers)。

第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=x+1),同時自己也發送一個SYN包(syn=y),即SYN+ACK包,此時服務器進入SYN_RECV狀態;

第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=y+1),此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP連接成功)狀態,完成三次握手。

4.2四次揮手過程理解(釋放連接)

1)客戶端進程發出連接釋放報文,並且停止發送數據。釋放數據報文首部,FIN=1,其序列號爲seq=u(等於前面已經傳送過來的數據的最後一個字節的序號加1),此時,客戶端進入FIN-WAIT-1(終止等待1)狀態。 TCP規定,FIN報文段即使不攜帶數據,也要消耗一個序號。
2)服務器收到連接釋放報文,發出確認報文,ACK=1,ack=u+1,並且帶上自己的序列號seq=v,此時,服務端就進入了CLOSE-WAIT(關閉等待)狀態。TCP服務器通知高層的應用進程,客戶端向服務器的方向就釋放了,這時候處於半關閉狀態,即客戶端已經沒有數據要發送了,但是服務器若發送數據,客戶端依然要接受。這個狀態還要持續一段時間,也就是整個CLOSE-WAIT狀態持續的時間。
3)客戶端收到服務器的確認請求後,此時,客戶端就進入FIN-WAIT-2(終止等待2)狀態,等待服務器發送連接釋放報文(在這之前還需要接受服務器發送的最後的數據)。
4)服務器將最後的數據發送完畢後,就向客戶端發送連接釋放報文,FIN=1,ack=u+1,由於在半關閉狀態,服務器很可能又發送了一些數據,假定此時的序列號爲seq=w,此時,服務器就進入了LAST-ACK(最後確認)狀態,等待客戶端的確認。
5)客戶端收到服務器的連接釋放報文後,必須發出確認,ACK=1,ack=w+1,而自己的序列號是seq=u+1,此時,客戶端就進入了TIME-WAIT(時間等待)狀態。注意此時TCP連接還沒有釋放,必須經過2∗∗MSL(最長報文段壽命)的時間後,當客戶端撤銷相應的TCB後,才進入CLOSED狀態。
6)服務器只要收到了客戶端發出的確認,立即進入CLOSED狀態。同樣,撤銷TCB後,就結束了這次的TCP連接。可以看到,服務器結束TCP連接的時間要比客戶端早一些。

5.HTTP七層協議

應用層
與其它計算機進行通訊的一個應用,它是對應應用程序的通信服務的。例如,一個沒有通信功能的字處理程序就不能執行通信的代碼,從事字處理工作的程序員也不關心OSI的第7層。但是,如果添加了一個傳輸文件的選項,那麼字處理器的程序就需要實現OSI的第7層。示例:TELNET,HTTP,FTP,NFS,SMTP等。

表示層
這一層的主要功能是定義數據格式及加密。例如,FTP允許你選擇以二進制或ASCII格式傳輸。如果選擇二進制,那麼發送方和接收方不改變文件的內容。如果選擇ASCII格式,發送方將把文本從發送方的字符集轉換成標準的ASCII後發送數據。在接收方將標準的ASCII轉換成接收方計算機的字符集。示例:加密,ASCII等。

會話層
它定義瞭如何開始、控制和結束一個會話,包括對多個雙向消息的控制和管理,以便在只完成連續消息的一部分時可以通知應用,從而使表示層看到的數據是連續的,在某些情況下,如果表示層收到了所有的數據,則用數據代表表示層。示例:RPC,SQL等。

傳輸層
這層的功能包括是否選擇差錯恢復協議還是無差錯恢復協議,及在同一主機上對不同應用的數據流的輸入進行復用,還包括對收到的順序不對的數據包的重新排序功能。示例:TCP,UDP,SPX。

網絡層
這層對端到端的包傳輸進行定義,它定義了能夠標識所有結點的邏輯地址,還定義了路由實現的方式和學習的方式。爲了適應最大傳輸單元長度小於包長度的傳輸介質,網絡層還定義瞭如何將一個包分解成更小的包的分段方法。示例:IP,IPX等。

數據鏈路層
它定義了在單個鏈路上如何傳輸數據。這些協議與被討論的各種介質有關。示例:ATM,FDDI等。

物理層
OSI的物理層規範是有關傳輸介質的特性,這些規範通常也參考了其他組織制定的標準。連接頭、幀、幀的使用、電流、編碼及光調製等都屬於各種物理層規範中的內容。物理層常用多個規範完成對所有細節的定義。示例:Rj45,802.3等。

參考:

https://www.runoob.com/http/http-intro.html

https://baike.baidu.com/item/http/243074?fromtitle=HTTP%E5%8D%8F%E8%AE%AE&fromid=1276942&fr=aladdin

https://blog.csdn.net/qq_38950316/article/details/81087809

https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C%E4%B8%83%E5%B1%82%E5%8D%8F%E8%AE%AE/6056879?fr=aladdin

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章