TCP/IP協(xié)議三次握手和四次揮手

TCP 協(xié)議簡述

TCP(Transmission Control Protocol)網(wǎng)絡傳輸控制協(xié)議,是一種面向連接的哨毁、可靠的仔燕、基于字節(jié)流的傳輸層通信協(xié)議颠毙,數(shù)據(jù)傳輸前建立連接的工作要經過三次握手,數(shù)據(jù)傳輸后斷開連接的工作要經過四次揮手肌索。TCP 提供面向有連接的通信傳輸蕉拢,面向有連接是指在傳送數(shù)據(jù)之前必須先建立連接,數(shù)據(jù)傳送完成后要釋放連接诚亚。

無論哪一方向另一方發(fā)送數(shù)據(jù)之前晕换,都必須先在雙方之間建立一條連接。在TCP/IP協(xié)議中站宗,TCP協(xié)議提供可靠的連接服務闸准,連接是通過三次握手進行初始化的。同時由于TCP協(xié)議是一種面向連接的梢灭、可靠的夷家、基于字節(jié)流的運輸層通信協(xié)議蒸其,TCP是全雙工模式,所以需要四次揮手關閉連接库快。

TCP包首部

網(wǎng)絡中傳輸?shù)臄?shù)據(jù)包由兩部分組成:一部分是協(xié)議所要用到的首部摸袁,另一部分是上一層傳過來的數(shù)據(jù)。首部的結構由協(xié)議的具體規(guī)范詳細定義义屏。在數(shù)據(jù)包的首部但惶,明確標明了協(xié)議應該如何讀取數(shù)據(jù)。反過來說湿蛔,看到首部膀曾,也就能夠了解該協(xié)議必要的信息以及所要處理的數(shù)據(jù)。包首部就像協(xié)議的臉阳啥。

下面的圖是TCP頭部的規(guī)范定義添谊,它定義了TCP協(xié)議如何讀取和解析數(shù)據(jù):


圖片.png

TCP頭部

TCP首部承載這TCP協(xié)議需要的各項信息,下面我們來分析一下:

TCP端口號

TCP的連接是需要四個要素確定唯一一個連接:(源IP察迟,源端口號)+ (目地IP斩狱,目的端口號)
所以TCP首部預留了兩個16位作為端口號的存儲,而IP地址由上一層IP協(xié)議負責傳遞
源端口號和目地端口各占16位兩個字節(jié)扎瓶,也就是端口的范圍是2^16=65535
另外1024以下是系統(tǒng)保留的所踊,從1024-65535是用戶使用的端口范圍

TCP的序號和確認號:

32位序號 seq:Sequence number 縮寫seq ,TCP通信過程中某一個傳輸方向上的字節(jié)流的每個字節(jié)的序號概荷,通過這個來確認發(fā)送的數(shù)據(jù)有序秕岛,比如現(xiàn)在序列號為1000,發(fā)送了1000误证,下一個序列號就是2000继薛。
32位確認號 ack:Acknowledge number 縮寫ack,TCP對上一次seq序號做出的確認號愈捅,用來響應TCP報文段遏考,給收到的TCP報文段的序號seq加1。

TCP的標志位

每個TCP段都有一個目的蓝谨,這是借助于TCP標志位選項來確定的灌具,允許發(fā)送方或接收方指定哪些標志應該被使用,以便段被另一端正確處理譬巫。
用的最廣泛的標志是 SYN咖楣,ACK 和 FIN,用于建立連接缕题,確認成功的段傳輸截歉,最后終止連接。
SYN:簡寫為S烟零,同步標志位瘪松,用于建立會話連接咸作,同步序列號;
ACK: 簡寫為.宵睦,確認標志位记罚,對已接收的數(shù)據(jù)包進行確認;
FIN: 簡寫為F壳嚎,完成標志位桐智,表示我已經沒有數(shù)據(jù)要發(fā)送了,即將關閉連接烟馅;
PSH:簡寫為P说庭,推送標志位,表示該數(shù)據(jù)包被對方接收后應立即交給上層應用郑趁,而不在緩沖區(qū)排隊刊驴;
RST:簡寫為R,重置標志位寡润,用于連接復位捆憎、拒絕錯誤和非法的數(shù)據(jù)包;
URG:簡寫為U梭纹,緊急標志位躲惰,表示數(shù)據(jù)包的緊急指針域有效,用來保證連接不被阻斷变抽,并督促中間設備盡快處理础拨;

