1、以太網幀格式
♦源地址和⽬的地址是指⽹卡的硬件地址(也叫MAC地址),長度是48位,是在⽹卡出⼚時固化的。Linux下可以⽤ifconfig命令看⼀下,“HWaddr 00:15:F2:14:9E:3F”部分就是硬件地址。
♦ 幀協議類型字段有三種值,分別對應IP、 ARP、 RARP。♦ 幀末尾是CRC校驗碼。
♦數據長度規定最⼩46字節,最⼤1500字節,ARP和RARP數據包的長度不夠46 字節,要在后⾯補填充位。
♦最⼤值1500稱為以太⽹的最⼤傳輸單元(MTU),不同的⽹絡類型有不同的MTU,如果⼀個數據包從以太⽹路由到撥號鏈路上,數據包長度⼤於撥號鏈路的MTU了,則需要對數據包進⾏分⽚。 ifconfig命令的輸出中也有“MTU:1500”。注 意,MTU這 個概念指數據幀中有效載荷的最⼤長度,不包括幀⾸部的長度。
2、IP數據報格式(這⾥討論IPv4)

♦4 位版本號指定 IP 協議的版本。對 IPv4 來說,其值是 4;
♦4 位頭部長度標識該 IP 頭部有多少個 32 bit字(4 字節 ),最⼩值為5,也就是說⾸部長度最⼩是4x5=20字節, 也就是不帶任何選項的IP⾸部,4位能表⽰的最⼤值是15,也就是說⾸部長度最⼤是60字 節。
♦8位TOS字段有3個位⽤來指定IP數據報的優先級(⽬前已經廢棄不⽤),還有4個位表⽰可選的服務類型(最⼩延遲、最⼤呑吐量、最⼤可靠性、最⼩成本),還有⼀個位總 是0。
♦16位總長度是整個數據報(包括IP⾸部和IP層payload)的字節數,以字節為單位,因 此 IP 數據報的最大長度為 65535 (2,6-1 ) 字節。但由於MTU的限制, 長度超過 MTU的數據報都將被分片傳輸,所以實際傳輸的 IP 數據報 (或分片)的長度都遠遠沒有達到最大值。
♦16位標識唯一地標識主機發送的每一個數據報。初始值由系統隨機生成 :每發送一個數據報,其值就加 1。該值在數據報分片時被復制到每個分片中,因此同一個數據報的所有分片都具有相同的標識值。
♦3 位標志字段的第一位保留。第二位表 示“ 禁止分片”。如果設S 了這個位,IP 模塊將不對數據報進行分片。在這種情況下,如 果 1P數據報 K 度 超 過 MTU的話, IP 模塊將丟棄該數據報並返回一個丨CMP差錯報文 。第 三 位及 示 “ 更多分片 ”。除了數據報的最后一個分片外,其他分片都要把它置1。
♦13位分片偏移是分片相對原始丨P 數據報開始處 (僅指數據部分 )的偏移。實際的偏移值是該值左移 3 位(乘 8 ) 后得到的。由於這個原因,除了最后一個丨P 分片外,每 個 IP 分片的數據部分的長度必須垃8 的整數倍 (這樣才能保證后面的 1P分片擁有一個合適的偏移偵)。
♦8 位生存時間 (Time To Live, T T L) 是數據報到達目的地之前允許經過的路rfl器跳數。TTL值被發送端設置 (常見的值記 64)。數據報在轉發過程中每經過一個路由,該值就被路由器減 1。當 TTL值減為 0 時 ,路由器將丟棄數據報,並向源端發送一個 ICMP 差錯報文aTTL值可以防止數據報陷入路由循環。
♦ 8 位協議用來區分上層協議,/etc/prmocols 文件定義了所有上層協議對應的 protocol字段的數值。其中 ICMP是 1,TCP是 6, UDP是 17。 /etc/protocols文件是 RFC 1700的一個子集。
♦16位頭部校驗和由發送端填充,接收端對其使用 CRC 算法以檢驗IP 數據報頭部(注意,僅檢驗頭部)在傳輸過程中是否損壞。
♦32位的源端 IP 地址和目的端 IP 地址用來標識數據報的發送端和接收端 。—般情況下,這兩個地址在整個數據報的傳遞過程中保持不變,而不論它中間經過多少個中轉路由器。♦選項字段是可變長的可選信息 。這部分最多包含40字節 ,因為丨P頭部最長是 60 字節(其中還包含前面討論的 20 字節的同定部分)。可用的 IP 選項包括:記錄路由、時間戳、松散路由源路由選擇、嚴格源路由選擇。
3、 UDP的段格式

