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

之前學了計算機網(wǎng)絡(luò)误堡,但半年后就忘的差不多了古话,感覺TCP/IP協(xié)議的這個知識點很重要,整理一篇文章來鞏固一下锁施。文章分為TCP的概念陪踩,TCP/UDP區(qū)別總結(jié),三次握手四次揮手的過程悉抵,為什么要這么做的原因等四大部分來講解肩狂。

一 、 TCP協(xié)議的概念

TCP(transmission control protocal,傳輸控制協(xié)議),是面向連接的并具備順序控制基跑、重發(fā)控制等機制的婚温。所以它可以為應(yīng)用提供可靠傳輸描焰。工作在網(wǎng)絡(luò)OSI的七層模型的第四層——傳輸層媳否。ip在第三層——網(wǎng)絡(luò)層。我們要知道數(shù)據(jù)從應(yīng)用層發(fā)下來荆秦,會在每一層加上響應(yīng)的頭部信息篱竭,進行封裝然后再發(fā)送到數(shù)據(jù)的接收端。每一層的作用和對應(yīng)的協(xié)議如下:


接下來介紹TCP協(xié)議的數(shù)據(jù)格式和頭部格式每個字段的含義:

  • Source Port和Destination Port:分別占用16位步绸,表示源端口號和目的端口號掺逼;用于區(qū)別主機中的不同進程,而IP地址是用來區(qū)分不同的主機的瓤介,源端口號和目的端口號配合上IP首部中的源IP地址和目的IP地址就能唯一的確定一個TCP連接吕喘。
  • Sequence Number:用來標識從TCP發(fā)端向TCP收端發(fā)送的數(shù)據(jù)字節(jié)流赘那,它表示在這個報文段中的的第一個數(shù)據(jù)字節(jié)在數(shù)據(jù)流中的序號;主要用來解決網(wǎng)絡(luò)報亂序的問題氯质。
  • Acknowledgment Number:32位確認序列號包含發(fā)送確認的一端所期望收到的下一個序號募舟,因此,確認序號應(yīng)當是上次已成功收到數(shù)據(jù)字節(jié)序號加1闻察。不過拱礁,只有當標志位中的ACK標志(下面介紹)為1時該確認序列號的字段才有效。主要用來解決不丟包的問題辕漂。
  • Offset:給出首部中32 bit字的數(shù)目呢灶,需要這個值是因為任選字段的長度是可變的。這個字段占4bit(最多能表示15個32bit的的字钉嘹,即4*15=60個字節(jié)的首部長度)鸯乃,因此TCP最多有60字節(jié)的首部。然而隧期,沒有任選字段飒责,正常的長度是20字節(jié)。
  • TCP Flags:TCP首部中有6個標志比特仆潮,它們中的多個可同時被設(shè)置為1宏蛉,主要是用于操控TCP的狀態(tài)機的,依次為URG性置,ACK拾并,PSHRST鹏浅,SYN嗅义,FIN。每個標志位的意思如下:
    * URG:此標志表示TCP包的緊急指針域(后面馬上就要說到)有效隐砸,用來保證TCP連接不被中斷之碗,并且督促中間層設(shè)備要盡快處理這些數(shù)據(jù)
    * ACK:此標志表示應(yīng)答域有效,就是說前面所說的TCP應(yīng)答號將會包含在TCP數(shù)據(jù)包中季希;有兩個取值:0和1褪那,為1的時候表示應(yīng)答域有效,反之為0
    * PSH:這個標志位表示Push操作式塌。所謂Push操作就是指在數(shù)據(jù)包到達接收端以后博敬,立即傳送給應(yīng)用程序,而不是在緩沖區(qū)中排隊
    * RST:這個標志表示連接復位請求峰尝。用來復位那些產(chǎn)生錯誤的連接偏窝,也被用來拒絕錯誤和非法的數(shù)據(jù)包
    * SYN:表示同步序號,用來建立連接。SYN標志位和ACK標志位搭配使用祭往,當連接請求的時候伦意,SYN=1,ACK=0硼补;連接被響應(yīng)的時候默赂,SYN=1,ACK=1括勺;這個標志的數(shù)據(jù)包經(jīng)常被用來進行端口掃描缆八。掃描者發(fā)送一個只有SYN的數(shù)據(jù)包,如果對方主機響應(yīng)了一個數(shù)據(jù)包回來 疾捍,就表明這臺主機存在這個端口奈辰;但是由于這種掃描方式只是進行TCP三次握手的第一次握手,因此這種掃描的成功表示被掃描的機器不很安全乱豆,一臺安全的主機將會強制要求一個連接嚴格的進行TCP的三次握手
    * FIN: 表示發(fā)送端已經(jīng)達到數(shù)據(jù)末尾奖恰,也就是說雙方的數(shù)據(jù)傳送完成,沒有數(shù)據(jù)可以傳送了宛裕,發(fā)送FIN標志位的TCP數(shù)據(jù)包后瑟啃,連接將被斷開。這個標志的數(shù)據(jù)包也經(jīng)常被用于進行端口掃描
  • Window:窗口大小揩尸,也就是有名的滑動窗口蛹屿,用來進行流量控制。

二岩榆、 TCP/UDP區(qū)別總結(jié)

TCP(Transmission Control Protocol)
UDP(User Datagram Protocol)

  • TCP面向連接(如打電話要先撥號建立連接)错负,UDP是無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接勇边。
  • TCP提供可靠的服務(wù),邏輯通信信道是全雙工的可靠信道犹撒,也就是說通過TCP連接傳送的數(shù)據(jù),無差錯粒褒,不丟失识颊,不重復,且按序到達奕坟。UDP是不可靠信道盡最大努力交付祥款,即不保證可靠交付。
  • TCP面向字節(jié)流执赡,實際上是TCP把數(shù)據(jù)看成一連串無結(jié)構(gòu)的字節(jié)流镰踏。UDP是面向報文的UDP沒有擁塞控制函筋,因此網(wǎng)絡(luò)出現(xiàn)擁塞不會使源主機的發(fā)送速率降低(對實時應(yīng)用很有用沙合,如IP電話,實時視頻會議等)跌帐。
  • 每一條TCP連接只能是點到點的,UDP支持一對一首懈,一對多绊率,多對一和多對多的交互通信。
  • TCP首部開銷20字節(jié)究履,UDP的首部開銷小滤否,只有8個字節(jié)。

三 最仑、 三次握手四次揮手的過程

TCP是面向連接的藐俺,無論哪一方向另一方發(fā)送數(shù)據(jù)之前,都必須先在雙方之間建立一條連接泥彤。

  • 第一次握手:建立連接欲芹。客戶端發(fā)送連接請求報文段吟吝,將SYN位置為1菱父,Sequence Number為x;然后剑逃,客戶端進入SYN_SEND狀態(tài)浙宜,等待服務(wù)器的確認。
  • 第二次握手:服務(wù)器收到SYN報文段蛹磺。服務(wù)器收到客戶端的SYN報文段粟瞬,需要對這個SYN報文段進行確認,設(shè)置Acknowledgment Number為x+1(Sequence Number+1)萤捆;同時亩钟,自己自己還要發(fā)送SYN請求信息,將SYN位置為1鳖轰,Sequence Number為y清酥;服務(wù)器端將上述所有信息放到一個報文段(即SYN+ACK報文段)中,一并發(fā)送給客戶端蕴侣,此時服務(wù)器進入SYN_RECV狀態(tài)
  • 第三次握手:客戶端收到服務(wù)器的SYN+ACK報文段焰轻。然后將Acknowledgment Number設(shè)置為y+1,向服務(wù)器發(fā)送ACK報文段昆雀,這個報文段發(fā)送完畢以后辱志,客戶端和服務(wù)器端都進入ESTABLISHED狀態(tài),完成TCP三次握手狞膘。

完成了三次握手揩懒,客戶端和服務(wù)器端就可以開始傳送數(shù)據(jù)。


