TCP連接的三次握手與四次揮手
計(jì)算機(jī)網(wǎng)絡(luò)課程估計(jì)有大半還給了老師州疾,學(xué)習(xí)還是要時而復(fù)習(xí)才行羹呵,TCP連接作為計(jì)算機(jī)網(wǎng)絡(luò)中重要的一部分內(nèi)容缤苫,希望通過自己的復(fù)習(xí)與記錄重新拾回來豹绪。
先記錄幾個關(guān)鍵字的意思:
- 同步 SYN :synchronous。建立連接镇防,將 SYN = 1啦鸣。
- 序號 seq: sequence。第一個字節(jié)的編號隨機(jī)產(chǎn)生来氧。
- 確認(rèn)位 ACK : acknowledgement 诫给。
- ack : 表示確認(rèn)字段的值。
- 結(jié)束 FIN : finish啦扬。FIN = 1 表示希望斷開連接中狂。
1. 三次握手過程
- A 發(fā)送同步信號
SYN
和一個隨機(jī)序列號seq = x
- B 確認(rèn)收到 A 的同步信號,返回確認(rèn)位
AKC = 1
扑毡,并將傳來的x
加上 1 返回 - B 發(fā)送同步信號
SYN
和一個隨機(jī)序列號seq = y
- A 確認(rèn)收到 B 的同步信號胃榕,返回確認(rèn)位
AKC = 1
,并將傳來的 y 加上 1 返回瞄摊,此時更新后的seq = x + 1
也一并返回
其中勋又,2苦掘、3兩步可以合并,也就是我們理解的三次握手楔壤,其實(shí)也可以這么理解鹤啡,雙方各發(fā)送一次請求,各進(jìn)行一次確認(rèn)挺邀,其中一次請求和確認(rèn)合并在一起就是三次。
2. 四次揮手過程
- A 發(fā)送結(jié)束信號
FIN
給 B跳座,和序列號seq = u
, u 等于 A 前面已傳過的數(shù)據(jù)最后一個字節(jié)序號加1端铛。 - B 確認(rèn)收到 A 的結(jié)束信號,返回確認(rèn)位
AKC = 1
疲眷、返回確認(rèn)號ack= u + 1
禾蚕,并返回序列號seq = v
,v 等于 B 前面已傳過的數(shù)據(jù)最后一個字節(jié)序號加1狂丝。 - B 等待數(shù)據(jù)傳送完畢换淆,發(fā)送結(jié)束信號
FIN
給 A,和序列號seq = w
(假設(shè)等待期間又發(fā)送了一些數(shù)據(jù))几颜,再次將確認(rèn)位AKC = 1
倍试、確認(rèn)號ack= u + 1
一并返回。 - A 確認(rèn)收到 B 的結(jié)束信號蛋哭,返回確認(rèn)位
AKC = 1
县习、返回確認(rèn)號ack= w + 1
,將更新后的seq = u + 1
返回谆趾。
3.建立TCP連接為什么需要三次握手
找了網(wǎng)絡(luò)上的各種三次握手文章躁愿,目前能了解的有下面這幾種原因
1.1 防止舊的重復(fù)連接初始化造成混亂,避免資源浪費(fèi)
謝希仁版《計(jì)算機(jī)網(wǎng)絡(luò)》中的例子是這樣的沪蓬,“已失效的連接請求報(bào)文段” 的產(chǎn)生在這樣一種情況下:client 發(fā)出的第一個連接請求報(bào)文段并沒有丟失彤钟,而是在某個網(wǎng)絡(luò)結(jié)點(diǎn)長時間的滯留了,以致延誤到連接釋放以后的某個時間才到達(dá) server跷叉。本來這是一個早已失效的報(bào)文段逸雹。但 server 收到此失效的連接請求報(bào)文段后,就誤認(rèn)為是 client 再次發(fā)出的一個新的連接請求云挟。于是就向 client 發(fā)出確認(rèn)報(bào)文段峡眶,同意建立連接。假設(shè)不采用 “三次握手”植锉,那么只要 server 發(fā)出確認(rèn)辫樱,新的連接就建立了。由于現(xiàn)在 client 并沒有發(fā)出建立連接的請求俊庇,因此不會理睬 server 的確認(rèn)狮暑,也不會向 server 發(fā)送數(shù)據(jù)鸡挠。但 server 卻以為新的運(yùn)輸連接已經(jīng)建立,并一直等待 client 發(fā)來數(shù)據(jù)搬男。這樣拣展,server 的很多資源就白白浪費(fèi)掉了。采用 “三次握手” 的辦法可以防止上述現(xiàn)象發(fā)生缔逛。例如剛才那種情況备埃,client 不會向 server 的確認(rèn)發(fā)出確認(rèn)。server 由于收不到確認(rèn)褐奴,就知道 client 并沒有要求建立連接按脚。”
白話一點(diǎn)就是敦冬,如果只有兩次握手辅搬,那么:
- A 向 B 發(fā)送了第一個請求,但是因?yàn)榫W(wǎng)絡(luò)堵塞沒有到達(dá)
- 超時后脖旱,于是 A 又發(fā)送了第二個請求堪遂,這此正常到達(dá),而且 B 回復(fù)收到了
- A 這時就開始和 B 相互通信萌庆,并一段時間后結(jié)束了連接
- 此時最開始的請求到達(dá)了 B溶褪,B 以為 A 又請求了連接,并且回復(fù)了 A
- 但 A 認(rèn)為自己并沒有發(fā)送請求践险,所以并不會理睬 B竿滨, B 就只能一直等著
1.2 同步雙方的初始序列號
舉例:
- 例如客戶端先發(fā)送了一個請求連接的數(shù)據(jù)包,初始
seq = 100
捏境, 因?yàn)榫W(wǎng)絡(luò)阻塞收不到回復(fù)于游,于是又發(fā)送了一個請求連接的數(shù)據(jù)包,初始seq = 200
- 此時網(wǎng)絡(luò)又恢復(fù)了正常垫言,服務(wù)端接收到了最開始發(fā)送的
seq = 100
贰剥, 于是返回ack = 101
- 客戶端比較上下文,發(fā)現(xiàn)自己希望收到的
ack
應(yīng)該是 201筷频,于是發(fā)送了RST
給服務(wù)端蚌成,中止連接。 - 一段時間后
seq = 200
到達(dá)了服務(wù)端凛捏,并返回了ack = 201
以及自己的seq
- 客戶端確認(rèn)信息担忧,返回服務(wù)端的
seq + 1
,建立TCP連接