1. 程式人生 > >圖解TCP/IP協議(六)傳輸層(TCP/UDP)、tcp三次握手和四次揮手

圖解TCP/IP協議(六)傳輸層(TCP/UDP)、tcp三次握手和四次揮手

傳輸層最常見的兩種傳輸協議,分別是TCP和UDP協議。

一、TCP協議

TCP 是面向有連線的流協議。流就是指不間斷的資料結構,可以把它想象成排水管道中的水流。TCP為提供可靠傳輸,實行“順序控制”或“重發控制”機制。

TCP/IP的眾多應用大多以客戶端/服務端的形式執行。作為服務端的程式需要提前啟動,準備接收客戶端的請求。下面是一個服務端接收處理一個HTTP請求的過程:

在這裡插入圖片描述

這些服務在UNIX系統中叫做守護程序。例如HTTP的服務端程式是httpd(HTTP的守護程序)。在UNIX中不需要將這些守護程序逐個啟動,而是啟動一個可以代表它們接收客戶端請求的inetd(網際網路守護程序)服務程式即可。它是一種超級守護程序。該超級守護程序收到客戶端請求以後會復刻(fork)新的程序並轉換(exec)為sshd等各個守護程序。

埠號:確認一個請求究竟發給的是哪個服務端(守護程序),可以通過所接收到資料包的目標埠號來識別,例如上圖,如果目標埠為22,則轉給sshd程序。

程序的埠號確定,有一些時標準規定的,例如:HTTP、TELNET、FTP所使用的埠號就是固定的。知名的程序埠一般被分配在0—1023之間。埠號大都分佈在1024—49151的數字之間。

TCP連線(三次握手)與關閉(四次揮手):在TCP傳輸資料之前,傳送端主機需要與目標主機之間建立連線;資料傳輸結束後,需要切斷連線。下圖為建立連線和切斷連線的流程。

前三個流程為三次握手,後四個流程為四次揮手。SYN(Synchronize sequence numbers)

在這裡插入圖片描述

為什麼TCP連線的時候需要三次握手,斷開連線的時候卻需要四次揮手?

因為在連線時接收端在接收到傳送端的SYN後,可以立即將ACK和SYN一起發給客戶端。但是切斷連線時,接收端在接收到FIN後,此時接收端可能還有未傳送完畢的資料,不能立即斷開連線,所以此時,只能先將ACK(針對FIN的應答)先發給傳送端,等到該處理的都處理完畢後,此時可以斷開連線了,再向傳送端傳送FIN請求斷開連線。

TCP資料傳輸需要克服的幾個問題:

TCP充分實現了資料傳輸時的各種控制功能,可以進行丟包時的重發控制,還可以對次序亂掉的分包進行順序控制。只有在確認通訊對端存在時,才會傳送資料,從而可以控制通訊流量的浪費。

TCP在實現上述功能時,必須要解決以下幾個問題:

  • 資料的破壞
  • 丟包
  • 重複傳送
  • 分片順序混亂

TCP傳輸中的序列號:在TCP中,當傳送端的資料到達接收主機時,接收端主機會返回一個已收到訊息的通知。這個訊息叫做認應答ACK(Positive Acknowledgement)。傳送端在傳送資料一段時間後沒有等到確認應答,傳送端就認為資料已經丟失,並進行重發。下面是幾種情況下的資料傳輸流程。

1、正常的資料包傳輸

在這裡插入圖片描述

2、資料包丟失的情況

在這裡插入圖片描述

3、資料包並未丟失,但是確認應答ACK丟失了,這種情況,也有可能是因為一些原因導致確認應答延遲到達,在源主機重發資料以後才到達的情況也屢見不鮮。此時,源主機只要重發資料即可,但是對於目標主機來說,反覆收到相同的資料簡直是一種災難。所以目標主機必須放棄已經重複的資料包。圖中資料包的序列號就是為了解決這些問題的。

在這裡插入圖片描述

