溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

linux TCP協(xié)議的知識點(diǎn)有哪些

發(fā)布時(shí)間:2021-12-17 10:19:00 來源:億速云 閱讀:127 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“l(fā)inux TCP協(xié)議的知識點(diǎn)有哪些”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“l(fā)inux TCP協(xié)議的知識點(diǎn)有哪些”吧!

1. TCP協(xié)議

1.1 TCP數(shù)據(jù)包頭

要了解三次握手和四次揮手,首先需要了解下TCP數(shù)據(jù)包頭的結(jié)構(gòu),如下: linux TCP協(xié)議的知識點(diǎn)有哪些

  • 源端口、目的端口:16位長,標(biāo)識出遠(yuǎn)端和本地的端口號;

  • 序號:SEQ,32位長,標(biāo)識發(fā)送的數(shù)據(jù)包的順序,防止數(shù)據(jù)包亂序;

  • 確認(rèn)號:32位長,接收方對發(fā)送方發(fā)送來的TCP報(bào)文段的響應(yīng),其值是對收到的報(bào)文序號加1,用于解決不丟包的問題;

  • TCP頭長:4位頭長,標(biāo)識tcp頭部可以有多少個(gè)32bit,即多少個(gè)4字節(jié),因?yàn)轭^長是4位,最大能表示15,所以TCP頭部最大就是15*4等于60個(gè)字節(jié),也就是說TCP包頭最長可以有60個(gè)字節(jié);

  • URG:表示緊急指針是否有效;

  • ACK:ACK位置1表明確認(rèn)號是合法的,如果ACK為0,那么數(shù)據(jù)包不包含確認(rèn)信息,確認(rèn)字段被省略;

  • PSH:提示接收端應(yīng)用程序應(yīng)該立即從TCP接收緩沖區(qū)中讀走數(shù)據(jù),為接收后續(xù)數(shù)據(jù)騰出空間;

  • RST:表示要求對方重新建立連接,用于復(fù)位由于主機(jī)崩潰或其他原因而出現(xiàn)的錯(cuò)誤的連接,還可以用于拒絕非法的數(shù)據(jù)報(bào)或拒絕連接請求;

  • SYN:表示請求建立連接;

  • FIN:表示通知對方要關(guān)閉連接了;

  • 窗口大小:16位長,是一種流量控制的手段,這個(gè)窗口,指的是接收通告窗口,它告訴對端本端的TCP緩沖區(qū)還能容納多少字節(jié)的數(shù)據(jù),這樣對方就可以控制發(fā)送數(shù)據(jù)的速度;

  • 校驗(yàn)和:16位長,由發(fā)送端填充,接收端根據(jù)該值,校驗(yàn)接收到的TCP報(bào)文段在傳輸過程中是否損壞,校驗(yàn)包括頭部和數(shù)據(jù)部分,它是TCP可靠傳輸?shù)囊粋€(gè)重要保障;

  • 緊急指針:16位長,是一個(gè)正的偏移量,它和序號相加表示最后一個(gè)緊急數(shù)據(jù)的下一個(gè)字節(jié)的序號,確切的說,它是緊急指針相對當(dāng)前序號的偏移,是發(fā)送端向接收端發(fā)送緊急數(shù)據(jù)的辦法;

  • 可選項(xiàng):TCP頭部最長可以有60個(gè)字節(jié),而前部分已知的字段占用了20個(gè)字節(jié),所以選項(xiàng)最多可以有40個(gè)字節(jié),包括最大TCP載荷,窗口比例、選擇重復(fù)數(shù)據(jù)報(bào)等選項(xiàng);

注意:TCP數(shù)據(jù)包是沒有IP地址的,只有端口

1.2 三次握手協(xié)議

