Jex’s Note

解析 TCP 三向交握(Three-way Handshake)封包

瀏覽器向 server 發送請求 :

瀏覽器發送 : 指定 seq

22:39:13.832224 IP 42.79.253.189.29729 > 172.31.23.23.8080: Flags [S], seq 3605791234, win 65535, options [mss 1394,nop,wscale 4,nop,nop,TS val 401990828 ecr 0,sackOK,eol], length 0

server 回應 : 將 seq+1 放到 ack, 並且指定 seq

22:39:13.832271 IP 172.31.23.23.8080 > 42.79.253.189.29729: Flags [S.], seq 4067821211, ack 3605791235, win 28960, options [mss 1460,sackOK,TS val 333436167 ecr 401990828,nop,wscale 7], length 0

瀏覽器發送 : ack = 1 用來回應上一個封包並且確認封包正確

22:39:13.943021 IP 42.79.253.189.29729 > 172.31.23.23.8080: Flags [.], ack 1, win 8205, options [nop,nop,TS val 401990926 ecr 333436167], length 0

瀏覽器發送 : Push 表示此封包應立即傳送不需等緩衝區滿了才送, seq : 1:321 代表從 1 開始, 並且加上長度 320 的 header

22:39:13.943692 IP 42.79.253.189.29729 > 172.31.23.23.8080: Flags [P.], seq 1:321, ack 1, win 8205, options [nop,nop,TS val 401990927 ecr 333436167], length 320

Browser request headers (320 bytes of data) :


GET / HTTP/1.1
Host: 54.250.138.78:8080
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-tw
Connection: keep-alive
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9) AppleWebKit/537.71 (KHTML, like Gecko) Version/7.0 Safari/537.71

server 回應 : ack : 321 表示收到剛剛瀏覽器傳來的資料

22:39:13.943711 IP 172.31.23.23.8080 > 42.79.253.189.29729: Flags [.], ack 321, win 235, options [nop,nop,TS val 333436194 ecr 401990927], length 0

server 回應網頁內容 :

server 回應 : seq 從 1 開始並加上傳送 64 字元的長度, ack 為剛剛收到瀏覽器 header 的 seq:321

22:39:35.943037 IP 172.31.23.23.8080 > 42.79.253.189.29729: Flags [P.], seq 1:65, ack 321, win 235, options [nop,nop,TS val 333441694 ecr 401990927], length 64

server 像 browser 發送的 header 資料 :


server response header (64 bytes of data) :

HTTP/1.1 200 OK
Content-Length: 4
Content-Type: text/html

fghd

server 回應 : 資料傳送結束, 並等待結束回應

22:39:35.943086 IP 172.31.23.23.8080 > 42.79.253.189.29729: Flags [F.], seq 65, ack 321, win 235, options [nop,nop,TS val 333441694 ecr 401990927], length 0

瀏覽器發送 : 跟 server 說剛收到的 seq 為 65

22:39:36.067513 IP 42.79.253.189.29729 > 172.31.23.23.8080: Flags [.], ack 65, win 8201, options [nop,nop,TS val 402012885 ecr 333441694], length 0

瀏覽器發送 : 與上個封包一樣, 重複送了一次

22:39:36.067565 IP 42.79.253.189.29729 > 172.31.23.23.8080: Flags [.], ack 66, win 8201, options [nop,nop,TS val 402012885 ecr 333441694], length 0

瀏覽器向 server 發送結束連線

瀏覽器發送 : 回應剛剛 server 請求的結束, ack 66 為 seq 65 + 1, seq 321 為 ack 321

22:39:44.832134 IP 42.79.253.189.29729 > 172.31.23.23.8080: Flags [F.], seq 321, ack 66, win 8201, options [nop,nop,TS val 402021471 ecr 333441694], length 0

server 回應 : ack = seq + 1

22:39:44.832200 IP 172.31.23.23.8080 > 42.79.253.189.29729: Flags [.], ack 322, win 235, options [nop,nop,TS val 333443917 ecr 402021471], length 0

狀態代碼

  • CWR : CWR (Congestion Window Reduced) flag 為 1 代表接到 ECE 旗標 為 1 的 TCP 封包。
  • ECE : ECE (ECN-Echo) flag 為 1 代表 TCP peer (對等體) 具備 ECN (Explicit Congestion Notification, 明確擁塞通知) 功能,同時 IP 封包中的 ECN 欄位被設定為 11。
  • URG : URG (Urgent) flag 為 1 代表緊急封包,接收端應優先處理。
  • ACK : ACK (Acknowledgment) flag 為 1 代表此封包的 Acknowledgment Number 是有效的﹐是用來回應上一個封包。
  • PSH : PSH (Push function) flag 為 1 代表此封包連同緩衝區的其它相關封包應立即進行傳送,而無需等待緩衝區滿了才送。
  • RST : RST (Reset) flag 為 1 代表馬上結束連線,無需等待終止確認手續。
  • SYN : SYN (Synchronize) flag 為 1 代表要求雙方進行同步處理,也就是要求建立連線。
  • FIN : FIN (Finish) flag 為 1 代表資料傳送結束,等待結束回應,以便正式結束 TCP 傳送流程。

ref : http://120.105.184.250/peiyuli/network-3/%E7%B6%B2%E8%B7%AF%E7%B0%A1%E4%BB%8B%E8%88%87%E6%8C%87%E4%BB%A4.htm

Comments