tcp全稱為 「傳輸控制協議(transmission control protocol」). 人如其名, 要對資料的傳輸進行乙個詳細的控制tcp協議段格式tcp,面向有連線的通訊協議,在傳送資料之前必須先建立連線,資料傳送完成後要釋放連線,正因如此才成就了它的可靠性,今天我們就來剖析它通訊的具體過程。
出處源/目的埠各佔2位元組 表示資料從那個程序中來,到那個程序中去;
序號(seq)佔4位元組 它的主要作用是標記資料段 tcp連線中傳送的位元組流中的每個位元組都按順序編號 序號就是該字段中的第乙個編號
確認號(ack)佔4位元組 它表示接收端已收到上次傳送過來的報文段中的資料並且返還給傳送端乙個序號 這個序號便是下次傳送端傳送報文資料的第乙個編號。
資料偏移,佔4位,它指出tcp報文的資料距離tcp報文段的起始處有多遠
保留位:由跟在資料偏移欄位後的 6 位構成, 全部為 0
urg:為1時表明緊急指標字段有效,意思是這是緊急資料
ack:佔1位,僅當ack=1時,確認號字段才有效。ack=0時,確認號無效
psh:當兩個應用程序進行互動式的通訊時,有時在一端的應用程序希望在鍵入乙個命令後立即就能夠收到對方的響應。在這種情況下,tcp 就可以使用推送(push)操作,這時,傳送方 tcp 把 psh 置 1 ,並立即建立乙個報文段傳送出去,接收方收到psh = 1 的報文段,就盡快地(即「推送」向前)交付給接收應用程序,而不再等到整個快取都填滿後再向上交付。
rst:當rst=1時,表明tcp連線中出現嚴重差錯,必須釋放連線,然後再重新建立連線
syn:在tcp連線建立時用來同步序號.syn=1 ack=0表示這是乙個tcp連線請求報文 ; syn=1 ack=1表示這是乙個tcp連線響應資料報
fin:fin表示釋放乙個連線 fin=1嘗試斷開連線
視窗:佔2位元組,指的是通知接收方,傳送本報文你需要有多大的空間來接受
檢驗和:傳送端填充, crc校驗. 接收端校驗不通過, 則認為資料有問題. 此處的檢驗和不光包含tcp首部, 也包含tcp資料部分
16位緊急指標: 標識哪部分資料是緊急資料
三次握手的基本流程
客戶端(a)——————>服務端(b)(客戶端向服務端傳送請求連線資料報 )序號seq=x,表明傳輸資料時的第乙個資料位元組的序號是x服務端——————>客戶端(服務端收到請求後傳送確認連線資料報 syn=1 ack=1)主機b的初始序列號seq(b)=y,以及主機b對主機a初始序列號的確認號ack(b)=seq(a)+1=x+1
客戶端——————>服務端(客戶端收到確認連線報後還需要確認)(ack=1 傳送乙個序列號seq(a)=x+1;確認號為ack(a)=y+1的報文 )
完成後進入 estable (穩定狀態) 然後可以進行資料傳輸
出處:思考:tcp連線的建立為什麼要進行3次握手?
有上面的分析可知,tcp在第二次握手完成的時候實際上已經建立了連線,可以進行資料傳輸了,但是為甚還要進行第三次握手。四次揮手的基本流程這其實是為了防止已經失效的連線請求報文段突然又傳給了伺服器,因而產生錯誤,你想想假如現在client端向server端傳送請求連線,而這個報文段卻在網路結點中迷路了 ,(於是乎client再次向server端傳送請求連線,這次連線進行的很順利,正常上班-工作-然後下班 )但在連線釋放以後client傳送的這個迷路報文段才到達server,此時這個報文段就是乙個已經失效的連線請求報文段。但server收到這個報文段後並不知其失效,以為是client又傳送的一次請求,就會向client傳送同意建立連線的確認報文段。但問題是client並沒有給server傳送請求,因此也會對這個確認報文段不予理睬,也不會傳送資料。但server會以為連線建立了,並會一直處於等待狀態,等待對方的資料,在這樣的情況下,server的一些資源就會浪費了。
但是採用三次握手就不一樣了,你迷路的報文再次到達server,server同意後傳送給client確認報文,client想著我沒有傳送請求啊,於是沒有傳送第三次確認,server沒有收到確認,就知道client沒有傳送請求。
怎樣理解四次揮手
(斷開連線是兩個人的事情所以我們必須雙方向上共同斷開連線)
客戶端————>伺服器 (客戶端傳送釋放連線請求fin=1和seq=u)客戶端進入fin_wait1狀態伺服器————>客戶端 (服務端傳送響應報文ack 和 ack=u+1) 服務端就進入了close-wait(關閉等待)狀態
伺服器————>客戶端 當伺服器的資料傳遞完後就向客戶端傳送連線釋放報文,fin=1,ack=u+1 伺服器進入last_ack(最後確認)狀態 等待客戶端確認
客戶端————>伺服器 傳送乙個確認ack 然後進入time_wait(防止ack丟失) 如果丟失就重新傳送ack
time_wait等待時間=2msl 一般為120s
為什麼要進行4次揮手?
tcp建立連線要進行三次握手,而斷開連線要進行四次。這是由於tcp的半關閉造成的。因為tcp連線是全雙工的(即資料可在兩個方向上同時傳遞)所以進行關閉時每個方向上都要單獨進行關閉。這個單方向的關閉就叫半關閉。當一方完成它的資料傳送任務,就傳送乙個fin來向另一方通告將要終止這個方向的連線。為什麼time_wait還需要進行等待2msl才進入close狀態?這是因為為了保證最後乙個確認ack能順利到達 msl是tcp報文的最長生存時間, 因此time_wait持續存在2msl的話 就能保證在兩個傳輸方向上的尚未被接收或遲到的報文段都已經消失(否則伺服器立刻重啟, 可能會收到來自上乙個程序的遲到的資料, 但是這種資料很可能是錯誤的); 同時也是在理論上保證最後乙個報文可靠到達(假設最後乙個ack丟失, 那麼伺服器會再重發乙個fin. 這時雖然客戶端的程序不在了, 但是tcp連線還在, 仍然可以重發last_ack)
tcp三次握手 TCP 三次握手總結
tcp特點概述 tcp segment structure 段結構 step2 server host receives syn,replie with syn ack segment 答覆syn ack報文段 step3 client receives synack,replies with ac...
網路基礎模型及TCP三次握手
國際標準組織制定了osi open system interconnection 七層參考模型,但是由於其在設計過程中是面向技術的,太過於複雜,在實際生產過程中用到的是tcp ip四層參考模型,模型及介紹如下 1.網路介面層 主要協議是arp rarp,主要功能是對資料鏈路的管理,包括錯誤檢測,不同...
tcp的三次握手 傳輸層 TCP 三次握手
使用tcp協議進行通訊的雙方必須先建立連線,然後才能開始傳輸資料。為了確保連線雙方可靠性,在雙方建立連線時,tcp協議採用了三次握手策略。如圖 客戶端傳送帶有syn標誌的連線請求報文段,然後進入syn send狀態,等待服務端的確認。服務端接收到客戶端的syn報文段後,需要傳送ack資訊對這個syn...