天天看點

傳輸層協定----TCP(三次握手,四次揮手)和UDP

目錄

1. 端口号

2. UDP

3. TCP

4. TCP和UDP的差別

5. 粘包問題

傳輸層的作用是負責資料能從發送端傳輸接收端,即確定網絡資料傳輸的可靠性和安全性.下面我們先來簡單的了解一下端口号.

1. 端口号

1) 作用:

對應某台主機中的程序.

2) 認識預設端口号:

http伺服器80端口;ssh伺服器, 使用22端口;ftp伺服器, 使用21端口;telnet伺服器, 使用23端口;https伺服器, 使用443

3) 問題1: 一個程序是否可以綁定多個端口号?

答: 可以

    問題2: 一個端口号是否可以被多個程序綁定?

       答: 不可以

4) 補充五元組的概念

包括:源IP,源端口号,目的IP,目的端口号,協定号. (其中IP在網絡層,端口号在傳輸層,協定号在應用層).

作用:辨別一個通信.

以發送快遞為例:

傳輸層協定----TCP(三次握手,四次揮手)和UDP

2. UDP

1) UDP協定端格式

傳輸層協定----TCP(三次握手,四次揮手)和UDP

其中校驗和類似于檔案的md5,sha1校驗碼,也類似于java對象的hashcode.

2) 特點

  • ① 無連接配接,不可靠.
  • ② 面向資料報(隻能一次發送,一次接收;應用層交給UDP多長的封包,UDP原樣發送,既不會拆分,也不會合并)
  • ③ 有接收緩沖區,無發送緩沖區
  • ④ 大小受限 (不能超過64k)

3) 基于UDP的應用層協定:

DNS: 域名解析協定; NFS: 網絡檔案系統; TFTP: 簡單檔案傳輸協定; DHCP: 動态主機配置協定; BOOTP: 啟動協定(用于無盤裝置啟動)

4) 關于IO和緩沖區的大概介紹:(了解)

網絡程式設計(用戶端服務端網絡資料傳輸) 都是基于網絡IO的操作,往網卡上收發資料,緩沖區可以使用,也可以不使用.使用緩沖區就是多次發(write)到緩沖區,緩沖區真正的發到網絡(flush)

傳輸層協定----TCP(三次握手,四次揮手)和UDP

3. TCP

1) TCP協定段格式

傳輸層協定----TCP(三次握手,四次揮手)和UDP

ACK: 确認号是否有效

SYN: 請求建立連接配接; 我們把攜帶SYN辨別的稱為同步封包段

FIN: 通知對方, 本端要關閉了, 我們稱攜帶FIN辨別的為結束封包段

2) TCP的設計

TCP設計的時候,綜合了安全性和效率.

安全性和效率成反比. -----UDP的效率高于TCP

TCP的安全不是100%,隻是相對來說,能夠接受的安全程度.

3) TCP原理/機制

a) 确認應答機制 (安全機制)

傳輸層協定----TCP(三次握手,四次揮手)和UDP

對上圖的分析:

1~1000: 發送資料時編号,1~1000個位元組儲存在TCP 32位确認序号字段

下一個是1001: 應答的方式: 下一個是多少,接收到的資料序号的最大值+1;含義: 下一個多少,代表之前的資料都已經被接收到,儲存在TCP. ack标志位=1,32位确認序号 字段.

b) 逾時重傳機制(安全機制)

發送端發送的資料報超過一定時間間隔沒有收到确認應答的資料報,表示之前發送的資料包可能丢包,是以要重新發送.

丢包的情況: 發送的資料包資料丢失;确認應答的資料包丢失.

如何确認逾時時間? 系統動态的計算:初始預設逾時時間(500ms),每次重傳,逾時時間會在原有的上一個逾時時間基礎上*2. 重傳達到一定的次數後,認為無法正常發送資料,就關閉連接配接.

c) 連接配接管理機制(安全機制)

① 連接配接: 用戶端和服務端,每一端來說,保持一個本端到對端的連接配接狀态(有方向的)

    建立連接配接: 建立用戶端到服務端的連接配接,連接配接狀态儲存在用戶端.

    建立服務端到用戶端的連接配接,連接配接狀态儲存在服務端.

② 三次握手(建立連接配接流程):

傳輸層協定----TCP(三次握手,四次揮手)和UDP

I. 用戶端發送SYN資料報到服務端,申請建立用戶端到服務端的連接配接.

II. 服務端傳回SYN+ACK給用戶端

     ACK是對第一次SYN的應答

     SYN是申請建立連接配接服務端到用戶端的連接配接.

     用戶端收到該資料報,建立用戶端到服務端的連接配接

III. 用戶端傳回ACK給服務端

     ACK是對第二次SYN的應答

    服務端接收到該資料報,建立服務端到用戶端的連接配接.

③ 四次揮手流程(關閉連接配接)

傳輸層協定----TCP(三次握手,四次揮手)和UDP

I. 用戶端發送 fin 到服務端,申請關閉連接配接(用戶端到服務端的連接配接)

    服務端接收到該資料報,狀态置為CLOSE_WAIT

II. 服務端傳回 ACK給用戶端

    ack是對第一次fin的應答

    傳回ack,是作業系統實作tcp協定棧的時候實作的,預設的機制:系統自動傳回.

III. 服務端發送 fin 到用戶端,申請關閉連接配接(服務端到用戶端的連接配接)

    用戶端接收到該資料報,狀态置為TIME_WAIT

    程式手動調用close關閉連接配接,發送fin

IV. 用戶端傳回ACK給服務端

    ack是對第三次fin的應答

為什麼是四次握手? 能不能是三次?

