關於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狀...