在衆多的網絡協議中,TCP協議佔據着舉足輕重的地位,你知道什麼是TCP協議嗎?編程
TCP(Transmission Control Protoco)協議屬於計算機網絡體系中的運輸層。運輸層的任務是負責向主機中應用層進程之間的通訊提供通用的數據傳輸服務。因此能夠通俗理解TCP協議就是進程間數據通信傳輸協議。根據不一樣應用,運輸層主要使用TCP和UDP兩種協議之一。若是想要了解計算機網絡體系分層概念,能夠看個人上一篇博文 計算機網絡體系結構劃分 緩存
TCP協議自己是比較複雜的,它包含擁塞控制、可靠傳輸、流量控制、鏈接管理等功能,主要特色包含如下幾個方面:服務器
既然TCP協議屬於運輸層,運輸層職責是爲主機應用層提供進程間的數據傳輸,因此咱們有必要搞清楚TCP協議運輸數據時的形式。TCP協議規定了TCP傳輸數據的單元爲TCP數據報。TCP報文是對應用層進程交付數據的封裝。 TCP數據報由兩部分組成:TCP首部和TCP數據部分網絡
TCP報文首部定義是TCP協議的精華所在,TCP複雜功能的實現,所有依靠了首部裏各類控制字段。咱們來看下TCP首部都定義了什麼: socket
源端口和目的端口:各佔2個字節,分別寫入通訊雙方進程端口號post
序號seq:佔4個字節。在TCP鏈接中,傳送的字節流中的每個字節都是要按順序編號[0~2^32^-1],整個要傳送的字節流的起始序號在必須鏈接創建時設置,序號字段值表明本報文段所發送的數據的第一個字節的序號計算機網絡
確認號ack:佔4個字節,是指望收到對方的下一個報文段的第一個數據字節的序號,即ack=N,就表明了到序號N-1爲止的全部數據都被正確接收了。指針
數據偏移:佔4位,表示TCP報文的數據部分起始處距離TCP報文首部的起始處有多遠,數據偏移值的單位是32位字(以4字節爲計算單位),4位二進制能表示的值[0~15],這就意味着TCP首部最大長度爲60字節,也就是選項部分的最大長度爲40字節。cdn
保留位:佔6位,保留爲之後使用,目前置爲0server
控制位:佔6位,每一個控制字段佔1位,它們的標識和含義是:
窗口:佔2字節,窗口值是[0~2^16^-1]之間的整數。窗口值告訴了對方,從本報文段的確認號算起,容許對方發送的數據量。
檢驗和:佔2字節,用於接收方檢驗首部和數據部分是否在傳輸中有差錯,相似咱們下載文件時的Md5簽名校驗做用。
緊急指針:佔2字節,URG=1時才起做用,用於指明本報文段中的緊急數據的字節數,緊急數據結束後就是普通數據,因此緊急指針指出了緊急數據的末尾在報文中位置。
選項:長度可變,最小0字節,最長達40字節。首部用來動態存儲數據。
TCP是面向鏈接的,因此每次傳輸數據以前,必需要創建TCP鏈接,在TCP創建鏈接時主要解決三個層面問題:
咱們都知道TCP鏈接採用的是C/S模式,主動發起鏈接的叫客戶端client,被動等待鏈接的叫服務器Server。那麼TCP創建鏈接的過程是什樣的呢?什麼是三次握手呢?
上面的鏈接創建過程就是TCP三次握手。
爲何client收到確認報文後,還要再發送一次確認報文給server呢?這主要是爲了防止已失效的鏈接請求報文段忽然又送到了Server端。
假設如今TCP鏈接是兩次握手機制,以下圖server在收到client的鏈接請求,確認後就進入ESTAB-LISHED狀態,會存在這樣一種問題:
client發送鏈接請求報文,因爲網絡緣由,長時間阻塞在某個網絡節點上了,因而client重傳了一次請求鏈接報文,第二次請求報文正常達到server,鏈接正常創建,數據傳輸完畢後,釋放鏈接。
可是假設此時第一次發送的請求報文並無丟失,而是延誤一段時間纔到達server,這本是已失效的鏈接請求報文段,可是server收到後,會覺得是client從新發送的鏈接請求,因而向client發送確認報文後,進入ESTAB-LISHED狀態,可是client並無發出新建鏈接的請求,就會忽略server的確認報文,server卻在一直等待client發送數據,致使server資源浪費嚴重。
那麼爲何不進行四次握手呢?這個問題留給大家解答。