Tcp ack 及seq

1、ACK包可以和其他包合在一起,比如ACK包可以攜帶數據

2、可以接收多個數據包後,一次性給一個應答,不用每個數據包一一對應給應答

3、在通信過程中,通過接收到的包的ack值可以判斷是否是上一個本機發送包的應答包(ack值與上一個本機發送包的seq有關),seq值和ack值的確定規則如下:

  三次握手:

    第一次握手(發送):seq爲x(x爲任意值),無視ack(因爲是第一個包,不需要給其他包應答)並進入syn_send狀態,等待服務器確認。

    第二次握手(發送):seq爲y(y爲任意值),ack等於接收包seq+1(即x+1),發送了SYN+ACK包,服務器進入SYN_RECV狀態。

    第三次握手(發送):seq等於上一個本機發送包seq+1(即x+1),也就是1,ack等於接收包seq+1(即y+1),向服務器發送確認包ACK, 此包發送完畢後,客戶端和服務器進入established狀態。

 

  數據傳輸:

    某主機發送的seq和ack是根據上一個接收包的seq、ack和len得到,具體爲:seq=ack,ack=seq+len

    提醒:如果某一主機連續發了4個包,後三個包的seq和ack和第一個包的一樣

    提醒:seq會單調增大

    特別:如果握手完第一個數據包是客戶端發送,第一個數據包的seq和ack和第三次握手的一樣 

  四次揮手:

    如果是服務器發起的揮手,揮手前最後一個包是服務器發送:

    如果是客戶端發起的揮手,揮手前最後一個包是客戶端發送:

      第一次揮手(發送):seq爲上一個本機發送包seq+len,ack爲上一個本機發送包ack

      第二個揮手(發送):seq爲本次接收包ack,ack爲本次接收包seq+1

      第三次揮手(發送):和第二次揮手一樣

      第四次揮手(發送):seq爲本次接收包ack,ack爲本次接收包seq+1

       

    如果是服務器發起的揮手,揮手前最後一個包是客戶端發送:

    如果是客戶端發起的揮手,揮手前最後一個包是服務器發送:

      第一次揮手(發送):seq爲本次接收包ack,ack爲本次接收包seq+len

      第二個揮手(發送):seq爲本次接收包ack,ack爲本次接收包seq+1

      第三次揮手(發送):和第二次揮手一樣

      第四次揮手(發送):seq爲本次接收包ack,ack爲本次接收包seq+1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章