TCP連接的端點(diǎn)
TCP連接的端點(diǎn)是套接字(socket)坯门。
socket=(IP地址:端口號)
TCP的首部
如下圖所示,TCP的首部最少有20個字節(jié) 逗扒,后面還有4n個字節(jié)是可選的古戴。
首部的主要包含:
- 源端口和目的端口 各占2個字節(jié)
- 序號 4字節(jié) 共2^32,到頭后從0開始矩肩。表示本次發(fā)送的數(shù)據(jù)的第一個字節(jié)的編號现恼。TCP傳送的字節(jié)流對每一個字節(jié)編號。
- 確認(rèn)號 占4字節(jié) 是期望收到的對方下一個報文段的第一個數(shù)據(jù)字節(jié)的序號
- 數(shù)據(jù)偏移 占4位 數(shù)據(jù)起始地址和報文起始地址的距離黍檩,實(shí)際指出首部長度
- 確認(rèn)ACK 僅當(dāng)ACK=1時確認(rèn)號字段才有效叉袍。TCP協(xié)議規(guī)定,當(dāng)連接建立后刽酱,ACK必須為1
- 同步SYN 在建立連接時使用 當(dāng)SYN=1而ACK=0時喳逛,表明這是一個連接請求報文段。而對方接受時會回復(fù)SYN=1棵里,ACK=1润文。因此SYN=1表示這是一個連接請求會連接接受報文段(第一和第二次握手)
- 終止 FIN 當(dāng)FIN=1時,表明此報文段的發(fā)送方的數(shù)據(jù)已經(jīng)發(fā)送完畢殿怜,并要求釋放運(yùn)輸連接
- 窗口 占2字節(jié) 表示允許對方發(fā)送數(shù)據(jù)的最大字節(jié)數(shù)
- 檢驗(yàn)和
- 緊急指針
TCP三次握手過程
三次握手涉及到TCP首部的典蝌,同步為SYN,確認(rèn)位ACK稳捆,序號seq赠法,請求號ack.
假設(shè)A是客戶端,B是服務(wù)端乔夯。
首先砖织,B處于監(jiān)聽狀態(tài),等待客戶端的連接請求
第一次:
A向B發(fā)送SYN=1末荐,ACK=0侧纯,選擇一個初始序號seq=x
第二次:
B向A發(fā)送SYN=1,ACK=1,確認(rèn)號ack=x+1 , 同樣選擇一個序號seq = y
第三次:
A向B發(fā)送ACK=1,seq = x+1, ack=y+1
B收到A的確認(rèn)后甲脏,連接建立
為什么需要三次握手
第三次握手是為了防止失效的連接請求到底服務(wù)器眶熬,讓服務(wù)器錯誤地打開連接妹笆,白白浪費(fèi)資源。
假設(shè)客戶端發(fā)送的第一次請求在網(wǎng)絡(luò)中滯留娜氏,客戶端得到不到相應(yīng)后就會重新發(fā)送請求建立連接拳缠。假設(shè)第一次無效的連接,很久后又到達(dá)了服務(wù)器贸弥,假設(shè)只有兩次握手窟坐,則這時服務(wù)的就會進(jìn)入連接建立狀態(tài),而客戶端卻認(rèn)為這次請求是無效的绵疲,服務(wù)的還傻傻地等等數(shù)據(jù)的到來哲鸳,浪費(fèi)了資源。如果有三次握手盔憨,客戶端會忽略服務(wù)的第二次握手的請求徙菠,使得連接不會建立,避免了資源浪費(fèi)郁岩。
TCP四次揮手
TCP的四次揮手主要涉及首部的FIN婿奔,ACK,序號驯用,確認(rèn)號
假設(shè)是客戶端A首先向服務(wù)的B請求接受連接
第一次:A向B發(fā)送報文脸秽,首部FIN=1,序號seq=u蝴乔。A進(jìn)入FIN_WAIT_1狀態(tài)
第二次:B收到A的請求,發(fā)送報文驮樊,首部seq=v薇正,ack=u+1,ACK=1 囚衔。進(jìn)入close_wait狀態(tài)
第三次:B的數(shù)據(jù)發(fā)送完畢挖腰,發(fā)送報文,首部 ack=u+1练湿,seq = w猴仑,ACK=1,F(xiàn)IN=1肥哎。進(jìn)入LAST_ACK狀態(tài)
第四次:A收到B的斷開請求辽俗,發(fā)送報文 ,首部ack=w+1篡诽,seq=u+1崖飘,ACK=1。進(jìn)入TIME_WAIT狀態(tài)
B收到第四次握手信息后進(jìn)入close狀態(tài)
A發(fā)送第四次握手后杈女,等等2MSL朱浴,進(jìn)入CLOSE狀態(tài)
為什么需要四次握手
因?yàn)榭蛻舳税l(fā)送FIN連接請求釋放連接后吊圾,服務(wù)器接受請求后進(jìn)入CLOSE_WAIT狀態(tài),這個狀態(tài)就是為了讓服務(wù)段發(fā)送還沒有發(fā)送完的數(shù)據(jù)翰蠢,發(fā)送完成后再發(fā)送FIN信號项乒。
TIME_WAIT
客戶端收到服務(wù)的釋放連接的請求后,不是立馬進(jìn)入CLOSE狀態(tài)梁沧,而是還要再等待2MSL檀何。理由是:
- 確保最后一個確認(rèn)報文能夠到達(dá)。如果沒能到達(dá)趁尼,服務(wù)端就會會重發(fā)FIN請求釋放連接埃碱。等待一段時間沒有收到重發(fā)就說明服務(wù)的已經(jīng)CLOSE了。如果有重發(fā)酥泞,則客戶端再發(fā)送一次LAST ack信號
- 等待一段時間是為了讓本連接持續(xù)時間內(nèi)所產(chǎn)生的所有報文都從網(wǎng)絡(luò)中消失砚殿,使得下一個新的連接不會出現(xiàn)舊的連接請求報文