TCP/IP基礎知識

  最近工做中須要本身在板卡植入TCP/IP協議棧,由於畢竟單片機性能有限,完整的TCP/IP協議棧很龐大,因此只能移植通過簡化的,原本已成功將LWIP協議棧移植到項目板卡中,但老大說這個協議棧寫得過於繁瑣,特別是在內存管理這塊,不容易理解,並且咱們板卡對數據的準確性要求沒那麼高,重點要保證能通就行,偶爾丟失一兩個包都不要緊,因此按此需求自寫協議棧,實現UDP以及Telnet通訊,目前UDP已經實現,其他功能還在慢慢增長中,經過這段時間的研究發現實現UDP並不難,最主要是要把網絡通訊的一些基本概念知識搞懂,蒐集了不少資料,如今將本身以爲比較有用基礎知識介紹以下。算法

以太網整體概述安全

"以太網"這個名字起源於一個科學假說:19世紀科學家們廣泛認爲光是經過一種叫以太的物質傳播的。時至今日,以太的存在早就被愛因斯坦狹義相對論否認了,而以太網卻成了主流的計算機網絡,依舊爲人類傳遞着光和電磁信息。網絡

以太網(Ethernet)指的是由Xerox公司建立並由Xerox、IntelDEC公司聯合開發的基帶局域網規範,是當今現有局域網採用的最通用的通訊協議標準。以太網絡使用CSMA/CD(載波監聽多路訪問衝突檢測)技術,並以10M/S的速率運行在多種類型的電纜上。以太網與IEEE802.3系列標準相相似。函數

包括標準的以太網(10Mbit/s)、快速以太網(100Mbit/s)和10G(10Gbit/s)以太網。它們都符合IEEE802.3工具

主要有如下兩種拓撲結構:性能

總線型:所需的電纜較少、價格便宜、管理成本高,不易隔離故障點、採用共享的訪問機制,易形成網絡擁塞。早期以太網多使用總線型的拓撲結構,採用同軸纜做爲傳輸介質,鏈接簡單,一般在小規模的網絡中不須要專用的網絡設備,但因爲它存在的固有缺陷,已經逐漸被以集線器和交換機爲核心的星型網絡所代替。以下圖:spa

 

 

 

總線型計算機網絡

 

 

 

星型:管理方便、容易擴展、須要專用的網絡設備做爲網絡的核心節點、須要更多的網線、對核心設備的可靠性要求高。採用專用的網絡設備(如集線器交換機)做爲核心節點,經過雙絞線將局域網中的各臺主機鏈接到核心節點上,這就造成了星型結構。星型網絡雖然須要的線纜比總線型多,但佈線和鏈接器比總線型的要便宜。此外,星型拓撲能夠經過級聯的方式很方便的將網絡擴展到很大的規模,所以獲得了普遍的應用,被絕大部分的以太網所採用。指針

 

1.      以太網工做原理

以太網採用帶衝突檢測的載波幀聽多路訪問(CSMA/CD)機制。以太網中節點均可以看到在網絡中發送的全部信息,所以,咱們說以太網是一種廣播網絡。htm

以太網的工做過程以下:

當以太網中的一臺主機要傳輸數據時,它將按以下步驟進行:

一、監聽信道上是否有信號在傳輸。若是有的話,代表信道處於忙狀態,就繼續監聽,直到信道空閒爲止。

二、若沒有監聽到任何信號,就傳輸數據

三、傳輸的時候繼續監聽,如發現衝突則執行退避算法,隨機等待一段時間後,從新執行步驟1(當衝突發生時,涉及衝突的計算機會發送會返回到監聽信道狀態。

注意:每臺計算機一次只容許發送一個包,一個擁塞序列,以警告全部的節點)

四、若未發現衝突則發送成功,全部計算機在試圖再一次發送數據以前,必須在最近一次發送後等待9.6微秒(以10Mbps運行)。

 

2.      幀格式

以太網主要有四種幀格式,各有不一樣,但在每種格式的以太網幀的開頭處都有64bit(8字節)的前導字符;其中,前7個字節稱爲前同步碼(Preamble),內容是16進制數0xAA;最後1字節爲幀起始標識符0xAB;它標識着以太網幀的開始,前導字符的做用是使接收節點進行同步並作好接收數據幀的準備。以下圖:

 

