日常記錄 - 5.4
什么情況會出現(xiàn)三次揮手?
「沒有數(shù)據(jù)要發(fā)送」并且「開啟了 TCP 延遲確認(rèn)機(jī)制」,那么第二和第三次揮手就會合并傳輸,這樣就出現(xiàn)了三次揮手。
當(dāng)有響應(yīng)數(shù)據(jù)要發(fā)送時,ACK 會隨著響應(yīng)數(shù)據(jù)一起立刻發(fā)送給對方
當(dāng)沒有響應(yīng)數(shù)據(jù)要發(fā)送時,ACK 將會延遲一段時間,以等待是否有響應(yīng)數(shù)據(jù)可以一起發(fā)送
如果在延遲等待發(fā)送 ACK 期間,對方的第二個數(shù)據(jù)報文又到達(dá)了,這時就會立刻發(fā)送 ACK
TCP 序列號和確認(rèn)號是如何變化的?
萬能公式:
發(fā)送的 TCP 報文:
公式一:序列號 = 上一次發(fā)送的序列號 + len(數(shù)據(jù)長度)。特殊情況,如果上一次發(fā)送的報文是 SYN 報文或者 FIN 報文,則改為 上一次發(fā)送的序列號 + 1。
公式二:確認(rèn)號 = 上一次收到的報文中的序列號 + len(數(shù)據(jù)長度)。特殊情況,如果收到的是 SYN 報文或者 FIN 報文,則改為上一次收到的報文中的序列號 + 1。
SYN視為 1字節(jié)的數(shù)據(jù)。ACK 則是0 。
如果第三次握手的ACK 丟失了,那么處于SYN_RCVD狀態(tài)服務(wù)端收到客戶端第一個TCP ?報文會發(fā)生什么?
發(fā)送的第一個 「TCP 數(shù)據(jù)報文的序列號和確認(rèn)號」都是和「第三次握手的 ACK 報文中序列號和確認(rèn)號」一樣的,并且該 TCP 數(shù)據(jù)報文也有將 ACK 標(biāo)記位置為 1。
所以,服務(wù)端收到這個數(shù)據(jù)報文,是可以正常完成連接的建立,然后就可以正常接收這個數(shù)據(jù)包了。