http三次握手四次揮手詳解


 

tcp3次握手:

  1、客戶端發送請求報文到服務器 表示客戶端想要和服務端建立連接

  2、服務端接收到客戶端的請求,返回客戶端報文 詢問客戶端是否准備好

  3、客戶端再次響應服務端一個ACK表示我已經准備好主機收到后檢查ack number是否正確,若正確,則連接建立成功

 

                

 

三次握手的具體步驟:

  建立一個TCP連接時,需要客戶端和服務器端總共發送3個包。
  三次握手的目的是接服務器指定端口,建立TCP連接,並同步連接雙方的序列號和確認號,交換TCP窗口大小信息。在socket編程中,客戶端執行connect()時將觸發三次握手。

 

  第一次握手(SYN=1,seq=x):
    客戶端發送一個TCP的SYN標志位置1的包,指明客戶端打算連接服務器的端口,以及初始序號X,保存在包頭的序列號(Sequence Number)字段里。

 

  第二次握手(SYN=1,ACK=1,seq=y,ACKnum=x+1):
    服務器發回確認包(ACK)應答。即SYN標志位ACK標志位均為1服務器端選擇自己的ISN序列號,放在seq域里,同時將確認序號(Acknowledgement Number)設置為客戶的ISN加1,即X+1。發送完畢后,服務器端進入SYN_RCVD狀態

 

  第三次握手(ACK=1,ACKnum=y+1):
    客戶端再次發送確認包(ACK),SYN標志位為0,ACK標志位為1,並且把服務器發來ACK的序號字段+1,放在確定字段中發送給對方,並且在數據段放寫ISN的+1。
  發送完畢后,客戶端進入ESTABLISHED狀態當服務器端收到這個包時,也進入ESTABLISHED狀態,TCP握手結束,TCP連接建立完成

為什么要進行第三次握手?

  為了防止服務器端開啟一些無用的連接增加服務器開銷以防止已失效的連接請求報文段突然又傳送到了服務端,因而產生錯誤。

四次揮手

  釋放一個TCP連接,需要客戶端和服務器總共發送4個包。客戶端和服務器端均可主動發起揮手動作。在socket編程中,任何一方執行close()操作即可產生揮手操作。

 

  第一次揮手(FIN=1,seq=x):
    假設客戶端想要關閉連接,客戶端發送一個FIN標志位置為1的包,表示自已經沒有數據可以發送了,但是仍然可以接收數據。 發送完畢之后,客戶端進入FIN_WAIT_1狀態。

 

  第二次揮手(ACK=1,ACKnum=x+1):
    服務器端確認客戶端的FIN包,發送一個確認包表明自己接收到了客戶端關閉連接的請求,但還沒有准備好關閉連接。 發送完畢后,服務器端進入CLOSE_WAIT狀態,客戶端接收到這個確認包之后進入FIN_WAIT_2狀態,等待服務器端關閉連接

 

    第三次揮手(FIN=1,seq=y):
    服務器端准備好關閉連接時,向客戶端發送結束連接請求,FIN置為1。 發送完畢后,服務器端進入LAST_ACK狀態,等待來自客戶端的最后一個ACK

 

    第四次揮手(ACK=1,ACKnum=y+1):
    客戶端接收到來自服務器的端的關閉請求,發送一個確認包,並進入TIME_WAIT狀態,等待可能出現的要重傳的ACK包。 服務器端接收到這個確認包之后,關閉連接,進入CLOSED狀態。 

客戶端等待了某個固定時間(兩個最大段生命周期,2MSL,2Maximum Segment Lifetime)之后,沒有收到服務器端的ACK,認為服務器端已經正常關閉連接,於是自己也關閉連接,進入CLOSED狀態。

TCP協議如何保證傳輸的可靠性

  確認和重傳:接收方收到報文就會確認,發送方發送一段時間后沒有收到確認就會重傳。
  數據校驗:TCP報文頭有檢驗和,用於校驗報文是否損壞。
  數據合理分片和排序:TCP會按最大傳輸單元(MTU)合理分片,接收方會緩存未按序到達的數據,重新排序后交給應用。
  流量控制:當接收方來不及處理發送方的數據,能通過滑動窗口,提示發送方降低發送的速率,防止包丟失。
  擁塞控制:當網絡擁塞時,通過擁塞窗口,減少數據的發送,防止包丟失。

待續.......

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM