第三次握手为什么没有序列号_图解TCP三次握手与四次分手
TCP三次握手和四次揮手不管是在開發還是面試中都是一個非常重要的知識點,它是我們優化web程序性能的基礎。但是大部分教材都對這部分解釋的比較抽象,本文我們就利用wireshark來抓包以真正體會整個流程的細節。
三次握手
根據下面這幅圖我們來看一下TCP三次握手。p.s: 每個箭頭代表一次握手。
第一次握手
client發送一個SYN(J)包給server,然后等待server的ACK回復,進入SYN-SENT狀態。p.s: SYN為synchronize的縮寫,ACK為acknowledgment的縮寫。
第二次握手
server接收到SYN(seq=J)包后就返回一個ACK(J+1)包以及一個自己的**SYN(K)**包,然后等待client的ACK回復,server進入SYN-RECIVED狀態。
第三次握手
client接收到server發回的ACK(J+1)包后,進入ESTABLISHED狀態。然后根據server發來的SYN(K)包,返回給等待中的server一個ACK(K+1)包。等待中的server收到ACK回復,也把自己的狀態設置為ESTABLISHED。到此TCP三次握手完成,client與server可以正常進行通信了。
為什么要進行三次握手
我們來看一下為什么需要進行三次握手,兩次握手難道不行么?這里我們用一個生活中的具體例子來解釋就很好理解了。我們可以將三次握手中的客戶端和服務器之間的握手過程比喻成A和B通信的過程:
- 在第一次通信過程中,A向B發送信息之后,B收到信息后可以確認自己的收信能力和A的發信能力沒有問題。
- 在第二次通信中,B向A發送信息之后,A可以確認自己的發信能力和B的收信能力沒有問題,但是B不知道自己的發信能力到底如何,所以就需要第三次通信。
- 在第三次通信中,A向B發送信息之后,B就可以確認自己的發信能力沒有問題。
上面分析還不夠形象,很容易忘記,下面我們利用wireshark來證明一下上面的分析過程。從下面的的輸出就可以很容易看出來,必須要經過前面的三次tcp請求才會有起一次http請求。
第一次請求客戶端發送一個SYN包,序列號是0。
第二次請求服務器會發送一個SYN和一個ACK包,序列號是0,ack號是1。
第三次本地客戶端請求會發送一個ACK包,序列號是1,ack號是1來回復服務器。
四次揮手
以下面這張圖為例,我們來分析一下TCP四次揮手的過程。
第一次揮手
client發送一個FIN(M)包,此時client進入FIN-WAIT-1狀態,這表明client已經沒有數據要發送了。
第二次揮手
server收到了client發來的FIN(M)包后,向client發回一個ACK(M+1)包,此時server進入CLOSE-WAIT狀態,client進入FIN-WAIT-2狀態。
第三次揮手
server向client發送FIN(N)包,請求關閉連接,同時server進入LAST-ACK狀態。
第四次揮手
client收到server發送的FIN(N)包,進入TIME-WAIT狀態。向server發送**ACK(N+1)**包,server收到client的ACK(N+1)包以后,進入CLOSE狀態;client等待一段時間還沒有得到回復后判斷server已正式關閉,進入CLOSE狀態。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的第三次握手为什么没有序列号_图解TCP三次握手与四次分手的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 天正建筑lisp编程接口_编程思想|面向
- 下一篇: rstudio 保存_Rstudio学习