相關概念

  • 序列號是按順序給傳送資料的每個位元組(8位位元組)都標上號碼的編號。
  • 序列號的初始值並非為0,而實在建立連線以後由隨機數生成。後面的則依次一位元組加一。
  • TCP的資料長度並未寫入TCP的首部,實際通訊中求得TCP包的長度的計算公式是:IP首部中的資料包長度減去IP首部的長度。
  • 重發超時的時間確定:tcp在每次發包時都會計算往返時間(RTT,Round Trip Time)及其偏差(RTT時間波動的值,方差,有時也叫抖動)。將這個往返時間和偏差相加,重發時間就是比這個總和要稍大一些。

TCP首部:

有關於首部中的校驗和介紹立即檢視

在這裡插入圖片描述

  • 源埠號:表示傳送端埠號,欄位長16位。
  • 目標埠號:表示接收端埠號,欄位長16位。
  • 序列號:是指傳送資料的位置,每傳送一次資料,就累加一次該資料位元組數的大小。初始值不是從0或1開始,是由計算機生成的一個隨機數。欄位長32位。
  • 確認應答號:是指下一次應該收到的資料的序列號。傳送端收到這個確認應答以後可以認為在這個序列號以前的資料已經被正常接收。
  • 資料偏移:該欄位表示TCP所傳輸的資料部分應該從TCP包的那個位開始計算,可以把它看作TCP首部的長度。欄位長4位。
  • 保留:為了以後擴充套件時使用,長度為4位。
  • 控制位:從左至右分別是,如下圖:
    在這裡插入圖片描述在這裡插入圖片描述
  • 校驗和:立即檢視
  • 緊急指標:只有在URG控制位為1時有效。該欄位的數值表示本報文中緊急資料的指標。緊急指標指出了緊急資料的末尾在報文段中的位置。緊急指標一般用於中斷通訊的情況。例如:在Web瀏覽器中點選停止按鈕、在使用telnet時輸入Ctrl+C時會有UGR為1的包。

接入乙太網的主機之間的通訊流程如下:

在這裡插入圖片描述

為了提高傳輸速度:TCP引入了視窗的概念。也就是一次傳送多個數據包,處理多個應答。
在這裡插入圖片描述

如果視窗中又部分資料丟失,也不會將整個視窗中的資料進行重發。視窗的告訴重發機制如下:在這裡插入圖片描述

二、UDP協議

UDP(User Datagram Protocol)是不具有可靠性的資料報協議,UDP可以確保傳送訊息的大小,卻不能保證訊息一定會送達。UDP不提供複雜的控制機制,利用IP提供面向無連線的通訊服務。UDP傳輸途中如果出現丟包,UDP也不負責重發。如果出現包到達順序亂掉時也沒有糾正的功能。關於包的細節控制,只能由應用程式來控制。

UDP是收到應用程式發來資料的那一刻,立即按照原樣傳送到網路上的一種機制。

UDP面向無連線,可以隨時傳送資料。再加上UDP本身的處理既簡單又高效,經常被用於一下幾個方面:

  • 視訊、音訊等多媒體通訊(即時通訊)
  • 廣播通訊(廣播、多播)

TCP雖然可靠,但是卻不一定處處優於UDP,UDP主要用於對高速傳輸和實時性要求較高的通訊或廣播。例如:打電話,即使缺少了一小部分的資料,也不會影響資訊的傳輸的。

UDP首部:

有關於首部中的校驗和介紹立即檢視
在這裡插入圖片描述

三、套接字Socket

應用中如果使用了TCP或者UDP時,會用到作業系統提供的類庫。兩者都會廣泛使用到套接字(socket)的API。套接字原本是由BSD UNIX開發的,後來又被移植到了Windows以及嵌入式作業系統中。應用在使用套接字時,可以設定對端的IP地址、埠號,實現資料的傳送與接收。

伺服器識別多個請求的例子:

在這裡插入圖片描述