TCP報文格式和三次握手——三次握手三個tcp包(header+data),此外,TCP 報文段中的數據部分是可選的,在一個連接建立和一個連接終止時,雙方交換的報文段僅有 TCP 首部。
from:https://blog.csdn.net/mary19920410/article/details/58030147
TCP報文是TCP層傳輸的數據單元,也叫報文段。
1、端口號:用來標識同一臺計算機的不同的應用進程。
1)源端口:源端口和IP地址的作用是標識報文的返回地址。
2)目的端口:端口指明接收方計算機上的應用程序接口。
TCP報頭中的源端口號和目的端口號同IP數據報中的源IP與目的IP唯一確定一條TCP連接。
2、序號和確認號:是TCP可靠傳輸的關鍵部分。序號是本報文段發送的數據組的第一個字節的序號。在TCP傳送的流中,每一個字節一個序號。e.g.一個報文段的序號為300,此報文段數據部分共有100字節,則下一個報文段的序號為400。所以序號確保了TCP傳輸的有序性。確認號,即ACK,指明下一個期待收到的字節序號,表明該序號之前的所有數據已經正確無誤的收到。確認號只有當ACK標誌為1時才有效。比如建立連接時,SYN報文的ACK標誌位為0。
3、數據偏移/首部長度:4bits。由於首部可能含有可選項內容,因此TCP報頭的長度是不確定的,報頭不包含任何任選字段則長度為20字節,4位首部長度字段所能表示的最大值為1111,轉化為10進制為15,15*32/8 = 60,故報頭最大長度為60字節。首部長度也叫數據偏移,是因為首部長度實際上指示了數據區在報文段中的起始偏移值。
4、保留:為將來定義新的用途保留,現在一般置0。
5、控制位:URG ACK PSH RST SYN FIN,共6個,每一個標誌位表示一個控制功能。
1)URG:緊急指針標誌,為1時表示緊急指針有效,為0則忽略緊急指針。
2)ACK:確認序號標誌,為1時表示確認號有效,為0表示報文中不含確認信息,忽略確認號字段。
3)PSH:push標誌,為1表示是帶有push標誌的數據,指示接收方在接收到該報文段以後,應盡快將這個報文段交給應用程序,而不是在緩沖區排隊。
4)RST:重置連接標誌,用於重置由於主機崩潰或其他原因而出現錯誤的連接。或者用於拒絕非法的報文段和拒絕連接請求。
5)SYN:同步序號,用於建立連接過程,在連接請求中,SYN=1和ACK=0表示該數據段沒有使用捎帶的確認域,而連接應答捎帶一個確認,即SYN=1和ACK=1。
6)FIN:finish標誌,用於釋放連接,為1時表示發送方已經沒有數據發送了,即關閉本方數據流。
6、窗口:滑動窗口大小,用來告知發送端接受端的緩存大小,以此控制發送端發送數據的速率,從而達到流量控制。窗口大小時一個16bit字段,因而窗口大小最大為65535。
7、校驗和:奇偶校驗,此校驗和是對整個的 TCP 報文段,包括 TCP 頭部和 TCP 數據,以 16 位字進行計算所得。由發送端計算和存儲,並由接收端進行驗證。
8、緊急指針:只有當 URG 標誌置 1 時緊急指針才有效。緊急指針是一個正的偏移量,和順序號字段中的值相加表示緊急數據最後一個字節的序號。 TCP 的緊急方式是發送端向另一端發送緊急數據的一種方式。
9、選項和填充:最常見的可選字段是最長報文大小,又稱為MSS(Maximum Segment Size),每個連接方通常都在通信的第一個報文段(為建立連接而設置SYN標誌為1的那個段)中指明這個選項,它表示本端所能接受的最大報文段的長度。選項長度不一定是32位的整數倍,所以要加填充位,即在這個字段中加入額外的零,以保證TCP頭是32的整數倍。
10、數據部分: TCP 報文段中的數據部分是可選的。在一個連接建立和一個連接終止時,雙方交換的報文段僅有 TCP 首部。如果一方沒有數據要發送,也使用沒有任何數據的首部來確認收到的數據。在處理超時的許多情況中,也會發送不帶任何數據的報文段。
參考文獻:
http://blog.chinaunix.net/uid-26366978-id-3282793.html
http://blog.csdn.net/ningxuezhu/article/details/39892091/
http://blog.csdn.net/a19881029/article/details/29557837
http://www.cnblogs.com/xinyuyuanm/archive/2013/04/17/3026279.html
http://www.360doc.com/content/12/1218/10/3405077_254718387.shtml
from:https://www.cnblogs.com/Chilam007/p/6973990.html
結合抓包數據分析TCP三次握手過程
1、首先要清楚TCP三次握手過程,如圖5所示:
圖5(TCP三次握手過程)
百度百科解釋TCP三次握手過程如下:
第一次握手:建立連接時,客戶端發送syn包(syn=j)到服務器,並進入SYN SENT狀態,等待服務器確認;SYN:即是同步序列編號(Synchronize Sequence Numbers);
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP連接成功)狀態,完成三次握手。
2、要清楚TCP包中的具體內容如圖6所示:(TCP包的具體內容圖來源於博客:http://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html)
圖6(TCP包的具體內容)
3、下面用實例講下wireshark中的tcp三次握手過程:
1)打開wireshark後,在瀏覽器輸入訪問地址:http://www.cnblogs.com/Chilam007/,wireshark自動捕獲數據包,然後過濾自己需要分析的數據,這裏是過濾與主機通信的記錄,
過濾規則為:ip.addr == 116.211.169.93 ,過濾後的數據如圖7所示
圖7(過濾後的數據包顯示,註:這裏不知道為什麽數據包是重復的)
-
574幀是客戶端向服務器發送TCP請求建立連接。標識為SYN。
- 619幀是服務器得到請求後向客戶端回應確認包的過程。標識為SYN,ACK。
-
620幀是客戶端回應服務器發送確認包的過程,將於服務器建立連接。標識為ACK。
-
663幀是客戶端向服務器發送HTTP請求內容的過程。標識為GET。
-
667幀是服務器響應客戶端請求的過程,收到請求。標識為ACK。
-
674幀是服務器向客戶端回應內容的過程。
2)TCP三次握手分析:
第一次握手數據包,客戶端發送一個TCP,標誌位為SYN,序列號為0, 代表客戶端請求建立連接,如圖8所示
圖8(第一次握手)
第二次握手的數據包,服務器發回確認包, 標誌位為 SYN,ACK. 將確認序號(Acknowledgement Number)設置為客戶的I S N加1以.即0+1=1,如圖9所示
圖9(第二次握手)
第三次握手的數據包,客戶端再次發送確認包(ACK) SYN標誌位為0,ACK標誌位為1.並且把服務器發來ACK的序號字段+1,放在確定字段中發送給對方.並且在數據段放寫ISN的+1,如圖10所示
圖10(第三次握手)
以上就是 wireshark中的tcp三次握手過程。
TCP報文格式和三次握手——三次握手三個tcp包(header+data),此外,TCP 報文段中的數據部分是可選的,在一個連接建立和一個連接終止時,雙方交換的報文段僅有 TCP 首部。