HTTP協議和TCP協議


HTTP協議

什么是HTTP

HTTP協議規定了瀏覽器怎樣向萬維網服務請求萬維網文檔,以及服務器怎樣把文檔傳送給瀏覽器。在服務器和瀏覽器之間的請求和響應的交互,必須按照規定的格式和遵循一定的規則。這些格式和規則就是超文本傳送協議HTTP。

HTTP規定在HTTP客戶和HTTP服務器之間的每次交互,都由一個ASCII碼串構成的請求和一個類似的通用因特網郵件擴充,即“類MIME(MIME-like)”的響應組成。HTTP報文通常都使用TCP連接傳送。

當在地址欄輸入www.baidu.com的時候會發生是什么

1、DNS解析地址

2、找到相應的服務器

3、TCP的三次握手建立TCP連接

4、找到入口文件

5、解析入口文件

6、TCP的四次揮手

7、返回資源頁面

HTTP使用了面向連接的TCP作為運輸層協議,保證了數據的可靠傳輸。HTTP不必考慮數據在傳輸過程中被丟棄后又怎樣被重傳。但是,HTTP協議本身是無連接的。也就是說,HTTP雖然使用了TCP連接,但通信的雙方在交換HTTP報文之前不需要先建立HTTP連接。

HTTP協議是無狀態的。也就是說,同一個客戶第二次訪問同一個服務器上的頁面的時候,服務器的響應與第一次被訪問的時候一樣,但是服務器並不知道你曾經訪問過這個頁面,也不記得你曾經訪問過多少次。HTTP的無狀態特性簡化了服務器的設計,使服務器更容易支持大量並發的HTTP請求。

HTTP報文結構

HTTP有兩類報文:

  請求報文——從客戶向服務器發送請求報文

  響應報文——從服務器到客戶的回答

由於HTTP是面向文本的,因此在報文中的每一個字段都是一些ASCII碼串,因而各個字段的長度都是不確定的。

HTTP請求報文和響應報文都是由三個部分組成。這兩種報文格式的區別就是開始行不同。

  1、開始行,用於區分是請求報文還是響應報文。在請求報文中的開始行叫做請求行,在響應報文中的開始行叫做狀態行。

  2、首部行,用來說明瀏覽器、服務器或報文主體的一些信息。

  3、實體主體,在請求報文中一般都不用這個字段,而在響應報文中也可能沒有這個字段。

 請求報文:

  請求報文的第一行“請求行”只有三個內容:方法、請求資源的URL、HTTP的版本

    請求報文的方法

    

 響應報文:

  響應報文的第一行就是狀態行,狀態行包括三項內容:HTTP的版本、狀態碼、解釋狀態碼的簡單短語。

  狀態碼都是三位數字,分為5大類共33種

    1xx 表示通知信息的,如果請求收到了或正在進行處理

    2xx 表示成功,如接受或知道了

    3xx 表示重定向,如要完成請求還必須采取進一步的行動

    4xx 表示客戶的差錯,如請求中有錯誤的語法或不能完成

    5xx 表示服務器的差錯,如服務器失效無法完成請求

 

TCP協議

TCP的主要特點

1、TCP是面向連接的傳輸層協議。也就是說應用程序在使用TCP協議之前,必須先建立TCP連接

2、每一條TCP連接只能有兩個端點,每一條TCP連接只能是點對點的(一對一)

3、TCP提供可靠交付的服務。通過TCP連接傳送的數據,無差錯、不丟失、不重復、並且按序到達

4、TCP提供全雙工通信。TCP允許通信雙方的應用進程在任何時候都能夠返送數據。TCP連接的兩端都設有發送緩存和接收緩存,用來臨時存放雙向通信的數據。

5、面向字節流。TCP中的流指的是流入到進程或者從進程流出的字節序列。

建立一個TCP需要三步

1:客戶端向服務端發出了請求連接請求報文, 首部中的同部位SYN=1,同時選擇一個廚師序號seq = x。這時,客戶端進入SYN-SENT(同步已發送)狀態

2:服務端收到請求報文后,如果同意建立連接,則向客戶端發送確認。在確認報文中SYN和ACK都置1,確認號是 ack = x + 1,自己選擇一個初始序號seq = y,服務器進入SYN-RCVD(同步收到)狀態

3:客戶端收到服務端確認后,還要想服務端給出確認。確認報文段的ACK置1,確認號2 ack = y + 1,自己的序號 seq = x + 1。這是TCP的連接已建立,客戶端進入ESTABLISHED(已建立連接)狀態。

當服務端收到客戶端的確認后,也進入ESTABLISHED狀態

為什么客戶端還要在發送一次確認呢?

這是為了防止已失效的鏈接請求報文突然又傳到了服務端。因而產生錯誤

“已失效的連接請求報文”是這樣產生的:

  客戶端發出了第一個連接請求,由於網絡等原因導致長時間滯留但是沒有丟失,以致延誤到連接釋放以后的某個時間才到達服務端。按理說這應該是一個早就失效的報文段,但是服務端收到這個失效的報文段后,他不知道你是失效的報文噻,所以就會誤以為客戶端有發來了一個請求,於是就向客戶端發出了確認報文同意連接。假設我們沒有第三次的握手,那豈不是又建立了一個連接。

但是我客戶端並沒有發出建立連接的請求啊,所以我就不搭理服務器,不給你發送數據。但是服務器以為新的連接已經建立好了,等着你客戶端發來數據他就一直等啊等啊等啊,確怎么也等不到。這樣就會導致服務器的許多資源就這么浪費了。

參用了三次握手的辦法可以防止上述現象的發生,就如剛才的情況,服務器收不到客戶端的確認就知道客戶端沒有要求建立連接。

 

我理解的區別

TCP是傳輸層協議,定義數據傳輸和連接方式的規范。握手過程中傳送的包里不包含數據,三次握手完畢后,客戶端與服務器才正式開始傳送數據。

HTTP 超文本傳送協議(Hypertext Transfer Protocol )是應用層協議,定義的是傳輸數據的內容的規范。

HTTP協議中的數據是利用TCP協議傳輸的,特點是客戶端發送的每次請求都需要服務器回送響應,它是TCP協議族中的一種,默認使用 TCP 80端口。

好比網絡是路,TCP是跑在路上的車,HTTP是車上的人。每個網站內容不一樣,就像車上的每個人有不同的故事一樣。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM