TCP IP的三次握手協議

2022-05-24 21:51:10 字數 2705 閱讀 9115

關於tcp/ip的三次握手協議,這篇文章中有詳細的介紹,

很通俗易懂,什麼時候忘了,都可以過來瞧兩眼,保證很快就明白了。

首先tcp/ip協議分為三個階段:建立連線(握手階段),資料傳輸階段,連線終止階段。

看到以前學習的《計算機網路》課本,書上介紹,資料傳輸階段的時候,突然想到qq或者阿里旺旺是不是採用tcp/ip協議進行聊天的,

發現阿里旺旺應該是採用tcp/ip協議,但是qq是採用udp協議進行聊天的,採用tcp協議進行保持登入狀態的。關於qq採用的協議,可以參考這篇知乎問答

關於他們具體採用的什麼協議,可以像這篇文章中介紹的那樣採用wireshark抓包的方式

,分析其標頭檔案,可以檢視採用了什麼協議。

關於seq和ack

其實他們都是序列號,在乙個連線中,tcp為傳輸的每乙個資料位元組編號。在每個方向上序號是獨立的。

tcp接收來自程序的資料位元組,儲存在傳送緩衝區中並給他們編號。編號不比從0開始,而是從0~(232-1)之間生成乙個隨機數作為初始序列號(initial sequence number,isn),第乙個位元組的序號就是從isn+1開始的,如果隨機數是1000,待傳送的資料為6000b,則這些位元組的序號範圍是1001~7000.

我們可以看到tcp/ip的第一次握手就是第一是建立連線,第二是確定雙方的初始序列號,從而確定第乙個位元組序號isn+1.

三次握手three-way handshake

乙個虛擬連線的建立是通過三次握手來實現的

1. (a) –> [syn] –> (b)

假如伺服器b和客戶機a通訊. 當a要和b通訊時,a首先向b發乙個syn (synchronize) 標記的包,告訴b請求建立連線.

注意: 乙個 syn包就是僅syn標記設為1的tcp包(參見tcp包頭resources). 認識到這點很重要,只有當a受到b發來的syn包,才可建立連線,除此之外別無他法。因此,如果你的防火牆丟棄所有的發往外網介面的syn包,那麼你將不能讓外部任何主機主動建立連線。

2. (b) <– [syn/ack] <–(a)

接著,b收到後會發乙個對syn包的確認包(syn/ack)回去,表示對第乙個syn包的確認,並繼續握手操作.

注意: syn/ack包是僅syn 和 ack 標記為1的包.

3. ( a) –> [ack] –> (b)

a收到syn/ack 包,a發乙個確認包(ack),通知b連線已建立。至此,三次握手完成,乙個tcp連線完成

note: ack包就是僅ack 標記設為1的tcp包. 需要注意的是當三此握手完成、連線建立以後,tcp連線的每個包都會設定ack位

握手階段:

序號 方向 seq ack

1  a->b 10000 0

2 b->a 20000 10000+1=10001

3 a->b 10001 20000+1=20001

解釋:1:a向b發起連線請求,以乙個隨機數初始化a的seq,這裡假設為10000,此時ack=0

2:b收到a的連線請求後,也以乙個隨機數初始化b的seq,這裡假設為20000,意思是:你的請求我已收到,我這方的資料流就從這個數開始。b的ack是a的seq加1,即10000+1=10001

3:a收到b的回覆後,它的seq是它的上個請求的seq加1,即10000+1=10001,意思也是:你的回覆我收到了,我這方的資料流就從這個數開始。a此時的ack是b的seq加1,即20000+1=20001

資料傳輸階段:

序號  方向    seq       ack           size

23       a->b   40000   70000           1514  

//4000是a中資料報的序列號開始的即isn+1(假設是第乙個傳送包),而7000也是b中資料報的序列isn+1.這時候a發出去了乙個含tcp頭部大小共1514個位元組大小的包,此時a中已經用到的編號是從4000到(4000+資料報的大小-1)=4000+(1514-54-1)54是tcp包的頭部。所以下一次傳送的seq應該是從

(4000+資料報的大小)開始。同理接收方的序列號也是這樣的!!!

24       b->a   70000   40000+1514-54=41460   54

25       a->b   41460   70000+54-54=70000   1514

26       b->a   70000   41460+1514-54=42920   54

解釋:23:b接收到a發來的seq=40000,ack=70000,size=1514的資料報

24:於是b向a也發乙個資料報,告訴b,你的上個包我收到了。b的seq就以它收到的資料報的ack填充,ack是它收到的資料報的seq加上資料報的大小(不包括乙太網協議頭,ip頭,tcp頭),以證實b發過來的資料全收到了。

25:a在收到b發過來的ack為41460的資料報時,一看到41460,正好是它的上個資料報的seq加上包的大小,就明白,上次傳送的資料報已安全到達。於是它再發乙個資料報給b。這個正在傳送的資料報的seq也以它收到的資料報的ack填充,ack就以它收到的資料報的seq(70000)加上包的size(54)填充,即ack=70000+54-54(全是頭長,沒資料項)。

其實在握手和結束時確認號應該是對方序列號加1,傳輸資料時則是對方序列號加上對方攜帶應用層資料的長度.如果從乙太網包返回來計算所加的長度,就嫌走彎路了.

另外,如果對方沒有資料過來,則自己的確認號不變,序列號為上次的序列號加上本次應用層資料傳送長度.

TCP IP三次握手協議

當兩台主機採用tcp協議進行通訊時,在交換資料前將建立連線。通訊完成後,將關閉會話並終止連線。連線和會話機制保障了tcp的可靠性功能。請參見圖中建立並終止tcp連線的步驟。主機將跟蹤會話過程中的每個資料段,並使用tcp報頭中的資訊了解每台主機所接收到的資料。每個連線都代表兩股單向通訊資料流或者會話。...

TCP IP三次握手協議

tcp transmission control protocol 傳輸控制協議 tcp是主機對主機層的傳輸控制協議,提供可靠的連線服務,採用三次握手確認建立乙個連線 位碼即tcp標誌位,有6種標示 syn synchronous建立聯機 ack acknowledgement 確認 psh pus...

TCP IP協議三次握手

建立起乙個tcp連線需要經過 三次握手 第一次握手 客戶端傳送syn包 syn j 到伺服器,並進入syn send狀態,等待伺服器確認 第二次握手 伺服器收到syn包,必須確認客戶的syn ack j 1 同時自己也傳送乙個syn包 syn k 即syn ack包,此時伺服器進入syn recv狀...