TCP 三次握手建立連接

所謂三次握手(Three-way Handshake),是指建立一個 TCP 連接時瞬沦,需要客戶端和服務器總共發(fā)送3個報文太伊。

三次握手的目的是連接服務器指定端口雇锡,建立 TCP 連接逛钻,并同步連接雙方的序列號和確認號,交換 TCP 窗口大小信息锰提。在 socket 編程中曙痘,客戶端執(zhí)行 connect() 時。將觸發(fā)三次握手立肘。

三次握手建立連接

第一次握手:
客戶端將TCP報文標志位SYN置為1边坤,隨機產生一個序號值seq=J,保存在TCP首部的序列號(Sequence Number)字段里谅年,指明客戶端打算連接的服務器的端口茧痒,并將該數(shù)據(jù)包發(fā)送給服務器端,發(fā)送完畢后融蹂,客戶端進入SYN_SENT狀態(tài)旺订,等待服務器端確認弄企。
第二次握手:
服務器端收到數(shù)據(jù)包后由標志位SYN=1知道客戶端請求建立連接,服務器端將TCP報文標志位SYN和ACK都置為1区拳,ack=J+1拘领,隨機產生一個序號值seq=K,并將該數(shù)據(jù)包發(fā)送給客戶端以確認連接請求樱调,服務器端進入SYN_RCVD狀態(tài)约素。
第三次握手:
客戶端收到確認后,檢查ack是否為J+1笆凌,ACK是否為1圣猎,如果正確則將標志位ACK置為1,ack=K+1乞而,并將該數(shù)據(jù)包發(fā)送給服務器端样漆,服務器端檢查ack是否為K+1,ACK是否為1晦闰,如果正確則連接建立成功放祟,客戶端和服務器端進入ESTABLISHED狀態(tài),完成三次握手呻右,隨后客戶端與服務器端之間可以開始傳輸數(shù)據(jù)了跪妥。

注意:我們上面寫的ack和ACK,不是同一個概念:

  • 小寫的ack代表的是頭部的確認號Acknowledge number声滥, 縮寫ack眉撵,是對上一個包的序號進行確認的號,ack=seq+1落塑。
  • 大寫的ACK纽疟,則是我們上面說的TCP首部的標志位,用于標志的TCP包是否對上一個包進行了確認操作憾赁,如果確認了污朽,則把ACK標志位設置成1奈附。

為什么需要三次握手每庆?

我們假設client發(fā)出的第一個連接請求報文段并沒有丟失稠诲,而是在某個網(wǎng)絡結點長時間的滯留了巾兆,以致延誤到連接釋放以后的某個時間才到達server痒筒。
本來這是一個早已失效的報文段惨篱。但server收到此失效的連接請求報文段后栓拜,就誤認為是client再次發(fā)出的一個新的連接請求姓建。于是就向client發(fā)出確認報文段缓溅,同意建立連接蛇损。
假設不采用“三次握手”,那么只要server發(fā)出確認,新的連接就建立了淤齐。由于現(xiàn)在client并沒有發(fā)出建立連接的請求束世,因此不會理睬server的確認,也不會向server發(fā)送數(shù)據(jù)床玻。但server卻以為新的運輸連接已經建立毁涉,并一直等待client發(fā)來數(shù)據(jù)。這樣锈死,server的很多資源就白白浪費掉了贫堰。

