网络编程-TCP/IP协议栈-TCP协议
TCP協議
TCP協議作用
-
TCP協議位于協議棧的傳輸層。當應用層向TCP層發送用于網間傳輸的,用8字節表示的數據流,TCP則吧數據流分割成適當長度的報文段,最大傳輸段大小(MSS)通常受到改計算機連接的網絡數據鏈路層的最大傳送單元(MTU)限制(例如路由器每次傳輸數據的大小是固定的,并且是可以設置的,這個傳輸值就是MTU)。之后TCP吧數據包床底給IP層,由他來通過網絡將包傳送給接收端實體的TCP層。
-
TCP為了保證報文傳輸的可靠性,就給每個包一個序號,同時序號也保證傳送到接收端實體的包的按順序接收,然后,接收端實體對已成功收到的字節發回一個相應的確認(ACK);如果發送端實體在合理的往返時延(RTT)內未收到確認,那么對應的數據(假設丟失)將會重傳。
- 在數據正確性與合法性上,TCP用一個 “校驗和函數” 來檢驗數據是否有錯誤,在發送和接收時都要計算校驗和;同時可以使用md5認證對數據進行加密
- 在保證可靠性上,采用超時重傳和捎帶確認的機制
- 在流量控制上,采用滑動窗口協議,協議中規定,對窗口內未經確認的分組需要重傳
-
在阻塞控制上,采用TCP擁塞控制算法,也稱為AIMD算法。改算法主要包括三個主要部分:
- 加性增,乘性減
- 慢啟動
- 對超時事件做出反應
TCP的報頭
- 和協議一樣,TCP協議也有他的報頭部分。一下圖表示
- 源端口:發送方的端口號
- 目的端口:接受方的端口號
- 序號:發送方的序號
- 確認序號:接收方得到序號后回復的確認序號(ACK需要)
- TCP首部長度:4bit,以32-bit字為單位。TCP首部長度,也是TCP報文數據部分的偏移量范圍5~15,即20bytes ~50bytes,可選項部分最多允許40bytes
- 標志位,主要用于標記該報文當前狀態
- URG:指示報文中有緊急數據,應該盡快傳送,(相當于高優先級的數據)
- ACK:確認序號(AN)有效
- PSH:接到后盡快交付給接收的應用進程
- RST:TCP鏈接中出現嚴重差錯(例如服務器宕機),必須釋放鏈接,在重新建立連接
- SYN:處于TCP鏈接建立過程
- FIN:發送端已經完成數據傳輸,請求釋放鏈接
TCP協議連接三次握手
-
TCP是一個面向連接的協議,在每一層傳輸數據前,客戶端和服務端需要進行連接,這個鏈接就是三次握手過程。
- 第一次:客戶端向服務器發送一個SYN(SEQ = x 客戶端序號)報文給服務器端,進入SYN_SEND狀態
- 第二次:服務器端收到SYN報文,回應一個SYN(SEQ = y 服務端序號)ACK(ACK = x+1 確認號 = 客戶端序號 + 1)報文,進入SYN_RECV狀態
- 第三次:客戶端收到服務器端的SYN報文,回應一個ACK(ACK = y+1)報文,進入Established狀態。
-
如下圖
-
三次握手的意義,為啥不是兩次,因為兩次通信后,客戶端與服務器端都處于準備好狀態,第三次是不是多余了?
-
答案是:兩次握手時,服務器提前進入準備狀態之后,如果中途遇到網絡中斷,消息沒有回傳給客戶端,客戶端將永遠借不到服務器的給入狀態,那么服務端將資源浪費在一個不存在的連接上。
-
三次握手并不保證絕對安全: 在三次握手過程中,Server發送SYN-ACK后,收到Client的ACK之前的TCP鏈接稱為半連接(half-open connect),此時Server處于SYN_RCVD狀態,當收到ACK后,Server轉入ESABLISHED狀態。SYN攻擊就是在Client在短時間內偽造大量不存在IP地址,并向Server端不斷發送SYN包,Server回復確認包,并等待Client的確認,由于源地址是不存在的,因此,Server需要不斷重新發送直到超時,這些偽造的SYN包將長時間占用服務端未連接隊列,導致正常SYN請求因為隊列滿無法進入而被丟棄,從而引起完了阻塞甚至系統癱瘓。SYN攻擊時一種典型的DDOS攻擊,檢查SYN攻擊的方式非常簡單,即當Server上有大量半連接狀態,并且IP地址是隨機地址,則可以斷定遭到SYN攻擊,可以用如下命令查看:
TCP協議斷開連接時候四次揮手
-
既然TCP面向連接,那么肯定也有斷開連接的操作,一個TCP完整的斷開需要進行四次揮手。
- 第一次:客戶端向服務器發送FIN + ACK 報文,同時攜帶序號為 X,客戶端進入FIN-WAIT1
- 第二次:服務器端回復ACK報文。附帶序號Z和確認序號X+1,表示服務器已經接收到客戶端的報文。但是由于服務器可能還在處理事務,因此,報文并不會攜帶FIN標志。狀態CLOSE WAIT
- 第三次:在一段時間后,服務器已經處理完畢,發送帶有FIN和ACK的報文,序號為Y,確認序號為X + 1.狀態:ACK-LAST
- 第四次:客戶端發送ACK報文,序號X+1,確認序號Y+1。客戶端進入:TIME_WAIT。服務端進入CLOSE(初始狀態)。
-
如上圖所示,我們關閉連接是四次揮手過程,但是建立連接是三次握手,斷開多了一個過程:
- 這是因為在連接過程中,服務器在LISTEN狀態下,收到建立連接請求的SYN報文后,把ACK和SYN放再一個報文給客戶端了。
- 而關閉連接時候,當收到對方的FIN報文時候,僅僅標識對方不在發送數據了,但并不表示不在接受數據,并且服務端此時并不能保證已經將全部數據發送給對方,所以服務器方可以立即iclose,也可以發送一些數據給對方后在發送FIN報文給對方來表示現在關閉連接,因此,服務端ACK和FIN一般會分開發送,在這里就多了一個步驟
-
在TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態,有如下兩個原因:
- 第一保證TCP協議的全雙工連接能夠可靠關閉
- 保證這次連接的重復數據段從網絡中消息
上一篇 網絡編程-TCP/IP協議棧-IP協議
下一篇 網絡編程-TCP/IP協議棧-UDP/HTTP協議
總結
以上是默认站点為你收集整理的网络编程-TCP/IP协议栈-TCP协议的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 针灸埋线能减肥吗
- 下一篇: 网络编程-TCP/IP协议栈-UDP/H