计算机网络tcp三次握手,快速掌握_计算机网络_TCP_三次握手
雖然這個話題已經(jīng)是老生常談了,隨手一搜資料一堆,但是讓人快速掌握,我認(rèn)為應(yīng)該有幾個概念先被明確指出,再放出那張大同小異的時序圖。
01關(guān)注的字段
探討三次握手問題前,不得不先了解TCP報文段中存在的這四個位置:
注意ACK和ack的不同之處
正因為ACK、SYN是標(biāo)志位,因此在不同資料中可能會用類似于“不標(biāo)出ACK”的方式來表示ACK=0的狀態(tài),此時若再標(biāo)出ack的值則坑會因字母相同令人混淆誤解。下面分別解釋四個字段的含義:
序號字段seq。TCP是面向字節(jié)流的(即TCP傳送時是逐個字節(jié)傳送的),所以TCP連接傳送的數(shù)據(jù)流中的每個字節(jié)都編上一個序號。序號字段的值指的是本報文段所發(fā)送的數(shù)據(jù)的第一個字節(jié)的序號。
例如,一報文段的序號字段值是301,而攜帶的數(shù)據(jù)共有100B,表明本報文段的數(shù)據(jù)的最后一個字節(jié)的序號是400,因此下一個報文段的數(shù)據(jù)序號應(yīng)從401開始。
確認(rèn)號字段ack。是期望收到對方的下一個報文段的數(shù)據(jù)的第一個字節(jié)的序號。若確認(rèn)號為N,則表明到序號N-1為止的所有數(shù)據(jù)都已正確收到。
例如,B正確收到了A發(fā)送過來的一個報文段,其序號字段是501,而數(shù)據(jù)長度是200B(序號501~700),這表明B正確收到了A發(fā)送的到序號700為止的數(shù)據(jù)。因此B期望收到A的下一個數(shù)據(jù)序號是701,于是B在發(fā)送給A的確認(rèn)報文段中把確認(rèn)號置為701。
確認(rèn)位ACK。只有當(dāng)ACK=1時確認(rèn)號字段才有效。當(dāng)ACK=0時,確認(rèn)號無效。
TCP規(guī)定,在連接建立后所有傳送的報文段都必須把ACK置1。
同步位SYN。同步SYN=1表示這是一個連接請求或連接接收報文。
當(dāng)SYN=1,ACK=0時,表明這是一個連接請求報文,對方若同意建立連接,則在響應(yīng)報文中使用SYN=1,ACK=1。即SYN=1表示這是一個連接請求或連接接收報文。
02連接的建立
四個字段的顏色已經(jīng)被區(qū)分開
1:客戶機(jī)的TCP首先向服務(wù)器的TCP發(fā)送一個連接請求報文段。這個特殊的報文段中不含應(yīng)用層數(shù)據(jù),其首部中的SYN標(biāo)志位被置為1。另外,客戶機(jī)會隨機(jī)選擇一個起始序號seq=x(連接請求報文不攜帶數(shù)據(jù),但要消耗一個序號)。
2:服務(wù)器的TCP收到連接請求報文段后,如同意建立連接,就向客戶機(jī)發(fā)回確認(rèn),并為該TCP連接分配TCP緩存和變量。在確認(rèn)報文段中,SYN和ACK位都被置為1,確認(rèn)號ack字段的值為x+1,并且服務(wù)器隨機(jī)產(chǎn)生起始序號seq=y(確認(rèn)報文不攜帶數(shù)據(jù),但也要消耗一個序號)。
3:當(dāng)客戶機(jī)收到確認(rèn)報文段后,還要向服務(wù)器給出確認(rèn),并且也要給該連接分配緩存和變量。這個報文段的ACK標(biāo)志位被置1,序號字段seq為x+1,確認(rèn)號字段ack=y于1。該報文段可以攜帶數(shù)據(jù),若不攜帶數(shù)據(jù)則不消耗序號。
可得這樣的結(jié)論:SYN與ACK標(biāo)志當(dāng)前的行為,而ack是上一次對方的seq加一,seq是上一次對方的ack
03連接的釋放
釋放連接時使用終止位FIN標(biāo)記狀態(tài)
1:客戶機(jī)打算關(guān)閉連接時,向其TCP發(fā)送一個連接釋放報文段,并停止發(fā)送數(shù)據(jù),主動關(guān)閉TCP連接,該報文段的FIN標(biāo)志位被置1,seq=u,它等于前面已傳送過的數(shù)據(jù)的最后一個字節(jié)的序號加1(FIN報文段即使不攜帶數(shù)據(jù),也要消耗一個序號)。TCP是全雙工的,即可以想象為一條TCP連接上有兩條數(shù)據(jù)通路。發(fā)送FIN報文時,發(fā)送FIN的一端不能再發(fā)送數(shù)據(jù),即關(guān)閉了其中一條數(shù)據(jù)通路,但對方還可以發(fā)送數(shù)據(jù)。
2:服務(wù)器收到連接釋放報文段后即發(fā)出確認(rèn),確認(rèn)號是ack=u+1,而這個報文段自己的序號是v,等于它前面已傳送過的數(shù)據(jù)的最后一個字節(jié)的序號加1。此時,從客戶機(jī)到服務(wù)器這個方向的連接就釋放了,TCP連接處于半關(guān)閉狀態(tài)。但服務(wù)器若發(fā)送數(shù)據(jù),客戶機(jī)仍要接收,即從服務(wù)器到客戶機(jī)這個方向的連接并未關(guān)閉。
3:若服務(wù)器已經(jīng)沒有要向客戶機(jī)發(fā)送的數(shù)據(jù),就通知TCP釋放連接,此時其發(fā)出FIN=1的連接釋放報文段。
4:客戶機(jī)收到連接釋放報文段后,必須發(fā)出確認(rèn)。在確認(rèn)報文段中,ACK字段被置為1,確認(rèn)號ack=w+1,序號seq=u+1。此時TCP連接還未釋放,必須經(jīng)過時間等待計時器設(shè)置的時間2MSL后,A才進(jìn)入連接關(guān)閉狀態(tài)。
關(guān)閉連接的特點是2、3階段都是由服務(wù)器端發(fā)送消息,此時ack是不變的。交替進(jìn)行的信息交換過程,仍然滿足結(jié)論:ack是上一次對方的seq加一,seq是上一次對方的ack
04例題
(2011年統(tǒng)考真題)主機(jī)甲向主機(jī)乙發(fā)送一個(SYN=1,seq=11220)TCP段,期望與主機(jī)乙建立TCP連接,若主機(jī)乙接受該連接請求,則主機(jī)乙向主機(jī)甲發(fā)送的正確的TCP段可能是()。
A.(SYN=0,ACK=0,seq=11221,ack=11221)
B.(SYN=1,ACK=1,seq=11220,ack=11220)
C.(SYN=1,ACK=1,seq=11221,ack=11221)
D.(SYN=0,ACK=0,seq=11220,ack=11220)
根據(jù)前文說的結(jié)論,ack為上次對方seq+1只能選A or C,應(yīng)答行為ACK應(yīng)取1則選C(而狀態(tài)為建立連接 同步標(biāo)志應(yīng)取1更應(yīng)選C)
舉報/反饋
總結(jié)
以上是生活随笔為你收集整理的计算机网络tcp三次握手,快速掌握_计算机网络_TCP_三次握手的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 斐讯路由器什么时候停产的
- 下一篇: 我的世界三叉戟怎么获得