答: 第二次是系統自動傳回,第三次是程式手動調用close關閉連接配接傳回

解釋為什麼不能合并?

答: tcp協定棧實作時,就不包含主動的發fin,交給程式自己實作,程式在關閉之前,可以完成一些前置工作,如釋放資源.

第二步,第三步,用戶端為什麼不能置為關閉狀态? 第三步,用戶端收到fin之後,為什麼還不能置為關閉狀态?

答: 第四步的ack也可能丢包,這種情況下,服務端會基于逾時重傳機制,重發fin,如果用戶端關閉連接配接,就沒法處理資料包了.

服務端出現大量的close_wait狀态,怎麼解決?

答: 服務端程式沒有正确調用close關閉連接配接.

傳輸層協定----TCP(三次握手,四次揮手)和UDP

d) 滑動視窗機制(效率)

① 背景: 網絡資料傳輸,如果使用串行的方式,發送端和接收端,都有發送/接收資料的操作,但是本身的執行時間是很快的,但是資料在網絡中傳輸時,可能比較慢. 串行: 類似代碼一行一行的執行. 為了解決這個問題,有了滑動視窗機制.

傳輸層協定----TCP(三次握手,四次揮手)和UDP

② 作用: 同時發送多個資料報,同時接收多個響應的ack,提高效率.

傳輸層協定----TCP(三次握手,四次揮手)和UDP

③ 視窗大小

    指的是無需等待确認應答而可以繼續發送資料的最大值. 上圖的視窗大小就是4000個位元組(四個段).

    如何确定視窗大小? =min(流量視窗大小,擁塞視窗大小)

④ 滑動: 發送以後沒有傳回ack的資料,都儲存在發送緩沖區,接收到下一個是多少的ack之後,可以計算出可以滑動的大小(下一個是多少減去視窗中的最小序号)

    這種機制被稱為 "高速重發控制"(也叫 "快重傳").

e) 流量控制機制(安全機制)

① 概念: 接收端處理資料的速度是有限的. 如果發送端發的太快, 導緻接收端的緩沖區被打滿, 這個時候如果發送端繼續發送, 就會造成丢包, 繼而引起丢包重傳等等一系列連鎖反應.是以TCP支援根據接收端的處理能力, 來決定發送端的發送速度. 這個機制就叫做流量控制.

tcp封包的視窗大小,儲存了接收端接收緩沖區的剩餘大小.

② 作用: 間接地控制發送端滑動視窗大小 (發送資料的大小)

f) 擁塞控制機制(安全機制)

雖然TCP有了滑動視窗這個大殺器, 能夠高效可靠的發送大量的資料. 但是如果在剛開始階段就發送大量的資料, 仍然可能引發問題. 因為網絡上有很多的計算機, 可能目前的網絡狀态就已經比較擁堵. 在不清楚目前網絡狀态下, 貿然發送大量的資料, 是很有可能引起雪上加霜的.

發送端在不了解網絡狀态的情況下, TCP引入 慢啟動 機制, 先發少量的資料, 探探路, 摸清目前的網絡擁堵狀态, 再決定按照多大的速度傳輸資料;

傳輸層協定----TCP(三次握手,四次揮手)和UDP

對上圖的分析:

慢啟動門檻值,擁塞視窗的大小從指數增長變為直線增長的門檻值.

網絡擁塞,發生大量的網絡丢包.

新的慢啟動門檻值就等于網絡擁塞時,擁塞視窗大小/2

g) 延時應答機制(效率)

馬上應答,傳回的流量視窗大小會比較小,接收端處理速度是比較快的,稍等一段時間,接收端消費一些接收緩沖區資料後,再傳回的流量視窗大小會更大.傳回發送端設定的滑動視窗大小就可能更大,網絡資料傳輸的吞吐量就更高.

h) 捎帶應答機制(效率)

概念: 不管哪一端,需要主動發送的資料報,可以和接收資料報後傳回的ack資料報,合并為一個.

類似于三次握手中,合并syn和ack的封包.

4) TCP小結

為什麼TCP這麼複雜? 因為要保證可靠性, 同時又盡可能的提高性能.

可靠性:

  • 校驗和
  • 序列号(按序到達)
  • 确認應答
  • 逾時重發
  • 連接配接管理
  • 流量控制
  • 擁塞控制

提高性能(效率):

  • 滑動視窗
  • 快速重傳
  • 延遲應答
  • 捎帶應答

其他:

  • 定時器(逾時重傳定時器, 保活定時器, TIME_WAIT定時器等)

4. TCP和UDP的差別

1) udp是無連接配接,不可靠的,效率更高;

    tcp是有連接配接的,可靠傳輸,效率相對udp更差;

2) udp是面向資料報 一次發一次收;

     tcp是面向位元組流 多次發,多次收;

3) udp是有接收緩沖區,無發送緩沖區;

    tcp既有接收緩沖區,也有發送緩沖區;

4) udp資料大小受限,tcp大小不限;

5) tcp提供了很多可靠傳輸的機制,如上面的介紹中所寫.

其他相同點: 基于UDP和tcp的程式,即可以發,也可以收,叫做全雙工.

5. 粘包問題

1) 産生的原因:

沒有明确資料包(應用層的包)的邊界.

2) 粘包的了解:

多個包之間互相粘連,導緻處理的資料有誤.

3) 解決:

表示應用層讀取多組資料時,一定要規定好一個業務的資料格式(應用層協定)

UDP不存在粘包問題.

4) 擴充問題

基于傳輸層UDP協定,如何傳輸超過64K的資料?

基于傳輸層UDP協定,如何保證可靠傳輸?

答: 在應用層實作類似于TCP所有可靠的傳輸的機制.

繼續閱讀