Http協議3次握手,4次揮手
1、TCP傳輸控制協議:
TCP是主機對主機層的傳輸控制協議,提供可靠的連接服務,采用3次握手確認建立一個連接。
位碼(即tcp)標志位,有6種標識
①SYN(synchronous建立聯機)
②ACK(acknowledgment確認)
③PSH(push傳送)
④FIN(finish結束)
⑤RST(reset重置)
⑥URG(urgent緊急)
Sequent number:順序號碼
Acknowledge number:確認號碼
SYN:代表請求創建連接,所以在三次握手中前兩次要SYN=1,表示這兩次用於建立連接。
FIN:表示請求關閉連接,在四次分手時,我們發現FIN發了兩遍。這是因為TCP的連接是雙向的,所以一次FIN只能關閉一個方向。
ACK:代表確認接受,從上面可以發現,不管是三次握手還是四次分手,在回應的時候都會加上ACK=1,表示消息接收到了,並且在建立連接以后的發送數據時,都需加上ACK=1,來表示數據接收成功。
seq:序列號,什么意思呢?當發送一個數據時,數據是被拆成多個數據包來發送,序列號就是對每個數據包進行編號,這樣接受方才能對數據包進行再次拼接。
初始序列號是隨機生成的,這樣不一樣的數據拆包解包就不會連接錯了。(例如:兩個數據都被拆成1,2,3和一個數據是1,2,3一個是101,102,103,很明顯后者不會連接錯誤)
ack:這個代表下一個數據包的編號,這也就是為什么第二請求時,ack是seq+1。
2、握手過程:
第一次:主機A發送位碼為syn = 1
,隨機產生Seq number = 1234567
的數據包到服務器,主機B由於SYN = 1
知道主機A要求建立聯機。—— A機請求連接包到B機(隨機產生Seq number = 1234567
, SYN = 1)。
第二次:主機B收到請求后要確認聯機信息,向主機A發送ack number = (主機A的Seq number + 1)
,syn = 1,ack = 1和(隨機產生seq number = 7654321)
—— B機回應A機請求,syn = 1,ack = 1和(隨機產生seq number = 7654321)的包。
第三次:主機A收到后檢查ack number
是否正確,即第一次發送的seq number + 1
, 以及位碼是ack
是否為1,若正確,主機A會再發送ack number = (主機B的seq + 1), ack = 1
,主機B收到后確認seq number
值和ack = 1
則連接成功。
完成三次握手,主機A與主機B開始傳送數據。
3、在TCP/IP協議中,TCP協議提供可靠的連接服務,采用三次握手建立一個連接。——每次請求服務器都會3次握手,4次揮手
1.客戶端首先要SYN=1,表示要創建連接,
2.服務端接收到后,要告訴客戶端:我接受到了!所以加個ACK=1,就變成了ACK=1,SYN=1
3.理論上這時就創建連接成功了,但是要防止可能出現的問題,所以客戶端要再發一個消息給服務端確認一下,這時只需要ACK=1就行了
可能出現的問題:如果一個連接請求在網絡中跑的慢,超時了,這時客戶端會從發請求,但是這個跑的慢的請求最后還是跑到了,然后服務端就接收了兩個連接請求,然后全部回應就會創建兩個連接,浪費資源!如果加了第三次客戶端確認,客戶端在接受到一個服務端連接確認請求后,后面再接收到的連接確認請求就可以拋棄不管了。
第一次握手:建立連接時,客戶端發送SYN包(SYN = 1, ACK = 0, seq = x)
到服務器,並進入SYN_SEND
狀態,等待服務器確認。
第二次握手:服務器收到syn包
,必須確認客戶端的SYN (SYN = 1, ACK = 1, seq = y, sck = x + 1)
,同時自己也發送一個SYN包(syn = k)
,即SYN + ACK包
給客戶端,此時服務器進入SYN_RECV
狀態。
第三次握手:客戶端收到服務器的SYN + ACK包
,向服務器發送確認包ACK(ACK = 1, seq = x + 1, ack = y + 1)
,此包發送完畢,客戶端和服務器進入RSTABLISHEN
狀態,完成三次握手。
完成三次握手,客戶端與服務器開始傳送數據。
4、4次揮手(關閉連接)
由於TCP連接是全雙工的,因此每個方向都必須單獨進行關閉,這個原則是當一方完成它的數據發送任務后就能發送一個FIN
來終止這個方向的連接。收到一個FIN
只意味着這一方向沒有數據流動,一個TCP連接在收到一個FIN
后仍能發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。
TCP的連接的拆除需要發送四個包,因此稱為四次揮手。客戶端或服務器均可主動發起揮手動作,在socket編程中,任何一方執行close()操作即可產生揮手動作。
1)四次揮手:
1、客戶端A發送一個FIN(FIN = 1, seq = u)
,用來關閉客戶端A到服務器B的數據傳送。
2、服務器B收到這個FIN(FIN = 1, seq = u)
,它發回一個ACK(ACK = 1, seq = v, ack = u + 1)
,確認序號為收到的序號加1 ,一個FIN
將占用一個序號。
3、服務器B關閉與客戶端A的連接,發送一個FIN(FIN = 1, seq = w, ack = u + 1)
給客戶端A。
4、客戶端A發回ACK(ACK = 1, seq = u + 1, ack = w + 1)
報文確認,並將確認序號設置為收到序號加1。
2)四個揮手的深入理解:
TCP協議的連接是全雙工連接,一個TCP連接存在雙向的讀寫通道。簡單說是“先關讀,后關寫”,一共需要四個階段。
以客戶端發起關閉連接為例:
1、服務器讀通道關閉。
2、客戶端寫通道關閉。
3、客戶端讀通道關閉。
4、服務器寫通道關閉。
關閉行為是在發起方數據發送完畢之后,給對方發出一個FIN(finish)
數據段。直到接收到對方發送的FIN
,且對方收到了接收確認ACK
之后,雙方的數據通信完全結束,過程中每次接收都需要返回確認數據段ACK
。
這是標准的TCP關閉兩個階段,服務器和客戶端都可以發起關閉,完全對稱。
5、TCP/UDP區別:
TCP傳輸控制協議:
面向連接、傳輸可靠(保證數據正確性)、有序(保證數據順序)、傳輸大量數據(流模式)、速度慢、對系統資源的要求多、程序結構較為復雜、每一條TCP連接只能是點到點的,TCP首部開銷20字節。
流模式:當通過TCP連接給另一端發送數據,只要調用一次
write
,發送了100個字節,但接受方可以分10次收完,每次10個字節;也可以調用10次wrtie
,每次10個字節,但接受方可以一次收完。
Ps: 但是,發送的數據量不能大於對方的接受緩存(流量控制),如果硬要發送過量數據,則接收方的緩存滿了就會把多出的數據丟失。這種情況是設置非阻塞I/O模型,會把內存耗盡,因為socket是存在內核中的。
UDP用戶數據報協議:
面向非連接、傳輸不可靠(可能丟包)、無序、傳輸少量數據(數據報模式)、速度快、對系統資源的要求少、程序結構較為簡單、UDP支持一對一、一對多、多對一和多對多的交互通信,UDP的首部開銷小(只有8個字節)。
數據報模式:發送端調用了幾次
write
,接收端必須用相同的次數的read
讀完。UDP是基於報文的,在接受的時候,每次最多只能讀取一個報文,報文和報文不會合並的,如果緩沖區小於報文長度,則多出的部分會被丟棄。也就是,如果不指定MSG_PEEK
標志,每次讀取操作會消耗一個報文。
6、WebSocket——解決了服務器與客戶端全雙工通信的問題
1)、什么是單工、半雙工、全雙工通信?
單工:信息只能單向傳輸。
半雙工:信息能雙向傳送但不能同時雙向傳送。
全雙工:信息能夠同時雙向傳送。
WebSocket協議包含兩部分:一部分是"握手",一部分是"數據傳輸"。
2)、WebSocket和Socket的區別:
1、Socket不是一個協議,而是為了方便使用TCP或UDP而抽象出來的一層,是位於應用層和傳輸控制層之間的一組接口。
2、當兩台主機通信時,必須通過Socket連接,Socket則利用TCP/IP協議建立TCP連接。TCP連接則更依靠於底層的IP協議,IP協議的連接則依賴於鏈路層更低層次。
3、Socket是傳輸控制層協議,WebSocket是應用層協議。
7、WebSocket與http協議:
1)、http:
http協議是非持久化的,單向的網絡協議,在建立連接后只允許瀏覽器向服務器發出請求后,服務器才能返回相應的數據。當需要即時通訊時,通過輪詢方式(即在特定的時間間隔不斷請求服務器,如1秒),由瀏覽器向服務器發送Request請求,然后將最新的數據返回給瀏覽器。
缺點:會導致過多不必要的請求,浪費流量和服務器資源,沒一次請求、應答,都浪費了一定的流量在相同的頭部信息上。
2)、WebSocket:
webSocket解決了http協議的缺點。在webSocket中只需要服務器和瀏覽器通過http協議進行一個握手的動作,然后單獨建立一條TCP的通信通道進行數據的傳送。
3)、webSocket與http相同點:
1、都是一樣基於TCP的,都是可靠性傳輸協議。
2、都是應用層協議。
4)、webSocket與http不同點:
1、webSocket是雙向通信協議,模擬socket協議,可以雙向發送或接受信息。http是單向的。
2、webSocket是需要握手進行建立連接的。