Linux基礎8-TCP的面向鏈接(三次四次)


TCP的面向鏈接:

1.三次握手(三次握手只有第三次可以攜帶數據)
2.四次揮手
3.建立鏈接
4.通訊雙方通過建立鏈接的過程來同步兩邊的報文段的標識

面試題——TCP網絡編程總結

1、三次握手講解

背景:TCP位於傳輸層,作用是提供可靠的字節流服務,爲了準確無誤地將數據送達目的地,TCP協議採納三次握手策略。
置位概念:根據TCP的包頭字段,存在3個重要的標識ACK、SYN、FIN

ACK:表示驗證字段
SYN:位數置1,表示建立TCP連接
FIN:位數置1,表示斷開TCP連接
在這裏插入圖片描述三次握手過程說明:
1、由客戶端發送建立TCP連接的請求報文,其中報文中包含seq序列號,是由發送端隨機生成的,並且將報文中的SYN字段置爲1,表示需要建立TCP連接。(SYN=1,seq=x,x爲隨機生成數值)
2、由服務端回覆客戶端發送的TCP連接請求報文,其中包含seq序列號,是由回覆端隨機生成的,並且將SYN置爲1,而且會產生ACK字段,ACK字段數值是在客戶端發送過來的序列號seq的基礎上加1進行回覆,以便客戶端收到信息時,知曉自己的TCP建立請求已得到驗證。(SYN=1,ACK=x+1,seq=y,y爲隨機生成數值)這裏的ack加1可以理解爲是確認和誰建立連接。
3、客戶端收到服務端發送的TCP建立驗證請求後,會使自己的序列號加1表示,並且再次回覆ACK驗證請求,在服務端發過來的seq上加1進行回覆。(SYN=1,ACK=y+1,seq=x+1)
詳細解釋:
第一次握手:

客戶端發送一個TCP的SYN標誌位置1的包指明客戶打算連接的服務器的端口,以及初始序號X,保存在包頭的序列號(Sequence Number)字段裏
在這裏插入圖片描述第二次握手 :
服務器發回確認包(ACK)應答。即SYN標誌位和ACK標誌位均爲1同時,將確認序號(Acknowledgement Number)設置爲客戶的I S N加1以.即X+1。
在這裏插入圖片描述第三次握手:
客戶端再次發送確認包(ACK) SYN標誌位爲0,ACK標誌位爲1.並且把服務器發來ACK的序號字段+1,放在確定字段中發送給對方.並且在數據段放寫ISN的+1
在這裏插入圖片描述即SYN就是詢問: 你能聽得到嗎? ACK就是回到: 我能聽得到啊。

2、四次揮手

意義:當被動方收到主動方的FIN報文通知時,它僅僅表示主動方沒有數據再發送給被動方了。但未必被動方所有的數據都完整的發送給了主動方,所以被動方不會馬上關閉SOCKET,它可能還需要發送一些數據給主動方後,再發送FIN報文給主動方,告訴主動方同意關閉連接,所以這裏的ACK報文和FIN報文多數情況下都是分開發送的。
在這裏插入圖片描述原理:
1)第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。
2)第二次揮手:Server收到FIN後,發送一個ACK給Client,確認序號爲收到序號+1(與SYN相同,一個FIN佔用一個序號),Server進入CLOSE_WAIT狀態。
3)第三次揮手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態。
4)第四次揮手:Client收到FIN後,Client進入TIME_WAIT狀態,接着發送一個ACK給Server,確認序號爲收到序號+1,Server進入CLOSED狀態,完成四次揮手
通俗的說法
1)Client:我所有東西都說完了
2)Server:我已經全部聽到了,但是等等我,我還沒說完
3)Server:好了,我已經說完了
4)Client:好的,那我們的通信結束!

插播-----計算機網絡第五版中對於四次握手中2MSL的解釋:
爲什麼TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?

答:雖然按道理,四個報文都發送完畢,我們可以直接進入CLOSE狀態了,但是我們必須假象網絡是不可靠的,有可以最後一個ACK丟失。所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文。

在這裏插入圖片描述在這裏插入圖片描述

3、11種狀態

在這裏插入圖片描述1、一開始,建立連接之前服務器和客戶端的狀態都爲CLOSED;
2、服務器創建socket後開始監聽,變爲LISTEN狀態;
3、客戶端請求建立連接,向服務器發送SYN報文,客戶端的狀態變味SYN_SENT;
4、服務器收到客戶端的報文後向客戶端發送ACK和SYN報文,此時服務器的狀態變爲SYN_RCVD;
5、然後,客戶端收到ACK、SYN,就向服務器發送ACK,客戶端狀態變爲ESTABLISHED;
6、服務器端收到客戶端的ACK後變爲ESTABLISHED。此時3次握手完成,連接建立!

