TCP有主要有兩個(gè)特點(diǎn):
- 面向連接:需要客戶端和服務(wù)器在發(fā)送數(shù)據(jù)之前有連接
- 可靠傳輸:客戶端與服務(wù)器之間發(fā)送的數(shù)據(jù)是可靠的(無損壞,按順序)
下面總結(jié)一下TCP的一些知識點(diǎn):
三次握手
- 用于客戶端和服務(wù)器建立連接
- 第一步:客戶端向服務(wù)器發(fā)送一個(gè)特殊的TCP報(bào)文段筋现,表示想建立連接(SYN=1)
- 第二步:服務(wù)器收到該報(bào)文唐础,向客戶端發(fā)送允許連接的報(bào)文段(SYN=1箱歧,ACK=1)
- 第三步:客戶端收到該報(bào)文,向服務(wù)器發(fā)送連接成功的報(bào)文段(ACK=1)一膨,同時(shí)在該報(bào)文段中攜帶數(shù)據(jù)
- 為什么不是兩次握手呀邢?如果在第二步服務(wù)器收到報(bào)文就建立了連接,服務(wù)器會一直等待客戶端發(fā)送數(shù)據(jù)豹绪,但客戶端可能在第一步之后就段開了連接价淌,導(dǎo)致服務(wù)器白白等待,浪費(fèi)資源
- 為什么不是四次握手瞒津?因?yàn)樵诘谌讲跻拢蛻舳税l(fā)送連接成功的同時(shí),可以攜帶數(shù)據(jù)巷蚪,沒必要分開發(fā)送病毡,如果服務(wù)器收到了連接成功,還可以順帶接收一次數(shù)據(jù)屁柏。
四次握手
- 用于客戶端和服務(wù)器斷開連接
- 第一步:客戶端向服務(wù)端發(fā)送一個(gè)特殊的TCP報(bào)文段啦膜,表示想斷開連接(FIN=1)
- 第二步:服務(wù)器收到該報(bào)文段后會向客戶端發(fā)送一個(gè)確認(rèn)報(bào)文段(SYN=1)
- 第三步:服務(wù)端發(fā)送自己的終止報(bào)文段,表示想斷開連接(FIN=1)
- 第四步:客戶端收到服務(wù)端的終止報(bào)文段后淌喻,向服務(wù)端發(fā)送一個(gè)確認(rèn)報(bào)文段(SYN=1)(bouns:同時(shí)客戶端還會等待TIME_WAIT僧家,在這段時(shí)間內(nèi)沒有服務(wù)器重傳的FIN,才正式斷開連接似嗤,以確毙ネ危客戶端最后的ACK能夠達(dá)到服務(wù)器)
- 為什么斷開連接要四次握手,而不像建立連接要三次烁落?客戶端和服務(wù)器的斷開連接請求要分開發(fā)乘粒,客戶端數(shù)據(jù)傳輸完畢,就可以請求斷開連接伤塌,發(fā)送FIN并等待SYN灯萍,但此時(shí)服務(wù)器可能還有數(shù)據(jù)需要傳輸,所以先發(fā)送SYN表示同意客戶端可以斷開連接每聪,等自己數(shù)據(jù)傳輸結(jié)束旦棉,再發(fā)送自己斷開連接的請求FIN。
- 為什么不是五次握手药薯?沒必要绑洛,因?yàn)樗拇尉涂梢源_認(rèn)雙方都已經(jīng)斷開連接。
可靠數(shù)據(jù)傳輸
- 校驗(yàn)和:檢測數(shù)據(jù)在傳輸過程中的有無變化
- 數(shù)據(jù)序列號Seq和確認(rèn)序列號Ack:TCP把數(shù)據(jù)封裝到很多個(gè)報(bào)文段中童本,每個(gè)報(bào)文段都包含一個(gè)序列號Seq真屯,和一個(gè)確認(rèn)序列號Ack,Seq告訴接收者當(dāng)前發(fā)送的報(bào)文編號穷娱,Ack告訴接收者绑蔫,我已經(jīng)收到了哪些數(shù)據(jù)运沦。
-
超時(shí)重傳機(jī)制:對一個(gè)報(bào)文段,指定一個(gè)定時(shí)器配深,如果在超時(shí)時(shí)間內(nèi)未收到Ack携添,則重傳該報(bào)文段,有以下注意點(diǎn):
- 如果是發(fā)送數(shù)據(jù)超時(shí)篓叶,接收端沒有收到烈掠,直接重傳即可。
- 如果是接收端已經(jīng)收到澜共,但是發(fā)送Ack超時(shí)向叉,那發(fā)送端重傳后,接收端再收到嗦董,直接丟棄重傳數(shù)據(jù)母谎,再發(fā)送Ack即可
- 累積確認(rèn)機(jī)制:接收方收到一個(gè)Seq,只有在上一個(gè)Seq收到的基礎(chǔ)上京革,才會發(fā)出Ack奇唤,這意味著,發(fā)送方收到了一個(gè)大的Ack匹摇,即使較小的Ack丟失咬扇,都代表著大Ack之前的所有數(shù)據(jù)都接受成功了
流量控制
- 接收方有一個(gè)接收緩存,為了保證接收緩存不會溢出廊勃,TCP通過滑動(dòng)窗口機(jī)制來控制流量懈贺。
- TCP會話的雙方都各自維護(hù)一個(gè)發(fā)送窗口和一個(gè)接收窗口的變量來提供流量控制,發(fā)送窗口的大小是由接收窗口來決定
- 發(fā)送窗口表示兩類數(shù)據(jù):1. 已發(fā)送坡垫,但未收到Ack梭灿。2. 未發(fā)送,但允許發(fā)送冰悠。發(fā)送窗口只有收到已發(fā)送的Ack堡妒,才會移動(dòng)發(fā)送窗口的左邊界。
- 接收窗口表示未接收但準(zhǔn)備接收的數(shù)據(jù)溉卓,接收窗口只有在前面所有的報(bào)文段都確認(rèn)的情況下才會移動(dòng)左邊界
- 接收窗口的空間=接收緩存大小-(已接收的最大Ack-已讀取的最大Ack)皮迟,空間為零時(shí),發(fā)送端停止發(fā)送數(shù)據(jù)
擁塞控制
- 通過TCP擁塞控制算法來限制發(fā)送方向連接發(fā)送流量的速率桑寨,主要包括慢啟動(dòng)伏尼、擁塞避
- 慢啟動(dòng): 發(fā)送方以1MSS的速率開始發(fā)送,收到確認(rèn)后尉尾,以指數(shù)增長烦粒。
- 擁塞避免:收到3次重復(fù) Acks,發(fā)送速率降一半,之后線性增長