關于TCP協定的部落格一直沒有開始寫,是因為一直不确定自己對TCP協定的認識是否正确,在近些時間查閱了很多書籍,文章之後,感覺對TCP協定有了一個大緻的認識,是以開始寫此篇部落格.(大多數人在學習TCP協定時,都習慣與UDP協定對比着學習,實際上這樣學習TCP也是完全可以的,因為很多TCP協定的特性與UDP協定的特性是完全對立的,是以如果要進行對比學習TCP協定的話,可以用此篇部落格結合之後的UDP協定的部落格進行對比學習)
TCP協定作為TCP/IP協定的核心協定,一直都是面試的必考題,也是對網絡知識學習的檢票員,是以對TCP協定有一個全面且清晰且正确的認識,是一個非常有必要的事情.
什麼是TCP協定
TCP協定全稱為傳輸控制協定,是TCP/IP協定的核心協定之一,位于TCP/IP協定4層模型的傳輸層.
傳輸層的作用
在發送資料時,傳輸層主要用于接收應用層的資料,對從應用層接受的資料進行封裝處理,然後向下發送給網絡層;
在接收資料時,傳輸層接收從網絡層發來的資料,對資料進行再傳輸層的解析,将解析完畢的資料發送給應用層.
TCP協定的特性
- 有連接配接:在使用TCP協定進行資料傳輸時,首先要進行連接配接,确認連接配接無誤後才可發送資料,在發送完資料之後,同樣要進行斷開連接配接.(通常将連接配接過程稱為三次握手,斷開過程稱為四次揮手)
該圖摘自
在TCP傳輸資料時,一般可将傳輸的兩方裝置分為用戶端(client)和服務端(server).
三次握手: 建立連接配接之前服務端首先要處于監聽(LISTEN)狀态,發起連接配接由用戶端首先發送一個SYN請求建立連接配接的資料包,用戶端進入SYN_SENT狀态等待應答,服務端在收到用戶端發來的SYN請求連接配接的資料時,會回複給用戶端一個ACK應答包,在這個ACK應答包中同樣包含着用戶端一個請求建立連接配接的資料,同時服務端進入SYN_RCVD狀态,在收到服務端的應答資料(ACK) + 請求資料(SYN)時, 用戶端回應服務端的請求資訊,向服務端發送應答資料(ACK),同時用戶端進入已連接配接狀态,在服務端接收到應答資料(ACK)時,也立即進入連接配接狀态,此時就可以互相傳輸資料,因為在連接配接時進過3次資料傳輸,是以連接配接過程被稱為三次握手.
四次揮手: 在資料發送完畢後,需要進行斷開連接配接,但在斷開連接配接時,用戶端和服務端都可以主動發起,是以這裡可以将斷開連接配接時的兩端稱為主動發起方和被動接受方,在斷開連接配接時,主動發起方向被動接受方發送一個FIN資料包,并且進入FIN_WAIT_1狀态,表示資料已傳輸完畢,請求斷開連接配接,被動接受方在收到資料後先向主動發起方發送一個應答(ACK)包并進入等待關閉CLOSE_WAIT狀态,在主動發起方接收到這個應答包後,立即進入FIN_WAIT_2狀态,等待被動方發起斷開請求,當被動接受方确認資料發送完畢後,會再次向主動發起方發送一個FIN+ACK(依然算是上一個應答包),請求關閉連接配接,并進入LAST_ACK狀态,等待最後的應答包,在主動方收到被動方發送的請求關閉連接配接資料時,會向被動方發送一個應答包,表示可以進行斷開了,随後主動方進入TIME_WAIT狀态,在經過2MSL時長後關閉連接配接,釋放資源,被動方在收到應答包後立即斷開連接配接,釋放資源,因斷開連接配接時要經過四次資料傳輸過程,是以稱之為四次揮手.
-
可靠傳輸:在TCP資料傳輸過程中TCP協定具有很多安全檢測功能,保證資料傳輸過程中的可靠性.
資料傳輸前的連接配接過程就是一種可靠傳輸的保證.
在TCP進行資料傳輸時,會附加發送一個校驗和,來保證資料的完整性.
TCP 給發送的每一個包進行編号,接收方對資料包進行排序,把有序資料傳送給應用層.
在TCP傳輸資料時還有一個可變大小的滑動視窗進行流量控制,防止緩沖區溢出.
還有一些機制進行網絡擁塞控制.
最後還有逾時重傳(如果不能在有限時間内收到發送出資料的應答資料,會進行重新發送),确認應答(在收到資料後,要進行對資料接收到的應答資料的發送)等機制保證TCP傳輸資料的可靠性.
以上所有功能都為TCP的可靠特性提供了依據.
-
基于位元組流
TCP 協定的資料并不會以消息為機關向目的主機傳輸,這些資料在某些情況下會被組合成一個資料段發送給目标的主機 ,其中不存在消息和資料包的概念,TCP在接收到上層資料後,會将資料放入一個緩沖區,然後從緩沖區讀取資料進行發送,是以,使用TCP協定發送資料時,并不關心要發送的來自哪個資料包.
TCP協定常考問題
-
為什麼是3次握手?
因為TCP協定是全雙工通信協定,也就是說,TCP在進行資料傳輸時,兩端都可以同時進行發送和接受資料,是以,在進行連接配接時,兩端都要進行對環路的檢測,首先用戶端發起連接配接請求,在接收到應答後,用戶端才可以确定環路通暢,可以進行資料 發送,服務端同樣要進行檢測,是以,服務端也要進行請求,并接收應答,在第二次握手時,将服務端的應答和請求壓縮為一個資料包,是以需要進行3次握手,而2次不足以完成連接配接,4次則又多餘,浪費資源.
-
為什麼是4次揮手?
4次揮手是因為主動發起方首先要進行發起關閉請求,被動方收到後,要立即回複一個應答包,之後檢測被動端資料是否發送完畢(發送完畢并且受到接收應答),在确認發送完畢後才會發起一個确認關閉請求,等待最後一個應答包,當主動方受到被動方發送的确認關閉請求時,會發送一個應答包,并進入TIME_WAIT狀态,經過2MSL之後斷開連接配接,被動方受到應答包之後直接進入關閉狀态并釋放資源.為什麼關閉時應答包和請求關閉包不能合并,因為關閉時,主動方并不知道被動方資料是否已經發送完畢,被動方要檢測所有資料發送完畢後才進行關閉請求.
-
為什麼要進入TIME_WAIT狀态等待2MSL?
MSL為一個資料包在網絡中存活的最長時間,在最後一次應答包發送時,若在網絡中丢失,就會導緻被動方收不到應答包,一直處于等待狀态,逾時之後會請求主動方重新發送,若主動方此時已經關閉連接配接,則收不到此處的請求,就會導緻被動方無法關閉.另外,如果不進行等待,若此時再重新開機一個用戶端進行連接配接(假設使用端口一樣),則可能導緻上次在網絡中殘留的資料被此次連接配接接收到,導緻資料混亂.
-
TCP協定握手時是否可以攜帶資料,可以在第幾次握手時攜帶?
可以攜帶資料,可以在第三次攜帶,因為第三次握手時,若到達服務端,則表示連接配接無誤,資料也自然可以到達服務端,若是未到達服務端,則表示連接配接失敗,則不可以發送資料.第一次和第二次握手都不可以攜帶資料,因為第一次和第二次握手成功之後都不可以保證連接配接無誤,若此時攜帶資料,則會破壞TCP協定的連接配接特性.
TCP協定雖然有很多優點,但是也有一個最緻命的缺點,那就是傳輸速度慢,在進行了大量的可靠傳輸保證中消耗了很多性能,是以傳輸速率非常慢,在以後與UDP的對比中會越發明顯