4、分析⼀幀基於UDP的TFTP協議幀
以太⽹⾸部
0000: 00 05 5d 67 d0 b1 00 05 5d 61 58 a8 08 00
分析:目的MAC地址:00:05:5d:67:d0:b1;源MAC地址:00 05 5d 61 58 a8;上層協議類型:0x0800表⽰IP。
IP ⾸部
0000: 45 00
0010: 00 53 93 25 00 00 80 11 25 ec c0 a8 00 37 c0 a8 0020: 00 01
分析: 4位版本號:4,即IPv4;4位⾸部長度:5,說 明IP⾸部不帶有選項字段;8位服務類型:0,沒有使⽤服務; 16位總長度字段:(包括IP⾸部和IP層payload的度)0x0053,即83字節,加上以太⽹⾸部14字節可知整個幀長度是97字;IP報標識:0x9325;標志字段與⽚偏移字段:0x0000,就是DF=0允許分⽚,MF=0此數據報沒有更多分⽚,沒有分⽚偏移; TTL:0x80,也就是12;上層協議:0x11表⽰UDP協議; IP ⾸部校驗和:0x25ec;源主機IP:c0 a8 00 37(192.168.0.55),⽬的主機IP:c0 a8 00 01(192.168.0.1)。
UDP⾸部
0020: 05 d4 00 45 00 3f ac 40
分析:16位源端口號:0x05d4(1492)是客戶端的端口號;⽬的端口號:0x0045(69)是TFTP服務的well-known端口號;16位UDP長度: 0x003f,即63字節,包括UDP⾸部和UDP層payload的長度;UDP⾸部和UDP層payload的校驗和:0xac40。
TFTP協議
0020:
0030: 'w''e''r''q''.''q''w''e'00 'n''e''t''a''s''c''i' 0040: 'i'00 'b''l''k''s''i''z''e'00 '5''1''2'00 't''i' 0050: 'm''e''o''u''t'00'1''0'00 't''s''i''z''e'00 '0' 0060: 00
TFTP:基於⽂本的協議,各字段之間⽤字節0分隔,開頭的 00 01 表⽰請求讀取⼀個⽂件,接下來的各字段是:c:\qwerq.qwe netascii blksize 512 timeout 10 tsize 0
⼀般的⽹絡通信方式:客戶端主動發起請求,⽽服務器被動地等待、接收和應答請求。IP 地址和端口號唯⼀標識了該主機上的TFTP進程,客戶端是主動發起請求的⼀⽅,它必須知道服務器的IP 地址和TFTP服務進程的端口號,所以,⼀些常見的⽹絡協議有默認的服務器端口號 ,例如HTTP服務默認TCP協議 的端口號80 ,FTP服務默認TCP協議的端口號21 ,TFTP服務默認UDP協議 的端口號69(如上例所⽰)。 在使⽤客戶端程序時,必須指定服務器的主機名或IP 地址,如果不明確指定端⼜號則采⽤默認端口號 。
5、TCP段格式

