简谈TCP的八个特性
TCP
1.確認(rèn)應(yīng)答ACK機(jī)制(可靠核心機(jī)制)
需要具體知道序號(hào)和確認(rèn)序號(hào)的含義, 每個(gè)字節(jié)的內(nèi)容都有序號(hào), 比如發(fā)送方發(fā)送了1~1000, 1001~2000, 的兩段數(shù)據(jù), 但是1001開(kāi)始的數(shù)據(jù)丟了, 那么接收方就會(huì)發(fā)送一個(gè)ACK確認(rèn)報(bào)文, 其中的確認(rèn)序號(hào)就1001, 代表我前面的1到1000的數(shù)據(jù)收到了, 下次需要你從1001開(kāi)始發(fā)送, 這樣發(fā)送方就知道了, 1001~2000丟了, 需要重傳
2. 超時(shí)重傳機(jī)制(可靠核心機(jī)制)
超時(shí)時(shí)間的重傳, 當(dāng)我們重傳之后數(shù)據(jù)報(bào)可能會(huì)被接收方收到多次, 那么如何將其去重呢,就要用到上面的序號(hào)了, 序號(hào)相同的我只保留一份即可**(因?yàn)榘l(fā)送方是無(wú)法區(qū)分是數(shù)據(jù)報(bào)丟了, 還是確認(rèn)的ACK丟了)**
3. 連接管理(面試必考)
- 建立連接 三次握手的過(guò)程
- 斷開(kāi)連接 四次揮手的過(guò)程
三次握手來(lái)確認(rèn)通信雙方的發(fā)送和接收能力是否正常
a) 第一次,a給b發(fā)送了一句喂喂喂你能聽(tīng)見(jiàn)嗎? b如果接收到了這句話, 就證明b現(xiàn)在已經(jīng)知道了a的發(fā)送能力和b的接收能力是正常的, 現(xiàn)在需要驗(yàn)證自己的發(fā)送能力和a的接收能力, 并將自己知道的也發(fā)送給對(duì)方
b)第二次, b就給a 發(fā)送了一個(gè)我能聽(tīng)見(jiàn), 你可以聽(tīng)見(jiàn)我嗎? 這樣的話 如果a接收到了b 的這條信息, 那么就證明a剛剛驗(yàn)證自己的發(fā)送和b的接收是正常的, 同時(shí)a自己知道了b的發(fā)送能力 和 a自己的接收能力是好的, 此時(shí)a就是知道了雙方的發(fā)送和接收是正常的,但是此時(shí)b是正在驗(yàn)證自己的發(fā)送能力和a 的接收能力是不是好的, 所以我們還需要a再次發(fā)送給b一條消息來(lái)告知是好的
c)第三次, a給b說(shuō)一句我能聽(tīng)到, 此時(shí)b收到了消息, 那么就證明b上面驗(yàn)證自己的發(fā)送能力和a的接收能力是好的, 此時(shí)通信雙方就都知道了雙方的發(fā)送和接收能力是好的, 就可以發(fā)送正文了
四次揮手來(lái)斷開(kāi)雙方連接
a) 首先是數(shù)據(jù)傳輸階段, 通信雙方正常傳輸數(shù)據(jù)
b) 當(dāng)客戶端數(shù)據(jù)發(fā)送完畢時(shí), 應(yīng)用層調(diào)用close()方法,客戶端會(huì)發(fā)送一個(gè)FIN = 1其序列號(hào)為seq=m(等于前面已經(jīng)傳送過(guò)來(lái)的數(shù)據(jù)的最后一個(gè)字節(jié)的序號(hào)加1)的數(shù)據(jù)報(bào), 此時(shí)客戶端進(jìn)入FIN_WAIT_1階段
c) 當(dāng)服務(wù)端,一收到了客戶端傳來(lái)的FIN報(bào)文段,操作系統(tǒng)內(nèi)核就立馬會(huì)發(fā)送一個(gè)ACK確認(rèn)報(bào)文, 此時(shí)服務(wù)端進(jìn)入CLOSE_WAIT狀態(tài), 半關(guān)閉狀態(tài)此時(shí)客戶端就沒(méi)有數(shù)據(jù)要發(fā)送了, 但是客戶端還會(huì)接收服務(wù)端傳輸過(guò)來(lái)的數(shù)據(jù), 服務(wù)端之前還有客戶端發(fā)送來(lái)的數(shù)據(jù)存在緩沖區(qū)需要處理,所以需要等待處理完之后才會(huì)調(diào)用close()方法來(lái)發(fā)送一個(gè)FIN報(bào)文, 服務(wù)端發(fā)送完FIN之后就會(huì)立馬進(jìn)入LAST_ACK狀態(tài)
d) 一當(dāng)上面的客戶端收到了來(lái)自服務(wù)端的ACK報(bào)文就會(huì)立馬進(jìn)入FIN_WAIT_2階段, 在這階段一直等待服務(wù)端的FIN報(bào)文, 當(dāng)客戶端收到了FIN報(bào)文段就會(huì)進(jìn)入TIME_WAIT狀態(tài), 并發(fā)送ACK確認(rèn)報(bào)文段給服務(wù)端
e) 當(dāng)服務(wù)端在最后收到了來(lái)自客戶端的ACK報(bào)文, 那么就會(huì)立馬進(jìn)入CLOSED狀態(tài)斷開(kāi)連接了
f) 但此時(shí)客戶端還不會(huì)立馬進(jìn)入CLOSED狀態(tài), 因?yàn)樽詈蟮腁CK報(bào)文段可能丟失, 所以需要等待2*MSL時(shí)間來(lái), 確保數(shù)據(jù)丟失的情況下來(lái)超時(shí)重傳
g) 為什么這個(gè)時(shí)間是 2*MSL呢?
? 我們假設(shè)FIN/ ACK 報(bào)文在網(wǎng)絡(luò)上由客戶端傳輸?shù)椒?wù)端需要花費(fèi)的最大時(shí)間為MSL(就是取個(gè)名字), 舉個(gè)例子 比如 : 我客戶端發(fā)送了ACK確認(rèn)報(bào)文, 但他在中途丟了, 那么是不是服務(wù)端就一直沒(méi)有收到ACK確認(rèn)報(bào)文, 那么他就會(huì)重傳 FIN結(jié)束報(bào)文, 但此時(shí)要是我客戶端直接發(fā)送完ACK后直接關(guān)閉了, 那么就無(wú)法響應(yīng)服務(wù)器的二次請(qǐng)求,這樣服務(wù)器會(huì)繼續(xù)發(fā)出FIN報(bào)文,從而變成了死循環(huán)。所以我們要設(shè)置一個(gè)時(shí)間段 : 如果在這個(gè)時(shí)間段內(nèi)接收到了服務(wù)器端的再次請(qǐng)求,則代表客戶端發(fā)出的ACK報(bào)文沒(méi)有接收成功。反之,則代表服務(wù)器端成功接收響應(yīng)報(bào)文,客戶端進(jìn)入CLOSED狀態(tài),此次連接成功關(guān)閉。而這個(gè)時(shí)間,就規(guī)定為了2MSL,即客戶端發(fā)出ACK報(bào)文到服務(wù)器端的最大時(shí)間 + 服務(wù)器沒(méi)有接收到ACK報(bào)文再次發(fā)出FIN的最大時(shí)間 = 2MSL
4.滑動(dòng)窗口(結(jié)合確認(rèn)序號(hào)來(lái)理解)
是一種用來(lái)提高傳輸效率的機(jī)制, 批量的發(fā)送數(shù)據(jù), 批量的等待ACK
不等待ACK所發(fā)送的最大數(shù)據(jù)量, 就稱為滑動(dòng)窗口
每收到一個(gè)ACK, 就對(duì)應(yīng)的發(fā)后面的數(shù)據(jù), 等待窗口的范圍一直在往后移
5.流量控制
在滑動(dòng)窗口的機(jī)制上, 限制傳輸?shù)男?就是限制窗口的大小)
接收方的接收緩沖區(qū)的空余大小,反向反饋發(fā)送者的滑動(dòng)窗口大小
ACK報(bào)文的報(bào)頭中, 有一個(gè)"窗口大小"字段, 這個(gè)字段就是接收方的接收緩沖區(qū)的空余空間大小
發(fā)送者也會(huì)定時(shí)的發(fā)送探測(cè)報(bào)文, 試探接收方的緩沖區(qū)的空余空間
6.擁塞控制
也是限制傳輸效率, 根據(jù)網(wǎng)絡(luò)當(dāng)前的擁堵情況, 動(dòng)態(tài)決定實(shí)際傳輸?shù)拇翱诖笮?/p>
實(shí)際發(fā)送方的窗口大小 = min(擁塞窗口大小, 流量控制窗口大小)
7.延遲應(yīng)答
目的是為了提高效率, 在流量控制的基礎(chǔ)上, 盡量返回一個(gè)合理的但是又比較大的窗口
其實(shí)就是讓ACK的發(fā)送時(shí)間晚一點(diǎn)(在不影響可靠性的前提下)
延遲的時(shí)間中就會(huì)給應(yīng)用程序提供更多的消費(fèi)數(shù)據(jù)的機(jī)會(huì) ~~ 此時(shí)時(shí)間到了, 我再發(fā)送ACK, 得到的緩沖區(qū)大小就會(huì)比剛剛大一些
不是所有的包都可以延遲應(yīng)答, 有數(shù)量限制和時(shí)間限制
8. 捎帶應(yīng)答
在延遲應(yīng)答的基礎(chǔ)上, 為了進(jìn)一步提高程序運(yùn)行效率而引進(jìn)的機(jī)制
本質(zhì)上就是把兩個(gè)包,合并成為一個(gè)就是捎帶, 節(jié)省帶寬
9. 心跳機(jī)制
心跳包 就是在客戶端和服務(wù)器間定時(shí)通知對(duì)方自己狀態(tài)的一個(gè)自己定義的命令字,按照一定的時(shí)間間隔發(fā)送,類似于心跳,所以叫做心跳包。 用來(lái)判斷對(duì)方(設(shè)備,進(jìn)程或其它網(wǎng)元)是否正常運(yùn)行,采用定時(shí)發(fā)送簡(jiǎn)單的通訊包,如果在指定時(shí)間段內(nèi)未收到對(duì)方響應(yīng),則判斷對(duì)方已經(jīng)離線。 用于檢測(cè)TCP的異常斷開(kāi)。
總結(jié)
以上是生活随笔為你收集整理的简谈TCP的八个特性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 简谈Redis的线程模型
- 下一篇: IP报文字段