23.TCP(二)

TCP(Transmission Control Protocol,傳輸控制協(xié)議)

1、TCP頭格式

屏幕快照 2017-10-31 10.22.12.png
TCP報文抓取工具
(1) Source Port(源端口號):數(shù)據(jù)發(fā)起者的端口號,16bit。
(2) Destination Port(目的端口號):數(shù)據(jù)接收者的端口號,16bit。
(3) Sequence Number(順序號碼,Seq):用于在數(shù)據(jù)通信中解決網(wǎng)絡包亂序(reordering)問題,以保證應用層接收到的數(shù)據(jù)不會因為網(wǎng)絡上的傳輸問題而亂序(TCP會用這個順序號碼來拼接數(shù)據(jù)),32bit。
(4) Acknowledgment Number(確認號碼,ack):是數(shù)據(jù)接收方期望收到發(fā)送方在下一個報文段的順序號碼(Seq),因此確認號碼應當是上次已成功收到順序號碼(Seq)加1,32bit。
(5) Offset(TCP報文頭長度):用于存儲報文頭中有多少個32bit(上圖的一行),存儲長度為4bit,最大可表示(23+22+2^1+1)32bit=60bytes的報文頭。最小取值5,532bit=20bytes。
(6) Reserved(保留):6bit, 均為0
(7) TCP Flags(TCP標志位)每個長度均為1bit
CWR:壓縮,TCP Flags值0x80。
ECE:擁塞,0x40。
URG:緊急,0x20。當URG=1時,表示報文段中有緊急數(shù)據(jù),應盡快傳送。
ACK:確認,0x10。當ACK = 1時,代表這是一個確認的TCP包,取值0則不是確認包。
PSH:推送,0x08。當發(fā)送端PSH=1時,接收端盡快的交付給應用進程。
RST:復位,0x04。當RST=1時,表明TCP連接中出現(xiàn)嚴重差錯,必須釋放連接,再重新建立連接。
SYN:同步,0x02。在建立連接是用來同步序號。SYN=1, ACK=0表示一個連接請求報文段。SYN=1,ACK=1表示同意建立連接。
FIN:終止,0x01。當FIN=1時,表明此報文段的發(fā)送端的數(shù)據(jù)已經(jīng)發(fā)送完畢,并要求釋放傳輸連接。
(8) 窗口:用來控制對方發(fā)送的數(shù)據(jù)量,通知發(fā)放已確定的發(fā)送窗口上限。
(9) 檢驗和:該字段檢驗的范圍包括頭部和數(shù)據(jù)這兩部分。由發(fā)端計算和存儲,并由收端進行驗證。
(10) 緊急指針:緊急指針在URG=1時才有效,它指出本報文段中的緊急數(shù)據(jù)的字節(jié)數(shù)。
(11) TCP選項:長度可變,最長可達40字節(jié)

備注:ISN(Inital Sequence Number):初始化Sequence Number,發(fā)生在建立連接時。

2、TCP協(xié)議中的三次握手和四次揮手
屏幕快照 2017-10-31 10.24.37.png

屏幕快照 2017-10-31 10.24.46.png

特別注意

Seq:是發(fā)送方當前報文的順序號碼。
ack:是發(fā)送方期望對方在下次返回報文中給回的Seq。

建立連接需要三次握手

第一次握手:客戶端向服務端發(fā)送連接請求包,標志位SYN(同步序號)置為1,順序號碼為X=0。

第二次握手:服務端收到客戶端發(fā)過來報文,由SYN=1知道客戶端要求建立聯(lián)機,則為這次連接分配資源。并向客戶端發(fā)送一個SYN和ACK都置為1的TCP報文,設置初始順序號碼Y=0,將確認序號(ack)設置為上一次客戶端發(fā)送過來的順序號(Seq)加1,即X+1 = 0+1=1。

第三次握手:客戶端收到服務端發(fā)來的包后檢查確認號碼(ack)是否正確,即第一次發(fā)送的Seq加1(X+1=1)。以及標志位ACK是否為1。若正確,服務端再次發(fā)送確認包,ACK標志位為1,SYN標志位為0。確認號碼(ack)=Y+1=0+1=1,發(fā)送順序號碼(Seq)為X+1=1。Server收到后確認號碼值與ACK=1則連接建立成功,可以傳送數(shù)據(jù)了。

