TCP協議詳解

來源:互聯網
上載者:User

標籤:

TCP協議
1.頭部。出現在每個TCP報文段,用於指定通訊的源端連接埠號碼,目的端連接埠號碼,管理TCP串連,控制兩個方向的資料流。
2.TCP狀態轉移過程。TCP串連的任意一端都是一個狀態機器。TCP的建立斷開狀態改變。
3.TCP資料流。互動資料流和成塊資料流
4.TCP資料流的控制。保證可靠和品質->逾時重傳和擁塞控制

TCP服務的特點 (連線導向、位元組流、可靠傳輸)
1.傳輸層主要的兩個協議 、 UDP協議 和 TCP協議
2.TCP協議通訊,雙方必須建立串連,才開始資料讀寫。雙方要為該連結分配必要的核心資源,用來管理串連的狀態和串連上資料的傳輸。TCP串連是全雙工系統的(雙方資料讀寫可以通過一個串連),完成後,中斷連線,釋放系統資源。
3.TCP是一對一串連的,廣播多播不能使用TCP服務。 UDP適合哦
4.TCP模組發送的TCP報文段個數和應用程式執行寫操作沒有數量關係》》》》可能發送的資料分區處理啊~~~
5.應用程式讀的次數和TCP報文段個數也沒關係。讀的大小,取決於讀緩衝區的大小,TCP按照報文段的序號排好依次放入TCP接受緩衝區中噠。
6.根據第四條和第五條,得出位元組流概念》》》》應用程式對資料的發送和接受是沒有邊界限制的~。UDP發送一次就要讀一次,否則要丟包的,沒有足夠大小的讀緩衝區,那UDP資料會被截斷//
7.TCP採用發送應答機制,即發送端發送的每個TCP報文段必須得到接收方的應答,才認為TCP報文段傳輸成功。
8.TCP採用逾時重傳機制,發送一個TCP報文段後啟動定時器,在定時器時間內未收到應答,則再次發送。
9.TCP報文段最終是以IP資料報發送的,而IP資料報到接收端很大可能是無序的重複的,TCP協議將對TCP報文重排,整理,再交給應用程式層。


1.16位連接埠號碼(port number) 源連接埠號碼和目的連接埠號碼
2.32位序號(sequence number) 第一個、序號值被初始化為某個隨機值ISN(initial sequence number) TCP報文是位元組流第1025~2048位元組,序號值是ISN+1025
3.32位確認號(acknowledgement number) 用作另一方TCP報文段相應。其值是收到TCP報文段序號值加1
4.4位頭部長度(header length)標識TCP頭部有多少個32bit字,最大為15,所以TCP頭部最長60位元組。
5.6位標誌位
URG標誌,表示緊急指標(urgent poinnter)是否有效
ACK標誌,表示確認號是否有效
PSH標誌,提示接收端應用程式應該立即從TCP接收緩衝區中讀走資料,騰衝空間
RST標誌,表示要求對方重建立立串連。 帶此標誌的報文段稱為複位報文段
SYN標誌,表示請求建立一個串連。帶此標誌的報文段稱為同步報文段
FIN標誌,表示通知對方本端要關閉串連了。帶此標誌的報文段稱為結束報文段
6.16位視窗大小(window size) 流量控制 告訴對方還能容納多少個位元組資料
7.16位校正和(TCP checksum)CRC校正頭部和資料部分
8.16位緊急指標(urgent pointer) 正位移量。他和序號欄位的值相加表示最後一個緊急資料的下一位元組的序號.發送緊急資料的方法。

TCP頭部選項
TCP頭部最後一個選項欄位是可邊長的可選資訊。 最多包含40位元組,因為TCP頭部最大60位元組,前面已經佔20位元組

kind說明選項的類型。
kind=0 選項表結束選項
kind=1 空操作(nop)選項,一般用於將TCP選項的總長度填充為4位元組整數倍
kind=2 最大報文短長度選項 MSS(最大報文長度)對乙太網路而言是1460位元組(1500-20TCP頭部-20IP頭部)
kind=3 視窗擴大因子選項,如果視窗擴大因子(移位元)為M,接受視窗大小為N,那麼N向左移3位(轉為2進位),相當於N×2的M次方
kind=4 選擇性確認(selective acknowledgment,SACK) 改善發送情況,原本出現差錯要發很多個TCP報文,接受到的也要發,使用這個,可以去除重複
kind=5 SCAK實際工作的選項,告訴對方那些沒收到,讓對方重新發
kind=8 時間戳記選項。計算雙方之間的迴路時間(Round Trip Time,RTT),/proc/sys/net/ipv4/tcp_timestamps —看了下裡頭就儲存了個1. (這個是啟用或關閉時間戳記)

