TCP(Transmission Control Protocol 傳輸控制協(xié)議)是一種面向連接的悦即、可靠的蛙吏、基于字節(jié)流的傳輸層通信協(xié)議涉瘾。TCP工作在網(wǎng)絡(luò)OSI七層模型中的第四層-傳輸層要出,下面一張圖展示OSI七層模型及每一層的作用和對(duì)應(yīng)的協(xié)議捉偏。更多精彩內(nèi)容請(qǐng)關(guān)注我的微信公眾號(hào):JavaQ倒得。
TCP是傳輸層協(xié)議,在進(jìn)行數(shù)據(jù)傳輸之前使用三次握手協(xié)議建立連接夭禽,大體的過程是客戶端發(fā)出SYN連接請(qǐng)求后霞掺,服務(wù)端接收請(qǐng)求后應(yīng)答SYN+ACK,客戶端收到服務(wù)端應(yīng)答后應(yīng)答ACK讹躯,這種建立連接的方法可以防止產(chǎn)生錯(cuò)誤的連接菩彬,防止已失效的連接請(qǐng)求報(bào)文段突然又傳送到了服務(wù)端。TCP三次握手過程圖示如下:
TCP三次握手過程描述如下:
1.客戶端發(fā)送SYN標(biāo)志位為1潮梯,Sequence Number為x的連接請(qǐng)求報(bào)文段骗灶,然后客戶端進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器的確認(rèn)響應(yīng)秉馏;
2.服務(wù)器收到客戶端的連接請(qǐng)求耙旦,對(duì)這個(gè)SYN報(bào)文段進(jìn)行確認(rèn),然后發(fā)送Acknowledgment Number為x+1(Sequence Number+1)萝究,SYN標(biāo)志位和ACK標(biāo)志位均為1免都,Sequence Number為y的報(bào)文段(即SYN+ACK報(bào)文段)給客戶端,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài)糊肤;
3.客戶端收到服務(wù)器的SYN+ACK報(bào)文段,確認(rèn)ACK后氓鄙,發(fā)送Acknowledgment Number為y+1馆揉,SYN標(biāo)志位為0,ACK標(biāo)志位為1的報(bào)文段抖拦,發(fā)送完成后升酣,客戶端和服務(wù)器端都進(jìn)入ESTABLISHED狀態(tài)舷暮,完成TCP三次握手,客戶端和服務(wù)器端成功地建立連接噩茄,可以開始傳輸數(shù)據(jù)了下面。
當(dāng)數(shù)據(jù)傳送完成后,為了正確完整的完成數(shù)據(jù)傳輸绩聘,需要經(jīng)過四次揮手?jǐn)嚅_連接沥割。TCP四次揮過程圖示如下:
TCP四次揮手過程描述如下:
1.客戶端發(fā)送Sequence Number為x+2,Acknowledgment Number為y+1的FIN報(bào)文段凿菩,客戶端進(jìn)入FIN_WAIT_1狀態(tài)机杜,即告訴服務(wù)端沒有數(shù)據(jù)需要傳輸了,請(qǐng)求關(guān)閉連接衅谷;
2.服務(wù)端收到客戶端的FIN報(bào)文段后椒拗,向客戶端應(yīng)答一個(gè)Acknowledgment Number為Sequence Number+1的ACK報(bào)文段,即應(yīng)答客戶端你的請(qǐng)求我收到了获黔,但是我還沒準(zhǔn)備好蚀苛,請(qǐng)等待我的關(guān)閉請(qǐng)求$枋希客戶端收到后進(jìn)入FIN_WAIT_2狀態(tài)堵未;
3.服務(wù)端完成數(shù)據(jù)傳輸后向客戶端發(fā)送Sequence Number為y+1的FIN報(bào)文段,請(qǐng)求關(guān)閉連接预茄,服務(wù)器進(jìn)入LAST_ACK狀態(tài)兴溜;
4.客戶端收到服務(wù)端的FIN報(bào)文段后,向服務(wù)端應(yīng)答一個(gè)Acknowledgment Number為Sequence Number+1的ACK報(bào)文段耻陕,然后客戶端進(jìn)入TIME_WAIT狀態(tài)拙徽;服務(wù)端收到客戶端的ACK報(bào)文段后關(guān)閉連接進(jìn)入CLOSED狀態(tài),客戶端等待2MSL后依然沒有收到回復(fù)诗宣,則證明服務(wù)端已正常關(guān)閉膘怕,客戶端此時(shí)關(guān)閉連接進(jìn)入CLOSED狀態(tài)。