1. 程式人生 > >TCP協議特性--可靠

TCP協議特性--可靠

   我們之前簡單的講解了一下TCP的工作方式以及TCP和UDP之間的區別,今天我們再深入的講一下TCP。

  

TCP是傳輸層的協議,在到達這一層的時候TCP會給資料加上一個TCP的首部,TCP首部大小最小為20位元組,最長是60位元組。並且在TCP首部中沒有表示包長度的資料或者資料長度的欄位,一般來說都是在IP層獲知TCP的包長,然後由TCP包長來計算出當前傳輸的資料長度。

  最開始16位是源埠號也就是傳送資料的一方的埠號,之後的16位是目的埠,也就是接受資料的一方的埠號是多少。

  序列號也就是序號理解起來就是我們在TCP傳送資料的時候的編號,因為TCP有一個特點就是傳送資料是面向資料流的,他會對資料進行分割。所以這裡的序號就是給我們的資料包進行分包的,傳送資料的時候的序列號並不想我們平時那樣從0或者1開始而是在建立連結的時候會隨機生成一個,然後通過SYN包傳送給接受端主機,並且在進行建立連結或者斷開連線的時候也是會在數值的基礎上加1 的。確認應答號既可以告訴傳送端應該發哪個資料,也表示他之前的資料都正確接受到了,也就是假如我們傳送了七個包,然後接收端在確認應答號的位置給了我們一個5代表,1-4都正確收到了,5可能是丟失了,需要我們重新發送一下。

  因為我們之前說了,TCP包的長度最小20最大為60,這就代表著TCP包的長度是不確定的,所以就有了資料偏移,就是告訴我們現在TCP首部是多大,從哪開始是我們的TCP的資料。

  之後是保留部分,也就是現在還沒有用途是為了以後擴充套件使用的,一般來說都設定為0

  對於控制位

  

CWR和ECE變成1的時候是告訴對方這邊的網路有擁塞,URG為1時代表著這個資料包中有著緊急資料需要處理,ACK為1代表確認應答的部分資料有效,PSH為1時代表著把收到的資料馬上傳輸給上一層,當為0時會進行快取,RST代表著當前TCP中存在著異常, 必須馬上斷開,SYN用於建立連結SYN為1代表想要建立連結,並且在序列號階段進行序列號的設定。FIN為1代表之後不再有資料進行傳送,希望斷開連線。

  視窗大小佔用的位置為16位用來告訴從確認應答號開始的位置能夠接受的資料大小,TCP不允許傳送資料超過這個大小,但是當這裡的大小為0的時候,傳送端可以傳送視窗探測來了解最新的視窗大小。

  之後是校驗和。和UDP一樣,在計算校驗和的時候使用了TCP的偽首部,因為在傳輸過程中可能某個路由器發生了故障,資料就有可能被破壞,這樣校驗和就可以起到作用,來計算,資料是不是被破壞了。

  緊急指標就是我們上邊說到的URG為1的時候有效,這裡的數值表示的是緊急資料的指標,也就是從資料部分的首位到緊急指標所指示的位置為止為緊急資料。

  選項中是一些為了提高TCP傳輸效能的一些選項。

  我們在介紹TCP和UDP的時候進場會說TCP相比於UDP是可靠的,這裡IDE可靠到底可靠在哪裡呢?

  先說說TCP的確認應答機制,我們在打電話的時候通常也會這樣,假如你不停的在和對方說話,但是對方一直沒有反應,這時候你已經不能保證對方是不是在聽你說話了,並且是不是可能訊號斷了呢?這時候就需要再兩個人進行交流的時候,就需要給一定的回答,TCP的應答機制也是這樣,當我知道你說了啥的時候就說一個嗯,當我不知道你說啥都餓時候就返回一個疑問咦?這樣對方就知道了,你是收到了,還是沒收到,還是收到了不正確的。

當主機A和B傳送訊息的時候,A傳送完之後B就會返回一個確認應答,也就是修改我們上邊說的確認應答號。如果在一定時間裡邊,沒有收到B的確認應答就認為可能是傳送的資料包丟了,這時候既需要進行重新發送,所以這裡的可靠傳輸,並不是說我能保證你不丟,我能保證的是即使這次資料丟了我還能保證你最後能收到,我會繼續給你補發。這就和我們在淘寶買東西一樣,淘寶是可靠的,並不能說保證我發給你的貨你一定能收到,一定能收到是好的,即使你沒收到,或者你收到了不好的貨,我會給你退換或者重發,那這家店就是我們說的可靠的。

  但是沒有收到確認應答也並不代表著我們的資料包丟了,你想我傳送資料都可能丟了,你一個應答包我當然也可能會丟了,這時候傳送方並不知道那邊有沒有收到,他沒有收到確認應答就認為你沒收到,一段時間之後會再次進行傳送,這時候接收端接收到資料之後會再次將返回確認應答, 但是這段資料接收端已經擁有了,這時候會把收到的資料丟到。

  這種凡是對於傳送端來說,我無非就是多操作了幾下傳送,但是對於網路資源來說是浪費的,並且接收端會不斷的接受很多重複的資料,這時候就需要引入一個新的機制。

  這就是重發超時,重發超時就是說,在重新發送資料之前,等待確認應答到來的那個特定時間間隔,如果超過了這個時間仍然沒有收到我們的確認應答,這時候再進行資料重發,但是這個時間間隔應該設定多少呢?設定太短還是會有很多重複的資料進行傳送,設定太長如果資料包真的丟失了需要好久才能再次收到。並且這種時間會隨著網路環境來變化的,如果說當前網路十分擁堵時間就要變長,TCP要求的是無論在什麼網路環境下都要提供高效能的通訊。所以他每次發包的時候都會計算往返的時間以及偏差,就把這個往返時間和偏差相加成為我們的重發超時間,一般來說第一個資料包還不知道往返時間會設定為6秒左右,如果說資料重發了,但是還是沒有收到確認應答, 這時候會再次進行傳送,但是這時候的確認應答時間會以2倍,4倍的指數函式延長。並且資料也是不會無限的傳送的,假如說現在重發達到了一定次數之後,如果仍然沒有確認應答,就判斷是不是網路或者主機端發生了異常,然後強制斷開TCP連線。

  

   這是TCP協議連結裡邊可靠。