在這裏插入圖片描述由於TCP連接是全雙工的,斷開連接會比建立連接麻煩一點點。
1、客戶端先向服務器發送FIN報文,請求斷開連接,其狀態變爲FIN_WAIT1;
2、服務器收到FIN後向客戶端發送ACK,服務器的狀態圍邊CLOSE_WAIT;
3、客戶端收到ACK後就進入FIN_WAIT2狀態,此時連接已經斷開了一半了。如果服務器還有數據要發送給客戶端,就會繼續發送;
4、直到發完數據,就會發送FIN報文,此時服務器進入LAST_ACK狀態;
5、客戶端收到服務器的FIN後,馬上發送ACK給服務器,此時客戶端進入TIME_WAIT狀態;
6、再過了2MSL長的時間後進入CLOSED狀態。服務器收到客戶端的ACK就進入CLOSED狀態。
至此,還有一個狀態沒有出來:CLOSING狀態。
CLOSING狀態表示:
客戶端發送了FIN,但是沒有收到服務器的ACK,卻收到了服務器的FIN,這種情況發生在服務器發送的ACK丟包的時候,因爲網絡傳輸有時會有意外。

  • LISTEN:等待從任何遠端TCP 和端口的連接請求。 SYN_SENT:發送完一個連接請求後等待一個匹配的連接請求

  • SYN_RECEIVED:發送連接請求並且接收到匹配的連接請求以後等待連接請求確認。

  • ESTABLISHED:表示一個打開的連接,接收到的數據可以被投遞給用戶。連接的數據傳輸階段的正常狀態。

  • FIN_WAIT_1:等待遠端TCP 的連接終止請求,或者等待之前發送的連接終止請求的確認。

  • FIN_WAIT_2:等待遠端TCP的連接終止請求。

  • CLOSE_WAIT:等待本地用戶的連接終止請求。

  • CLOSING:等待遠端TCP 的連接終止請求確認。

  • LAST_ACK:等待先前發送給遠端TCP 的連接終止請求的確認(包括它字節的連接終止請求的確認)

  • TIME_WAIT:等待足夠的時間過去以確保遠端TCP 接收到它的連接終止請求的確認。 TIME_WAIT 兩個存在的理由:
    1.可靠的實現tcp全雙工連接的終止;
    2.允許老的重複分節在網絡中消逝。

  • CLOSED:不在連接狀態(這是爲方便描述假想的狀態,實際不存在)

一些問題:

爲什麼建鏈接要3次握手,斷鏈接需要4次揮手?

  • 對於建鏈接的3次握手:
    主要是要初始化Sequence Number 的初始值。通信的雙方要互相通知對方自己的初始化的Sequence Number這個要作爲以後的數據通信的序號,以保證應用層接收到的數據不會因爲網絡上的傳輸的問題而亂序(TCP會用這個序號來拼接數據)。
  • 對於4次揮手:
    因爲TCP是全雙工的,所以,發送方和接收方都需要Fin和Ack。
    只不過,有一方是被動的,所以看上去就成了所謂的4次揮手。如果兩邊同時斷連接,那就會就進入到CLOSING狀態,然後到達TIME_WAIT狀態。
  • 當Server端收到Client端的SYN連接請求報文後,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,“你發的FIN報文我收到了”。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。

TCP網絡編程中Listen的第二個參數有什麼意義?

它太大或者太小有什麼影響?

Listen函數原型

 int listen(int listenfd, int size);
  • Listenfd:指定監聽的文件描述符

  • size:指定內核維護的已完成三次握手的隊列的大小,實際維護的隊列的大小爲size+1。如果這個值太小,那麼服務器能維護的已完成三次握手的但是沒有accept的連接數就會很小,導致完成三次握手,等待服務器處理的客戶端數量很少。如果這個值很大,那麼就導致服務器這邊的內核資源浪費。但是如果開啓syncookies,則忽略第二個參數。size在linux中僅表示已完成三次握手的隊列長度,在內核2.6中是5~128,在unix網絡編程中這個size表示兩個隊列之和

  • accept: 從已完成三次握手的連接隊列裏獲取一個連接。

  • 客戶端在 connect 完成三次握手

不能兩次握手的原因
1、如果沒有最後一個ACK,服務器會不斷超時重傳 ACK/SYN
2、會浪費服務器的資源(SYN 溢出攻擊,因爲網絡環境的影響,客戶端的 SYN 會被重傳多次)

這主要是爲了防止已失效的請求連接報文忽然又傳送到了,從而產生錯誤。
假定A向B發送一個連接請求,由於一些原因,導致A發出的連接請求在一個網絡節點逗留了比較多的時間。此時A會將此連接請求作爲無效處理 又重新向B發起了一次新的連接請求,B正常收到此連接請求後建立了連接,數據傳輸完成後釋放了連接。如果此時A發出的第一次請求又到達了B,B會以爲A又發起了一次連接請求,如果是兩次握手:此時連接就建立了,B會一直等待A發送數據,從而白白浪費B的資源。 如果是三次握手:由於A沒有發起連接請求,也就不會理會B的連接響應,B沒有收到A的確認連接,就會關閉掉本次連接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章