1. 程式人生 > >TCP三次握手和四次釋放

TCP三次握手和四次釋放

UPDTCP/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無情