前導字符事後纔是各類類型的幀真正的開始;大致可分爲以下四類:

2.1.    Ethernet II

即DIX 2.0:Xerox與DEC、Intel在1982年制定的以太網標準幀格式,如圖所示。

 

   

Ethernet II類型以太網幀的最小長度爲64字節(6+6+2+46+4),最大長度爲1518字節(6+6+2+1500+4)。其中前12字節分別標識出發送數據幀的源節點MAC地址和接收數據幀的目標節點MAC地址。(注:ISL封裝後可達1548字節,802.1Q封裝後可達1522字節)。

接下來的2個字節標識出以太網幀所攜帶的上層數據類型,如:

0x0800: IP協議;

0x0806: ARP協議;

0x809B:AppleTalk協議數據;

0x8138: Novell類型協議數據。

在不定長的數據字段後是4個字節的幀校驗序列(Frame Check Sequence,FCS),採用32位CRC循環冗餘校驗對從"目標MAC地址"字段到"數據"字段的數據進行校驗。

 

   

 

2.2.    Ethernet 802.3 raw

Novell在1983年公佈的專用以太網標準幀格式,以下圖所示。

 

 

在Ethernet 802.3 raw類型以太網幀中,原來Ethernet II類型以太網幀中的類型字段被「總長度」字段所取代,它指明其後數據域的長度,其取值範圍爲:46~1500。

接下來的2個字節是固定不變的16進制數0xFFFF,它標識此幀爲Novell以太類型數據幀。

 

 

2.3.    Ethernet 802.3 SAP

IEEE在1985年公佈的Ethernet 802.3的SAP版本以太網幀格式,以下圖所示:

 

從上圖中能夠看出,在Ethernet 802.3 SAP幀中,將原Ethernet 802.3 raw幀中2個字節的0xFFFF變爲各1個字節的DSAP和SSAP,同時增長了1個字節的"控制"字段,構成了802.2邏輯鏈路控制(LLC)的首部。LLC提供了無鏈接(LLC類型1)和麪向鏈接(LLC類型2)的網絡服務。LLC1是應用於以太網中,而LLC2應用在IBM SNA網絡環境中。

新增的802.2 LLC首部包括兩個服務訪問點:源服務訪問點(SSAP)和目標服務訪問點(DSAP)。它們用於標識以太網幀所攜帶的上層數據類型,如16進制數0x06表明IP協議數據,16進制數0xE0表明Novell類型協議數據,16進制數0xF0表明IBM NetBIOS類型協議數據等。

至於1個字節的"控制"字段,則基本不使用(通常被設爲0x03,指明採用無鏈接服務的802.2無編號數據格式)。

 

2.4.    Ethernet 802.3 SNAP

IEEE在1985年公佈的Ethernet 802.3的SNAP版本以太網幀格式,如圖所示:

 

Ethernet 802. 3 SNAP類型以太網幀格式和Ethernet 802. 3 SAP類型以太網幀格式的主要區別在於:

2個字節的DSAP和SSAP字段內容被固定下來,其值爲16進制數0xAA。

1個字節的"控制"字段內容被固定下來,其值爲16進制數0x03。

增長了SNAP字段,由下面兩項組成:

新增了3個字節的組織惟一標識符(Organizationally Unique Identifier,OUI ID)字段,其值一般等於MAC地址的前3字節,即網絡適配器廠商代碼。

2個字節的「類型」字段用來標識以太網幀所攜帶的上層數據類型。

 

 

 

 

 

 

 

 

3.      TCP/IP協議

3.1.    簡介

TCP/IP:傳輸控制協議/因特網互聯協議,又名網絡通訊協議;是Internet最基本的協議,Internet國際互聯網絡的基礎,由網絡層的IP協議和傳輸層的TCP協議組成,TCP/IP定義了電子設備如何連入因特網,以及數據如何在它們之間傳輸的標準。通俗而言:TCP負責發現傳輸問題,一有問題就發出信號,要求從新傳輸,直到全部的數據安全正確的傳輸到目的地,而IP是給因特網的每一臺聯網設備規定一個地址。

