佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > tcp、udp、ip協(xié)議分析_動力節(jié)點Java學院整理

tcp、udp、ip協(xié)議分析_動力節(jié)點Java學院整理

熱門標簽:呼叫中心市場需求 銀行業(yè)務 美圖手機 網站文章發(fā)布 服務器配置 智能手機 檢查注冊表項 鐵路電話系統(tǒng)

互連網早期的時候,主機間的互連使用的是NCP協(xié)議。這種協(xié)議本身有很多缺陷,如:不能互連不同的主機,不能互連不同的操作系統(tǒng),沒有糾錯功能。為了改善這種缺點,大牛弄出了TCP/IP協(xié)議?,F在幾乎所有的操作系統(tǒng)都實現了TCP/IP協(xié)議棧。

TCP/IP協(xié)議棧主要分為四層:應用層、傳輸層、網絡層、數據鏈路層,每層都有相應的協(xié)議,如下圖


所謂的協(xié)議就是雙方進行數據傳輸的一種格式。整個網絡中使用的協(xié)議有很多,所幸的是每一種協(xié)議都有RFC文檔。在這里只對IP、TCP、UDP協(xié)議頭做一個分析。

首先來看看在網絡中,一幀以太網數據包的格式:


在Linux 操作系統(tǒng)中,當我們想發(fā)送數據的時候,我們只需要在上層準備好數據,然后提交給內核協(xié)議棧 , 內核協(xié)議棧自動添加相應的協(xié)議頭。下面我們來看看,每一層添加的協(xié)議頭具體內容。

一. TCP協(xié)議

TCP協(xié)議是面向連接、保證高可靠性(數據無丟失、數據無失序、數據無錯誤、數據無重復到達)傳輸層協(xié)議。

1.TCP頭分析

先來分析一下TCP頭的格式以及每一個字段的含義:


(1)端口號[16bit]

我們知道,網絡實現的是不同主機的進程間通信。在一個操作系統(tǒng)中,有很多進程,當數據到來時要提交給哪個進程進行處理呢?這就需要用到端口號。在TCP頭中,有源端口號(Source Port)和目標端口號(Destination Port)。源端口號標識了發(fā)送主機的進程,目標端口號標識接受方主機的進程。

(2)序號[32bit]

序號分為發(fā)送序號(Sequence Number)和確認序號(Acknowledgment Number)。

發(fā)送序號:用來標識從 TCP源端向 TCP目的端發(fā)送的數據字節(jié)流,它表示在這個報文段中的第一個數據字節(jié)的順序號。如果將字節(jié)流看作在兩個應用程序間的單向流動,則 TCP用順序號對每個字節(jié)進行計數。序號是 32bit的無符號數,序號到達 2  32- 1后又從 0開始。當建立一個新的連接時, SYN標志變 1,順序號字段包含由這個主機選擇的該連接的初始順序號 ISN( Initial Sequence Number)。

確認序號:包含發(fā)送確認的一端所期望收到的下一個順序號。因此,確認序號應當是上次已成功收到數據字節(jié)順序號加 1。只有 ACK標志為 1時確認序號字段才有效。 TCP為應用層提供全雙工服務,這意味數據能在兩個方向上獨立地進行傳輸。因此,連接的每一端必須保持每個方向上的傳輸數據順序號。

(3)偏移[4bit]

這里的偏移實際指的是TCP首部的長度,它用來表明TCP首部中32 bit字的數目,通過它可以知道一個TCP包它的用戶數據是從哪里開始的。這個字段占4bit,如4bit的值是0101,則說明TCP首部長度是5 * 4 = 20字節(jié)。 所以TCP的首部長度最大為15 * 4 = 60字節(jié)。然而沒有可選字段,正常長度為20字節(jié)。

(4)Reserved [6bit]

目前沒有使用,它的值都為0

(5)標志[6bit]

在TCP首部中有6個標志比特。他們中的多個可同時被置為1 。

URG         緊急指針(urgent pointer)有效

ACK          確認序號有效

PSH          指示接收方應該盡快將這個報文段交給應用層而不用等待緩沖區(qū)裝滿
RST           一般表示斷開一個連接

例如:一個TCP的客戶端向一個沒有監(jiān)聽的端口的服務器端發(fā)起連接,wirshark抓包如下


可以看到host:192.168.63.134向host:192.168.63.132發(fā)起連接請求,但是host:192.168.63.132并沒有處于監(jiān)聽對應端口的服務器端,這時

host : 192.168.63.132發(fā)一個RST置位的TCP包斷開連接。

SYN          同步序號用來發(fā)起一個連接

