JavaSE(二十二)——TCP协议的三次握手
文章目錄
- 1. TCP協(xié)議
- 2. TCP的三次握手
- 3. 為什么一定是三次握手?
1. TCP協(xié)議
TCP協(xié)議:傳輸控制協(xié)議,是可靠連接,類似于打電話,只有等待對方接通的時(shí)候才可以交流,也就是確認(rèn)了對方可以傳信息,才會(huì)發(fā)送信息。
UDP協(xié)議:用戶數(shù)據(jù)報(bào)協(xié)議,是不可靠的,就像發(fā)短信,發(fā)出去就完事了,對方是否接收到就與自己無關(guān)。
2. TCP的三次握手
初始狀態(tài):客戶端處于 closed(關(guān)閉)狀態(tài),服務(wù)器處于 listen(監(jiān)聽) 狀態(tài)。
第一次握手:客戶端發(fā)送請求報(bào)文將 SYN = 1同步序列號和初始化序列號seq = x發(fā)送給服務(wù)端,發(fā)送完之后客戶端處于SYN_Send狀態(tài)。
第二次握手:服務(wù)端受到 SYN 請求報(bào)文之后,如果同意連接,會(huì)以自己的同步序列號SYN(服務(wù)端) = 1、初始化序列號 seq = y和確認(rèn)序列號(期望下次收到的數(shù)據(jù)包)ack = x+ 1 以及確認(rèn)號ACK = 1報(bào)文作為應(yīng)答,服務(wù)器為SYN_Receive狀態(tài)。
第三次握手: 客戶端接收到服務(wù)端的 SYN + ACK之后,知道可以下次可以發(fā)送了下一序列的數(shù)據(jù)包了,然后發(fā)送同步序列號 ack = y + 1和數(shù)據(jù)包的序列號 seq = x + 1以及確認(rèn)號ACK = 1確認(rèn)包作為應(yīng)答,客戶端轉(zhuǎn)為established狀態(tài)。
3. 為什么一定是三次握手?
- 三次握手的本質(zhì)原因是因?yàn)橥ㄓ嵥幍耐ㄓ嶆溌泛托诺朗遣豢煽康?#xff0c;但是我們的通訊和數(shù)據(jù)傳輸需要的是可靠的信息流動(dòng),就像我們打電話一樣,不能我說了一句話那邊只聽到半句或者聽不到,我在等對方回答,對方卻在等待我的問題,這就進(jìn)入了死鎖的狀態(tài)會(huì)很尷尬。
- 通訊雙方為了解決這種不可靠,無論消息中包含什么信息,在數(shù)學(xué)歸納法來講,三次通訊是理論上的最小值,所以才有了三次握手。
- 簡單講,三次握手不是TCP的問題,也不是TCP所需要的必須條件,而是為了滿足在不可靠的鏈路信道上進(jìn)行可靠地消息傳輸這個(gè)問題需求所導(dǎo)致的。
- 鏈路信道不可靠,而需要數(shù)據(jù)傳輸可靠,三次達(dá)到了,也就解決了信道不可靠的問題。后面不管你交互任何信息就和進(jìn)行可靠的信息傳輸需求就沒關(guān)系了。因?yàn)槟阈诺揽煽苛藷o論你發(fā)送什么消息,什么時(shí)候發(fā)送,只要連接在,對方都一定能收的到。
總結(jié)
以上是生活随笔為你收集整理的JavaSE(二十二)——TCP协议的三次握手的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaSE(二十一)——栈和队列、栈和
- 下一篇: JavaSE(二十三)——JVM