什么是tcp協(xié)議?TCP是一個(gè)超級(jí)麻煩的協(xié)議,而它又是互聯(lián)網(wǎng)的基礎(chǔ),也是每個(gè)程序員必備的基本功。
傳輸控制協(xié)議(TCP,Transmission Control Protocol)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,由IETF的RFC 793定義。
TCP旨在適應(yīng)支持多網(wǎng)絡(luò)應(yīng)用的分層協(xié)議層次結(jié)構(gòu)。 連接到不同但互連的計(jì)算機(jī)通信網(wǎng)絡(luò)的主計(jì)算機(jī)中的成對(duì)進(jìn)程之間依靠TCP提供可靠的通信服務(wù)。TCP假設(shè)它可以從較低級(jí)別的協(xié)議獲得簡單的,可能不可靠的數(shù)據(jù)報(bào)服務(wù)。 原則上,TCP應(yīng)該能夠在從硬線連接到分組交換或電路交換網(wǎng)絡(luò)的各種通信系統(tǒng)之上操作。
TCP/IP自下到上劃分為鏈路層、網(wǎng)絡(luò)層、傳輸層、應(yīng)用層。下層向上層提供能力,上層利用下層的能力提供更高的抽象。
鏈路層,也稱網(wǎng)絡(luò)接口層,包括操作系統(tǒng)的設(shè)備驅(qū)動(dòng)程序和網(wǎng)卡,它們一起處理與傳輸媒介(光纖等)的物理接口細(xì)節(jié)。
網(wǎng)絡(luò)層,也就是IP層,負(fù)責(zé)處理IP datagram在網(wǎng)絡(luò)中的傳輸,IP層傳輸?shù)氖荌P datagram,借助路由表,把IP datagram從網(wǎng)絡(luò)的一端傳輸?shù)搅硪欢耍喍灾篒P實(shí)現(xiàn)包的路由傳輸,IP協(xié)議和路由器工作在網(wǎng)絡(luò)層。
傳輸層,提供端到端之間的通信,包括提供面向連接和高可靠性的TCP,以及無連接不可靠的UDP。貌似TCP更好,但實(shí)際不是這樣,UDP因?yàn)椴恍枰ㄟB開銷,所以更快,應(yīng)用得也很廣,比如新一代互聯(lián)網(wǎng)協(xié)議HTTP3就從TCP轉(zhuǎn)向UDP,應(yīng)根據(jù)適應(yīng)場景選擇傳輸層協(xié)議。
應(yīng)用層,跟應(yīng)用相關(guān),不同應(yīng)用解決不同問題,需要不同的應(yīng)用層協(xié)議。
TCP工作方式
TCP是因特網(wǎng)中的傳輸層協(xié)議,使用三次握手協(xié)議建立連接。當(dāng)主動(dòng)方發(fā)出SYN連接請(qǐng)求后,等待對(duì)方回答SYN+ACK,并最終對(duì)對(duì)方的SYN執(zhí)行ACK確認(rèn)。
TCP三次握手的過程如下:
(1)客戶端發(fā)送SYN(SEQ=x)報(bào)文給服務(wù)端,進(jìn)入SYN_SEND狀態(tài)。
(2)服務(wù)端接收SYN報(bào)文,回應(yīng)一個(gè)SYN(SEQ=y)ACK(ACK=x+1)報(bào)文,進(jìn)入SYN_RECV狀態(tài)。
(3)客戶端收到服務(wù)器端的SYN報(bào)文,回應(yīng)一個(gè)ACK(ACK=y+1)報(bào)文,進(jìn)入Established狀態(tài)。
三次握手完成,TCP客戶端和服務(wù)器端成功的建立連接,可以開始傳輸數(shù)據(jù)了。
當(dāng)客戶端和服務(wù)端通過三次握手建立了 TCP 連接以后,當(dāng)數(shù)據(jù)傳送完畢,斷開連接就需要進(jìn)行TCP的四次揮手。其四次揮手如下所示:
第一次揮手,客戶端設(shè)置seq和 ACK ,向服務(wù)器發(fā)送一個(gè) FIN(終結(jié))報(bào)文段。此時(shí),客戶端進(jìn)入 FIN_WAIT_1 狀態(tài),表示客戶端沒有數(shù)據(jù)要發(fā)送給服務(wù)端了。
第二次揮手,服務(wù)端收到了客戶端發(fā)送的 FIN 報(bào)文段,向客戶端回了一個(gè) ACK 報(bào)文段。
第三次揮手,服務(wù)端向客戶端發(fā)送FIN 報(bào)文段,請(qǐng)求關(guān)閉連接,同時(shí)服務(wù)端進(jìn)入 LAST_ACK 狀態(tài)。
第四次揮手,客戶端收到服務(wù)端發(fā)送的 FIN 報(bào)文段后,向服務(wù)端發(fā)送 ACK 報(bào)文段,然后客戶端進(jìn)入 TIME_WAIT 狀態(tài)。服務(wù)端收到客戶端的 ACK 報(bào)文段以后,就關(guān)閉連接。此時(shí),客戶端等待 2MSL(指一個(gè)片段在網(wǎng)絡(luò)中較大的存活時(shí)間)后依然沒有收到回復(fù),則說明服務(wù)端已經(jīng)正常關(guān)閉,這樣客戶端就可以關(guān)閉連接了。