一、tcp包結構:
乙個tcp包結構如下:
乙個tcp包主要由tcp包頭和資料部分組成,包頭固定部分為20位元組,選項和資料部分根據實際情況設定為4n(n可以為0)位元組。
1.16bit源埠和目的埠號,它可以確認資料的傳輸方向(暫不考慮更底層的包)
2.32bit序號,它是為tcp包中資料部分進行編號的部分。假設要傳送的資料有100m,由於受mss( maximum segment size 最大報文段長度)限制,乙個tcp包是不可能傳輸完這100m的資料,於是需要將資料拆分,為了確保拆分傳輸後的資料能在接收端正確的拼接,就需要對每個拆分的資料報進行編號來傳輸。這樣,這個32位的序號指的就是本包資料部分第乙個位元組是這個100m資料中的第多少個位元組。例如:假設傳送第乙個包時,先取出這100m資料的前面1024個位元組傳送,這時這個包中32位序號就是1,然後取下乙個1024位元組傳輸,這個時候的資料部分的第乙個位元組是這100m資料的第1025個位元組,所以這第二tcp包中32位的序列號就應該為1025。當序號超過2^32時,進行乙個輪迴,重新從0開始計數。
3.32bit確認序號,和上面的32位序號類似,只不過它指的是期望收到的下乙個包的資料部分的編號。
4.4bit首部長度,單位為4位元組,指的是乙個tcp包中除去資料部分的長度,也就是包頭固定部分+選項部分的長度,2^4 -1 = 15, 15*4位元組=60位元組,即包頭固定部分為20位元組,選項最多可以為40位元組。
5.標識位:
urg:.........
ack:tcp包的acknowledgement number有效位,1時表明acknowledgement number有效,0表示acknowledgement number無效,忽略acknowledgement number欄位。自tcp連線建立後,ack必須為1。
psh:tcp包中有資料需要盡快傳遞給應用層使用,而不是將資料進行緩衝,等到緩衝區滿了再投遞給應用層。
rst:..........
syn:tcp包的同步位
fin:表示這個方向的帶資料的包傳輸已經完成,即傳送fin包的端沒有帶資料的包過來了,需要釋放這個方向的連線。
二、tcp三次握手
抓包結果如下:
第一次握手:
第二次握手:
第三次握手:
三、為什麼要三次握手
結合網上搜尋,我覺得這是由於tcp是可靠的全雙工的傳輸協議。首先,為什麼要握手?因為需要確保可靠。為什麼要3次,因為3次是理論上確保全雙工握手成功的最少次數。對於單工,確保一次通訊可以需要:1傳送方把資料傳送出去(syn),2接收方回應傳送方接收成功(ack),這樣形成了乙個閉環。看看三次握手怎麼做的:
第一次:client----syn----->server
第二次:server----ack,syn---->client
第三次:client----ack----->server
這樣,從client---->server, server---->client各自通過一次syn,ack形成閉環,理論上形成了乙個近似可靠的通訊。為什麼說是近似可靠?因為完全可靠的通訊是不存在的,見謝希仁《計算機網路》裡面講的紅團藍團問題。
四、tcp的四次揮手
按照理論來說,是要有四次揮手,但是實際抓包,只能抓到前2個包,不知道為什麼?
第一次揮手:
第二次揮手:
TCP三次握手 四次揮手
tcp 三次握手 tcp 連線是通過三次握手進行初始化的。三次握手的目的是同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊。以下步驟概述了通常情況下客戶端計算機聯絡伺服器計算機的過程 1.客戶端向伺服器傳送乙個syn置位的tcp報文,其中包含連線的初始序列號x和乙個視窗大小 表示客戶端上用來...
TCP三次握手 四次揮手
服務端的tcp程序先建立傳輸控制塊tcb,準備接受客戶端程序的連線請求,然後服務端程序處於listen狀態,等待客戶端的連線請求,如有,則作出響應。1 客戶端的tcp程序也首先建立傳輸控制模組tcb,然後向服務端發出連線請求報文段,該報文段首部中的syn 1,ack 0,同時選擇乙個初始序號seq ...
TCP三次握手四次揮手
tcp transmission control protocol 傳輸控制協議 tcp是主機對主機層的傳輸控制協議,提供可靠的連線服務,採用三次握手確認建立乙個連線。位碼即tcp標誌位,有6種標誌 urg urgent緊急 ack acknowledgement 確認 psh push傳送 rst...