可以根據抓包來分析三次握手與四次握手:
埠40286表示客戶端client,埠9000表示服務端server
三次握手:
a.client向server傳送syn=1,ack=0,seq=x(此階段不會有ack),client狀態為syn_snet;
b.server收到client的syn請求,傳送syn=1,ack=1,seq=y,ack=x+1,server狀態從listen > syn_recv
c.client收到server的ack,傳送syn=0,ack=1,seq=x+1,ack=y+1,client狀態從syn_sent > established,server狀態從syn_recv > established
狀態變化:
client:syn_sent > established
server:listen > syn_recv > established
四次握手:
a.client向server傳送fin=1,ack=1,seq=m,ack=n,client狀態從established > fin_wait_1,此時client不再傳送資料,但是可以接受資料
b.server收到client的請求斷開連線請求,傳送fin=0,ack=1,seq=n,ack=m+1,server狀態從established > close_wait;server表示知道client要斷開連線了,server也許還有沒有傳送完的資料,所以並沒有立即發fin;此時client收到server的ack報文,client狀態從fin_wait_1 > fin_wait_2
c.server確認沒有資料要傳送給client,傳送fin=1,ack=1,seq=t,ack=m+1,server狀態從close_wait > last_ack
d.client收到server的fin報文,傳送fin=0,ack=1,seq=m+1,ack=t+1,client狀態從fin_wait_2 > time_wait,client經過2msl(最大分段壽命(maximum segment lifetime (msl) ,預設2min)後狀態從time_wait > close;server接收到client的ack報文,狀態從last_ack > close
狀態變化
client:established > fin_wait_1 > fin_wait_2 > time_wait > close
server:established > close_wait > last_ack > close
一些問題:
a.為什麼建立連線需要三次握手?
雖然可以有這些回答:因為前期沒有建立連線,雙方都不會有資料傳送,所以不必像斷開連線時的四次握手;或者,如果只需要兩次握手,也許中間的網路延遲原因,client又重發了一次syn,而這syn到達server之後,server則又會建立乙個連線,但此連線在cllient並無效,所以需要第三次連線。但是這些回答總覺得不能使人信服;
從tcp的本質來看,tcp是可靠性傳輸,但是為什麼可靠?可靠的依據是什麼?這裡就需要深入了解一下seq和ack代表的實際意義;seq:佔 4 位元組,序號範圍[0,2^32-1],序號增加到 2^32-1 後,下個序號又回到 0。ack:佔 4 位元組,期望收到對方下個報文段的第乙個資料位元組的序號。tcp 是面向位元組流的,通過 tcp 傳送的位元組流中的每個位元組都按順序編號,而報頭中的序號字段值則指的是本報文段資料的第乙個位元組的序號。tcp通過確認這些seq來保證資料是正確接收和傳送或重發;
從上可知三次握手主要是為了雙方確認對方的seq初始序列號;
b.為什麼斷開連線需要四次握手?三次握手行不行?
從斷鏈階段可以看出,主要是為了在server端未傳送完成的資料傳送到client端;如果能確保在收到client的fin報文時,server在下次的報文中(fin+ack)將資料全部發出,三次也是可以的,不過並不標準;
c.為什麼斷開連線時客戶端向服務端傳送ack報文後不直接進入close而是進入了time_wait?
主要為了能夠在time_wait的2msl時間內,client傳送的ack報文能夠準確到達server;對於伺服器來說,如果沒有收到最後的ack報文,那麼又會重新發一次fin+ack報文給client,如果client在time_wait時間內收到這個報文,就會重發ack報文並重置2msl時間;
task
tcp三次握手與四次握手
reflect and recite
record and reduce
三次握手
<1>client send syn to server (seq=x)
<2>server send syn and ack to client (seq=y,ack=x+1)
<3>client send ack to server (seq=x+1,ack=y+1)
四次握手
<1>client send fin and ack to server (seq=m)
<2>server send ack to client (seq=n,ack=m+1)
<3>server send fin and ack to client (seq=v,ack=m+1)
<4>clinet send ack to server (seq=m+1,ack=v+1)
三次握手狀態變化
client:syn_sned > established
server:linsten > syn_recv > established
四次握手狀態變化
client:established > fin_time_1 > fin_time_2 > time_wait > close
server:established > close_wait > last_ack > close
2msl,最大分段壽命
review
最後推薦一篇blog,寫得非常不錯
TCP三次握手與四次握手
當我們從瀏覽器輸入乙個url,http的工作流程如下圖所示 dns解析流程請看dns網域名稱解析過程這篇文章 現在來講tcp三次握手 tcp是主機對主機層的傳輸控制協議,提供可靠的連線服務,採用三次握手確認建立乙個連線。1 序號 seq序號,佔32位,用來標識從tcp源端向目的端傳送的位元組流,發起...
TCP 三次握手 四次握手
http常見狀態碼 200 ok 伺服器成功處理了請求 301 302 moved permanently 重定向 response中應該包含乙個location url,說明資源現在所處的位置 304 not modified 未修改 客戶的快取資源是最新的,要客戶端使用快取 404 not fo...
tcp三次握手和四次握手
建立tcp需要三次握手才能建立,而斷開連線則需要四次握手。整個過程如下圖所示 先來看看如何建立連線的。首先client端傳送連線請求報文,server段接受連線後回覆ack報文,並為這次連線分配資源。client端接收到ack報文後也向server段發生ack報文,並分配資源,這樣tcp連線就建立了...