今天好好的又又又把 tcp 的三次/四次握手學習了一遍恬叹,輸出一下。
幫助理解的重要前提
這個前提就是,tcp 本身是一個面向連接的执赡,全雙工的傳輸層協(xié)議。也即 bi-direction or to say full-duplex函筋。
三次握手
借用一張網(wǎng)圖:
四次斷開
再借一張圖:
自己總結
用自己的白話來講就是搀玖,tcp 不管建立連接還是關閉連接,都有 sync/fin - ack 的過程驻呐,從client 和 server 出發(fā)來講都是如此灌诅。
之所以建立連接只需要三次芳来,是因為,當 server接到 client 的 sync 請求時猜拾,可以同時把 ack 和 sync 合并發(fā)送給 client即舌。
而關閉連接需要四次是因為,server 接到 client 的 fin 請求并返回 ack 之后挎袜,并不一定要決定此時立刻馬上也把自己關掉顽聂。
(這里就是前文提到的重要前提,因為 tcp 是全雙工的盯仪,雖然你 client 不想和我連接了紊搪,但是我自己的事情還沒處理完,比如server 還沒接收完上次的發(fā)過來的數(shù)據(jù)等等)全景,所以這時候并不一定會立刻返回fin 給 client耀石,于是便有了四次握手。但是爸黄,并不一定不代表不會滞伟,猜想當 server 在收到 client 發(fā)送的 fin 之后發(fā)現(xiàn)自己也可以關掉連接了,于是有可能也會在返回 ack 時候同時返回 fin炕贵。這時候關閉連接實際上也是三次梆奈。
這也是我在 Stack Overflow 上看到有人問為什么 tcp 關閉連接時四次握手而不是三次握手底下看到的最簡短的一個答案:It can, and sometimes it does! ??
PS: 網(wǎng)圖侵刪