所以,采用“三次握手”的辦法可以防止上述現(xiàn)象發(fā)生待牵。例如剛才那種情況其屏,client不會向server的確認發(fā)出確認。server由于收不到確認缨该,就知道client并沒有要求建立連接偎行。經過三次的互相確認,大家就會認為對方對聽的到自己說話贰拿,并且愿意下一步溝通蛤袒,否則,對話就不一定能正常下去了膨更。

TCP 四次揮手關閉連接

四次揮手即終止TCP連接妙真,就是指斷開一個TCP連接時,需要客戶端和服務端總共發(fā)送4個包以確認連接的斷開荚守。在socket編程中珍德,這一過程由客戶端或服務端任一方執(zhí)行close來觸發(fā)。
由于TCP連接是全雙工的矗漾,因此锈候,每個方向都必須要單獨進行關閉,這一原則是當一方完成數(shù)據(jù)發(fā)送任務后敞贡,發(fā)送一個FIN來終止這一方向的連接泵琳,收到一個FIN只是意味著這一方向上沒有數(shù)據(jù)流動了,即不會再收到數(shù)據(jù)了嫡锌,但是在這個TCP連接上仍然能夠發(fā)送數(shù)據(jù)虑稼,直到這一方向也發(fā)送了FIN。首先進行關閉的一方將執(zhí)行主動關閉势木,而另一方則執(zhí)行被動關閉。

四次揮手關閉連接
揮手請求可以是Client端歌懒,也可以是Server端發(fā)起的啦桌,我們假設是Client端發(fā)起:

第一次揮手: Client端發(fā)起揮手請求,向Server端發(fā)送標志位是FIN報文段,設置序列號seq甫男,此時且改,Client端進入FIN_WAIT_1狀態(tài),這表示Client端沒有數(shù)據(jù)要發(fā)送給Server端了板驳。
第二次分手:Server端收到了Client端發(fā)送的FIN報文段又跛,向Client端返回一個標志位是ACK的報文段,ack設為seq加1若治,Client端進入FIN_WAIT_2狀態(tài)慨蓝,Server端告訴Client端,我確認并同意你的關閉請求端幼。
第三次分手: Server端向Client端發(fā)送標志位是FIN的報文段礼烈,請求關閉連接,同時Client端進入LAST_ACK狀態(tài)婆跑。
第四次分手 : Client端收到Server端發(fā)送的FIN報文段此熬,向Server端發(fā)送標志位是ACK的報文段,然后Client端進入TIME_WAIT狀態(tài)滑进。Server端收到Client端的ACK報文段以后犀忱,就關閉連接。此時扶关,Client端等待2MSL的時間后依然沒有收到回復峡碉,則證明Server端已正常關閉,那好驮审,Client端也可以關閉連接了鲫寄。

為什么連接的時候是三次握手,關閉的時候卻是四次握手疯淫?

建立連接時因為當Server端收到Client端的SYN連接請求報文后地来,可以直接發(fā)送SYN+ACK報文。其中ACK報文是用來應答的熙掺,SYN報文是用來同步的未斑。所以建立連接只需要三次握手。
由于TCP協(xié)議是一種面向連接的币绩、可靠的蜡秽、基于字節(jié)流的運輸層通信協(xié)議,TCP是全雙工模式缆镣。
這就意味著芽突,關閉連接時,當Client端發(fā)出FIN報文段時董瞻,只是表示Client端告訴Server端數(shù)據(jù)已經發(fā)送完畢了寞蚌。當Server端收到FIN報文并返回ACK報文段田巴,表示它已經知道Client端沒有數(shù)據(jù)發(fā)送了,但是Server端還是可以發(fā)送數(shù)據(jù)到Client端的挟秤,所以Server很可能并不會立即關閉SOCKET壹哺,直到Server端把數(shù)據(jù)也發(fā)送完畢。
當Server端也發(fā)送了FIN報文段時艘刚,這個時候就表示Server端也沒有數(shù)據(jù)要發(fā)送了管宵,就會告訴Client端,我也沒有數(shù)據(jù)要發(fā)送了攀甚,之后彼此就會愉快的中斷這次TCP連接箩朴。