♦源端口(16位):標識發送報文的計算機端口或進程。一個 TCP 報文段必須包括源端口號,使目的主機知道應該向何處發送確認報文。
♦目的端口(16位):標識接收報文的目的主機的端口或進程。
♦序號(也叫序列號)(32位):用於標識每個報文段,使目的主機可確認已收到指定報文段中的數據。當源主機用於多個報文段發送一個報文時,即使這些報文到達目的主機的順序不一樣。在 SYN 標志未置位時,該字段指示了用戶數據區中第一個字節的序號;在 SYN 標志置位時,該字段指示的是初始發送的序列號。
在建立連接時發送的第一個報文段中,雙方都提供一個初始序列號。TCP 標准推薦使用以 4ms 間隔遞增 1 的計數器值作為這個初始序列號的值。使用計數器可以防止連接關閉再重新連接時出現相同的序列號。對於那些包含數據的報文段,報文段中第一個數據字節的數量就是初始序列號,其后數據字節按順序編號。如果源主機使用同樣的連接發送另一個報文段,那么這個報文段的序列號等於前一個報文段的序列號與前一個報文段中數據字節的數量之和。 如果序列號增大至最大值將復位為 0。
♦確認號(32位):目的主機返回確認號,使源主機知道某個或幾個報文段已被接收。
♦數據偏移(首部長度)(4位)
♦保留位(6位):由跟在數據偏移字段后的 6 位構成, 全部為 0 。
♦控制位(6位):SYN ACK FIN RST PSH URG
SYN: 表示建立連接;
FIN: 表示關閉連接;
ACK: 表示響應;
PSH: 表示有 DATA數據傳輸;
RST:表示連接重置;
UGR:緊急指針。
SYN和ACK同時為1時,它表示建立連接之后的響應,如果只是SYN為1,它表示的只是建立連接。TCP的幾次握手就是通過這樣的ACK表現出來的。SYN與FIN不同時為1,前者表示建立連接,而后者表示斷開連接。RST一般在FIN之后才會出現為1的情況,表示連接重置。一般地,當出現FIN包或RST包時,我們便認為客戶端與服務器端斷開了連接;而當出現SYN和SYN+ACK包時,我們認為客戶端與服務器建立了一個連接。PSH為1的情況,一般只出現在 DATA內容不為0的包中,也就是說PSH為1表示的是有真正的TCP數據包內容被傳遞。
♦窗口(16位):此字段用來進行流量控制,這個值是本機期望一次接收的字節數,即發送數據的窗口大小。告訴對方在不等待確認的情況下,可以發來多大的數據。這里表示的最大長度是2^16 - 1 = 65535,如需要使用更大的窗口大小,需要使用選項中的窗口擴大因子選項。指發送本報文段的一方的接收窗口(而不是自己的發送窗口)。
♦校驗和(16位):源主機和目的主機根據 TCP 報文段以及偽報頭的內容計算校驗和。在偽報頭中存放着來自 IP 報頭以及 TCP 報文段長度信息。與 UDP 一樣,偽報頭並不在網絡中傳輸,並且在校驗和中包含偽報頭的目的是為了防止目的主機錯誤地接收存在路由的錯誤數據報。
偽首部, 又稱為偽包頭(Pseudo Header):是指在 TCP 的分段或 UDP 的數據報格式中,在數據報首部前面增加源 IP 地址、目的 IP 地址、IP 分組的協議字段、TCP 或 UDP 數據報的總長度等共12字節,所構成的擴展首部結構。此偽首部是一個臨時的結構,它既不向上也不向下傳遞,僅僅只是為了保證可以校驗套接字的正確性。

UDP的首部結構和TCP的偽首部相同,只不過TCP中協議字段為6。
♦緊急指針(16位):僅在 URG = 1 時才有意義,它指出本報文段中的緊急數據的字節數(緊急數據結束后就是普通數據),即指出了緊急數據的末尾在報文中的位置,注意:即使窗口為零時也可發送緊急數據。如果 URG 為 1 ,則緊急指針標志着緊急數據的結束。其值是緊急數據最后 1 字節的序號,表示報文段序號的偏移量。例如,如果報文段的序號是 1000,前 8 個字節都是緊急數據,那么緊急指針就是 8 。緊急指針一般用途是使用戶可中止進程。
♦選項、填充字段:可能包括“窗口擴大因子”、“時間戳”等選項。長度可變,最長可達 40 字節,當沒有使用選項時,TCP 首部長度是 20 字節。填充用於保證任選項為 32bit 的整數倍。
♦數據(長度可變):TCP 首部結束之后的部分
