dnf盜號(hào)網(wǎng)站怎么做阿亮seo技術(shù)顧問(wèn)
tcp為什么需要四次揮手?
答案有兩個(gè):
1.將發(fā)送fin包的權(quán)限交給被動(dòng)斷開(kāi)發(fā)的應(yīng)用層去處理,也就是讓程序員處理
2.接第一個(gè)答案,應(yīng)用層有了發(fā)送fin的權(quán)限,可以在發(fā)送fin前繼續(xù)向?qū)Χ税l(fā)送消息
為了搞清楚這個(gè)問(wèn)題,我們先要了解四次揮手的過(guò)程:
1.注意事項(xiàng)
- tcp四次揮手過(guò)程中沒(méi)有客戶(hù)端和服務(wù)端的概念,只有主動(dòng)方和被動(dòng)方之分
- 所有的ack包不會(huì)自動(dòng)重傳,如果ack包超時(shí)或丟失,通過(guò)對(duì)端重發(fā)fin來(lái)解決
2.四次揮手的開(kāi)始條件
- 主動(dòng)斷開(kāi)方調(diào)用shutdown,關(guān)閉讀端
- 主動(dòng)斷開(kāi)方調(diào)用shutdown,關(guān)閉寫(xiě)端
- 主動(dòng)斷開(kāi)放調(diào)用close,關(guān)閉讀端和寫(xiě)端
- 主動(dòng)斷開(kāi)放程序崩潰,關(guān)閉雙端,協(xié)議棧發(fā)送RST包
3.第一次揮手詳解
- 主動(dòng)斷開(kāi)放觸發(fā)四個(gè)條件之一,協(xié)議棧會(huì)在內(nèi)核態(tài)發(fā)送fin包
- 如果超時(shí)時(shí)間內(nèi)未收到ack,協(xié)議棧會(huì)重發(fā)fin
- 如果由于程序崩潰,協(xié)議棧只發(fā)送一次RST包,進(jìn)入快速關(guān)閉流程
4.第二次揮手詳解
- 主動(dòng)關(guān)閉方發(fā)送fin,向被動(dòng)方的讀緩沖區(qū)寫(xiě)入eof結(jié)束符,被動(dòng)方收到可讀事件,read返回值為0
- 被動(dòng)斷開(kāi)方根據(jù)read返回值0判斷對(duì)方請(qǐng)求關(guān)閉連接,但并不知道對(duì)方有沒(méi)有關(guān)閉讀端
- 被動(dòng)斷開(kāi)方可以選擇繼續(xù)發(fā)送數(shù)據(jù),如果對(duì)方關(guān)閉讀端則數(shù)據(jù)丟失
- 直到被動(dòng)斷開(kāi)放的應(yīng)用層代碼調(diào)用close或shutdown或程序崩潰,協(xié)議棧會(huì)自動(dòng)發(fā)送fin或RST包
5.RST(連接重置)詳解
- 協(xié)議棧發(fā)送RST是在本端tcp連接非正常斷開(kāi)時(shí)進(jìn)行的
- 任意一方發(fā)送RST或接收到RST都會(huì)進(jìn)入快速關(guān)閉流程,釋放相應(yīng)的資源,然后關(guān)閉連接
為什么是四次揮手?
- 如果是三次揮手,那么可能的情況是:
- 第二次和第三次揮手合并,也就是和tcp連接的三次揮手類(lèi)似,被動(dòng)方接收到fin后,協(xié)議棧自動(dòng)發(fā)送ack+fin包
- 三次揮手合并了第二和第三次揮手,最大的不同是:fin由協(xié)議棧自動(dòng)發(fā)送,應(yīng)用層沒(méi)有權(quán)限控制
- 如果使用三次揮手,那么被動(dòng)方在發(fā)送fin前無(wú)法繼續(xù)發(fā)送消息,而且在程序運(yùn)行過(guò)程中進(jìn)入tcp連接關(guān)閉流程,程序員可能并不知道tcp連接關(guān)閉的發(fā)生,這對(duì)代碼邏輯有很大的挑戰(zhàn)
以上是我個(gè)人的理解,下面是gpt-4o的解釋:
為什么不能是三次揮手
- 可靠性要求:
- TCP協(xié)議要求每個(gè)FIN和ACK都要獨(dú)立確認(rèn),以確保每一方向另一方清楚地通知了自己的關(guān)閉意圖。
- 將ACK和FIN合并在一個(gè)包里可能會(huì)導(dǎo)致確認(rèn)過(guò)程的不可靠。如果ACK和FIN合并在一個(gè)包中,這個(gè)包丟失了,將難以確定是否是ACK還是FIN丟失,需要重新發(fā)送哪個(gè)包。
- 流量控制和數(shù)據(jù)傳輸?shù)姆蛛x:
- 接收FIN包意味著對(duì)方已經(jīng)完成數(shù)據(jù)發(fā)送,但并不意味著接收方也已經(jīng)完成數(shù)據(jù)發(fā)送。
- 被動(dòng)關(guān)閉方可能在接收到FIN包后還有數(shù)據(jù)需要發(fā)送,所以它需要有時(shí)間處理和發(fā)送剩余的數(shù)據(jù)。
- 單獨(dú)的ACK包確保了被動(dòng)關(guān)閉方有時(shí)間處理這些數(shù)據(jù),而不是立即發(fā)送FIN包。
- 避免狀態(tài)混淆:
- 四次揮手的流程清晰地分離了不同的狀態(tài):接收FIN、確認(rèn)FIN、發(fā)送FIN、確認(rèn)關(guān)閉。
- 這種狀態(tài)分離可以避免在不同階段的混淆,確保每一步都清楚且明確。
例子解釋
如果采用三次揮手,將第二次和第三次揮手合并,情況如下:
- 主動(dòng)關(guān)閉方發(fā)送FIN。
- 被動(dòng)關(guān)閉方接收FIN并發(fā)送ACK+FIN。
- 主動(dòng)關(guān)閉方接收ACK+FIN,發(fā)送ACK,進(jìn)入TIME_WAIT。
這種情況下:
- 如果ACK+FIN包丟失,主動(dòng)關(guān)閉方無(wú)法區(qū)分是ACK還是FIN丟失,需要重新發(fā)送哪個(gè)包。
- 被動(dòng)關(guān)閉方在接收到FIN后立即發(fā)送ACK+FIN,可能會(huì)丟失未發(fā)送完的數(shù)據(jù)。
- 主動(dòng)關(guān)閉方在接收到ACK+FIN后立即發(fā)送ACK并進(jìn)入TIME_WAIT,可能會(huì)導(dǎo)致被動(dòng)關(guān)閉方的數(shù)據(jù)傳輸被中斷。
結(jié)論
四次揮手設(shè)計(jì)的目的是確保每個(gè)關(guān)閉步驟都得到確認(rèn),保證連接的可靠性和完整性。雖然理論上可以考慮三次揮手,但那樣會(huì)增加丟包情況下的復(fù)雜性和不確定性,違背了TCP協(xié)議設(shè)計(jì)的初衷。四次揮手雖然多了一步,但提供了更高的可靠性和明確的狀態(tài)分離,有助于實(shí)現(xiàn)穩(wěn)定和可靠的連接關(guān)閉過(guò)程。
那樣會(huì)增加丟包情況下的復(fù)雜性和不確定性,違背了TCP協(xié)議設(shè)計(jì)的初衷。四次揮手雖然多了一步,但提供了更高的可靠性和明確的狀態(tài)分離,有助于實(shí)現(xiàn)穩(wěn)定和可靠的連接關(guān)閉過(guò)程。
推薦學(xué)習(xí) https://xxetb.xetslk.com/s/p5Ibb