您好,登錄后才能下訂單哦!
這篇文章主要講解了“linux TCP協議的知識點有哪些”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“linux TCP協議的知識點有哪些”吧!
要了解三次握手和四次揮手,首先需要了解下TCP數據包頭的結構,如下:
源端口、目的端口:16位長,標識出遠端和本地的端口號;
序號:SEQ,32位長,標識發送的數據包的順序,防止數據包亂序;
確認號:32位長,接收方對發送方發送來的TCP報文段的響應,其值是對收到的報文序號加1,用于解決不丟包的問題;
TCP頭長:4位頭長,標識tcp頭部可以有多少個32bit,即多少個4字節,因為頭長是4位,最大能表示15,所以TCP頭部最大就是15*4等于60個字節,也就是說TCP包頭最長可以有60個字節;
URG:表示緊急指針是否有效;
ACK:ACK位置1表明確認號是合法的,如果ACK為0,那么數據包不包含確認信息,確認字段被省略;
PSH:提示接收端應用程序應該立即從TCP接收緩沖區中讀走數據,為接收后續數據騰出空間;
RST:表示要求對方重新建立連接,用于復位由于主機崩潰或其他原因而出現的錯誤的連接,還可以用于拒絕非法的數據報或拒絕連接請求;
SYN:表示請求建立連接;
FIN:表示通知對方要關閉連接了;
窗口大小:16位長,是一種流量控制的手段,這個窗口,指的是接收通告窗口,它告訴對端本端的TCP緩沖區還能容納多少字節的數據,這樣對方就可以控制發送數據的速度;
校驗和:16位長,由發送端填充,接收端根據該值,校驗接收到的TCP報文段在傳輸過程中是否損壞,校驗包括頭部和數據部分,它是TCP可靠傳輸的一個重要保障;
緊急指針:16位長,是一個正的偏移量,它和序號相加表示最后一個緊急數據的下一個字節的序號,確切的說,它是緊急指針相對當前序號的偏移,是發送端向接收端發送緊急數據的辦法;
可選項:TCP頭部最長可以有60個字節,而前部分已知的字段占用了20個字節,所以選項最多可以有40個字節,包括最大TCP載荷,窗口比例、選擇重復數據報等選項;
注意:TCP數據包是沒有IP地址的,只有端口
在利用TCP實現源主機和目的主機通信時,目的主機必須同意,否則TCP連接無法建立。為了確保TCP連接的成功建立,TCP采用了一種稱為三次握手的方式,三次握手方式使得“序號/確認號”系統能夠正常工作,從而使它們的序號達成同步。如果三次握手成功,則連接建立成功,可以開始傳送數據信息。 三次握手:為應用程序提供可靠的通信連接,適合于一次傳輸大批數據的情況,并適用于要求得到響應的應用程序。 其三次握手分別為:
源主機A的TCP向主機B發送連接請求報文段,其首部中的SYN(同步)標志位應置為1,表示想跟目標主機B建立連接,進行通信,并發送一個同步序列號X(例:SEQ=100)進行同步,表明在后面傳送數據時的第一個數據字節的序號為X+1(即101), 此時client端狀態為SYN_SENT。
目標主機B的TCP收到連接請求報文段后,如同意,則發回確認。再確認報中應將ACK位置為1.確認號為X+1,同時又向A也發送一個SYN=1,并發送一個序號Y, 此時server端狀態為SYN_RCVD。
源主機A的TCP收到目標主機B的確認后要想目標主機B給出確認。其ACK置為1,確認號為Y+1,而自己的序號為X+1。TCP的標準規定,SYN置1的報文段要消耗掉一個序號, 當兩邊都確認完成后,狀態改為ESTABLISHED。
運行客戶進程的源主機A的TCP通知上層應用進程,連接已經建立。 當源主機A向目標主機B發送第一個數據報文段時,其序號仍為X+1,因為前一個確認報文段并不消耗序號。 當運行服務進程的目標主機B的TCP收到源主機A的確認后,也通知其上層應用進程,連接已經建立。至此建立了一個全雙工的連接。
tcp建立連接是三次,但斷開連接卻要四次,是因為tcp是全雙工的,兩個方向上都需要進行關閉。
當主機A完成數據傳輸后,將控制位FIN置1,向主機B提出停止TCP連接的請求,狀態改為FINWAIT1,此時,該數據包中,序列號為主機B發送的上一個數據包中的確認號值,而確認號為主機A發送的上一個數據包中的序列號+該數據包所帶的數據的大小;
主機B收到FIN后對其作出響應,確認這一方向上的TCP連接將關閉,將ACK置1,此時服務器狀態改為CLOSEWAIT, 客戶端狀態改為FINWAIT_1,此時序列號為上一步中的確認號,確認號為上一步中的序列號加1;
由B 端再提出反方向的關閉請求,將FIN置1,服務端狀態為LASTACK,客戶端狀態為TIMEWAIT,此時序列號為上一步的確認號,確認號為上一步的序列號加上數據包所帶數據的大小;
主機A對主機B的請求進行確認,將ACK置1,雙方向的關閉結束狀態為CLOSED,此時序列號為上一步中的確認號,確認號為上一步中的序列號加1;
注意 : FIN和SYN一樣,也要消耗一個序號。理論上服務器在TCP連接關閉時發送的終止數據包中,只有終止位置是1,然后客戶端進行確認。但是在實際的 TCP實現中,在終止數據包中,確認位和終止位是同時置為1的,確認位置為1表示對最后一次傳輸的數據進行確認,終止位置為1表示關閉該方向的TCP連 接。
一般我們可以使用netstat查看當前socket狀態。
CLOSED:表示初始狀態;
LISTEN:表示服務器端的某個socket處于監聽狀態,可以接受連接;
SYNSENT:三次握手時,客戶端發送第一次SYN連接請求后,狀態SYNSENT;
SYN_RCVD:也是三次握手時服務端的一個中間狀態;
ESTABLISHED:表示連接已經建立,這里要說明一下,其實TCP連接并不是真的有什么東西連著在,只是說雙方都是ESTABLLISHED狀態,就說明雙方連接正常;
FINWAIT1:已經建立連接后,其中一方請求終止連接,四次揮手中間狀態;
TIME_WAIT:表示收到了對方的FIN報文,并發送出了ACK報文,就等2MSL(默認是2min)后回到CLOSED可用狀態;
CLOSING:表示發送FIN報文后,沒有收到對方的ACK報文,反而收到了對方的FIN報文,這種情況其實就是雙方同時關閉socket;
CLOSE_WAIT:四次揮手中間狀態,表示在等待關閉連接;
LAST_ACK:四次揮手時被動關閉一方在發送FIN報文后,等待對方的ACK確認報文;
RST:同時打開和同時關閉;
有兩個原因:
可靠地終止TCP連接,在四次揮手的最后一步中,可能客戶端發送到服務端的確認包丟失,服務端就會重發結束報文段,客戶端重新發起確認報文段,而這就需要停留一段時間;
保證讓遲來的TCP報文段有足夠的時間被識別并丟棄,如果沒有停留一段時間,原來客戶端的端口號就可以立即被另外一個應用程序重用,此時如果服務端有遲來的報文段,就會發到該新的應用程序上去,而這顯然是不被允許的;
注意:報文段的生存周期是一個MSL,所以在2MSL后,不會還存在遲到的報文段。
感謝各位的閱讀,以上就是“linux TCP協議的知識點有哪些”的內容了,經過本文的學習后,相信大家對linux TCP協議的知識點有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。