一、TCP協(xié)議介紹
TCP協(xié)議是可靠的、面向連接的、基于字節(jié)流的傳輸層通信協(xié)議。
TCP的頭部結(jié)構(gòu):
源/目的端口號(hào): 表示數(shù)據(jù)是從哪個(gè)進(jìn)程來(lái), 到哪個(gè)進(jìn)程去;(tcp是傳輸層的協(xié)議,端與端之間的數(shù)據(jù)傳輸,在TCP和UDP協(xié)議當(dāng)中不會(huì)體現(xiàn)出IP)
32位序號(hào):一次TCP通信(從TCP連接建立到斷開(kāi))過(guò)程中某一個(gè)傳輸方向上的字節(jié)流的每個(gè)字節(jié)的編號(hào)。
32位確認(rèn)號(hào):對(duì)另一方發(fā)送來(lái)的TCP報(bào)文段的響應(yīng),即告知發(fā)送端期待發(fā)送的下一條序號(hào)。其值是收到的TCP報(bào)文段的序號(hào)值加1。
4位TCP報(bào)頭長(zhǎng)度:表示該TCP頭部有多少個(gè)32位bit(有多少個(gè)4字節(jié)); 所以TCP頭部最大長(zhǎng)度是15 * 4 = 60
16位窗口大?。焊嬖V發(fā)送方字節(jié)的接收能力
6位標(biāo)志位:
16位校驗(yàn)和: 發(fā)送端填充, CRC校驗(yàn). 接收端校驗(yàn)不通過(guò), 則認(rèn)為數(shù)據(jù)有問(wèn)題. 此處的檢驗(yàn)和不光包含TCP首部, 也包含TCP數(shù)據(jù)部分,簡(jiǎn)單來(lái)說(shuō)就是檢驗(yàn)TCP數(shù)據(jù)是否在傳輸過(guò)程中失真。
16位緊急指針: 標(biāo)識(shí)哪部分?jǐn)?shù)據(jù)是緊急數(shù)據(jù)。
二、三次握手
面向連接指TCP連接的本質(zhì)是在建立三次握手時(shí)期,通信雙方會(huì)協(xié)商很多連接當(dāng)中的數(shù)據(jù)。對(duì)于TCP而言,如果通信雙方不建立連接則不能進(jìn)行通信。
在listen()方法中第二個(gè)參數(shù)就是指定已完成三次握手隊(duì)列的長(zhǎng)度。
TCP在建立連接的時(shí)候,客戶端就會(huì)先給服務(wù)器端發(fā)送一個(gè)TCP報(bào)文段,然后服務(wù)器端再給客戶端恢復(fù)一個(gè)TCP報(bào)文段,最后客戶端再給服務(wù)器端回復(fù),一共三次。
三次握手的具體過(guò)程是:
第一次握手:當(dāng)客戶端執(zhí)行connet()這行代碼的時(shí)候開(kāi)始進(jìn)行三次握手,此時(shí)客戶端就會(huì)在傳輸層給服務(wù)端發(fā)送一個(gè)SYN報(bào)文,SYN報(bào)文中有一個(gè)序號(hào),這個(gè)序號(hào)就是自己的序號(hào)(32位序號(hào)),假設(shè)這個(gè)序號(hào)為i。
第二次握手:服務(wù)器收到之后會(huì)給客戶端一個(gè)回復(fù),回復(fù)的是SYN報(bào)文,此報(bào)文中也有一個(gè)自己的序號(hào),假設(shè)這個(gè)序號(hào)為j,還有ACK報(bào)文,是一個(gè)確認(rèn)號(hào),這個(gè)確認(rèn)號(hào)就是對(duì)剛剛客戶端發(fā)來(lái)的序號(hào)進(jìn)行確認(rèn),由于客戶端發(fā)來(lái)的序號(hào)值為i,則這個(gè)確認(rèn)號(hào)就為i+1,服務(wù)器向客戶端回復(fù)的時(shí)候序號(hào)和確認(rèn)號(hào)可以寫(xiě)到一個(gè)報(bào)文中。
第三次握手:客戶端收到服務(wù)器端的回復(fù)之后,再給客戶端發(fā)送一個(gè)報(bào)文ACK進(jìn)行確認(rèn),對(duì)剛剛服務(wù)器返回回來(lái)的序號(hào)進(jìn)行確認(rèn),由于服務(wù)器回復(fù)到客戶端的序號(hào)為j,所以確認(rèn)的序號(hào)應(yīng)該為j+1。
具體過(guò)程如下圖所示:
注意:三次握手發(fā)生在建立連接的時(shí)候,connect開(kāi)始執(zhí)行發(fā)起連接三次握手開(kāi)始,connect返回成功三次握手結(jié)束。但是連接發(fā)送的syn,syn+ack,ack用戶都沒(méi)有直接參與,換句話說(shuō),在發(fā)送這些數(shù)據(jù)包的時(shí)候,用戶并沒(méi)有給傳輸層的TCP協(xié)議提交任何數(shù)據(jù)。這里的syn,syn+ack,ack全部都是TCP協(xié)議報(bào)頭的內(nèi)容。
三、四次揮手
在客戶端與服務(wù)器通信完畢過(guò)后,誰(shuí)先調(diào)用close,開(kāi)始進(jìn)行四次揮手。一般來(lái)說(shuō),主動(dòng)斷開(kāi)方都是客戶端。
以斷供開(kāi)方為客戶端為例:
第一次揮手:當(dāng)客戶端執(zhí)行到close這行代碼的時(shí)候就意味著要斷開(kāi)和客戶端的連接了,此時(shí)開(kāi)始進(jìn)行四次揮手,客戶端給服務(wù)器端發(fā)送一個(gè)FIN報(bào)文,假如它的序號(hào)值為n。
第二次揮手:服務(wù)器端接收到了客戶端的FIN報(bào)文,馬上給客戶端發(fā)送一個(gè)確認(rèn)信息,即ACK報(bào)文,確認(rèn)號(hào)為n+1,確認(rèn)已經(jīng)收到客戶端要斷開(kāi)的信息。
第三次揮手:服務(wù)器端給客戶端發(fā)送了確認(rèn)信息之后,也執(zhí)行close,表示服務(wù)器端也要斷開(kāi)了,此時(shí)服務(wù)器端給客戶端發(fā)送一個(gè)FIN報(bào)文,假如它的序號(hào)值為m。
第四次揮手:客戶端接收到了服務(wù)器端的FIN報(bào)文,馬上給服務(wù)器端發(fā)送一個(gè)確認(rèn)信息,即ACK報(bào)文,確認(rèn)號(hào)為m+1,確認(rèn)已經(jīng)收到服務(wù)器端要斷開(kāi)的信息。
具體過(guò)程如下圖所示:
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-672196.html
注意:四次揮手?jǐn)嚅_(kāi)連接時(shí)發(fā)送的FIN,ACK用戶都沒(méi)有直接參與,是底層協(xié)議自己完成的,在代碼層面只需要close。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-672196.html
到了這里,關(guān)于Linux TCP協(xié)議——三次握手,四次揮手的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!