FIN            發(fā)送端完成發(fā)送任務(即斷開連接)

(6)窗口大小(window)[16bit]

窗口的大小,表示源方法最多能接受的字節(jié)數。。

(7)校驗和[16bit]

校驗和覆蓋了整個的TCP報文段:TCP首部和TCP數據。這是一個強制性的字段,一定是由發(fā)端計算和存儲,并由收端進行驗證。

(8)緊急指針[16bit]

只有當URG標志置為1時緊急指針才有效。緊急指針是一個正的偏移量,和序號字段中的值相加表示緊急數據最后一個字節(jié)的序號。TCP的緊急方式是發(fā)送端向另一端發(fā)送緊急數據的一種方式。

(9)TCP選項

是可選的,在后面抓包的時候,我們在看看它

2.重點詳解

(1)三次握手建立連接

a.請求端(通常稱為客戶)發(fā)送一個SYN段指明客戶打算連接的服務器的端口,以及初始序號(ISN,在這個例子中為1415531521)。這個SYN段為報文段1。
b.服務器發(fā)回包含服務器的初始序號的SYN報文段(報文段2)作為應答。同時,將確認序號設置為客戶的ISN加1以對客戶的SYN報文段進行確認。一個SYN將占用一個序號
c.客戶必須將確認序號設置為服務器的ISN加1以對服務器的SYN報文段進行確認(報文段3)
這三個報文段完成連接的建立。這個過程也稱為三次握手(three-way handshake)


用wirshark抓包如下:


可以看到三次握手確定了雙方間包的序號、最大接受數據的大小(window)以及MSS(Maximum Segment Size)。
MSS = MTU - IP頭 - TCP頭,MTU表示最大傳輸單元,我們在IP頭分析的時候會講到,它一般為1500個字節(jié)。IP頭和TCP 頭部帶可選選項的時候都是20個字節(jié)。這樣的話MSS=1500 - 20 -20 = 1460。

MSS限制了TCP包攜帶數據的大小,它的意思就是當應用層向傳輸層提交數據通過TCP協(xié)議進行傳輸時,如果應用層的數據>MSS就必須分段,分成多個段,逐個的發(fā)過去。

例如:應用層一次性向傳輸層提交4096個字節(jié)數據,這個時候通過wirshark抓包效果如下:


前三次是三次握手的過程,后面三次是傳送數據的過程,由于數據大小是4096個字節(jié),所以用了三次進行傳遞(1448 + 1448 + 1200)。細心的人會問為什么每次傳送的最大數據大小不是1460個字節(jié)呢?因為這里的TCP攜帶可選項,TCP頭長度 = 20 + 12(可選選項大小) = 32字節(jié)。 這樣能傳輸的最大數據為:1500 - 20 - 32 = 1448個字節(jié)。

(2)四次揮手斷開連接

a.現在的網絡通信都是基于socket實現的,當客戶端將自己的socket進行關閉時,內核協(xié)議棧會向服務器自動發(fā)送一個FIN置位的包,請求斷開連接。我們稱首先發(fā)起斷開請求的一方稱為主動斷開方。
b.服務器端收到請客端的FIN斷開請求后,內核協(xié)議棧會立即發(fā)送一個ACK包作為應答,表示已經收到客戶端的請求
c.服務器運行一段時間后,關閉了自己的socket。這個時候內核協(xié)議棧會向客戶端發(fā)送一個FIN置位的包,請求斷開連接
d.客戶端收到服務端發(fā)來的FIN斷開請求后,會發(fā)送一個ACK做出應答,表示已經收到服務端的請求


用wirshar抓包分析如下:


(3)TCP可靠性的保證

TCP采用一種名為“帶重傳功能的肯定確認(positive acknowledge with retransmission)”的技術作為提供可靠數據傳輸服務的基礎。這項技術要求接收方收到數據之后向源站回送確認信息ACK。發(fā)送方對發(fā)出的每個分組都保存一份記錄,在發(fā)送下一個分組之前等待確認信息。發(fā)送方還在送出分組的同時啟動一個定時器,并在定時器的定時期滿而確認信息還沒有到達的情況下,重發(fā)剛才發(fā)出的分組。圖3-5表示帶重傳功能的肯定確認協(xié)議傳輸數據的情況,圖3-6表示分組丟失引起超時和重傳。為了避免由于網絡延遲引起遲到的確認和重復的確認,協(xié)議規(guī)定在確認信息中稍帶一個分組的序號,使接收方能正確將分組與確認關聯起來。

