TCP三次握手原理

在衆多的網絡協議中,TCP協議佔據着舉足輕重的地位,你知道什麼是TCP協議嗎?編程

1、TCP協議

TCP(Transmission Control Protoco)協議屬於計算機網絡體系中的運輸層。運輸層的任務是負責向主機中應用層進程之間的通訊提供通用的數據傳輸服務。因此能夠通俗理解TCP協議就是進程間數據通信傳輸協議。根據不一樣應用,運輸層主要使用TCP和UDP兩種協議之一。若是想要了解計算機網絡體系分層概念,能夠看個人上一篇博文 計算機網絡體系結構劃分 緩存

計算機網絡體系結構

2、TCP協議特色

TCP協議自己是比較複雜的,它包含擁塞控制、可靠傳輸、流量控制、鏈接管理等功能,主要特色包含如下幾個方面:服務器

  • TCP是面向鏈接的協議,程序在使用TCP協議通信時,必需要先創建TCP鏈接。這就比如我要給你打電話,咱倆之間的通信線路必須是鏈接狀態的。
  • TCP鏈接是點對點的,每一條TCP鏈接只能有兩個端口(endpoint)。這個端點就是咱們Java網絡編程所使用的套接字(socket)。由IP地址+端口號組成(IP:端口號)。
  • TCP鏈接提供可靠交付,也就是說使用TCP鏈接傳輸數據,保證無差錯、不丟失、不重複而且按順序到達
  • TCP鏈接是雙向的通訊,也就是說通訊的兩方,既能發送數據,也能接收數據。就向咱們通話時雙方同樣。
  • TCP面向字節流傳輸數據,就是說TCP傳送數據時,是把進程交付的數據,按照一段段字節流序列傳遞的,每次傳輸其中一段字節序列。應用層接收字節序列後,再將內容還原。

3、TCP報文格式

既然TCP協議屬於運輸層,運輸層職責是爲主機應用層提供進程間的數據傳輸,因此咱們有必要搞清楚TCP協議運輸數據時的形式。TCP協議規定了TCP傳輸數據的單元爲TCP數據報。TCP報文是對應用層進程交付數據的封裝。 TCP數據報由兩部分組成:TCP首部TCP數據部分網絡

  • TCP首部:包含許多控制和描述字段,是TCP所有功能的體現
  • TCP數據部分:對於應用層進程交付的數據,封裝後的字節流序列
    TCP報文格式
    應用層進程交付的數據被封裝TCP報文,而後進行傳輸,TCP鏈接保證數據傳輸的可靠性,TCP報文傳輸的過程示意圖:
    TCP數據傳輸模型

4、TCP報文首部

TCP報文首部定義是TCP協議的精華所在,TCP複雜功能的實現,所有依靠了首部裏各類控制字段。咱們來看下TCP首部都定義了什麼: socket

TCP報文首部
TCP報文的首部 由20個字節固定字節4n(n取[0~5]整數)個可變的 選項字節組成,其中固定部分的各字段含義以下:

  • 源端口目的端口:各佔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位,它們的標識和含義是:

    • 緊急URG:URG=1時,告訴系統此報文中有緊急數據,優先傳送,與緊急指針配合使用
    • 確認ACK:當ACK=1時,確認號纔有效,ACK=0時,確認號無效,TCP鏈接創建後,全部報文ACK必須都爲1
    • 推送PSH:發送方把PSH置爲1,接收方收到報文後會儘快交付,不用等緩存填滿了再交付
    • 復位RST:當RST=1時,代表TCP鏈接出現了嚴重差錯,必須釋放鏈接,而後從新創建新運輸鏈接。RST=1還能夠用來拒接一個非法報文段或拒絕打開一個鏈接。
    • 同步SYN:在鏈接創建時用來同步序號。當SYN=1而ACK=0時,代表這是一個鏈接請求報文段,對方若贊成創建鏈接,則須要在響應報文中使SYN=1和ACK=1
    • 終止FIN:用來釋放一個鏈接 。當FIN=1時,代表此報文段的發送方數據已經發送完畢,而且要求釋放運輸鏈接。
  • 窗口:佔2字節,窗口值是[0~2^16^-1]之間的整數。窗口值告訴了對方,從本報文段的確認號算起,容許對方發送的數據量。

  • 檢驗和:佔2字節,用於接收方檢驗首部和數據部分是否在傳輸中有差錯,相似咱們下載文件時的Md5簽名校驗做用。

  • 緊急指針:佔2字節,URG=1時才起做用,用於指明本報文段中的緊急數據的字節數,緊急數據結束後就是普通數據,因此緊急指針指出了緊急數據的末尾在報文中位置。

  • 選項:長度可變,最小0字節,最長達40字節。首部用來動態存儲數據。

