2013/12/09

[網際網路] 乙太網路封包格式(MAC Frame Format)

Ethernet (802.3 MAC frame format)

在網路傳輸資料是透過所謂的封包來傳送,封包內包含了目的及來源的MAC位址、IP和Port,才能夠讓資料正確的傳送到目的地。不過整個電腦的網路是利用各種網路拓樸連結在一起,有時候封包間會發生碰撞的問題,可以想像成在單行道上,兩台車都要通過,就會造成堵塞的現象。因此透過CSMA/CD(Carrier Sense Multiple Access with Collision, IEEE 802.3)的設計,訂定出了網路的封包大小最小為64bytes;最大為1518bytes,來避免封包碰撞的現象。

TCP/IP封包為例子,扣掉MAC位址及一些辨識碼[6(DA)+6(SA)+2(Ether type)+4(FCS)=18bytes],因此IP封包的大小為46~1500bytes,所以也常常會看到人家說網路的MTU1500bytes,就是這麼來的。



1.Ethernet II 封包(Frame)

Preamble(7)
SFD(1)
DA(6)
SA(6)
Ether type(2)
Payload
PAD
FCS(4)

  • Preamble:一連串的1010…10,用來同步
  • SFD(start of frame delimiter):為10101011,用來表示經同步之後,資料的起始
  • DA(Destination Address):目標的MAC位址,MAC為6bytes的硬體碼,從00:00:00:00:00:00到FF:FF:FF:FF:FF:FF,前3碼為製造廠商碼,後3碼為廠商自訂的流水號。
  • SA(Source Address):來源的MAC位址。
  • Ether type:長度或者類別,IP封包為0x0800;ARP封包為0x0806。
  • Payload: MAC封包所要傳送的資料內容,也就是IP封包或者ARP封包等等,如底下第2點所介紹。
  • PAD(Padding):Ethernet封包長度介於46~1500bytes之間,因此假設IP封包長度沒有符合就必須做補滿的動作。
  • FCS(Frame check sequence, CRC32):Checksum,用來確認傳送資料是否有錯誤。


2.IP封包(Datagram)

Version(4)
IHL(4)
Type of Service(8)
Total Length(16)
Identification(16)
Flag(3)
Fragment offset(13)
Time to Live(8)
Protocol(8)
Header Checksum(16)
Source Address(32)
Destination Address(32)
Options
Padding
Data

IP封包格式的內容很多,簡單挑幾個重要的來介紹

  • VersionIPv4(4) or IPv6(6)。
  • Identification: IP封包最大可達65535Bytes,為了能夠放到MAC frame裡面,所以IP封包會分割,然後到了目的地電腦之後,再利用Identification來重組。
  • Fragment offset: 被切割的IP封包在原本封包裡面的offset,用來重組。
  • Time to Live: 為了避免無用的封包佔用網路資源,因此設計了一個TTL值,預設通常都是128 or 64,此參數的意義是封包每經過一個網路設備,TTL值就會減1,直到TTL值為0,封包就會被discard,才不會造成找不到目的地的IP封包會一直在網路上傳輸,佔用了網路的資源。
  • Protocol: 常用的為TCP(0x06)或者UDP(0x17)封包協定。
  • Header Checksum: 用來確認傳輸資料的正確與否。
  • Source Address: 來源IP位址。
  • Destination Address: 目的IP位址。
  • Data: TCP or UDP封包的內容。


3.TCP封包(Segment)

Source Port(16)
Destination Port(16)
Sequence Number(32)
Acknowledgment Number(32)
Data Offset(4)
Reserved(6)
Flag(6)
Window(16)
Checksum(16)
Urgent Pointer(16)
Options
Padding
Data

TCP為Layer 3(Network Layer)的內容,主要包含了來源及目的的Port。

  • Source Port: 來源位址所使用的Port。
  • Destination Port: 目的位址所使用的Port。
  • Sequence Number, Acknowledgment Number: 要建立TCP連線為一個三向交握機制,為了確保兩者之間連線溝通的同步,就用這兩個參數來記錄。簡單來說Sequence Number為已送出的data量;而Acknowledgment Number為以接收的data量。假設A與B之間建立TCP連線,一開始A會送(SEQA=0, ACKA=0)的封包給B,請求與B建立連線,然後B收到之後會回覆一個(SEQB=0, ACKB=1)給A,確認A可以連線,因為已經收到一個封包資訊,所以ACK為1,A接收到之後最後會在回覆一個確認封包(SEQA=1, ACKA=1)給B,確認建立TCP連線,這也就是三向交握的機制。
    這兩個參數的設計,可以確認A會在確認B送過來的封包之中的(SEQB/ACKB)得知B是否有正確收到上一個傳送過去的封包,然後才會再送下一個封包。
    相較於UDP的設計,TCP可以確保每次封包都會正確傳送到目的地,是一個可靠的傳輸,但相對的缺乏效率。
  • Window: TCP會確保封包是否正確送達目的地,不過每次都送出等待目的的回覆確認的話,會造成太多時間的在等待上,因此設計了Window參數,用來告訴對方一次可以接受的視窗大小,讓對方一次送N個TCP封包,然後再回覆確認,,若有沒收到的要求對方再重傳,確認N個封包都收到之後,再送下一個N個封包,如此可以增加傳送的效率。
  • Checksum: 錯誤檢查碼,確認資料傳送的正確性。
底下用WireShark軟體抓取一個TCP/IP封包為例子
MAC表頭的部分,目的及來源的MAC位址。

IPv4封包的內容,包含了目的及來源的IP位址,Protocol為TCP(0x06)。

TCP封包的內容,包含了來源及目的位址所使用的Port number,SEQ/ACK number。

最後就是資料內容。

根據OSI七層參考模型,資料是從傳輸層(TPC/UDP, Port)→網路層(IP address)→資料鏈結層(MAC)→實體層(Binary)來傳送,由上而下包裝segment(TCP/UDP, Port)→datagram(IP address)→frame(MAC),最後實體層用1010的二進制碼傳送出去。

2 則留言:

  1. 少數清晰的整理,很厲害

    回覆刪除
  2. 感謝分享, 關於IP封包的Protocol欄位, UDP應該是17(0x11), 而不是0x17, 請再確認

    回覆刪除