在利用TCP實(shí)現(xiàn)源主機(jī)和目的主機(jī)通信時(shí),目的主機(jī)必須同意,否則TCP連接無法建立。為了確保TCP連接的成功建立,TCP采用了一種稱為三次握手的方式,三次握手方式使得“序號/確認(rèn)號”系統(tǒng)能夠正常工作,從而使它們的序號達(dá)成同步。如果三次握手成功,則連接建立成功,可以開始傳送數(shù)據(jù)信息。 三次握手:為應(yīng)用程序提供可靠的通信連接,適合于一次傳輸大批數(shù)據(jù)的情況,并適用于要求得到響應(yīng)的應(yīng)用程序。 其三次握手分別為:

  • 源主機(jī)A的TCP向主機(jī)B發(fā)送連接請求報(bào)文段,其首部中的SYN(同步)標(biāo)志位應(yīng)置為1,表示想跟目標(biāo)主機(jī)B建立連接,進(jìn)行通信,并發(fā)送一個(gè)同步序列號X(例:SEQ=100)進(jìn)行同步,表明在后面?zhèn)魉蛿?shù)據(jù)時(shí)的第一個(gè)數(shù)據(jù)字節(jié)的序號為X+1(即101), 此時(shí)client端狀態(tài)為SYN_SENT。

  • 目標(biāo)主機(jī)B的TCP收到連接請求報(bào)文段后,如同意,則發(fā)回確認(rèn)。再確認(rèn)報(bào)中應(yīng)將ACK位置為1.確認(rèn)號為X+1,同時(shí)又向A也發(fā)送一個(gè)SYN=1,并發(fā)送一個(gè)序號Y, 此時(shí)server端狀態(tài)為SYN_RCVD。

  • 源主機(jī)A的TCP收到目標(biāo)主機(jī)B的確認(rèn)后要想目標(biāo)主機(jī)B給出確認(rèn)。其ACK置為1,確認(rèn)號為Y+1,而自己的序號為X+1。TCP的標(biāo)準(zhǔn)規(guī)定,SYN置1的報(bào)文段要消耗掉一個(gè)序號, 當(dāng)兩邊都確認(rèn)完成后,狀態(tài)改為ESTABLISHED。

運(yùn)行客戶進(jìn)程的源主機(jī)A的TCP通知上層應(yīng)用進(jìn)程,連接已經(jīng)建立。 當(dāng)源主機(jī)A向目標(biāo)主機(jī)B發(fā)送第一個(gè)數(shù)據(jù)報(bào)文段時(shí),其序號仍為X+1,因?yàn)榍耙粋€(gè)確認(rèn)報(bào)文段并不消耗序號。 當(dāng)運(yùn)行服務(wù)進(jìn)程的目標(biāo)主機(jī)B的TCP收到源主機(jī)A的確認(rèn)后,也通知其上層應(yīng)用進(jìn)程,連接已經(jīng)建立。至此建立了一個(gè)全雙工的連接。

1.3 tcp斷開連接四次揮手

tcp建立連接是三次,但斷開連接卻要四次,是因?yàn)閠cp是全雙工的,兩個(gè)方向上都需要進(jìn)行關(guān)閉。

  • 當(dāng)主機(jī)A完成數(shù)據(jù)傳輸后,將控制位FIN置1,向主機(jī)B提出停止TCP連接的請求,狀態(tài)改為FINWAIT1,此時(shí),該數(shù)據(jù)包中,序列號為主機(jī)B發(fā)送的上一個(gè)數(shù)據(jù)包中的確認(rèn)號值,而確認(rèn)號為主機(jī)A發(fā)送的上一個(gè)數(shù)據(jù)包中的序列號+該數(shù)據(jù)包所帶的數(shù)據(jù)的大小;

  • 主機(jī)B收到FIN后對其作出響應(yīng),確認(rèn)這一方向上的TCP連接將關(guān)閉,將ACK置1,此時(shí)服務(wù)器狀態(tài)改為CLOSEWAIT, 客戶端狀態(tài)改為FINWAIT_1,此時(shí)序列號為上一步中的確認(rèn)號,確認(rèn)號為上一步中的序列號加1;

  • 由B 端再提出反方向的關(guān)閉請求,將FIN置1,服務(wù)端狀態(tài)為LASTACK,客戶端狀態(tài)為TIMEWAIT,此時(shí)序列號為上一步的確認(rèn)號,確認(rèn)號為上一步的序列號加上數(shù)據(jù)包所帶數(shù)據(jù)的大小;

  • 主機(jī)A對主機(jī)B的請求進(jìn)行確認(rèn),將ACK置1,雙方向的關(guān)閉結(jié)束狀態(tài)為CLOSED,此時(shí)序列號為上一步中的確認(rèn)號,確認(rèn)號為上一步中的序列號加1;

