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是車上的人。每個網站內容不一樣,就像車上的每個人有不同的故事一樣。