TCP詳解

TCP協議詳解

 

TCP/IP協議不是TCPIP這兩個協議的合稱,而是指因特網整個使用TCP/IP協議的協議集合。他取代了OSI七層模型,成為事實上的應用于實際的模型。

TCP/IP協議與OSI協議的關系如下:

TCP詳解

 

各層的作用如下:

TCP詳解

TCP特性:

工作在傳輸層面向連接協議

全雙工協議

半關閉

錯誤檢查

將數據打包成段,排序

確認機制

數據恢復,重傳

流量控制,滑動窗口

擁塞控制,慢啟動和擁塞避免算法

補充:TCP是一種面向連接的,可靠的傳輸層協議;全雙工代表可以雙向連同;TCP協議建立在不可靠的網絡層IP協議之上,IP不能提供任何可靠性機制,TCP的可靠性完全由自己實現,TCP采用的最基本的可靠性技術是確認與超時重傳和流量控制;

 

TCP包頭:

TCP詳解

下面是包頭內容的解釋:

源端口、目標端口:計算機上的進程要和其他進程通信是要通過計算機端口的,而一個計算機端口某個時刻只能被一個進程占用,所以通過指定源端口和目標端口,就可以知道是哪兩個進程需要通信。源端口、目標端口是用16位表示的,可推算計算機的端口個數為2^16個。

序列號:表示本報文段所發送數據的第一個字節的編號。在TCP連接中所傳送的字節流的每一個字節都會按順序編號。由于序列號由32位表示,所以每2^32個字節,就會出現序列號回繞,再次從0開始。

確認號:表示接收方期望收到發送方下一個報文段的第一個字節數據的編號。也就是告訴發送方:我希望你下次發送的數據的第一個字節數據的編號是這個確認號。

數據偏移:表示TCP報文段的首部長度,共4位,由于TCP首部包含一個長度可變的選項部分,需要指定這個TCP報文段到底有多長。它指出TCP報文段的數據起始處距離TCP報文段的起始處有多遠。該字段的單位是32位(即4個字節為計算單位),4位二進制最大表示15,所以數據偏移也就是TCP首部最大60字節。

URG:表示本報文段中發送的數據是否包含緊急數據。后面的緊急指針字段(urgent pointer)只有當URG=1時才有效。

ACK:表示是否前面的確認號字段是否有效。ACK=1,表示有效。只有當ACK=1時,前面的確認號字段才有效。TCP規定,連接建立后,ACK必須為1,帶ACK標志的TCP報文段稱為確認報文段。

PSH:提示接收端應用程序應該立即從TCP接收緩沖區中讀取數據,為接收后續數據騰出空間。如果為1,則表示對方應當立即把數據提交給上層應用,而不是緩存起來,如果應用程序不將接收到的數據讀取,就會一直停留在TCP接收緩沖區中

PST:如果收到一個RST=1的報文,說明與主機的連接出現了嚴重錯誤(如主機崩潰),必須釋放連接,然后重新建立連接。或者說明上次發送給主機的數據有問題,主機拒絕響應,帶RST標志的TCP報文段稱為復位報文段。

SYN:在建立連接時使用,用來同步序號。當SYN=1,ACK=0時,表示這是一個請求建立連接的報文段;當SYN=1,ACK=1時,表示對方同意建立連接。SYN=1ACK=1時,表示對方同意建立連接。SYN=1,說明這是一個請求建立連接或同意建立連接的報文。只有在前兩次握手中SYN才置為1,帶SYN標志的TCP報文段稱為同步報文段。

FIN:表示通知對方本端要關閉連接了,標記數據是否發送完畢。如果FIN=1,即告訴對方:“我的數據已經發送完畢,你可以釋放連接了”,帶FIN標志的TCP報文段稱為結束報文段。

窗口大小: 表示現在允許對方發送的數據量,也就是告訴對方,從本報文段的確認號開始允許對方發送的數據量。

校驗和:提供額外的可靠性。

緊急指針:標記緊急數據在數據字段中的位置。

選項部分:其最大長度可根據TCP首部長度進行推算。TCP首部長度用4位表示,選項部分最長為:(2^4-1)*4-20=40字節。

常見選項:

最大報文段長度

窗口擴大

時間戳

 

TCP端口:

如果把IP地址比作一間房子,端口就是出入這間房子的門。真正的房子只有幾個門,但是一個IP地址的端口可以 有65535個之多。端口號號只有整數,從065535

在這65535個端口之中:

0-1023:被永久的分配給固定的系統應用使用,如:

22/tcp(ssh), 80/tcp(http), 443/tcp(https)

1024-49151: 被用于用戶端口或注冊端口,但要求并不嚴格,分配給程序注冊為某應用使用

包括:1433/tcp(SqlServer),1521/tcp(oracle), 3306/tcp(mysql), 11211/tcp/udp(memcached)

49152-65535: 動態端口或私有端口,客戶端程序隨機使用的端口

 

客戶端用戶可用的端口號隨機范圍:

 

 

TCP詳解

 

現在重點講一下,TCP的三次握手,四次揮手:

三次握手,指的是通過兩臺要相連的主機互相發送消息,來確認連接。他們的連接過程相當于:

甲方:我能連接你吧?

我聽到你的話了,你能連接我:乙方

甲方:好的,那我連接你了

這樣三次相互發消息之后,雙方就可以建立連接了。
TCP詳解

圖解:

CLOSED: 沒有任何連接狀態

LISTEN: 偵聽狀態,等待來自遠方TCP端口的連接請求

SYN-SENT:在發送連接請求后,等待對方確認

SYN-RECEIVED:在收到和發送一個連接請求后,等待對方確認

ESTABLISHED:代表傳輸連接建立,雙方進入數據傳送狀態

 

四次揮手,代表正在建立連接的兩臺主機,由其中一臺先發出斷連消息,另外一臺確定。其過程包手4次收發。

TCP詳解

圖解,當客戶機發出斷連消息,并發送FIN=1,seq=u的數據包,FIN意味著分手。服務器端收到消息后發送ACK=1seq=v,ack=u+1ACK表示確認收到了客戶機發的消息,同時發送FIN=1,ACK=1,seq=w,ack=u+1,表示確認分手。這時客戶機收到消息,再次向服務器發送ACK=1,seq=u+1,ack=w+1,向服務器表示我(指客戶機)收到了確認分手的消息,這個過程所用的時間是大約兩分鐘。

ESTABLISHED:代表傳輸連接建立,雙方進入數據傳送狀態

FIN-WAIT-1:主動關閉,主機已發送關閉連接請求,等待對方確認

FIN-WAIT-2:主動關閉,主機已收到對方關閉傳輸連接確認,等待對方發送關閉傳輸連接請求

TIME-WAIT:完成雙向傳輸連接關閉,等待所有分組消失

CLOSE-WAIT:被動關閉,等待最后一個關閉傳輸連接確認,并等待所有分組消失

CLOSING:雙方同時嘗試關閉傳輸連接,等待對方確認

 

有限狀態機:

客戶端發送FIN給服務端時,自己進入了FIN_WAIT_1狀態,這時等待接收服務端的報文,該報文會有三種可能:

1.只有服務端的ACK。只收到服務器的ACK,客戶端會進入FIN_WAIT_2狀態,當收到FIN時,才會給服務器端發送一個確認收到的ACK,然后進入TIME_WAIT狀態。這個狀態會持續2MSL。

2.只有服務器端的FIN時,回應一個ACK給服務端,進入CLOSING狀態,然后接收到服務端的ACK時,進入TIME_WAIT狀態

3.同時收到服務端的ACKFIN,直接進入TIME_WAIT狀態。

可以由下圖表示:

TCP詳解

 

客戶端的典型狀態轉移:

客戶端通過connect系統調用主動與服務器建立連接connect系統調用首先給服務器發送一個同步報文段,使連接轉移到SYN_SENT狀態。此后connect系統調用可能因為如下兩個原因失敗返回:

1. 如果connect連接的目標端口不存在(未被任何進程監聽),或者該端口仍被牌TIME_WAIT狀態的連接所占用,則服務器將給客戶端發送一個復位報文段,connect調用失敗。

2. 如果目標端口存在,但connect在超時時間內未收到服務器的確認報文段,則connect調用失敗。

Connect調用失敗將使連接立即返回到初始的CLOSED狀態。如果客戶端成功收到服務器的同步報文段和確認,則connect調用成功返回,連接轉移至ESTABLISHED狀態

 