當客戶端和服務(wù)器通過三次握手建立了TCP連接以后挽封,當數(shù)據(jù)傳送完畢已球,要斷開TCP連接.對于TCP的斷開連接,這里就有了神秘的“四次分手”。

  • 第一次分手:主機1(可以使客戶端智亮,也可以是服務(wù)器端)忆某,設(shè)置Sequence NumberAcknowledgment Number,向主機2發(fā)送一個FIN報文段阔蛉;此時弃舒,主機1進入FIN_WAIT_1狀態(tài);這表示主機1沒有數(shù)據(jù)要發(fā)送給主機2了状原。
  • 第二次分手:主機2收到了主機1發(fā)送的FIN報文段聋呢,向主機1回一個ACK報文段,Acknowledgment NumberSequence Number加1颠区;主機1進入FIN_WAIT_2狀態(tài)坝冕;主機2告訴主機1,我“同意”你的關(guān)閉請求瓦呼。
  • 第三次分手:主機2向主機1發(fā)送FIN報文段喂窟,請求關(guān)閉連接,同時主機2進入LAST_ACK狀態(tài)央串。
  • 第四次分手:主機1收到主機2發(fā)送的FIN報文段磨澡,向主機2發(fā)送ACK報文段,然后主機1進入TIME_WAIT狀態(tài)质和;主機2收到主機1的ACK報文段以后稳摄,就關(guān)閉連接;此時饲宿,主機1等待2MSL后依然沒有收到回復厦酬,則證明Server端已正常關(guān)閉,主機1也可以關(guān)閉連接了瘫想。

四仗阅、 相關(guān)問題

  • 1 為什么要三次握手?
    感覺兩次就能完成連接国夜,為什么非要三次呢减噪?引用謝希仁的《計算機網(wǎng)絡(luò)》中的解釋

為了防止已失效的連接請求報文段突然又傳送到了服務(wù)器端,因而產(chǎn)生錯誤车吹。

就是防止服務(wù)器端的一直等待而浪費了資源筹裕。

  • 2 為什么要四次分手?
    TCP協(xié)議是一種面向連接的窄驹、可靠的朝卒、基于字節(jié)流的運輸層通信協(xié)議。TCP是全雙工模式乐埠,這就意味著抗斤,當主機1發(fā)出FIN報文段時囚企,只是表示主機1已經(jīng)沒有數(shù)據(jù)要發(fā)送了,主機1告訴主機2豪治,它的數(shù)據(jù)已經(jīng)全部發(fā)送完畢了;但是扯罐,這個時候主機1還是可以接受來自主機2的數(shù)據(jù)负拟;當主機2返回ACK報文段時,表示它已經(jīng)知道主機1沒有數(shù)據(jù)發(fā)送了歹河,但是主機2還是可以發(fā)送數(shù)據(jù)到主機1的掩浙;當主機2也發(fā)送了FIN報文段時,這個時候就表示主機2也沒有數(shù)據(jù)要發(fā)送了秸歧,就會告訴主機1厨姚,我也沒有數(shù)據(jù)要發(fā)送了,之后彼此就會愉快的中斷這次TCP連接键菱。
  • 3 為什么TIME_WAIT狀態(tài)還需要等2MSL后才能返回到CLOSED狀態(tài)谬墙?
  • 什么是2MSL?MSL即Maximum Segment Lifetime经备,也就是報文最大生存時間拭抬,引用《TCP/IP詳解》中的話:“它(MSL)是任何報文段被丟棄前在網(wǎng)絡(luò)內(nèi)的最長時間∏置桑”那么造虎,2MSL也就是這個時間的2倍。其實我覺得沒必要把這個MSL的確切含義搞明白纷闺,你所需要明白的是算凿,當TCP連接完成四個報文段的交換時,主動關(guān)閉的一方將繼續(xù)等待一定時間(2-4分鐘)犁功,即使兩端的應(yīng)用程序結(jié)束氓轰。
  • 從以上TCP連接關(guān)閉的狀態(tài)轉(zhuǎn)換圖可以看出,主動關(guān)閉的一方在發(fā)送完對對方FIN報文的確認(ACK)報文后浸卦,會進入TIME_WAIT狀態(tài)戒努。TIME_WAIT狀態(tài)也稱為2MSL狀態(tài)。
  • 為什么需要2MSL镐躲?根據(jù)《TCP/IP詳解》和《The TCP/IP Guide》中的說法储玫,有兩個原因:

其一,保證發(fā)送的ACK會成功發(fā)送到對方萤皂,如何保證撒穷?我覺得可能是通過超時計時器發(fā)送。這個就很難用代碼演示了裆熙。

其二端礼,報文可能會被混淆禽笑,意思是說,其他時候的連接可能會被當作本次的連接蛤奥。直接引用《The TCP/IP Guide》的說法:The second is to provide a “buffering period” between the end of this connection and any subsequent ones. If not for this period, it is possible that packets from different connections could be mixed, creating confusion.

  • 4 常見的應(yīng)用中有哪些是應(yīng)用TCP協(xié)議的佳镜,哪些又是應(yīng)用UDP協(xié)議的,為什么它們被如此設(shè)計凡桥?
  • 多播的信息一定要用UDP實現(xiàn)弱睦,因為TCP只支持一對一通信莽使。
  • 如果一個應(yīng)用場景重性能甚于重完整性和安全性,那么適合于UDP,比如多媒體應(yīng)用尸疆,缺一兩幀不影響用戶體驗莲镣,但是需要流媒體到達的速度快拙绊,因此比較適合用UDP无切。
  • 以qq為例的一個說明
  • 登陸采用TCP協(xié)議和HTTP協(xié)議,你和好友之間發(fā)送消息啡省,主要采用UDP協(xié)議娜睛,內(nèi)網(wǎng)傳文件采用了P2P技術(shù)。
  • 和好友發(fā)消息卦睹,客戶端client采用UDP協(xié)議微姊,但是需要通過服務(wù)器轉(zhuǎn)發(fā)。騰訊為了確保傳輸消息的可靠分预,采用上層協(xié)議來保證可靠傳輸兢交。如果消息發(fā)送失敗,客戶端會提示消息發(fā)送失敗笼痹,并可重新發(fā)送配喳。
  • 如果是在內(nèi)網(wǎng)里面的兩個客戶端傳文件,QQ采用的是P2P技術(shù)凳干,不需要服務(wù)器中轉(zhuǎn)晴裹。

參考文獻

http://blog.csdn.net/yipiankongbai/article/details/24435977
http://www.jellythink.com/archives/705
http://www.zhihu.com/question/20292749
謝希仁《計算機網(wǎng)絡(luò)》《圖解tcp/ip》《tcp/ip詳解》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市救赐,隨后出現(xiàn)的幾起案子涧团,更是在濱河造成了極大的恐慌,老刑警劉巖经磅,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泌绣,死亡現(xiàn)場離奇詭異,居然都是意外死亡预厌,警方通過查閱死者的電腦和手機阿迈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轧叽,“玉大人苗沧,你說我怎么就攤上這事刊棕。” “怎么了待逞?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵甥角,是天一觀的道長。 經(jīng)常有香客問我识樱,道長嗤无,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任牺荠,我火速辦了婚禮翁巍,結(jié)果婚禮上驴一,老公的妹妹穿的比我還像新娘休雌。我一直安慰自己,他們只是感情好肝断,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布杈曲。 她就那樣靜靜地躺著,像睡著了一般胸懈。 火紅的嫁衣襯著肌膚如雪担扑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天趣钱,我揣著相機與錄音涌献,去河邊找鬼。 笑死首有,一個胖子當著我的面吹牛燕垃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播井联,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼卜壕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了烙常?” 一聲冷哼從身側(cè)響起轴捎,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蚕脏,沒想到半個月后侦副,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡驼鞭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年跃洛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片终议。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡汇竭,死狀恐怖葱蝗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情细燎,我是刑警寧澤两曼,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站玻驻,受9級特大地震影響悼凑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜璧瞬,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一户辫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嗤锉,春花似錦渔欢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至访诱,卻和暖如春垫挨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背触菜。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工九榔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人涡相。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓哲泊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親漾峡。 傳聞我的和親對象是個殘疾皇子攻旦,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容