它並非TCP和IP兩個協議的合稱,而是指整個TCP/IP協議族,OSI(開放系統互聯參考模型)將TCP/IP分爲七層,實際使用咱們能夠將其簡化爲四層,以下圖:

 

YMODEM也是一種XMODEM的實現。它包括XMODEM-1K的全部特徵,另外在一次單一會話期間爲發送一組文件,增長了批處理文件傳輸模式。

3.2.    協議內容

3.2.1.      協議相關控制字符

    SOH             0x01 

    STX             0x02 

    EOT             0x04 

    ACK             0x06 

    NAK             0x15 

    CAN             0x18 

    CTRLZ         0x1A 

3.2.2.      標準幀格式(128字節)

SOH

信息包序號

包序號的補碼

數據區段

校驗和

起始字節

包號

取反加1

128

數據區段和

1k-Xmodem幀格式以下:

STX

信息包序號

包序號的補碼

數據區段

校驗和

起始字節

包號

取反加1

1024

數據區段和

 

說明:

SOH 幀的開頭字節,表明信息包中的第一個字節   

信息包序號:對256取模所獲得當前包號,第一個信息包的序號爲1,而信息包序號範圍 0~255;   

信息包序號的補碼:當前信息包號的補碼;   

數據區段: 數據區段的長度固定爲128字節(最後一個區段數據字節數確定小於128,由CTRLZ來填充),其內容沒有任何限制,能夠是文本數據或二進制數據; 

算術校驗和:1字節的算術校驗和,只對數據區段求和後對256取模而得;

 

3.2.3.      傳輸邏輯

1> 收發雙方撥號連通後,發送方等待接收方傳來 NAK 信號。當第一個NAK 到達,發送方解釋爲開始發送第一個包;  

2> 發送方一旦收到第一個 NAK,啓動了傳輸,發送方就將數據以每次 128字節打包成幀格式傳送,再等待接收方的確認信號;   

3> 發送方收到接收方傳來的ACK信號,解釋爲信息包被正確接收,並有發送下一個包的含義;   

4> 發送方收到接收方傳來的NAK信號,解釋爲請求重發同一數據包;   

5> 發送方收到接收方傳來的 CAN 信號,解釋爲請求無條件中止傳輸過程;

6> 發送方正常傳輸徹底部數據,須要正常結束,發送EOT信號通知接收方。接收方用 ACK 進行確認;   

7> 接收方發送CAN無條件中止傳輸過程,發送方收到CAN後,不發送 EOT 確認;   

8> 雖然信息包是以 SOH 來標誌一個信息包的起始的,但在 SOH 位置上出現的 EOT則表示數據傳輸結束,再也沒有數據傳過來;   

9> 接收方首先應確認信息包序號的完整性,經過對信息包序號取補,而後和信息包序號的補碼異或,結果爲0表示正確,結果不爲0則發送NAK請求重傳;   

10> 接收方確認信息包序號正確後,而後檢查是否指望的序號。若是不是指望獲得的信息包序號,說明發生嚴重錯誤,應該發送一個 CAN 來停止傳輸;   

11> 對於10>狀況的惟一例外,是收到的包的信息包序號與前一個信息包序號相同,此中狀況,接收方簡單忽略這個重複的包,向發送方發出 ACK ,準備接收下一個包。

12>接收方確認了信息包序號的完整性和是正確指望的後,只對 128 字節的數據區段進行算術和校驗,結果與幀中最後一個字節(算術校驗和)比較,相同發送 ACK,不一樣發送 NAK;

3.2.4.      超時處理 

1> 接收方等待一個信息包的到來所具備的超時時限爲 10 秒,每一個超時後發送 NAK;   

2> 當收到包時,接收過程當中每一個字符的超時間隔爲1秒;   

3> 爲保持「接收方驅動」,發送方在等待一個啓動字節時不該該採用超時處理

4> 一旦傳輸開始,發送方採用單獨的1分鐘超時時限,給接收方充足的時間作發送ACK 、NAK 、CAN以前的必須處理;   

5> 全部的超時及錯誤事件至少重試10次;

3.2.5.      校驗和的說明

Xmodem協議支持2種校驗和,它們是累加和與CRC校驗。當接收方一開始啓動傳輸時發送的是NAK,表示它但願以累加和方式校驗。當接收方一開始啓動傳輸時發送的是字符「C」,表示它但願以CRC方式校驗。

可能有人會問,接收方想怎麼校驗發送方都得配合嗎,難道發送方必須都支持累加和校驗和CRC校驗?事實上Xmodem要求支持CRC的就必須同時支持累加和,若是發送方只支持累加和,而接收方用字符「C」來啓動,那麼發送方只要無論它,當接收方繼續發送「C」,三次後都沒收到應答,就自動會改成發送NAK,由於它已經明白髮送方可能不支持CRC校驗,如今接收方改成累加和校驗和發送方通信。發送方收到NAK就趕忙發送數據包響應。

 

4.      TCP協議

4.1.    協議簡介

爲方便查詢和使用板卡功能,仿照Linux終端工具開發了板卡終端平臺,經過串口或網口Telnet能夠操做板卡各項功能,底層代碼中將板卡各項功能均作成統一格式的接口,放在一個註冊表中,這樣既方便上位機操做板卡,也方便了底層功能的添加和修改;終端界面以下:

TCP是一種面向鏈接的、可靠的、基於IP的傳輸層協議,面向鏈接意味着兩個使用TCP的應用在彼此交換數據以前必須先創建一個TCP鏈接。當應用層向TCP層發送用於網間傳輸的、用8位字節表示的數據流,TCP則把數據分割成適當長度的報文段,最大傳輸段大小一般受計算機鏈接的網絡的數據鏈路層的最大傳送單元(MTU)限制。以後TCP把數據包傳給IP層,由它來經過網絡將包傳送給接收端的TCP層。

TCP爲了保證報文傳輸的可靠,就給每一個包一個序號,同時序號也保證了傳送到接收端的數據包能被按序接收。而後接收端對已成功收到的字節發回一個相應的確認(ACK);若是發送端在合理的往返時延(RTT)內未收到確認,那麼對應的數據將會被重傳。

在數據正確性與合法性上,TCP用一個校驗和函數來檢驗數據是否有錯誤,在發送和接收時都要計算校驗和。在保證可靠性上,採用超時重傳和捎帶確認機制,在流量控制上,採用滑動窗口協議,協議中規定,對於窗口內未經確認的分組須要重傳,在擁塞控制上,採用TCP擁塞控制算法;

4.2.    TCP首部

TCP數據被封裝在一個IP數據報中,以下:

 

下圖爲TCP報文數據格式,在沒有選項的狀況下,它一般是20個字節:

 

源端口號和目的端口號用於尋找發送端和接收端的應用進程,這個和UDP報文相同,這兩個指加上IP首部中的源IP地址和目的IP地址惟一肯定一個TCP鏈接。

序列號字段用來標識從TCP發送端向TCP接收端發送的數據字節流,它表示在這個報文段中的第一個數據字節。當創建一個新的鏈接時,握手報文中的SYN標誌置1,這個握手報文中的序號字段爲隨機選擇的初始序號ISN,當鏈接創建好之後發送方要發送的第一個字節序號爲ISN+1。

確認號字段只有在ACK爲1的時候纔有用,確認號中包含發送確認的一方所指望收到的下一個序號,確認號是在上一次成功接收到的數據字節序號上加1,例如上次成功接收到對方發過來的數據序號爲X,那麼返回的確認號就應該爲X+1。

頭部長度也叫首部長度,首部長度中給出了首部的長度,以32bit也就是4字節爲單位,這個字段有4bit,所以TCP最多有60字節的首部,若是沒有任何的選項字段,正常的首部長度是20字節。

TCP首部中還有6個標誌比特,這個6個標誌位的說明以下:

 

窗口尺寸也就是窗口大小,其中填寫相應的值以通知對方本身指望接收的字節數,窗口大小字段是TCP流量控制的關鍵字段,窗口大小是一個16bit的字段,所以窗口大小最大爲65535字節。

16位的校驗和和UDP的校驗和的計算過程和原理相同,這是一個強制性的字段,校驗和覆蓋了整個TCP報文段,TCP首部和TCP數據;

緊急指針只有在URG置1時纔有效,緊急指針是一個正的偏移量,和序號字段中的值相加表示緊急數據最後一個字節的序號。

相關文章
相關標籤/搜索