孤兒連接:導致產生孤兒連接的,是發送的一方長時間收不到接收方發送的消息,一直停留在一個狀態下。這容易消耗資源,所以系統定義兩個參數來防止過多的孤兒連接拖累系統:

/proc/sys/net/ipv4/tcp_max_orphans 指定內核能接管的孤兒連接數目

/proc/sys/net/ipv4/tcp_fin_timeout 指定孤兒連接在內核中生存的時間

 

TCP超時重傳:

當網絡出現異常狀況時,在發送信息的過程中容易出現超時或丟包的情況。TCP服務則注重解決這一問題。

TCP服務必須能夠重傳超時時間內未收到確認的TCP報文段。為此,TCP模塊為每個TCP報文段都維護一個重傳定時器,該定時器在TCP報文段第一次被發送時啟動,如果超時時間內未收到接收方的應答,TCP模塊將重傳TCP報文段并重置定時器。至于下次重傳的超時時間如何選擇,以及最多執行多少次重傳,就是TCP的重傳策略

TCP超時重傳相關的兩個內核參數:

/proc/sys/net/ipv4/tcp_retries1, 指定在底層IP接管之前TCP最少執行的重傳次數,默認值是3.

/proc/sys/net/ipv4/tcp_retries2, 指定連接放棄前TCP最多可以執行的重傳次數,默認值15(一般對應13~30min

 

TCP端口號:

源端口(Sorce Port)在前,目標端口(Dest Port)在后。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原創文章,作者:xxcj,如若轉載,請注明出處:http://www.www58058.com/86043

(0)
xxcjxxcj
上一篇 2017-09-02 21:00
下一篇 2017-09-03 10:41

相關推薦

  • 一切皆文件

    Linux Linux內一切皆文件;表現之一:硬件設備也通過文件表示 物理終端:/dev/console 虛擬終端: /dev/tty#[1,6] 串行終端:/dev/ttyS# 偽終端: /dev/pts/# 注意:在啟動設備之后,在其上關聯一個用戶接口程序,即可實現與用戶交互,交互式程序有兩類:GUI(圖形化界面)和CLI(命令行界面)。 查看終端設備:…

    Linux干貨 2017-04-01
  • RAID有點意思

        獨立硬盤冗余陣列(RAID, Redundant Array of Independent Disks),舊稱廉價磁盤冗余陣列(Redundant Array of Inexpensive Disks),簡稱磁盤陣列。其基本思想就是把多個相對…

    Linux干貨 2017-06-19
  • 文件查找locate和find

    locate 查詢系統上預建的文件索引數據庫 /var/lib/mlocate/mlocate.db 依賴于事先構建的索引 索引的構建是在系統較為空閑時自動進行(周期性任務),管理員手動更新數據庫(updatedb) 索引構建過程需要遍歷整個根文件系統,極消耗資源 工作特點: ?查找速度快 ?模糊查找 ?非實時查找 ?搜索的是文件的全路徑,不僅僅是文件名 ?…

    2017-08-11
  • selinux與systemd

    selinux :service enhanced linux 安全增強的Linux  軟件的安全性 選擇安全系數較高的系統提高現有系統的安全性  計算機的安全等級D  最低的安全級別,提供最少的安全防護,系統訪問無限制。DOS   C  訪問控制的權限,能夠實現可控的安全防護,個人賬戶管理,審計和…

    Linux干貨 2017-05-22
  • CentOS6.6上編譯安裝httpd2.4

    簡介    現在apache軟件基金會正在維護的httpd項目有三個版本,分別為Version 2.4,Version 2.2與Version 2.0。    三個版本的區別暫不一一介紹,有興趣的可以去httpd.apache.org了解,下面著重介紹httpd 2.4版本。新特性 &nb…

    Linux干貨 2015-06-26
  • 加密和解密技術基礎(01) ~ 105分鐘

    加密和解密技術基礎(01) ~ 105分鐘 講課思路: 互聯網通信機制 –> 網絡協議模式(osi,tcp/ip模型) –> 數據通信安全  à 數據加密 –> 加密算法 –> OpenSSL是什么 à SSL通信原理 –> CA –> OpenSSL命令用法 à CA 自簽及簽證演示 1.1 &nbs…

    Linux干貨 2016-09-19

評論列表(1條)

  • linux1
    linux1 2017-11-16 12:34

    路過看看!

欧美性久久久久