TCP是面向鏈接的傳輸層協議,它提供可靠交付的、全雙工的、面向字節流的點對點服務。HTTP協議即是基於TCP協議實現的。(雖然做爲應用層協議,HTTP協議並無明確要求必須使用TCP協議做爲運輸層協議,可是由於HTTP協議對可靠性的的要求,默認HTTP是基於TCP協議的。如果使用UDP這種不可靠的、盡最大努力交付的運傳輸層協議來實現HTTP的話,那麼TCP協議的流量控制、可靠性保障機制等等功能就必須所有放到應用層來實現)而相比網絡層更進一步,傳輸層着眼於應用進程間的通訊,而不是網絡層的主機間的通信。咱們常見的端口、套接字等概念就是由此而生。(端口表明主機上的一個應用進程、而套接字則是ip地址與端口號的合體,能夠在網絡範圍內惟一肯定一個應用進程)TCP協議的可靠傳輸是經過滑動窗口的方法實現的;擁塞控制則有着慢開始和擁塞避免、快重傳和快恢復、RED隨機早期檢測幾種辦法。緩存
TCP協議的報文服務器
TCP報文段的首部分爲固定部分和選項部分,固定部分長20byte,而選項部分長度可變。(若整個首部長度不是4byte的整數倍的話,則須要用填充位來填充)在固定首部中,與本文密切相關的是如下幾項:網絡
seq(序號):TCP鏈接字節流中每個字節都會有一個編號,而本字段的值指的是本報文段所發送數據部分第一個字節的序號。spa
ack(確認號):表示指望收到的下一個報文段數據部分的第一個字節的編號,編號爲ack-1及之前的字節已經收到。blog
SYN:當本字段爲1時,表示這是一個鏈接請求或者鏈接接受報文。進程
ACK:僅當本字段爲1時,確認號纔有效。ip
FIN:用來釋放一個鏈接。當本字段爲1時,表示此報文段的發送端數據已發送完畢,要求釋放運輸鏈接。資源
TCP三次握手過程同步
傳輸鏈接具備三個階段:鏈接創建、數據傳送以及鏈接釋放。傳輸鏈接管理就是對鏈接創建以及鏈接釋放過程的管控,使得其能正常運行,達到這些目的:使通訊雙方可以確知對方的存在、能夠容許通訊雙方協商一些參數(最大報文段長度、最大窗口大小等等)、可以對運輸實體資源進行分配(緩存大小等)。TCP鏈接的創建採用客戶-服務器模式:主動發起鏈接創建的應用進程叫作客戶,被動等待鏈接創建的應用進程叫作服務器。服務器端
鏈接創建階段:
第一次握手:客戶端的應用進程主動打開,並向客戶端發出請求報文段。其首部中:SYN=1,seq=x。
第二次握手:服務器應用進程被動打開。若贊成客戶端的請求,則發回確認報文,其首部中:SYN=1,ACK=1,ack=x+1,seq=y。
第三次握手:客戶端收到確認報文以後,通知上層應用進程鏈接已創建,並向服務器發出確認報文,其首部:ACK=1,ack=y+1。當服務器收到客戶端的確認報文以後,也通知其上層應用進程鏈接已創建。
在這個過程當中,通訊雙方的狀態以下圖,其中CLOSED:關閉狀態、LISTEN:收聽狀態、SYN-SENT:同步已發送、SYN-RCVD:同步收到、ESTAB-LISHED:鏈接已創建
至此,TCP鏈接就創建了,客戶端和服務器能夠愉快地玩耍了。只要通訊雙方沒有一方發出鏈接釋放的請求,鏈接就將一直保持。
鏈接釋放過程
第一次揮手:數據傳輸結束之後,客戶端的應用進程發出鏈接釋放報文段,並中止發送數據,其首部:FIN=1,seq=u。
第二次揮手:服務器端收到鏈接釋放報文段以後,發出確認報文,其首部:ack=u+1,seq=v。此時本次鏈接就進入了半關閉狀態,客戶端再也不向服務器發送數據。而服務器端仍會繼續發送。
第三次揮手:若服務器已經沒有要向客戶端發送的數據,其應用進程就通知服務器釋放TCP鏈接。這個階段服務器所發出的最後一個報文的首部應爲:FIN=1,ACK=1,seq=w,ack=u+1。
第四次揮手:客戶端收到鏈接釋放報文段以後,必須發出確認:ACK=1,seq=u+1,ack=w+1。 再通過2MSL(最長報文端壽命)後,本次TCP鏈接真正結束,通訊雙方完成了他們的告別。
在這個過程當中,通訊雙方的狀態以下圖,其中:ESTAB-LISHED:鏈接創建狀態、FIN-WAIT-1:終止等待1狀態、FIN-WAIT-2:終止等待2狀態、CLOSE-WAIT:關閉等待狀態、LAST-ACK:最後確認狀態、TIME-WAIT:時間等待狀態、CLOSED:關閉狀態