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