什么是TCP呢?
由三個單詞組成的Transport Control Protocol,字面理解是傳輸控制協(xié)議,可以理解為比特同學(xué)要想在網(wǎng)絡(luò)泳池里游泳,那么他必須學(xué)習(xí)傳輸層控制技能,并且要掌握相應(yīng)的動作——協(xié)議,他才能在暢游世界網(wǎng)絡(luò)這個超大型游泳池。
TCP:一個傳輸層協(xié)議,提供Host-To-Host的可靠傳輸,支持全雙工,是一個面向連接的協(xié)議。

TCP工作在傳輸層,它的上層是應(yīng)用層,應(yīng)用就是人們常用的微信、抖音、王者榮耀等服務(wù)工作的協(xié)議。兩臺不同的設(shè)備使用微信聊天,發(fā)送語音,需要實現(xiàn)Host-To-Host的數(shù)據(jù)通信,那么就可以直接調(diào)用TCP協(xié)議進(jìn)行。
調(diào)用TCP通信時需要指定通信的端口,不同的端口對應(yīng)不同應(yīng)用,不同IP對應(yīng)不同的主機(jī),也就是不同的設(shè)備。這就涉及到網(wǎng)絡(luò)地址——IP地址,工作在網(wǎng)絡(luò)層,當(dāng)然TCP層只負(fù)責(zé)把對應(yīng)的IP地址和端口傳給網(wǎng)絡(luò)層即可,具體業(yè)務(wù)由網(wǎng)絡(luò)層來實現(xiàn)。
互聯(lián)網(wǎng)層,即Network Layer,提供地址和地址間的通信,只關(guān)注地址到地址Address-To-Address間通信,具體設(shè)備間通信由數(shù)據(jù)鏈路層實現(xiàn),數(shù)據(jù)鏈路層關(guān)注MAC地址間通信,具體的物理設(shè)備,傳輸介質(zhì)由物理層負(fù)責(zé)。
以上就是TCP/IP協(xié)議常用的層級分割,最終目的就是為Host-To-Host服務(wù),實現(xiàn)應(yīng)用到應(yīng)用的通信服務(wù)。
什么是連接和會話呢?
連接事需要通信雙方相互配合來實現(xiàn)的,是雙方達(dá)成的一種即時的狀態(tài)約定,保證通信雙方都在線,都有能力為接下來的數(shù)據(jù)傳輸做出盡快的響應(yīng),我們稱之為連接。
連接是網(wǎng)絡(luò)行為狀態(tài)的記錄,既然連接需要雙方共同努力,那么就需要雙方都有一個對象來記憶當(dāng)前傳輸?shù)臄?shù)據(jù)類型,對方的端口、已經(jīng)傳輸了多少,效率怎么樣等等一些關(guān)注點。
那么與之相關(guān)聯(lián)的另一個名詞會話(Session),是什么意思呢,會話是應(yīng)用的行為。大家每次用微信聊天時都會有一個窗口,用來發(fā)送信息,你來我往,這個窗口中會有很多條信息,我們稱之為會話,當(dāng)我們在會話進(jìn)行中,連接一定是在通信狀態(tài)的。聊一會,累了,退出微信了,但是一般我們不會刪除我們的會話內(nèi)容,這時會話還在,但是連接已經(jīng)中斷。
雙工/單工問題
想想自己理解的是什么?
單工:任何時間,數(shù)據(jù)只能單向發(fā)送,單工至少需要一條線路
半全雙工:某一時候可以雙向發(fā)送數(shù)據(jù),至少需要一條線路
全雙工:任何時刻都可以雙向發(fā)送數(shù)據(jù),大于一條線路
這里線路不一定真實存在物理線路,可能采用模擬的形式實現(xiàn)
TCP是一個全雙工協(xié)議,數(shù)據(jù)任何時刻都可以雙向發(fā)送,這說明服務(wù)器和客戶端可以根據(jù)需要選擇任意時刻發(fā)送和接收信息,所以呢都可以被稱為主機(jī)(Host)
可靠性的定義
TCP可以提供可靠性,那么可靠性具體的實現(xiàn)方式是什么呢?
可靠性指數(shù)據(jù)無損傳輸。發(fā)送主機(jī)按照順序發(fā)送數(shù)據(jù),數(shù)據(jù)通過網(wǎng)絡(luò)傳輸,收不同網(wǎng)絡(luò)條件限制,數(shù)據(jù)不會按照發(fā)送時的順序到達(dá)接收方,這時我們就需要一種算法來保證接收方可以還原出發(fā)送方的順序。這里還有一個概念叫多播,發(fā)送方同時發(fā)送給多個接收方信息,如果接收方中有一個接收到了這條信息,我們的可靠性就必須保證其他接收方也必須接收到相同的信息,這里我們不討論多播。
TCP的握手和揮手
TCP是一個面向連接的連接的協(xié)議,握手是建立連接的過程,揮手是斷開連接的過程。
TCP的基本操作
- 我們把發(fā)起請求叫SYN(Synchronization),指一個主機(jī)開始發(fā)送信息,會首先發(fā)送一個SYN給響應(yīng)方,按照字面意思理解是同步請求,我把這個理解為發(fā)起方請求
- 主動斷開請求叫FIN(Finish)
- 主動推送信息叫PSH(Push)
以上三種操作以后,另一方必須立即給發(fā)起方返回一個ACK(Ackknowledgement),這是TCP保證可靠性的要求。如果一方不回復(fù)發(fā)送方ACK,發(fā)送方則認(rèn)為接收方?jīng)]有收到信息,會重新發(fā)送。
建立連接的過程-三次握手
三次握手的形成和TCP要求每次發(fā)送方發(fā)送信息以后,接收方必須返回ACK確認(rèn)有直接的關(guān)系

上圖描述了TCP建立連接的過程,分為6步:
- 客戶端發(fā)送SYN——建立連接請求
- 服務(wù)端收到SYN——開始接收數(shù)據(jù)準(zhǔn)備
- 服務(wù)端返回ACK——已收到客戶端請求
- 服務(wù)端發(fā)送SYN——詢問客戶端是否準(zhǔn)備好
- 客戶端收到服務(wù)端SYN——開始準(zhǔn)備發(fā)送數(shù)據(jù)
- 客戶端返回ACK——收到服務(wù)端請求
TCP建立連接的過程如上,那么為什么是三次呢?
第二步服務(wù)端做準(zhǔn)備,因為是首次收到發(fā)送數(shù)據(jù)請求,無需處理,可以立刻進(jìn)入數(shù)據(jù)交互狀態(tài),所以可以立刻發(fā)送給客戶端SYN,告訴客戶端,我已準(zhǔn)備好,所以第三步和第四步可以合并為一次握手——ACK-SYN,然后客戶端回應(yīng)ACK,連接建立完成

以上就是三次握手了
具體在數(shù)據(jù)交互過程,ACK和SYN等需要用標(biāo)識位來標(biāo)記,在實際應(yīng)用中,我們一般使用1來表示開啟,0表示關(guān)閉。
那么四次揮手為什么是四次呢,主要是因為,揮手時服務(wù)端收到FIN以后,不能馬上回復(fù)FIN,因為自身還有任務(wù)沒有處理完,所以上面所說的6步中,第3、4步就不能一起回復(fù),只能先回復(fù)ACK,等自身任務(wù)處理完畢,才能告訴客戶端,我已經(jīng)準(zhǔn)備好,可以關(guān)閉連接,這樣就需要4次數(shù)據(jù)交互,如下圖:
