TCP三次握手和四次釋放
UPD
和 TCP/IP
協議的區別
從前有一個古老的 負責網路傳輸 的種族,種族由很多個協議成員 組成,TCP協議 ,IP協議 ,UDP協議 ,HTTP協議 ,TELNET協議 等等
TCP協議和IP協議
是這個協議大家庭的兩個大佬,所以就用這兩個大佬來命名這個家族 TCP/IP
協議簇
家族主要負責網路傳輸,覆蓋業務涵蓋了:
應用層,傳輸層,網路層,網路訪問層
所以改一下問題 問題1: UPD
和 大佬 TCP
協議 的區別
TCP大佬
:Tansmisson control protocl
傳輸控制協議 ,是一個傳輸層協議
基於連線協議,3次握手,對系統資源多,流資料模式,保證資料正確性,順序性。
UDP小弟
:User Data Protocol
, 使用者資料報協議 ,非連線協議,不建立連線,不保證傳輸成功 ,盡最大努力交付,面向報文
TCP
基本介紹
Tcp
是一種可靠的面向連線的傳輸協議。為了提供可靠的服務 。
TCP協議
工作在傳輸層,是一種可靠的面向連線的資料流協議。TCP
之所以可靠,是因為它保證了傳送資料包的順序。順序是用一個序列號來保證的。響應包內也包括一個序列號,表示接收方準備好這個序列號的包。在 TCP
傳送一個數據包時,它會把這個資料包放入重發佇列中,同時啟動計時器,如果收到了關於這個包的確認資訊,便將此資料包從佇列中刪除,如果在計時器超時的時候仍然沒有收到確認資訊,則需要重新發送該資料包。另外,TCP
Tcp
生成 Syn
包的過程
Initial sequence number
的 生成
公式:ISN = M + F(本地主機,本地埠,遠端主機,遠端埠)
F的函式可以參考使用 MD5
Tcp 三次握手
起初,伺服器和客戶端都為CLOSED狀態。在通訊開始前,雙方都得建立各自的傳輸控制塊(TCB)。
伺服器建立完TCB後遍進入LISTEN狀態,此時準備接收客戶端發來的連線請求。
第一次握手
客戶端向服務端傳送連線請求報文段。該報文段的頭部中SYN=1,ACK=0,seq=x。請求傳送後,客戶端便進入SYN-SENT狀態。
- PS1:SYN=1,ACK=0表示該報文段為連線請求報文。
- PS2:x為本次TCP通訊的位元組流的初始序號。
TCP規定:SYN=1的報文段不能有資料部分,但要消耗掉一個序號。
第二次握手
服務端收到連線請求報文段後,如果同意連線,則會發送一個應答:SYN=1,ACK=1,seq=y,ack=x+1。
該應答傳送完成後便進入SYN-RCVD狀態。
- PS1:SYN=1,ACK=1表示該報文段為連線同意的應答報文。
- PS2:seq=y表示服務端作為傳送者時,傳送位元組流的初始序號。
- PS3:ack=x+1表示服務端希望下一個資料報傳送序號從x+1開始的位元組。
第三次握手
當客戶端收到連線同意的應答後,還要向服務端傳送一個確認報文段,表示:服務端發來的連線同意應答已經成功收到。
該報文段的頭部為:ACK=1,seq=x+1,ack=y+1。
客戶端發完這個報文段後便進入ESTABLISHED狀態,服務端收到這個應答後也進入ESTABLISHED狀態,此時連線的建立完成!
Tcp三次握手流程圖
seq序號 是自己的序列號 ack確認號 是 希望對方下一個報文的序號起始
1 第1次握手的報文(連線請求報文) 應該是 SYN=1 ACK=0 seq=x ack =0
2 第2次握手的報文(響應報文) 應該是SYN=1 ACK=1 seq = y ack =x+1
3 第3次握手的報文(確認報文) 應該是 ACK=1 seq =x+1 ack = y+1
其實TCP握手,是對比通訊雙方資料原點的序列號。
Tcp四次揮手釋放
1 客戶端程序發出 (1)連線釋放報文
,並且停止傳送資料。釋放資料報文首部,FIN=1,其序列號為seq=u(等於前面已經傳送過來的資料的最後一個位元組的序號加1)
,此時,客戶端進入FIN-WAIT-1
(終止等待1)狀態。
P:客戶端主動第一次說 :你出去,你出去。
2 伺服器收到客戶端傳過來的 (1)連線釋放報文
,發出(2)確認報文
,ACK=1,ack=u+1
,並且帶上自己的序列號 seq=v
,此時,服務端就進入了CLOSE-WAIT(關閉等待)
狀態。TCP伺服器通知高層的應用程序,客戶端向伺服器的方向就釋放了,這時候處於半關閉狀態,即客戶端已經沒有資料要傳送了,但是伺服器若傳送資料,客戶端依然要接受。這個狀態還要持續一段時間,也就是整個 CLOSE-WAIT
狀態持續的時間。
P:收到了你出去
的(1)連線釋放報文,他嘴上對她說,好的,我出去了
。但是先不去,因為要通知上層應用停止動作,而且,下層連線可能在繼續傳輸某些資料
,所以需要一個時間,保持這個 close-wait 狀態。
3 客戶端收到伺服器的(1)確認請求後,此時,客戶端就進入 FIN-WAIT-2(終止等待2)
狀態,等待伺服器傳送連線釋放報文(在這之前還需要接受伺服器傳送的最後的資料)。
4 伺服器將最後的資料傳送完畢後,就向客戶端傳送(3)連線釋放報文
,FIN=1,ack=u+1
,由於在半關閉狀態,伺服器很可能又傳送了一些資料,假定此時的序列號為seq=w
,此時,伺服器就進入了 LAST-ACK(最後確認)
狀態,等待客戶端的確認。
p:客戶端傳送結束榨乾
之後,伺服器精疲力盡的說,我真的沒有資料了,這是最後的資料了,最後的資料的序列號為w ,我真的要出去了
,然後伺服器就進入了最後確認的狀態 (3)連線釋放報文
。
5 客戶端收到伺服器的連線釋放報文後,必須發出(4)確認
,ACK=1,ack=w+1
,而自己的序列號是 seq=u+1
,此時,客戶端就進入了TIME-WAIT(時間等待)
狀態。注意此時TCP連線還沒有釋放,必須經過2MSL(最長報文段壽命)
的時間後,當客戶端撤銷相應的TCB後,才進入CLOSED狀態
。
P:客戶端發出 (4)確認
,說:好的,我收到了你最後的訊息,畢竟你已經說了兩遍,你已經傳輸完成資料了,我相信你榨乾了,你出去吧
,然後,客戶端還需要等待 2個 MSL 的時間。才會完全進入關閉狀態,這個時間稱為 她的賢者時間
。
6 伺服器只要收到了客戶端發出的 (4)確認
,立即進入CLOSED狀態
。同樣,撤銷TCB後,就結束了這次的TCP連線。可以看到,伺服器結束TCP連線的時間要比客戶端早一些。
P:伺服器收到了(4)確認
請求,就立刻結束TCP連線 ,所以伺服器退出連線狀態的時間是早於客戶端的,這被人們稱為 拔x無情
。