從圖 3-5可以看出,雖然網絡具有同時進行雙向通信的能力,但由于在接到前一個分組的確認信息之前必須推遲下一個分組的發(fā)送,簡單的肯定確認協(xié)議浪費了大量寶貴的網絡帶寬。為此, TCP使用滑動窗口的機制來提高網絡吞吐量,同時解決端到端的流量控制。



(4)滑動窗口技術

滑動窗口技術是簡單的帶重傳的肯定確認機制的一個更復雜的變形,它允許發(fā)送方在等待一個確認信息之前可以發(fā)送多個分組。如圖 3-7所示,發(fā)送方要發(fā)送一個分組序列,滑動窗口協(xié)議在分組序列中放置一個固定長度的窗口,然后將窗口內的所有分組都發(fā)送出去;當發(fā)送方收到對窗口內第一個分組的確認信息時,它可以向后滑動并發(fā)送下一個分組;隨著確認的不斷到達,窗口也在不斷的向后滑動。



二、UDP協(xié)議

UDP協(xié)議也是傳輸層協(xié)議,它是無連接,不保證可靠的傳輸層協(xié)議。它的協(xié)議頭比較簡單,如下:



這里的端口號就不解釋了,和TCP的端口號是一樣的含義。

Length占用2個字節(jié),標識UDP頭的長度。Checksum : 校驗和,包含UDP頭和數據部分。

三、IP協(xié)議

I P是T C P / I P協(xié)議族中最為核心的協(xié)議。所有的T C P、U D P、I C M P及I G M P數據都以I P數據報格式傳輸。它的特點如下:
不可靠(u n r e l i a b l e)的意思是它不能保證 I P數據報能成功地到達目的地。 I P僅提供最好的傳輸服務。如果發(fā)生某種錯誤時,如某個路由器暫時用完了緩沖區(qū), I P有一個簡單的錯誤處理算法:丟棄該數據報,然后發(fā)送 I C M P消息報給信源端。任何要求的可靠性必須由上層來提供(如T C P) 。

無連接(c o n n e c t i o n l e s s)這個術語的意思是I P并不維護任何關于后續(xù)數據報的狀態(tài)信息。每個數據報的處理是相互獨立的。這也說明, I P數據報可以不按發(fā)送順序接收。如果一信源向相同的信宿發(fā)送兩個連續(xù)的數據報(先是 A,然后是B) ,每個數據報都是獨立地進行路由選擇,可能選擇不同的路線,因此B可能在A到達之前先到達。

1.IP 頭格式


(1)版本 占4位,指IP協(xié)議的版本。通信雙方使用的IP協(xié)議版本必須一致。目前廣泛使用的IP協(xié)議版本號為4(即IPv4)。關于IPv6,目前還處于草案階段。 

(2)首部長度 占4位,可表示的最大十進制數值是15。請注意,這個字段所表示數的單位是32位字長(1個32位字長是4字節(jié)),因此,當IP的首部長度為1111時(即十進制的15),首部長度就達到60字節(jié)。當IP分組的首部長度不是4字節(jié)的整數倍時,必須利用最后的填充字段加以填充。因此數據部分永遠在4字節(jié)的整數倍開始,這樣在實現IP協(xié)議時較為方便。首部長度限制為60字節(jié)的缺點是有時可能不夠用。但這樣做是希望用戶盡量減少開銷。最常用的首部長度就是20字節(jié)(即首部長度為0101),這時不使用任何選項。 

(3)區(qū)分服務 占8位,用來獲得更好的服務。這個字段在舊標準中叫做服務類型,但實際上一直沒有被使用過。1998年IETF把這個字段改名為區(qū)分服務DS(Differentiated Services)。只有在使用區(qū)分服務時,這個字段才起作用。 

(4)總長度 總長度指首部和數據之和的長度,單位為字節(jié)??傞L度字段為16位,因此數據報的最大長度為216-1=65535字節(jié)。 

在IP層下面的每一種數據鏈路層都有自己的幀格式,其中包括幀格式中的數據字段的最大長度,這稱為最大傳送單元MTU(Maximum Transfer Unit)。當一個數據報封裝成鏈路層的幀時,此數據報的總長度(即首部加上數據部分)一定不能超過下面的數據鏈路層的MTU值。 

(5)標識(identification) 占16位。IP軟件在存儲器中維持一個計數器,每產生一個數據報,計數器就加1,并將此值賦給標識字段。但這個“標識”并不是序號,因為IP是無連接服務,數據報不存在按序接收的問題。當數據報由于長度超過網絡的MTU而必須分片時,這個標識字段的值就被復制到所有的數據報的標識字段中。相同的標識字段的值使分片后的各數據報片最后能正確地重裝成為原來的數據報。 