為什么要等待2MSL?

MSL:報文段最大生存時間云稚,它是任何報文段被丟棄前在網(wǎng)絡內的最長時間隧饼。
有以下兩個原因:
第一點:保證TCP協(xié)議的全雙工連接能夠可靠關閉:
由于IP協(xié)議的不可靠性或者是其它網(wǎng)絡原因,導致了Server端沒有收到Client端的ACK報文静陈,那么Server端就會在超時之后重新發(fā)送FIN燕雁,如果此時Client端的連接已經關閉處于CLOESD狀態(tài),那么重發(fā)的FIN就找不到對應的連接了鲸拥,從而導致連接錯亂拐格,所以,Client端發(fā)送完最后的ACK不能直接進入CLOSED狀態(tài)刑赶,而要保持TIME_WAIT捏浊,當再次收到FIN的收,能夠保證對方收到ACK撞叨,最后正確關閉連接金踪。
第二點:保證這次連接的重復數(shù)據(jù)段從網(wǎng)絡中消失
如果Client端發(fā)送最后的ACK直接進入CLOSED狀態(tài),然后又再向Server端發(fā)起一個新連接牵敷,這時不能保證新連接的與剛關閉的連接的端口號是不同的胡岔,也就是新連接和老連接的端口號可能一樣了,那么就可能出現(xiàn)問題:如果前一次的連接某些數(shù)據(jù)滯留在網(wǎng)絡中枷餐,這些延遲數(shù)據(jù)在建立新連接后到達Client端靶瘸,由于新老連接的端口號和IP都一樣,TCP協(xié)議就認為延遲數(shù)據(jù)是屬于新連接的毛肋,新連接就會接收到臟數(shù)據(jù)怨咪,這樣就會導致數(shù)據(jù)包混亂。所以TCP連接需要在TIME_WAIT狀態(tài)等待2倍MSL润匙,才能保證本次連接的所有數(shù)據(jù)在網(wǎng)絡中消失诗眨。


圖片.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市趁桃,隨后出現(xiàn)的幾起案子辽话,更是在濱河造成了極大的恐慌肄鸽,老刑警劉巖卫病,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件油啤,死亡現(xiàn)場離奇詭異,居然都是意外死亡蟀苛,警方通過查閱死者的電腦和手機益咬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帜平,“玉大人幽告,你說我怎么就攤上這事●伤Γ” “怎么了冗锁?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嗤栓。 經常有香客問我冻河,道長,這世上最難降的妖魔是什么茉帅? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任叨叙,我火速辦了婚禮,結果婚禮上堪澎,老公的妹妹穿的比我還像新娘擂错。我一直安慰自己,他們只是感情好樱蛤,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布钮呀。 她就那樣靜靜地躺著,像睡著了一般昨凡。 火紅的嫁衣襯著肌膚如雪爽醋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天土匀,我揣著相機與錄音子房,去河邊找鬼。 笑死就轧,一個胖子當著我的面吹牛证杭,可吹牛的內容都是我干的。 我是一名探鬼主播妒御,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼解愤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了乎莉?” 一聲冷哼從身側響起送讲,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤奸笤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哼鬓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體监右,經...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年异希,在試婚紗的時候發(fā)現(xiàn)自己被綠了健盒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡称簿,死狀恐怖扣癣,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情憨降,我是刑警寧澤父虑,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站授药,受9級特大地震影響士嚎,放射性物質發(fā)生泄漏。R本人自食惡果不足惜烁焙,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一航邢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧骄蝇,春花似錦膳殷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至岔激,卻和暖如春勒极,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背虑鼎。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工辱匿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人炫彩。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓匾七,卻偏偏與公主長得像,于是被迫代替她去往敵國和親江兢。 傳聞我的和親對象是個殘疾皇子昨忆,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內容