記錄 - 4.29
什么是TCP?
面向連接的、可靠的、字節(jié)流的。
UDP和TCP 的不同 : 連接、服務(wù)對象、可靠性、擁塞/流量控制、首部開銷(UDP 沒有【選項(xiàng)】字段)、傳輸方式(TCP 是流式傳輸,沒有邊界,保證順序和可靠;TCP是一個(gè)個(gè)包發(fā)送,有邊界)、分片不同
為什么 UDP 頭部沒有「首部長度」字段,而 TCP 頭部有「首部長度」字段呢?
TCP 有可變長的「選項(xiàng)」字段,而 UDP 頭部長度則是不會(huì)變化的,無需多一個(gè)字段去記錄 UDP 的首部長度。
TCP 連接建立過程:
客戶端會(huì)隨機(jī)初始化序號,將此序號放在TCP 首部的【序號】中,同時(shí)SYN為1,發(fā)送給服務(wù)端,之后客戶端處于SYN-SENT狀態(tài)
服務(wù)端收到SYN報(bào)文后,將自己的隨機(jī)初始化序號填到TCP首部的【序號】這種,并把 收到的SYN報(bào)文中的序號+1填入當(dāng)前報(bào)文的【確認(rèn)應(yīng)答號】中,并把ACK和SYN標(biāo)志置為1,之后服務(wù)端處于SYN-RCVD
客戶端收到服務(wù)端報(bào)文后,回應(yīng)ACK?!敬_認(rèn)應(yīng)答號】填入服務(wù)端序號+1,發(fā)送給服務(wù)端后,客戶端進(jìn)入ESTABLISHED狀態(tài)。并且此次發(fā)送可以攜帶數(shù)據(jù)。
為什么是三次握手?
三次握手才能保證雙方具有接收和發(fā)送的能力。
三次握手才可以阻止重復(fù)歷史連接的初始化(主要原因)
在兩次握手的情況下,服務(wù)端沒有中間狀態(tài)給客戶端來阻止歷史連接,導(dǎo)致服務(wù)端可能建立一個(gè)歷史連接,造成資源浪費(fèi)。
當(dāng)收到舊連接時(shí),當(dāng)服務(wù)端進(jìn)入SYN_RCVD后向服務(wù)端發(fā)送ACK,服務(wù)端根據(jù)ACK發(fā)送RST中止連接,如果只有兩次連接,那在服務(wù)端收到歷史連接的SYN 報(bào)文后就直接進(jìn)入ESTABLISHED 狀態(tài),并直接就進(jìn)行數(shù)據(jù)的發(fā)送,但這些數(shù)據(jù)都是不會(huì)被客戶端接收的,當(dāng)ACK 到達(dá)后,客戶端仍然會(huì)回復(fù)RST中止連接。
三次握手才可以同步雙方的初始序列號
三次握手才可以避免資源浪費(fèi)
小結(jié):
TCP 建立連接時(shí),通過三次握手能防止歷史連接的建立,能減少雙方不必要的資源開銷,能幫助雙方同步初始化序列號。序列號能夠保證數(shù)據(jù)包不重復(fù)、不丟棄和按序傳輸。
不使用「兩次握手」和「四次握手」的原因:
「兩次握手」:無法防止歷史連接的建立,會(huì)造成雙方資源的浪費(fèi),也無法可靠的同步雙方序列號;
「四次握手」:三次握手就已經(jīng)理論上最少可靠連接建立,所以不需要使用更多的通信次數(shù)。
為什么每次建立 TCP 連接時(shí),初始化的序列號要求不一樣?
為了防止歷史報(bào)文被下一個(gè)相同四元組的連接接收(主要方面);
為了安全性,防止黑客偽造的相同序列號的 TCP 報(bào)文被對方接收;
初始化序列號是基于時(shí)鐘計(jì)時(shí)器遞增的,基本不可能會(huì)隨機(jī)成一樣的初始化序列號。
既然IP層會(huì)分片,為什么TCP層還需要MSS 呢?
如果一個(gè)IP分片丟失,整個(gè)IP 報(bào)文的所有分片都得重傳。
為達(dá)到最佳的傳輸效能會(huì)進(jìn)行MSS值的協(xié)商,這樣也就不需要IP層的分片了。
一個(gè)TCP分片丟失后,重發(fā)也是以MSS為單位的,不用重傳所有的分片。
第一次握手丟失了,會(huì)發(fā)生什么?
重傳SYN報(bào)文。通常,重傳5次,第一次為1秒,每次超時(shí)的時(shí)間是上一次的兩倍。
第二次握手丟失了,會(huì)發(fā)生什么?
丟失的兩個(gè)內(nèi)容:ACK和SYN。服務(wù)端和客戶端都會(huì)觸發(fā)重傳
客戶端會(huì)重傳 SYN 報(bào)文,也就是第一次握手,最大重傳次數(shù)由 tcp_syn_retries內(nèi)核參數(shù)決定;
服務(wù)端會(huì)重傳 SYN-ACK 報(bào)文,也就是第二次握手,最大重傳次數(shù)由 tcp_synack_retries 內(nèi)核參數(shù)決定。
時(shí)間兩倍,超過次數(shù)則斷開連接。
第三次握手丟失了,會(huì)發(fā)生什么?
ACK報(bào)文是不會(huì)有重傳的。當(dāng)?shù)谌挝帐值膩G失時(shí),服務(wù)端會(huì)重傳SYN-ACK報(bào)文,直到收到第三次握手或者達(dá)到最大重傳次數(shù)。