注意 : FIN和SYN一樣,也要消耗一個(gè)序號。理論上服務(wù)器在TCP連接關(guān)閉時(shí)發(fā)送的終止數(shù)據(jù)包中,只有終止位置是1,然后客戶端進(jìn)行確認(rèn)。但是在實(shí)際的 TCP實(shí)現(xiàn)中,在終止數(shù)據(jù)包中,確認(rèn)位和終止位是同時(shí)置為1的,確認(rèn)位置為1表示對最后一次傳輸?shù)臄?shù)據(jù)進(jìn)行確認(rèn),終止位置為1表示關(guān)閉該方向的TCP連 接。

1.4 TCP有哪些狀態(tài)

一般我們可以使用netstat查看當(dāng)前socket狀態(tài)。

  • CLOSED:表示初始狀態(tài);

  • LISTEN:表示服務(wù)器端的某個(gè)socket處于監(jiān)聽狀態(tài),可以接受連接;

  • SYNSENT:三次握手時(shí),客戶端發(fā)送第一次SYN連接請求后,狀態(tài)SYNSENT;

  • SYN_RCVD:也是三次握手時(shí)服務(wù)端的一個(gè)中間狀態(tài);

  • ESTABLISHED:表示連接已經(jīng)建立,這里要說明一下,其實(shí)TCP連接并不是真的有什么東西連著在,只是說雙方都是ESTABLLISHED狀態(tài),就說明雙方連接正常;

  • FINWAIT1:已經(jīng)建立連接后,其中一方請求終止連接,四次揮手中間狀態(tài);

  • TIME_WAIT:表示收到了對方的FIN報(bào)文,并發(fā)送出了ACK報(bào)文,就等2MSL(默認(rèn)是2min)后回到CLOSED可用狀態(tài);

  • CLOSING:表示發(fā)送FIN報(bào)文后,沒有收到對方的ACK報(bào)文,反而收到了對方的FIN報(bào)文,這種情況其實(shí)就是雙方同時(shí)關(guān)閉socket;

  • CLOSE_WAIT:四次揮手中間狀態(tài),表示在等待關(guān)閉連接;

  • LAST_ACK:四次揮手時(shí)被動關(guān)閉一方在發(fā)送FIN報(bào)文后,等待對方的ACK確認(rèn)報(bào)文;

  • RST:同時(shí)打開和同時(shí)關(guān)閉;

1.5 TIME_WAIT為什么要等2MSL才會變?yōu)镃LOSED

有兩個(gè)原因:

  • 可靠地終止TCP連接,在四次揮手的最后一步中,可能客戶端發(fā)送到服務(wù)端的確認(rèn)包丟失,服務(wù)端就會重發(fā)結(jié)束報(bào)文段,客戶端重新發(fā)起確認(rèn)報(bào)文段,而這就需要停留一段時(shí)間;

  • 保證讓遲來的TCP報(bào)文段有足夠的時(shí)間被識別并丟棄,如果沒有停留一段時(shí)間,原來客戶端的端口號就可以立即被另外一個(gè)應(yīng)用程序重用,此時(shí)如果服務(wù)端有遲來的報(bào)文段,就會發(fā)到該新的應(yīng)用程序上去,而這顯然是不被允許的;

注意:報(bào)文段的生存周期是一個(gè)MSL,所以在2MSL后,不會還存在遲到的報(bào)文段。

感謝各位的閱讀,以上就是“l(fā)inux TCP協(xié)議的知識點(diǎn)有哪些”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對linux TCP協(xié)議的知識點(diǎn)有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI