“当高启强遇到陈书婷”与TCP协议
大家是否經常聽別人提起TCP協議的三次握手和四次揮手呢?是否看過很多相關的文章都沒看懂或是沒記住呢?看過我上篇的小伙伴都應該知道TCP協議是屬于傳輸層中的協議,沒有看過的請移步這里 “老默我想吃魚了”與五層網絡模型。
TCP協議中的三次握手和四次揮手是計算機網絡中最重要的知識點,也是我們面試過程中經常問到的點。TCP協議(Transmission Control Protocol,傳輸控制協議)是處理可靠傳輸的,保證數據的正確性,只要使用這個協議,那雙方的數據永遠不可能錯亂,多個字或者少個字的情況。
TCP收發數據流程
不知道大家是否還記得強哥第一次見大嫂是什么場景?花襯衫?深綠色西裝?別猜了,看張圖片幫你回憶
沒錯,第一次見大嫂提了一斤橘子,當大嫂看到強哥穿著很是詫異,完全不想搭理,但有句話說的好,不看僧面看佛面,看在橘子面勉強跟你嘮嘮,畫了一張簡圖:
TCP收發數據流程也是如此,主要分為三個部分,首先是建立連接,我們一般稱為三次握手,打完招呼之后就是正事了,互相交流寒暄,我們把這種互相交流稱為收發數據,我們需要注意的是這里的收發數據并不像HTTP請求那樣,由客戶端發出請求,服務端再響應,這里既可以由客戶端發送到服務端,服務端也可以發送到客戶端,如果把強哥比作客戶端,大嫂比作服務端,就是強哥可以找大嫂說話,大嫂也能找強哥說話。當交流完畢后就say goodbye,一般稱為四次揮手,至于為什么要握三次手、揮四次手后面會說,莫急!
TCP如何收發數據
自從強哥見了舒婷,便茶不思、飯不想、夜不能寐,懂的都懂,強哥是被舒婷談吐氣質深深折服了,有一天,強哥準備發微信試探性問問舒婷內心真實的想法,以下就是強哥編輯的內容:
當強哥編輯了這么一大坨內容之后,是如何跑到舒婷的手機中的呢?TCP是通過分段的方式進行傳輸的,之所以分段發送是因為有時我們發送的東西特別多,容易造成阻塞,分段還有一個好處就是如果遇到丟包,后續只需要重新發送丟包的段即可,畫個簡圖:
如果發送數據量很小的時候,就不需要分段了,一次性就過去。當數據量很大的時候,就要用到分段了,它會將整個數據分成段,按照字節進行編號,然后取出第一段,加上TCP頭(藍色方塊)開始發送,緊接著取出第二段,再加上TCP頭開始發送,依次類推,直到數據全部發完。
在TCP協議中,無論是發送方還是接收方,都可以主動給對方發送消息,數據傳輸的過程中,難免會出現數據報丟失、順序錯亂的情況,那么它是如何解決可靠傳輸問題呢?TCP協議規定:接收方收到數據報后,都要對數據報進行確認,用強哥和舒婷的例子來說,就是當強哥發了一大坨詩意的文字后,舒婷看到后回復一句:“好,我收到了,還有我不喜歡虛的,喜歡實在點的”,有句流行語叫“句句有回音,件件有著落”,就是這么個意思。但如果沒有回應的話,那就表明數據出了問題,后續就需要重新發送了。
畫個簡圖:
對照這個圖,我們再走一遍可靠傳輸流程,當強哥將編寫好的信息發送給舒婷時,如果數據量過大,就需要進行分段發送,取出第一段并攜帶TCP頭形成數據報進行傳輸,這個TCP頭部包含了很多的信息,其中就有seq、ACK、ack
- seq:全稱sequence,表示這次數據報序號,就是整個數據被分成段之后發送每一段的序號,有了它我們就知道這次是發送哪一段的數據報
- ACK:表示這次數據數據報是一個確認數據報,只能取0或1,相當于是個布爾值,為0時表示發送方發出的數據,為1時表示確認數據
- ack:表示期望下次收到的數據報序號
當強哥開始發送消息時,TCP頭攜帶seq=x和ACK=0,seq表示的是數據報序號,由于我們并不知道當前是發送第幾個數據報片段,所以用x表示,ACK=0表示當前數據報還沒有被接收方確認,當舒婷收到消息后,回應一句,你寫的詩我看了,此時ACK就變為1,表示自己已經收到消息了,接收方已經確認,ack=x+1意思是數據報序號為x的我已經收到了,下次麻煩給我發送序號為x+1的數據報。但是如果發送方長時間沒有收到數據報的確認(ACK=1),那就說明這段數據報出問題了,后續會重新發送。
建立連接(三次握手)
三次握手,想必大家都聽過吧!為什么要三次呢?兩次行不行?我覺得一次就行了,難不成想耍流氓?還有我怎么不知道TCP還有手呢?接下來依然用強哥和書婷的例子,讓大家明白三次握手
遇到書婷之前,強哥從未談過戀愛,也并不知道如何追女孩子,這不深夜聯系了法醫,經過我的細心指導,最終向強哥推薦了這本《魔鬼搭訕學》
如果有掘友想咨詢感情問題,那就關注我吧!法醫,教你們如何更快的分手,哈哈。
當強哥得知舒婷喜歡實在點的,不喜歡虛的,強哥準備用書信的方式表達自己的傾慕之情,以下是信的內容
然后強哥叫了一位美團小哥去送信,這一行為相當于TCP發起建立鏈接的請求,美團小哥走著走著迷路了,也不知道走哪里去了,那強哥的信肯定是送不到的,書婷自然也不可能有所回應,這一情況說明TCP的數據報丟失了,強哥長時間沒有收到書婷的回應,說明ACK=0,此時強哥會重新寫一封,繼續叫一位靠譜的美團小哥送信,直到書婷有所回應,看來強哥也是一位專情的人,希望大家都做一個對待感情專一的人
經過一番折騰,這封信終于到了書婷的手中,這一過程我們稱為第一次握手,第一次握手后書婷知道強哥具有發消息的能力,但是書婷并不知道強哥是否可以收消息,這還得看送信人靠不靠譜,書婷聯系了好評100%的餓了么小哥送信,書婷編輯了以下內容:
書婷讓餓了么小哥送信的過程,我們稱為第二次握手,不負所望,餓了么小哥成功將書信送到強哥手中,當強哥滿心激動、小心翼翼地打開信封,看到書婷寫的信,整個心都要碎了,淚流滿面,深夜,正當我寫文章之際,強哥不停敲打房門,當我打開門之后,看到淚流滿面的強哥,急忙詢問,強哥擦了擦鼻涕跟我說:“第一次表白就被拒絕了”,當我接過強哥手中的信,安慰說到:“女人心海底針,你沒有被拒絕,看,人家稱你為小強,說明你是打不死的小強”,強哥痛定思痛之后決定繼續追求書婷。
強哥收到書婷的信之后,我們稱為第二次握手,此時知道書婷能收到強哥寄的信了,同時也具有寄信的能力,但是舒婷還是不知道強哥是否收到自己的信了,這時強哥回了一封信,并寫道:“此生非你不娶!”,美團小哥安全將信送到書婷手中,書婷看了信之后心想:“這家伙還蠻有毅力的”,當書婷成功收到信之后,我們稱這次為第三次握手,此時書婷知道了強哥也可以收到自己的信了,這時強哥和舒婷都知道對方既有寄信的能力,又有收信的能力,表示通過三次握手的方式兩人溝通渠道已經建立成功。接下來就是隨心所欲的發送消息了。
畫個簡圖:
我們過一遍這個圖,當發送的數據過大時,會被分成一段一段的數據報,每一段數據報頭部都會有TCP頭部,這里面包含了很多信息,其中就有上圖中的SYN(Synchronize Sequence Numbers,同步序列編號,是連接建立的握手信號)、seq(sequence,數據報序號)、ACK(Acknowledge character,確認字符,只有0和1)
每個鏈接都是從CLOSED狀態開始的,當它執行一個主動打開連接操作或者被動打開連接操作,它就離開了CLOSED狀態,當強哥開始寄第一封信的時候,鏈接從CLOSED狀態進入SYN-SENT狀態,TCP頭部攜帶SYN=1表示我要跟書婷建立同步鏈接、seq=x表示這次發送的是序號為x的數據報、ACK=0表示還未被確認的數據報,將這三個同時發給書婷,書婷成功收到信后,CLOSED狀態關閉并進入SYN-RCVD狀態,表示第一次握手成功,此時書婷知道強哥具有寄信的功能,但不知道的是強哥是否有收信的功能,這時書婷開始回信,第二次握手發生了,書婷的信攜帶TCP頭部的信息SYN=1表示我要跟強哥建立同步鏈接,seq=y表示這次發送的是序號為y的數據報、ACK=1表示強哥的信被確認的數據報、ack=x+1表示序號為x的數據報已經收到,麻煩下次給我發x+1序號的數據報,當強哥成功收到書婷的回信后,第二次握手成功,強哥看了信悲痛欲絕、撕心裂肺、痛定思痛之后決定此生非書婷不娶,強哥此時已經知道書婷可以收到自己的信,但是書婷并不知道強哥已經收到自己的信,所以強哥需要再次寫封信告訴書婷:“此生非你不娶”,這時第三次握手發生了,當書婷收到強哥的信后,書婷明白強哥是個專一的人,同時書婷也知道強哥可以收到自己的信,此時書婷和強哥雙方都具有寄信和收信的能力,這一刻兩人的連接就建立成功了,連接狀態就變成ESTAB-LISHED,表示正常的傳輸狀態,可以互相交流了。
連接銷毀(四次揮手)
三次握手我們已經知道,那四次揮手又是什么呢?為什么握手需要三次?揮手卻需要四次?難道是對我依依不舍?
經過幾天的書信往來,書婷漸漸對強哥也有了好感,加上第一次見面時的情景歷歷在目,強哥也是喜歡陪孩子玩耍的,其實男人除了疼愛自己的老婆時有魅力,還有就是帶孩子,與孩子一起玩耍的時候,此時的他們少了父愛的光環,而蛻變成了一個活脫脫的孩子,像個孩子一樣天真可愛。平時看上去不茍言笑的大男人,他們在當了父親,陪伴孩子的時候,摘掉了社會發給他們的面具和偽裝,心就像白云一樣柔軟和干凈。我想這也是陳書婷喜歡強哥的一方面吧
這天安欣警官喊強哥一起吃豬腳面,隨后強哥修書一封告訴書婷:“安警官約我吃面,不能給你寫信了”,強哥是個負責任的男人,雖然他很想和安警官一起吃面,但是他必須征求書婷的同意,所以強哥會等到書婷的來信之后再做決定。
當強哥寫信告訴書婷:“安警官約我吃面,不能給你寫信了”,這就是第一次揮手,無論是強哥,還是書婷,都可以發起第一次揮手,我們暫且稱為發送方,每一次請求都需要被確認才可以,所以當發送方發起第一次揮手時,發完并不會立刻就掛,而是要等接收方的回應。
不一會功夫強哥收到了書婷的回信:“小強兒, 我知道了,但是我還有最后幾句話想跟你說,所以你先別去,等我說完”,然后書婷單方面的寫了一大堆寄給小強兒,當把所有的話說完后,書婷寫了最后一封信:“我想說的已經說完了,你去吧,等你忙完我們再聯系”
書婷收到了強哥的來信,隨后回復:“小強兒, 我知道了,但是我還有最后幾句話想跟你說,所以你先別去,等我說完”,這就是第二次揮手,這里發生了兩件事情,第一件就是確認收到了強哥來信,知道強哥準備出門和安警官吃面,不能繼續寫信了,第二個就是書婷還要說幾句話,然后書婷繼續巴拉巴拉說,等書婷說完之后寫了最后一封信:“我想說的已經說完了,你去吧,等你忙完我們再聯系”,這是第三次揮手
強哥收到了書婷的來信:“我想說的已經說完了,你去吧,等你忙完我們再聯系”,強哥也知道書婷的話也說完了,但是舒婷也并不知道強哥是否收到,所以強哥依然還需要進行回復:“好,我知道了,我吃完面回來找你”
強哥最后回復“好,我知道了,我吃完面回來找你”就是第四次揮手,完成之后,連接銷毀
畫一張簡圖:
接下來我們詳細的過一遍這個流程:
強哥和舒婷兩人相聊甚歡,有一天,安警官約強哥一起吃豬腳面,所以強哥寫一封信:“安警官約我吃面,不能給你寫信了”,這就是第一次揮手,TCP頭部有一個特殊的信息FIN(finish,表示想結束了),當FIN=1時,說明這次的數據報準備銷毀連接了,發送成功后,強哥的狀態從ESTAB-LISHED變為FIN-WAIT-1,表示強哥已經說完話結束連接了,看線條1。
當書婷收到強哥的信之后,知道強哥約了安警官一起吃飯,不能繼續寫信聊天了,此時書婷的狀態從ESTAB-LISHED變為CLOSE-WAIT,表示強哥已經發起了關閉連接。隨后書婷寫了一封信:“小強兒,你的信我收到了,我知道你要出去吃飯了,但我還有最后幾句話要說”,這時候ACK=1表示收到強哥的信了,用于確認數據報,這是第二次揮手,用線條2表示,當強哥成功收到書婷的信后,強哥的狀態從FIN-WAIT-1變為FIN-WAIT-2,表示書婷同意強哥去吃面,也就是同意強哥釋放連接。由于接收方(書婷)還沒有發起斷開連接請求,此時書婷依然可以進行數據傳輸,圖中綠色箭頭表示書婷說最后的幾句話。
書婷說完之后,寫了最后一封信:“我想說的已經說完了,你去吧,等你忙完我們再聯系”,這是第三次揮手,TCP頭部包含了FIN=1,說明書婷說完了,準備結束了,書婷的狀態從CLOSE-WAIT變為LAST-ACK,表示所有數據報都結束了,用線條3表示
當強哥收到了書婷來信后,強哥也知道了書婷的話也說完了,也準備結束了,強哥也回復最后一封信:“好,那我出門了,等我回來再說”,TCP頭部的ACK=1表示確認收到書婷的數據報,這是第四次揮手,用線條4表示
圖中有個特別重要的點,就是狀態TIME-WAIT表示等待所有數據報結束,左邊還有一個2MSL,MSL是Maximum Segment Lifetime英文的縮寫,中文可以譯為“報文最大生存時間”,2MSL相當于是數據一個來回的時間,這里為什么要等待這個時間呢?主要是因為發送數據報不可能每次都成功,也有失敗的時候,失敗就需要重新發送,直到數據報被確認,這里假設第四次揮手線條4失敗,沒有發送成功,也沒有等待2MSL時間直接關閉進入CLOSED狀態,這時候書婷會認為強哥沒有收到自己的信,路途中丟失了,那么會再次發送,但是強哥已經處于CLOSED關閉狀態了,這樣會造成書婷不停的發送,但強哥始終確認不了,所以書婷的連接沒有辦法釋放,遲早奔潰了。
補充的點
這里給大家補充一個點,看到這里我想大家也都知道數據包如果很大,會被分成一個個數據報片段進行傳輸,那么數據報片段在哪里組裝成一個完整的數據呢?有一個地方叫做數據緩沖區
我們繼續用強哥和舒婷的例子,書婷無論是從談吐、氣質都是優秀的女孩,那肯定追求者不會少,強哥只是其中之一
畫個簡圖:
這里書婷相當于服務器,而四位追求者相當于客戶端,客戶端和服務器每一次傳輸數據都會經過三次握手和四次揮手,數據報片段都會在數據緩沖區進行組裝,每次通過四次揮手銷毀連接,也就是清除緩沖區釋放空間,當我們每次打開瀏覽器頁面的時候,打開幾個頁面感覺不到卡,那你的打開100個頁面試試,當然這跟電腦配置也有關系。
我想大家現在也應該明白,為什么要使用三次握手和四次揮手?理想狀態一直連著不好嗎?想請求數據隨時請求,干嘛還要斷開,主要還是因為減少服務器的壓力,盡管三次握手和四次揮手會損耗一些時間,但是用這些時間換去服務器的空間是非常劃算的。
最后
欲知后續如何?請聽下回解說,關注我不迷路法醫,如果本篇文章對你有所幫助,或者你有什么疑問,歡迎在評論區留言,我一般看到都會回復的。大家點贊支持一下啊~,點擊鏈接即可關注法醫
總結
以上是生活随笔為你收集整理的“当高启强遇到陈书婷”与TCP协议的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: flutter安装及过程中遇到的问题解决
- 下一篇: app启动速度优化实践