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的報文,說明與主機的連接出現了嚴重錯誤(如主機崩潰),必須釋放連接,然后重新建立連接?;蛘哒f明上次發送給主機的數據有問題,主機拒絕響應,帶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+1,ACK表示確認收到了客戶機發的消息,同時發送FIN=1,ACK=1,seq=w,ack=u+1,表示確認分手。這時客戶機收到消息,再次向服務器發送ACK=1seq=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
下一篇 2017-09-03

相關推薦

  • 16 文本處理工具

    文本處理工具一 一、雜項知識整理 1、ps axo user,ruser,cmd 查看命令發起者的身份和真正的登錄身份: [root@localhost test]# ps axo user,ruser,cmd USER     RUSER  &nb…

    Linux干貨 2016-08-05
  • LINUX–命令的格式、類型、別名的概述及運用

    命令格式       COMMAND [OPTIONS…] [ARGUMENTS..]      [OPTIONS..] 選項:用于啟用或關閉命令的某個或某些功能                &n…

    2017-05-21
  • raid,lvm,及sed命令的相關使用總結

    raid0 條帶化 chunk最小寫入單位 至少2塊盤 空間大小 單塊磁盤大小*nraid1 鏡像  1/n   讀性能提升,寫入比單塊盤慢  空間始終是一塊盤的大小   容錯率高  可以壞  n-1塊盤raid10 容錯高于raid01 但空間損失更多,讀寫性能 提升 造價高。raid4&nbsp…

    2017-08-26
  • grep

    1. 文本處理工具的使用:   cat 連接文件并打印到標準輸出設備,但是文件較大時,翻屏太快,與more或者less連用 命令反著輸入(tac)將會反向輸出文本文件 用法: cat 選項 參數   選項: -A 顯示不可打印字符 -b 對行進行編號,空白行不編號 -s 壓縮空白行 -n 對行進行編號,包括空白航  參數: &n…

    Linux干貨 2016-08-08
  • $@與$*的不同之處

    $@與$*的不同之處 $*: 把我們傳遞給腳本的參數全部合為一個字節,當成一個字符串或者參數來使用。 $@: 把我們傳遞給腳本的所有參數,每個參數都為獨立字符串,當我們用 \((n) 來調用的時候, 輸入參數的位置為第幾個,那我們就用用\)n來調用第幾個,一對應。 下面我們用代碼來看一下這兩個的區別: 創建一個簡單的腳本讓他輸出我們輸入的多個參數:&#822…

    2017-06-06
  • 初學Linux

       已經學習了Linux一周了,從原來的設計網頁、動畫影視制作、3D模型到現在的黑白界面虛擬世界,從原來吃睡由我到現在重回高三生活,說實話,一開始還是不太能適應的,尤其是眼睛,酸脹痛。不過,越努力越幸運,也覺得linux其實很有意思。。以下是我第一篇微博的內容,也是我學習linux一周所總結的知識。 首先,學習一門知識就要先了解他的歷史…

    Linux干貨 2017-07-15

評論列表(1條)

  • linux1
    linux1 2017-11-16 12:34

    路過看看!

欧美性久久久久