這幾天複習計算機網絡對TCP三次握手很迷惑,查了一大堆資料算是明白了緣由,就看成我第一篇博客的內容吧。web
首先TCP是面向鏈接的,三次握手是爲了創建鏈接以便傳輸數據。面試
爲何是三次握手呢?服務器
本質上是由於TCP的鏈接是雙向的,而四次握手的中間兩步又是能夠合併的。網絡
雙向保證鏈接的四次握手svg
A 請求鏈接——> B A 請求鏈接——> B計算機網絡
A <——確認收到 B A <——確認收到 請求鏈接 Bxml
A <——請求鏈接 B A 確認收到——> Bblog
A 確認收到——> B博客
三次握手的過程it
SYN=1 seq=x.SYN=1,ACK=0.表示爲請求鏈接報文,(這裏ACK=0省略) seq表示主機A向主機B協商從序號爲x發送數據報
這裏須要注意的是,A向B的鏈接未創建沒法傳送數據,因此該請求報文消耗序號最小,消耗1個序號
SYN=1,ACK=1,seq=y,ack=x+1。
SYN=1,ACK=1表示贊成創建A向B的鏈接,seq=y表示從序號爲y的報文段開始發送,
ack=x+1表示已收到序號x的報文段,指望收到x+1序號的數據,即已收到序號x。第一次的請求報文消耗了1個序號
ack=x+1確認了第一次報文的收到,並請求B向A的鏈接
SYN=1,ACK=1,seq=x+1,ack=y+1 。
seq=x+1表示本身從序號x+1開始發送,指望收到主機B序號y+1的數據
第三次報文確認了前兩次請求報文的收到。
四次揮手的過程
FIN=1表示請求關閉A向B的鏈接 seq=u 已發送u-1序號的數據報
ACK=1,贊成關閉A向B的鏈接。seq=v,B向A發送的數據報序號爲v。ack=u+1已收到u序號數據報
此時A向B方向的鏈接已經關閉,中間保持一段時間單向B向A鏈接。
FIN=1 seq=w
FIN=1,請求關閉B向A鏈接。seq=w,從序號爲w開始向A發送。
這裏ack=u+1是由於前兩次已經關閉了客戶向服務器這個方向的連接。
ACK=1,seq=u+1,ack=w+1。
ACK=1,贊成關閉B向A鏈接。seq=u+1,由於A向B的鏈接已關閉,故這裏是u+1。ack=w+1,已收到序號w的報文段,指望收到w+1序號的報文段。
更新一個問題,看人家說面試裏面的,爲何請求報文只佔1個序號?
答:此時鏈接未創建,沒法傳輸數據,只能攜帶請求信息,也是消耗序號最少的報文,消耗序號1。