斷開連接需要四次揮手

提醒:中斷連接端可以是Client端,也可以是Server端。只要將下面兩角色互換即可。
第一次揮手:客戶端給服務端發(fā)送FIN報文,用來關閉客戶端到服務端的數(shù)據(jù)傳送。將標志位FIN和ACK置為1,順序號碼為X=1,確認號碼為Z=1。意思是說”我Client端沒有數(shù)據(jù)要發(fā)給你了,但是如果你還有數(shù)據(jù)沒有發(fā)送完成,則不必急著關閉Socket,可以繼續(xù)發(fā)送數(shù)據(jù)。所以你先發(fā)送ACK過來?!?/p>

第二次揮手:服務端收到FIN后,發(fā)回一個ACK(標志位ACK=1),確認號碼為收到的順序號碼加1,即X=X+1=2。順序號碼為收到的確認號碼=Z。意思是說“你的FIN請求我收到了,但是我還沒準備好,請繼續(xù)你等我的消息" 這個時候客戶端就進入FIN_WAIT狀態(tài),繼續(xù)等待服務端的FIN報文。

第三次揮手:當服務端確定數(shù)據(jù)已發(fā)送完成,則向客戶端發(fā)送FIN報文,關閉與客戶端的連接。標志位FIN和ACK置為1,順序號碼為Y=1,確認號碼為X=2。意思是告訴Client端“好了,我這邊數(shù)據(jù)發(fā)完了,準備好關閉連接了?!?/p>

第四次揮手:客戶端收到服務器發(fā)送的FIN之后,發(fā)回ACK確認(標志位ACK=1),確認號碼為收到的順序號碼加1,即Y+1=2。順序號碼為收到的確認號碼X=2。意思是“我Client端知道可以關閉連接了,但是我還是不相信網(wǎng)絡,怕 Server端不知道要關閉,所以發(fā)送ACK后進入TIME_WAIT狀態(tài),如果Server端沒有收到ACK則可以重傳。Client端等待了2MSL后依然沒有收到回復,則證明Server端已正常關閉,那好,我Client端也可以關閉連接了?!埃ㄔ赥IME_WAIT狀態(tài)中,如果TCP client端最后一次發(fā)送的ACK丟失了,它將重新發(fā)送。TIME_WAIT狀態(tài)中所需要的時間是依賴于實現(xiàn)方法的。典型的值為30秒、1分鐘和2分鐘。等待之后連接正式關閉,并且所有的資源(包括端口號)都被釋放。)

為什么關閉的時候卻是四次揮(握)手?
因為當Server端收到Client端的SYN連接請求報文后,可以直接發(fā)送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當Server端收到FIN報文時,很可能并不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,"你發(fā)的FIN報文我收到了"。只有等到我Server端所有的報文都發(fā)送完了,我才能發(fā)送FIN報文,因此不能一起發(fā)送。故需要四步握手。

3、TCP報文抓取工具:Wireshark

捕獲過濾器中填入表達式:host www.cnblogs.com and port 80(80等效于http)
有多個TCP流時在顯示過濾器中填入表達式:tcp.stream eq 0 篩選出第一個TCP流(包含完整的一次TCP連接:三次握手和四次揮手)

屏幕快照 2017-10-31 10.26.50.png

每條記錄都有如下協(xié)議層
(1) Frame: 物理層的數(shù)據(jù)幀概況
(2)Ethernet II: 數(shù)據(jù)鏈路層以太網(wǎng)幀頭部信息
(3) Internet Protocol Version 4: 互聯(lián)網(wǎng)層IP包頭部信息
(4)Transmission Control Protocol: 傳輸層的數(shù)據(jù)段頭部信息,此處是TCP
(5) Hypertext Transfer Protocol: 應用層的信息,此處是HTTP協(xié)議

屏幕快照 2017-10-31 10.27.38.png

摘自:http://www.cnblogs.com/ImBit/p/5513401.html#two.one

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容