UDP千兆以太网FPGA_verilog实现(四、代码前期准备-UDP和IP协议构建)
UDP:user Datagram protocol 用戶數(shù)據(jù)報(bào)協(xié)議
無連接的傳輸層協(xié)議,提供面向事務(wù)的簡(jiǎn)單不可靠信息傳送服務(wù),IETF RFC 768是UDP的正式規(guī)范。UDP在IP報(bào)文的協(xié)議號(hào)是17(0x11)
UDP協(xié)議的主要作用是將網(wǎng)絡(luò)數(shù)據(jù)流量壓縮成數(shù)據(jù)包的形式。一個(gè)典型的數(shù)據(jù)包就是一個(gè)二進(jìn)制數(shù)據(jù)的傳輸單位。每一個(gè)數(shù)據(jù)包的前8個(gè)字節(jié)用來包含包頭信息,剩余字節(jié)則用來包含具體的傳輸數(shù)據(jù)。
UDP報(bào)頭使用兩個(gè)字節(jié)存放端口號(hào),所以端口號(hào)的有效范圍是從0------65535
數(shù)值為0-1023,這些數(shù)值可以在網(wǎng)址www.iana.rog查到,IANA把這些端口號(hào)指派給TCP/IP最重要的一些應(yīng)用程序,讓所有的用戶都知道。
登記端口號(hào)
數(shù)值在1024-49151。這類端口號(hào)是為沒有熟知端口號(hào)的應(yīng)用程序使用的。使用這類端口號(hào)必須在IANA按照規(guī)定的手續(xù)登記,防止重復(fù)。
客戶端使用的端口號(hào)數(shù)值在49152-65535。由于這類端口號(hào)僅在客戶進(jìn)程運(yùn)行時(shí)才動(dòng)態(tài)選擇,因此又叫短暫端口號(hào)。這類端口號(hào)是留給客戶進(jìn)程選擇暫時(shí)使用。當(dāng)服務(wù)器進(jìn)程收到客戶進(jìn)程的報(bào)文時(shí),就知道了客戶進(jìn)程使用的端口號(hào),因此可以把數(shù)據(jù)發(fā)送個(gè)客戶進(jìn)程。通信結(jié)束后,剛才已使用過的客戶端端口號(hào)不復(fù)存在,這個(gè)端口號(hào)就可以供其他客戶進(jìn)程使用。
----UDP的長(zhǎng)度是指包括包頭和數(shù)據(jù)部分在內(nèi)的總字節(jié)數(shù)。因?yàn)閳?bào)頭的長(zhǎng)度是固定的,所以該域主要被用來計(jì)算可變長(zhǎng)度的數(shù)據(jù)部分(又稱為數(shù)據(jù)負(fù)載)。數(shù)據(jù)報(bào)的最大長(zhǎng)度根據(jù)操作環(huán)境的不同而各異。理論上,包含報(bào)頭在內(nèi)的數(shù)據(jù)報(bào)的最大長(zhǎng)度為65535字節(jié)。
---- UDP協(xié)議使用報(bào)頭中的校驗(yàn)值來保證數(shù)據(jù)的安全。校驗(yàn)值首先通過特殊的算法計(jì)算得出,在傳遞到了接收方之后,還需要再重新計(jì)算。因此UDP協(xié)議可以檢測(cè)是否出錯(cuò)。雖然UDP提供有錯(cuò)誤檢測(cè),但檢測(cè)到錯(cuò)誤時(shí),UDP不做錯(cuò)誤校正,知識(shí)簡(jiǎn)單地把損壞的消息段扔掉,或者給應(yīng)用程序提供警告信息。
‘’’’’'由于每次需要發(fā)送的數(shù)據(jù)都不相同,而且校驗(yàn)和內(nèi)容在發(fā)送數(shù)據(jù)段之前就需要計(jì)算出來,不像MAC層是在所有數(shù)據(jù)都發(fā)送完成之后才發(fā)送CRC校驗(yàn)值,因此在UDP組包時(shí),校驗(yàn)值的計(jì)算是一個(gè)不太好處理的地方,在UDP要求不是很嚴(yán)格的地方校驗(yàn)和其實(shí)是可以忽略的,因此,在使用verilog實(shí)現(xiàn),為了提升效率并節(jié)約FPGA資源,將校驗(yàn)和字段忽略。這樣一來,UDP數(shù)據(jù)包的組包就百年的非常簡(jiǎn)單了。
’ -----------------------------------------------------------------------------------------------------------------------------------------------------‘
IP協(xié)議的介紹
IP首部:20個(gè)固定字節(jié)+可選字段
每一行32位bit
4字節(jié)的32bit值按照以下次序來傳輸,首先0-7bit,其次8-15比特,然后16-23bit,最后是24-31bit。(這種傳輸次序稱之為big—endian)
首部長(zhǎng)度,說明了首部必須為4的倍數(shù),最大值15(說明IP首部長(zhǎng)度最大為60bit)。當(dāng)IP首部長(zhǎng)度為20時(shí)(無可選字段),該值為5.(5*4=20)
總長(zhǎng)度指整個(gè)IP數(shù)據(jù)報(bào)的長(zhǎng)度,包括首部和數(shù)據(jù)部分,16bit,最長(zhǎng)可達(dá)65535
服務(wù)類型:指示了報(bào)文的優(yōu)先權(quán)等,默認(rèn)全部0
片標(biāo)識(shí):是否屬于同一個(gè)數(shù)據(jù)段,IP報(bào)文的分片ID。全0即可
片偏移:全0即可
生存周期:TTL,典型值32or64
上層協(xié)議類型:指封包所使用的網(wǎng)絡(luò)協(xié)議類型,常用協(xié)議號(hào):00IP,01ICMP,06TCP,17UDP
IP報(bào)頭校驗(yàn)和:是根據(jù)IP首部計(jì)算的校驗(yàn)和,不對(duì)首部后面的數(shù)據(jù)進(jìn)行計(jì)算,其計(jì)算方法為:
在發(fā)送數(shù)據(jù)時(shí)候,為了計(jì)算IP的校驗(yàn)和,應(yīng)該按照如下步驟:
1.將校驗(yàn)和字段置0,然后將IP包頭按照16bit分為多個(gè)單元,如包頭長(zhǎng)度不是16bit的倍數(shù),則用0bit填充到16bit的倍數(shù)。
2.對(duì)各個(gè)單元采用反碼加法運(yùn)算(即高位溢出位會(huì)加到低位,通常的補(bǔ)碼運(yùn)算是直接丟掉溢出的高位),將得到的和的反碼填入校驗(yàn)和字段
例如,我們使用IP協(xié)議發(fā)送一個(gè)數(shù)據(jù)長(zhǎng)度為30個(gè)字節(jié)的數(shù)據(jù)包,發(fā)送端IP為192.168.0.2,接收端IP為192.168.0.3 則IP包頭如下所示:
總結(jié)
以上是生活随笔為你收集整理的UDP千兆以太网FPGA_verilog实现(四、代码前期准备-UDP和IP协议构建)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UDP千兆以太网FPGA_verilog
- 下一篇: UDP千兆以太网FPGA_verilog