TCP鏈接的創建與終止

咱們經過一個例子來講說TCP鏈接的創建與斷開:服務器

       在這個例子中,客戶端發起鏈接,發送請求,服務端響應請求,而後客戶端主動關閉鏈接。ide

wKiom1c5yNShcxizAAB3OS4j73U590.png

創建鏈接的過程:spa

       1.客戶端發出段1,SYN表示鏈接請求,如圖中所示,序號是1000,每發送一個數據字節,這個序號就要加1,這樣在接收端能夠根據序號排出數據包的正確順序,也能夠發現丟包的狀況,SYN和FIN位也要佔一個序號,從第一段能夠看出,此次發送的數據是0(即沒有發送數據),可是因爲SYN要佔一位,所以下次發送數據要從1001開始。mss表示最大段尺寸,若是一個段太大,封裝成幀後,超過了鏈路層的最大幀長度,就要在IP層分片,因此客戶端要聲明本身的最大段尺寸,建議服務器發過來的段不要超過這個長度;3d

       2.服務器發出段2,也帶有SYN位,同時置ACK位表示確認,確認序號1001,表示確認1000及之前的段都正確接收,也就是答應了客戶端的鏈接請求,同時也給客戶端發送一個鏈接請求,也聲明瞭本身的最大段尺寸。blog

       3.客戶端發出段3,對服務器的鏈接請求進行應答,確認序號是8001(8000+SYN);進程

       以上就是鏈接創建的過程,咱們能夠看到在鏈接創建的過程當中,一共有3個段,稱爲「三次握手」。在創建鏈接的同時,雙方協商了諸如雙方發送序號的初始值,最大段尺寸等一些信息。get

       若是一方收到對方發來的段中的端口號發現本機並無任何進程使用這個端口號,就會發送一個包含RST的段給另外一方。it

接下來咱們再來看數據傳輸的過程:io

       以上圖中的數據爲例,咱們來分析:class

       1.客戶端發出段4,發送的數據是20字節,發送序號從1001開始;

       2.服務器發出段5,確認序號是1021(1001+20),同時請求發送從序號1021開始的數據,服務器在應答的同時也發送了從8001開始的10字節數據;

       3.客戶端發出段6,確認對端發來的從8001開始的10字節數據已收到,請求發送從8011開始的數據

       在這裏咱們要注意,在數據傳輸過程當中,ACK和確認序號是很是重要的,應用層交給TCP協議的數據會暫存在TCP層的發送緩衝區中,在發出數據包以後,只有收到了對方的ACK確認應答,才知道該數據已到達對端,能夠從發送緩衝區釋放掉了,若是由於某些故障丟掉了數據報或者對方發回的ACK段沒收到,通過等待超時後,TCP協議自動將發送緩衝區中的數據包重發。


關閉鏈接的過程:

       1.客戶端發出段7,FIN位表示關閉鏈接的請求;

       2.服務器發出段8,應答客戶端的關閉鏈接的請求;

       3.服務器發出段9,同時也向客戶端發出關閉鏈接請求;

       4.客戶端發出段10,應答服務器的關閉鏈接的請求;

      

       從上面能夠看到,關閉鏈接須要4段,服務器的應答和關閉鏈接請求不在一個段上,這樣作的目的是有鏈接半關閉的狀況,什麼意思呢?就是在這種狀況下,客戶端就不能再向服務端發送數據包了,服務器還能夠發送數據包給客戶端,直到服務器也關閉鏈接爲止。

       咱們以上的例子只描述了最簡單的一問一答時的狀況,實際的TCP數據傳輸過程能夠收發不少數據段,事實上,TCP協議爲應用層提供了全雙工的服務,雙方均可以主動或者同時給對端發送數據包。

相關文章
相關標籤/搜索