本文旨在簡單羅列基礎(chǔ)知識點(diǎn),復(fù)習(xí)就看一看唤蔗,第一次學(xué)不建議看探遵。
連接
技術(shù)要點(diǎn):
- SYN=1 表示此包為發(fā)起連接包
- seq 表示已經(jīng)傳輸?shù)搅硕嗌僮止?jié),起始從一個隨機(jī)數(shù) x 開始措译,seq = x + 已經(jīng)全部發(fā)出去的數(shù)據(jù)長度
- ack 用于確認(rèn)接收别凤,表示到目前為止接收到了多少個字節(jié),ack = seq + 發(fā)來的數(shù)據(jù)長度
通信
技術(shù)要點(diǎn):
- 在通信過程中领虹,不會對每一個包都返回一個 ACK 规哪,可以提高傳輸效率,也不會影響確認(rèn)
- 超時重傳 在得到對方 ACK 確認(rèn)前塌衰,發(fā)過的包都會保存在緩沖區(qū)中诉稍。如果對方?jīng)]有發(fā)回 ACK ,那就重新發(fā)送這些包
- 擁塞控制和慢啟動 TCP 會在發(fā)送數(shù)據(jù)的過程中持續(xù)測量 ACK 號的返回時間最疆,如果 ACK 號返回的慢杯巨,則相應(yīng)延長等待時間;相對的努酸,如果 ACK 號馬上就能返回服爷,則相應(yīng)縮短等待時間。在剛開始發(fā)送時比較慢获诈,然后逐漸加速
- 滑動窗口 因為發(fā)送方和接收方的數(shù)據(jù)處理能力不匹配仍源,所以接收方會有一個緩存區(qū)(這個緩沖區(qū)的大小可以自己設(shè)定),用來存還顧不上處理的數(shù)據(jù)舔涎,并且在刷新緩沖區(qū)大小時笼踩,還會向發(fā)送方發(fā)送自己當(dāng)前緩沖區(qū)的大小(和時間相近的 ACK 號合并發(fā)送)亡嫌,以便于發(fā)送方調(diào)整自己的發(fā)送速度以配合接收方嚎于。
斷開
技術(shù)要點(diǎn):
- FIN 表示是斷開連接的包
-
為啥連接需要三次通信掘而,斷開需要四次?
這里我有一點(diǎn)自己的理解:其實(shí) TCP 中每完成一次傳遞信息都需要兩次通信(發(fā)信息一次于购,ACK確認(rèn)一次)袍睡,而連接或斷開都需要兩次傳遞信息,(服務(wù)端和客戶端都要告訴對方自己可以 連接/斷開 了)肋僧,本來都需要四次通信女蜈,而連接操作相當(dāng)于是把第二次和第三次合并了,所以只需要三次通信色瘩。斷開操作則不能合并伪窖,因為當(dāng)客戶端的斷開請求過來時,要留一點(diǎn)時間讓服務(wù)器確認(rèn)數(shù)據(jù)是不是發(fā)完了居兆,或是服務(wù)器先斷開時讓客戶端確認(rèn)數(shù)據(jù)是不是收完了 -
為啥客戶端最后還不關(guān)覆山,還要等一段時間再關(guān)?
可以防止誤操作泥栖,這里舉個例子:如果圖中最后一個ACK丟失了簇宽,服務(wù)端又發(fā)了一個刪除套接字的 FIN 過去,萬一原來的套接字已經(jīng)刪了吧享,而且又創(chuàng)建了一個在監(jiān)聽同一端口的套接字魏割,那就有可能把剛創(chuàng)建的那個套接字刪了