(6)標志(flag) 占3位,但目前只有2位有意義。 

● 標志字段中的最低位記為MF(More Fragment)。MF=1即表示后面“還有分片”的數據報。MF=0表示這已是若干數據報片中的最后一個 

● 標志字段中間的一位記為DF(Don't Fragment),意思是“不能分片”。只有當DF=0時才允許分片。 

(7)片偏移 占13位。片偏移指出:較長的分組在分片后,某片在原分組中的相對位置。也就是說,相對用戶數據字段的起點,該片從何處開始。片偏移以8個字節(jié)為偏移單位。這就是說,每個分片的長度一定是8字節(jié)(64位)的整數倍。 

(8)生存時間 占8位,生存時間字段常用的的英文縮寫是TTL(Time To Live),表明是數據報在網絡中的壽命。由發(fā)出數據報的源點設置這個字段。其目的是防止無法交付的數據報無限制地在因特網中兜圈子,因而白白消耗網絡資源。最初的設計是以秒作為TTL的單位。每經過一個路由器時,就把TTL減去數據報在路由器消耗掉的一段時間。若數據報在路由器消耗的時間小于1秒,就把TTL值減1。當TTL值為0時,就丟棄這個數據報。 

(9)協(xié)議 占8位,協(xié)議字段指出此數據報攜帶的數據是使用何種協(xié)議,以便使目的主機的IP層知道應將數據部分上交給哪個處理過程。 

(10)首部檢驗和 占16位。這個字段只檢驗數據報的首部,但不包括數據部分。這是因為數據報每經過一個路由器,路由器都要重新計算一下首部檢驗和(一些字段,如生存時間、標志、片偏移等都可能發(fā)生變化)。不檢驗數據部分可減少計算的工作量。 

(11)源IP地址 占32位。 

(12)目的IP地址 占32位。

2.分片解釋

分片指的是需要傳送的數據大于最大傳輸單元(MTU)的時候,就需要分成多個包,然后一個個發(fā)送給對方。我們在說TCP的時候,說到MSS很多人不能區(qū)分它們。通過下面的圖,我想就可以完全區(qū)分它們了。

個人覺的如果通過TCP協(xié)議傳輸數據,到IP層的時候,可定不需要分片了。只有在通過UDP協(xié)議傳送大數據的時候,需要分片。
例如:用UDP協(xié)議傳送10240個字節(jié)數據


可以看到,但數據提交到網絡層的時候,由于數據超過了最大傳輸單元,就分片了。分成多個包通過IP協(xié)議發(fā)送個對方。每個數據包最大的字節(jié)為MTU - IP頭 = 1500 - 20 = 1480。

四 、以太網頭


三部分組成 :源MAC Address | 目的 MAC Address | 所使用的協(xié)議.

所以在以太網中,數據包的格式有一下幾種:


ARP協(xié)議是通過IP地址獲得對應的MAC地址,稱為地址解析協(xié)議

RARP協(xié)議是通過MAC地址來獲得對應的IP地址,稱為逆向地址解析協(xié)議

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • 詳解Java的TCP/IP編程學習--基于定界符的成幀
  • Java基于Tcp/ip連接的多人交互聊天室
  • java實現微信App支付服務端
  • Java基于socket實現的客戶端和服務端通信功能完整實例
  • 微信小程序調用微信登陸獲取openid及java做為服務端示例
  • Java編程Socket實現多個客戶端連接同一個服務端代碼
  • java服務端微信APP支付接口詳解
  • Java實現TCP/IP協(xié)議的收發(fā)數據(服務端)代碼實例

標簽:樂山 長治 滄州 河南 新疆 上海 沈陽 紅河

巨人網絡通訊聲明:本文標題《tcp、udp、ip協(xié)議分析_動力節(jié)點Java學院整理》,本文關鍵詞  ;如發(fā)現本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    响水县| 无锡市| 温宿县| 丽水市| 连城县| 裕民县| 威海市| 长治县| 临夏县| 浦东新区| 东安县| 柏乡县| 会东县| 彰化县| 桐庐县| 清丰县| 仙居县| 仪陇县| 襄汾县| 遂川县| 江都市| 浦东新区| 长垣县| 宁远县| 萍乡市| 津南区| 米林县| 屏山县| 湖南省| 伊金霍洛旗| 吐鲁番市| 安溪县| 阜康市| 沂源县| 特克斯县| 嵊州市| 万源市| 雅江县| 和平区| 昔阳县| 阳泉市|