5、三次握手過程

TCP是面向鏈接的,因此每次傳輸數據以前,必需要創建TCP鏈接,在TCP創建鏈接時主要解決三個層面問題:

  • 使鏈接的每一方都能確認對方的存在
  • 協商鏈接中參數,好比各方窗口值,時間戳等
  • 各方對運輸資源如緩存大小、鏈接表等進行分配

咱們都知道TCP鏈接採用的是C/S模式,主動發起鏈接的叫客戶端client,被動等待鏈接的叫服務器Server。那麼TCP創建鏈接的過程是什樣的呢?什麼是三次握手呢?

在這裏插入圖片描述
默認狀況下客戶端client和服務端sever的TCP進程都處於 CLOSED(關閉)狀態。 服務端TCP服務進程先創建傳輸控制塊TCB,而後準備接受客戶端請求,此時服務端進入 LISTEN狀態,等待客戶端鏈接請求,

  • 第一次握手:客戶端TCP進程也先創建傳輸控制塊TCB,而後向服務端發送鏈接請求報文段,此時SYN=1,隨機選定一個初始序號seq=x,,此報文不能攜帶數據,可是要消耗掉一個序號,發送完畢後,客戶端進入SYN-SENT(同步已發送)狀態
  • 第二次握手:服務端收到客戶端請求鏈接報文段後,若贊成創建鏈接,則發送確認報文,確認報文中SYN=一、ACK=1,確認號ack=x+1,同時隨機選定一個本身序號seq=y,確認報文段一樣不能攜帶數據,可是也要消耗掉一個序號,發送完畢後服務端進入SYN-RCVD(同步收到)狀態
  • 第三次握手:客戶端收到確認報文後,檢查ACK=1,ack=x+1是否正確,若正確,則向服務端發送確認報文,確認報文中ACK=1,ack=y+1,seq=x+1,發送後進入ESTAB-LISHED狀態,服務端收到確認報文後,也進入ESTAB-LISHED狀態,此時雙方TCP鏈接正式創建。

上面的鏈接創建過程就是TCP三次握手

6、爲何是三次握手?

爲何client收到確認報文後,還要再發送一次確認報文給server呢?這主要是爲了防止已失效的鏈接請求報文段忽然又送到了Server端。

假設如今TCP鏈接是兩次握手機制,以下圖server在收到client的鏈接請求,確認後就進入ESTAB-LISHED狀態,會存在這樣一種問題:

client發送鏈接請求報文,因爲網絡緣由,長時間阻塞在某個網絡節點上了,因而client重傳了一次請求鏈接報文,第二次請求報文正常達到server,鏈接正常創建,數據傳輸完畢後,釋放鏈接。

可是假設此時第一次發送的請求報文並無丟失,而是延誤一段時間纔到達server,這本是已失效的鏈接請求報文段,可是server收到後,會覺得是client從新發送的鏈接請求,因而向client發送確認報文後,進入ESTAB-LISHED狀態,可是client並無發出新建鏈接的請求,就會忽略server的確認報文,server卻在一直等待client發送數據,致使server資源浪費嚴重。

兩次握手
總結起來看,TCP三次握手過程就是client與server在相互確認各自發送和接收是否正常的過程:

  • 第一次握手:client—>server,server確認了cilent的發送能力和本身的接收能力是正常的
  • 第二次握手:server—>client,client確認了本身的發送能力和server的接收能力是正常的,可是server此時不清楚本身的發送能力是否正常
  • 第三次握手:client—>server,server確認了本身的發送能力正常,同時也代表雙方也都確認完畢,能夠開始傳輸數據。

那麼爲何不進行四次握手呢?這個問題留給大家解答。

相關文章
相關標籤/搜索