TCP連接的端點
TCP連接的端點是套接字(socket)。
socket=(IP地址:端口號)
TCP的首部
如下圖所示艘刚,TCP的首部最少有20個字節(jié) ,后面還有4n個字節(jié)是可選的截珍。
首部的主要包含:
- 源端口和目的端口 各占2個字節(jié)
- 序號 4字節(jié) 共2^32攀甚,到頭后從0開始。表示本次發(fā)送的數(shù)據(jù)的第一個字節(jié)的編號岗喉。TCP傳送的字節(jié)流對每一個字節(jié)編號秋度。
- 確認號 占4字節(jié) 是期望收到的對方下一個報文段的第一個數(shù)據(jù)字節(jié)的序號
- 數(shù)據(jù)偏移 占4位 數(shù)據(jù)起始地址和報文起始地址的距離,實際指出首部長度
- 確認ACK 僅當ACK=1時確認號字段才有效钱床。TCP協(xié)議規(guī)定荚斯,當連接建立后,ACK必須為1
- 同步SYN 在建立連接時使用 當SYN=1而ACK=0時查牌,表明這是一個連接請求報文段事期。而對方接受時會回復SYN=1,ACK=1纸颜。因此SYN=1表示這是一個連接請求會連接接受報文段(第一和第二次握手)
- 終止 FIN 當FIN=1時兽泣,表明此報文段的發(fā)送方的數(shù)據(jù)已經(jīng)發(fā)送完畢,并要求釋放運輸連接
- 窗口 占2字節(jié) 表示允許對方發(fā)送數(shù)據(jù)的最大字節(jié)數(shù)
- 檢驗和
- 緊急指針
TCP三次握手過程
三次握手涉及到TCP首部的胁孙,同步為SYN唠倦,確認位ACK称鳞,序號seq,請求號ack.
假設A是客戶端牵敷,B是服務端胡岔。
首先,B處于監(jiān)聽狀態(tài)枷餐,等待客戶端的連接請求
第一次:
A向B發(fā)送SYN=1靶瘸,ACK=0,選擇一個初始序號seq=x
第二次:
B向A發(fā)送SYN=1,ACK=1,確認號ack=x+1 , 同樣選擇一個序號seq = y
第三次:
A向B發(fā)送ACK=1毛肋,seq = x+1, ack=y+1
B收到A的確認后怨咪,連接建立
為什么需要三次握手
第三次握手是為了防止失效的連接請求到底服務器,讓服務器錯誤地打開連接润匙,白白浪費資源诗眨。
假設客戶端發(fā)送的第一次請求在網(wǎng)絡中滯留,客戶端得到不到相應后就會重新發(fā)送請求建立連接孕讳。假設第一次無效的連接匠楚,很久后又到達了服務器,假設只有兩次握手厂财,則這時服務的就會進入連接建立狀態(tài)芋簿,而客戶端卻認為這次請求是無效的,服務的還傻傻地等等數(shù)據(jù)的到來璃饱,浪費了資源与斤。如果有三次握手,客戶端會忽略服務的第二次握手的請求荚恶,使得連接不會建立撩穿,避免了資源浪費。
TCP四次揮手
TCP的四次揮手主要涉及首部的FIN谒撼,ACK食寡,序號,確認號
假設是客戶端A首先向服務的B請求接受連接
第一次:A向B發(fā)送報文廓潜,首部FIN=1抵皱,序號seq=u。A進入FIN_WAIT_1狀態(tài)
第二次:B收到A的請求茉帅,發(fā)送報文叨叙,首部seq=v,ack=u+1堪澎,ACK=1 擂错。進入close_wait狀態(tài)
第三次:B的數(shù)據(jù)發(fā)送完畢,發(fā)送報文樱蛤,首部 ack=u+1钮呀,seq = w剑鞍,ACK=1,F(xiàn)IN=1爽醋。進入LAST_ACK狀態(tài)
第四次:A收到B的斷開請求蚁署,發(fā)送報文 ,首部ack=w+1蚂四,seq=u+1光戈,ACK=1。進入TIME_WAIT狀態(tài)
B收到第四次握手信息后進入close狀態(tài)
A發(fā)送第四次握手后遂赠,等等2MSL久妆,進入CLOSE狀態(tài)
為什么需要四次握手
因為客戶端發(fā)送FIN連接請求釋放連接后,服務器接受請求后進入CLOSE_WAIT狀態(tài)跷睦,這個狀態(tài)就是為了讓服務段發(fā)送還沒有發(fā)送完的數(shù)據(jù)筷弦,發(fā)送完成后再發(fā)送FIN信號。
TIME_WAIT
客戶端收到服務的釋放連接的請求后抑诸,不是立馬進入CLOSE狀態(tài)烂琴,而是還要再等待2MSL。理由是:
- 確保最后一個確認報文能夠到達蜕乡。如果沒能到達奸绷,服務端就會會重發(fā)FIN請求釋放連接。等待一段時間沒有收到重發(fā)就說明服務的已經(jīng)CLOSE了异希。如果有重發(fā)健盒,則客戶端再發(fā)送一次LAST ack信號
- 等待一段時間是為了讓本連接持續(xù)時間內所產(chǎn)生的所有報文都從網(wǎng)絡中消失绒瘦,使得下一個新的連接不會出現(xiàn)舊的連接請求報文