前20個位元組是IP報的頭部,第21個位元組開始是TCP頭部資訊《第2行第3個》
0xb075是源連接埠號碼 —– 0x0017是目的連接埠
0xd058 670c 是序號 —– 0x0000 0000是確認號
0xa 是TCP頭部長度為10個32位(40位元組) —–0x002 設定SYN標誌(同步報文段)
0xaaaa 接受視窗大小(位元組) —– 0xfe30 頭部校正和(校正頭部還有據部分!!!)
0x0000 沒設定緊急指標 —- 0x0204 kind 和length(各1位元組 8位)
0xffd7 最大報文長度 —- 0x0402 允許SACK(改善~~~)
0x080a 時間戳記kind和length —-0x0001 6f0c時間戳記
0x0000 0000 回顯應答時間戳記 —– 0x01空操作
0x0303視窗擴大因子kind和length 0x07 視窗擴大因子為7(左移7位~)
FLAG[S] 表示是SYN標誌(同步報文段)
seq是序號值3495454476 因為它是第一個報文段所以也是此次傳輸的ISN值(隨機值)。其他都要加上位元組流的值。
win 接受通過視窗大小 mss(max segment size最大報文長度)為65495
sackok同意改善~~SACK~ TS val 發送端的時間戳記 93964
ecr時間戳記回顯應答(因為這是第一次TCP通訊的第一個TCP報文段,所以對方時間戳記應答為0) nop空操作
wscal 視窗擴大因子7
length為0意思就是資料部分為0 因為應用程式層資料沒發生交換
《IP TCP關於位移位元組的問題》
1.在IP資料報前序中,標識、標誌和片位移3個欄位與控制分區和重組有關。其中,片位移欄位指出本片資料在出事IP資料報資料區中的位置,位置位移量以8個位元組為單位
2.強調內容在TCP資料報中,沒有位移位元組不過有序號
1. IP
如果有一個3800位元組的資料,每個分區最大為1420B;由於頭部佔20位元組,所以資料部分分成了1400 1400 和 1000位元組
那麼第一個分區中位移欄位為0 第二個分區欄位為(1400)/8 =175
第三個分區為 (1400+1400)/8 = 350
就這樣
2.TCP
某個TCP報文段傳送的位元組流中第1025~2048位元組,那麼該報文段序號值為ISN+1025 .. 位移為位元組~~~
這樣做才有序,資料正確嘛~

TCP/IP串連的建立與關閉

第一個TCP報文是同步的(SYN),ernest-laptop向kongming20發送串連請求,ISN為535734930
第二個也是同步報文段,表示kongming20同一和ernest-laptop建立串連,對第一個同步報文進行確認,ISN為2159701207 注意拉~~ack確認值是第一個同步報文段序號值加1
序號值是標識TCP資料流中的每一位元組,同步報文段特殊,要佔用一個序號值
第三個TCP報文段是ernest-laptop對第二個同步報文段的確認
就這樣TCP串連建立好啦, 這三步為 TCP的三向交握

後面4各是TCP報文段的關閉過程。TCP的四次揮手
FIN標誌表示通知kongming20本端要關閉了。也就是ernest-laptop要關閉串連,結束報文段和同步報文段一樣都要佔1個序號值
第5個,確認該結束報文段
第6個,緊接著kongming20發送結束報文短
第6個ernest-lattop給予確認
第5個報文段的出現取決於TCP的延遲確認特性
ernest-lattop執行主動關閉 kongming20執行被動關閉

半關閉狀態
通訊一端可以發送FIN給對方,告訴對方本端完成資料的發送,但允許接受對方的資料,直到對方發給自己FIN。

伺服器和用戶端應用程式判斷對方是否已經關閉串連的方法:
read系統調用返回0(收到結束報文段後 read就返回0 這樣就可以判斷拉)
socket通過shutdown函數提供半關閉的支援。

連線逾時
如果用戶端訪問一個距離它很遠的伺服器,或由於網路繁忙,導致伺服器對用戶端發出的同步報文段沒有應答,對於TCP來說,必然要進行重連。
時間間隔1s,2s,4s,8s ,16s.

由proc/sys/net/ipv4/tcp_syn_retries決定,重連進行5次

伺服器通過listen進入LISTEN狀態,等待用戶端串連(被動開啟),收到請求,將連結放入核心等待隊列中,向用戶端發SYN標誌的確認報文(ACK),此時狀態(SYN_RCVD),收到用戶端的ACK則狀態到ESTABLISHED已建立串連狀態。(雙方能進行雙向資料轉送)
用戶端主動關閉,伺服器收到FIN並發送ACK,進入CLOSE_WAIT狀態(等待伺服器應用程式關閉串連),通常,伺服器檢測到用戶端關閉串連後,給用戶端發送結束報文關閉串連,進入 LAST_ACK,以等待用戶端對結束報文段的最後一次確認。確認完成,徹底關閉了。

用戶端通過connect系統調用主動與伺服器建立串連,給伺服器發送同步報文,進入SYN_SENT狀態,(失敗返回情況:1.目標連接埠不存在,或連接埠被TIME_WAIT狀態佔用,server給client發送一個複位報文段2.connect在逾時時間內未收到伺服器的確認報文段)

client主動關閉,向伺服器發送FIN報文段,進入FIN_WAIT_1狀態。收到專門用於確認目的的確認報文段,進入FIN_WAIT_2狀態,此時伺服器處於CLOSE_WAIT狀態,這一對狀態可能發生半關閉狀態。server關閉client給予確認,server進入TIME_WAIT狀態。
TCP建立斷開過程,用戶端伺服器狀態轉移圖如下:

client收到server的結束報文段,並沒直接進入CLOSE狀態,client要等待一段長2MSL的時間(報文段最大存留時間)
TIME_WAIT狀態存在原因:
1.可靠地終止TCP串連(不這樣伺服器重發報文6時會發送複位報文段給server)
2.保證讓遲來的TCP報文段有足夠時間被識別並丟棄(防止新串連和舊串連一樣)

複位報文段
通知對方關閉串連或者重建立立串連
異常終止串連
一方給另一方發送FIN報文段,收到方發複位報文段,發送端所有等待發送的資料都將被丟棄。

擁塞控制= =

TCP協議詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.