抓包網址:www.cnblogs.com/緩存
本機ip地址172.31.120.93網絡
目的ip地址 101.37.225.65tcp
1、分析傳輸層協議(TCP、UDP)的報文格式,TCP協議的鏈接管理大數據
1.1 TCP報文格式編碼
一、端口號:用來標識同一臺計算機的不一樣的應用進程。spa
1)源端口:源端口和IP地址的做用是標識報文的返回地址。計算機網絡
2)目的端口:端口指明接收方計算機上的應用程序接口。3d
TCP報頭中的源端口號和目的端口號同IP數據報中的源IP與目的IP惟一肯定一條TCP鏈接。指針
二、序號和確認號:是TCP可靠傳輸的關鍵部分。序號是本報文段發送的數據組的第一個字節的序號。在TCP傳送的流中,每個字節一個序號。e.g.一個報文段的序號爲300,此報文段數據部分共有100字節,則下一個報文段的序號爲400。因此序號確保了TCP傳輸的有序性。確認號,即ACK,指明下一個期待收到的字節序號,代表該序號以前的全部數據已經正確無誤的收到。確認號只有當ACK標誌爲1時纔有效。好比創建鏈接時,SYN報文的ACK標誌位爲0。blog
三、數據偏移/首部長度:4bits。因爲首部可能含有可選項內容,所以TCP報頭的長度是不肯定的,報頭不包含任何任選字段則長度爲20字節,4位首部長度字段所能表示的最大值爲1111,轉化爲10進製爲15,15*32/8 = 60,故報頭最大長度爲60字節。首部長度也叫數據偏移,是由於首部長度實際上指示了數據區在報文段中的起始偏移值。
四、保留:爲未來定義新的用途保留,如今通常置0。
五、控制位:URG ACK PSH RST SYN FIN,共6個,每個標誌位表示一個控制功能。
1)URG:緊急指針標誌,爲1時表示緊急指針有效,爲0則忽略緊急指針。
2)ACK:確認序號標誌,爲1時表示確認號有效,爲0表示報文中不含確認信息,忽略確認號字段。
3)PSH:push標誌,爲1表示是帶有push標誌的數據,指示接收方在接收到該報文段之後,應儘快將這個報文段交給應用程序,而不是在緩衝區排隊。
4)RST:重置鏈接標誌,用於重置因爲主機崩潰或其餘緣由而出現錯誤的鏈接。或者用於拒絕非法的報文段和拒絕鏈接請求。
5)SYN:同步序號,用於創建鏈接過程,在鏈接請求中,SYN=1和ACK=0表示該數據段沒有使用捎帶的確認域,而鏈接應答捎帶一個確認,即SYN=1和ACK=1。
6)FIN:finish標誌,用於釋放鏈接,爲1時表示發送方已經沒有數據發送了,即關閉本方數據流。
六、窗口:滑動窗口大小,用來告知發送端接受端的緩存大小,以此控制發送端發送數據的速率,從而達到流量控制。窗口大小時一個16bit字段,於是窗口大小最大爲65535。
七、校驗和:奇偶校驗,此校驗和是對整個的 TCP 報文段,包括 TCP 頭部和 TCP 數據,以 16 位字進行計算所得。由發送端計算和存儲,並由接收端進行驗證。
八、緊急指針:只有當 URG 標誌置 1 時緊急指針纔有效。緊急指針是一個正的偏移量,和順序號字段中的值相加表示緊急數據最後一個字節的序號。 TCP 的緊急方式是發送端向另外一端發送緊急數據的一種方式。
九、選項和填充:最多見的可選字段是最長報文大小,又稱爲MSS(Maximum Segment Size),每一個鏈接方一般都在通訊的第一個報文段(爲創建鏈接而設置SYN標誌爲1的那個段)中指明這個選項,它表示本端所能接受的最大報文段的長度。選項長度不必定是32位的整數倍,因此要加填充位,即在這個字段中加入額外的零,以保證TCP頭是32的整數倍。
十、數據部分: TCP 報文段中的數據部分是可選的。在一個鏈接創建和一個鏈接終止時,雙方交換的報文段僅有 TCP 首部。若是一方沒有數據要發送,也使用沒有任何數據的首部來確認收到的數據。在處理超時的許多狀況中,也會發送不帶任何數據的報文段。
附:tcp抓包圖
1.2 UDP報文格式
●源、目標端口號字段:佔16比特。做用與TCP數據段中的端口號字段相同,用來標識源端和目標端的應用進程。
●長度字段:佔16比特。標明UDP頭部和UDP數據的總長度字節。
●校驗和字段:佔16比特。用來對UDP頭部和UDP數據進行校驗。和TCP不一樣的是,對UDP來講,此字段是可選項,而TCP數據段中的校驗和字段是必須有的。
附:udp抓包圖
1.3 TCP協議的鏈接管理
TCP三次握手/創建鏈接
步驟1 A的TCP向B發出鏈接請求報文段,其首部中的同步位SYN=1,並選擇序號seq=x,代表第一次傳送數據時的第一個數據字節的序號是x。
步驟2 B的TCP收到鏈接請求報文段,如贊成,則發回確認。ACK=1,其確認號ack=x+1。同時B向A發起鏈接請求,應使SYN=1,本身選擇的序號seq=y。
步驟3 A收到此報文段後向B給出確認,其ACK=1,確認號ack=y+1。A的TCP通知上層應用進程,鏈接已經創建。
下面是抓包三次握手示意圖
第一條TCP報文: 其中將seq設置爲0 , SYN = 1 , ack = 0;
第二條TCP報文: 其中ack = 1(第一條報文中的seq+1) , SYN = 1 , 再將seq設置爲1;
第三條TCP報文: ack = 1第二條報文中seq+1) ; seq =1(第一條報文中seq+1) ; SYN=0
2、分析網絡層協議的報文格式(IP、ICMP)的報文格式。
2.1 IP報文格式
版本:IP協議的版本,目前的IP協議版本號爲4,下一代IP協議版本號爲6。
首部長度:IP報頭的長度。固定部分的長度(20字節)和可變部分的長度之和。共佔4位。最大爲1111,即10進制的15,表明IP報頭的最大長度能夠爲15個32bits(4字節),也就是最長可爲15*4=60字節,除去固定部分的長度20字節,可變部分的長度最大爲40字節。
服務類型:Type Of Service。
總長度:IP報文的總長度。報頭的長度和數據部分的長度之和。
標識:惟一的標識主機發送的每一分數據報。一般每發送一個報文,它的值加一。當IP報文長度超過傳輸網絡的MTU(最大傳輸單元)時必須分片,這個標識字段的值被複制到全部數據分片的標識字段中,使得這些分片在達到最終目的地時能夠依照標識字段的內容從新組成原先的數據。
標誌:共3位。R、DF、MF三位。目前只有後兩位有效,DF位:爲1表示不分片,爲0表示分片。MF:爲1表示「更多的片」,爲0表示這是最後一片。
片位移:本分片在原先數據報文中相對首位的偏移位。(須要再乘以8)
生存時間:IP報文所容許經過的路由器的最大數量。每通過一個路由器,TTL減1,當爲0時,路由器將該數據報丟棄。TTL 字段是由發送端初始設置一個 8 bit字段.推薦的初始值由分配數字 RFC 指定,當前值爲 64。發送 ICMP 回顯應答時常常把 TTL 設爲最大值 255。
協議:指出IP報文攜帶的數據使用的是那種協議,以便目的主機的IP層能知道要將數據報上交到哪一個進程(不一樣的協議有專門不一樣的進程處理)。和端口號相似,此處採用協議號,TCP的協議號爲6,UDP的協議號爲17。ICMP的協議號爲1,IGMP的協議號爲2.
首部校驗和:計算IP頭部的校驗和,檢查IP報頭的完整性。
源IP地址:標識IP數據報的源端設備。
目的IP地址:標識IP數據報的目的地址。
附:抓包圖
2.2 ICMP的報文格式
各字段說明
1. 類型:佔8位
2. 代碼:佔8位
3. 檢驗和:佔16位
說明:ICMP全部報文的前4個字節都是同樣的,可是剩下的其餘字節則互不相同。
4.標識:佔2字節,用於標識本ICMP進程,但僅適用於回顯請求和應答ICMP報文,對於目標不可達ICMP報文和超時ICMP報文等,該字段的值爲0。
5.其它字段都ICMP報文類型不一樣而不一樣。
1> ICMP報文的前4個字節是統一的格式,共有三個字段:即類型,代碼和檢驗和。
2> 8位類型和8位代碼字段一塊兒決定了ICMP報文的類型。
類型8,代碼0:表示回顯請求(ping請求)。
類型0,代碼0:表示回顯應答(ping應答)
類型11,代碼0:超時
3>16位的檢驗和字段:包括數據在內的整個ICMP數據包的檢驗和;其計算方法和IP頭部檢驗和的計算方法同樣的。
ICMP報文具體分爲查詢報文和差錯報文(對ICMP差錯報文有時須要作特殊處理,所以要對其進行區分。如:對ICMP差錯報文進行響應時,永遠不會生成另外一份ICMP差錯報文,不然會出現死循環)
附:Icmp抓包圖
3、分析數據鏈路層的幀格式
數據鏈路層實現的三大功能分別爲:
(1) 封裝成幀
(2) 透明傳輸
(3) 差錯控制
一、封裝成幀
封裝成幀就是在一段數據先後分別添加首部和尾部,構成了一個幀。
接收端在收到物理層上交的比特流後,能根據首部跟尾部的標記,從收到的比特流識別幀的開始和結束。
此外,首部跟尾部還包括許多必要的控制信息。在發送幀時,是從幀首部開始發送。各類數據鏈路層協議都要對幀首尾部格式有明確的規定。每一種協議都限定了幀的數據部分長度上限-----最大傳輸單元MTU。
附:最大傳輸單元MTU
一個UDP報文能傳輸的最大數據爲多大?
以太網的數據鏈路層規定了最大傳輸單元MTU=1500(字節),那麼實際上一個IP數據報最長也就是1500 字節,而IP數據報又是由UDP報文或TCP流封裝獲得的,那麼一個UDP報文最大長度爲1500-20=1480.20爲IP數 據報的首部長度。而在運輸層,UDP也有本身的首部(8字節),因此在應用層一個UDP報文能傳遞的最大數據 爲1500-20-8=1472(字節)
二、透明傳輸
什麼是透明傳輸,爲何須要透明傳輸?看下圖:
解決透明傳輸的方法:
一、發送端的數據鏈路層在數據中出現控制字符「SOH」或「EOT」的前面插入一個轉義字符「ESC」(其十六進制編碼是 1B)。
二、字節填充或字符填充——接收端的數據鏈路層在將數據送往網絡層以前刪除插入的轉義字符。
三、若是轉義字符也出現數據當中,那麼應在轉義字符前面插入一個轉義字符。當接收端收到連續的兩個轉義字符時,就刪除其中前面的一個。
實現方法見下圖:
三、差錯檢測
在傳輸過程當中可能會產生比特差錯:1 可能會變成 0 而 0 也可能變成 1。
爲了保證數據傳輸的可靠性,在計算機網絡傳輸數據時,必須採用各類差錯檢測措施。
CRC循環冗餘檢測
在數據鏈路層傳送的幀中,普遍使用了循環冗餘檢驗 CRC 的檢錯技術。
發送端執行的操做:
在發送端,先把數據劃分爲組。假定每組 k 個比特。
假設待傳送的一組數據 M = 101001(如今 k = 6)。咱們在 M 的後面再添加供差錯檢測用的 n 位冗餘碼一塊兒發送。
冗餘碼計算實例:
如今 k = 6, M = 101001。
設 n = 3, 除數 P = 1101,(除數P是咱們本身約定的,n的取值是 P的位數減1)
被除數是 (2^n)M = 101001000。 (對M從後開始補0,一共補n位)
模 2 運算的結果是:商 Q = 110101,(計算結果見下圖)
餘數 R = 001。
把餘數 R 做爲冗餘碼添加在數據 M 的後面發送出去。發送的數據是:101001001,共 (k + n) 位。
CRC 是一種經常使用的檢錯方法,而 FCS 是添加在數據後面的冗餘碼。
接收端執行的操做:
從發送端接收到數據M:101001001(包含冗餘碼FCS)
發送端、接收端約定的除數 P = 1101
M%P 運算結果若爲0,表示無比特差錯
M%P 運算結果不爲0,表示比特差錯,丟棄該幀
僅用循環冗餘檢驗 CRC 差錯檢測技術只能作到無差錯接受。「無差錯接受」是指:「凡是接受的幀(即不包括丟棄的幀),咱們都能以很是接近於 1 的機率認爲這些幀在傳輸過程當中沒有產生差錯」。也就是說:「凡是接收端數據鏈路層接受的幀都沒有傳輸差錯」(有差錯的幀就丟棄而不接受)。要作到「可靠傳輸」(即發送什麼就收到什麼)就必須再加上確認和重傳機制。
附:抓包圖