www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀] 1.前言 嵌入式以太網(wǎng)開發(fā)是一個(gè)很有挑戰(zhàn)性的工作。通過幾個(gè)月的學(xué)習(xí),我個(gè)人覺得大致有兩條途徑。第一條途徑,先通過高級語言熟悉socket編程,例如C#或C++,對bind,listen,connect,accept等函數(shù)熟悉

1.前言

嵌入式以太網(wǎng)開發(fā)是一個(gè)很有挑戰(zhàn)性的工作。通過幾個(gè)月的學(xué)習(xí),我個(gè)人覺得大致有兩條途徑。第一條途徑,先通過高級語言熟悉socket編程,例如C#或C++,對bind,listen,connect,accept等函數(shù)熟悉之后,應(yīng)用 lwIP。第二種途徑,通過分析嵌入式以太網(wǎng)代碼,結(jié)合TCPIP協(xié)議棧規(guī)范逐步實(shí)踐代碼。第一種途徑效率高,開發(fā)周期短,編寫出來的代碼性能穩(wěn)定,第二種途徑花的時(shí)間長,開發(fā)出來的代碼功能不完善,但是由于緊緊結(jié)合TCPIP規(guī)范,可以了解的內(nèi)容較多,適合學(xué)習(xí)。本文通過分析和修改AVRNET源碼,逐步實(shí)現(xiàn)TCPIP協(xié)議棧的各個(gè)子部分,包括ETHERNET部分,ARP部分,IP部分,ICMP部分,UDP部分,TCP部分和HTTP部分。

本文將實(shí)現(xiàn)IP部分和ICMP部分。

1.2 相關(guān)資料

【ENC28J60學(xué)習(xí)筆記】

STM32NET學(xué)習(xí)筆記 ARP和Ethernet部分】

【AVRNET項(xiàng)目(國外)】

【AVR webserver項(xiàng)目(國外)】


1.3 代碼倉庫

【代碼倉庫】——CSDN Code代碼倉庫。


2.IP部分實(shí)現(xiàn)

IP層是TCP和UDP實(shí)現(xiàn)的基礎(chǔ)。IP首部緊跟以太網(wǎng)首部,長度為20字節(jié)。IP首部具有最基本的兩個(gè)任務(wù),

【第一】定義IP包的具體協(xié)議類型,例如ICMP,TCP或UDP等;

【第二】定義IP報(bào)文從哪個(gè)IP地址來和到哪個(gè)IP地址去。

需要強(qiáng)調(diào),在同一個(gè)子網(wǎng)中即同一個(gè)物理網(wǎng)絡(luò)中,IP報(bào)文中的目標(biāo)IP地址和以太網(wǎng)首部中的目標(biāo)MAC地址相對應(yīng),若不在同一個(gè)物理網(wǎng)路中,目標(biāo)IP地址和目標(biāo)MAC地址不同,目標(biāo)MAC地址被路由器的MAC地址替代,意味著通過路由器轉(zhuǎn)發(fā)報(bào)文。在IP首部中還包括很多其他內(nèi)容,需要注意的是IP標(biāo)識符,該標(biāo)識符主要用于區(qū)分IP報(bào)文,最簡單的算法即每發(fā)送一個(gè)IP報(bào)文后IP標(biāo)識符累加。具體通過以下代碼實(shí)現(xiàn)IP首部的填充。

2.1 IP首部填充


  1. //IP首部總長度

  2. #defineIP_HEADER_LEN20

  3. //協(xié)議類型

  4. //ICMP協(xié)議

  5. #defineIP_PROTO_ICMP_V0x01

  6. //TCP協(xié)議

  7. #defineIP_PROTO_TCP_V0x06

  8. //UDP協(xié)議

  9. #defineIP_PROTO_UDP_V0x11

  10. //IPV4版本

  11. #defineIP_V4_V0x40

  12. #defineIP_HEADER_LENGTH_V0x05

  13. //IP版本號位置以太網(wǎng)首部2+6+6

  14. #defineIP_P0x0E

  15. //首部長度

  16. #defineIP_HEADER_VER_LEN_P0x0E

  17. //服務(wù)類型

  18. #defineIP_TOS_P0x0F

  19. //IP總長度

  20. #defineIP_TOTLEN_H_P0x10

  21. #defineIP_TOTLEN_L_P0x11

  22. //IP標(biāo)識

  23. #defineIP_ID_H_P0x12

  24. #defineIP_ID_L_P0x13

  25. //

  26. #defineIP_FLAGS_H_P0x14

  27. #defineIP_FLAGS_L_P0x15

  28. //TTL生存時(shí)間

  29. #defineIP_TTL_P0x16

  30. //IP協(xié)議類型例如ICMPTCPUDP

  31. #defineIP_PROTO_P0x17

  32. //首部校驗(yàn)和

  33. #defineIP_CHECKSUM_H_P0x18

  34. #defineIP_CHECKSUM_L_P0x19

  35. //源IP地址

  36. #defineIP_SRC_IP_P0x1A

  37. //目標(biāo)IP地址

  38. #defineIP_DST_IP_P0x1E

  39. voidip_generate_header(BYTE*rxtx_buffer,WORD_BYTEStotal_length,BYTEprotocol,BYTE*dest_ip)

  40. {

  41. BYTEi;

  42. //校驗(yàn)結(jié)果

  43. WORD_BYTESck;

  44. //版本號和首都長度

  45. rxtx_buffer[IP_P]=IP_V4_V|IP_HEADER_LENGTH_V;

  46. //服務(wù)類型

  47. rxtx_buffer[IP_TOS_P]=0x00;

  48. //總長度

  49. rxtx_buffer[IP_TOTLEN_H_P]=total_length.byte.high;

  50. rxtx_buffer[IP_TOTLEN_L_P]=total_length.byte.low;

  51. //IP標(biāo)識

  52. rxtx_buffer[IP_ID_H_P]=ip_identfier>>8;

  53. rxtx_buffer[IP_ID_H_P]=ip_identfier&0x00ff;

  54. //累加

  55. ip_identfier++;

  56. //標(biāo)志和分片偏移

  57. rxtx_buffer[IP_FLAGS_H_P]=0x00;

  58. rxtx_buffer[IP_FLAGS_L_P]=0x00;

  59. //生存時(shí)間

  60. rxtx_buffer[IP_TTL_P]=128;

  61. //setippackettypetotcp/udp/icmp...

  62. rxtx_buffer[IP_PROTO_P]=protocol;

  63. //設(shè)定目標(biāo)地址和源地址

  64. for(i=0;i<4;i++)

  65. {

  66. rxtx_buffer[IP_DST_IP_P+i]=dest_ip[i];

  67. rxtx_buffer[IP_SRC_IP_P+i]=avr_ip.byte[i];

  68. }

  69. //校驗(yàn)結(jié)果

  70. rxtx_buffer[IP_CHECKSUM_H_P]=0;

  71. rxtx_buffer[IP_CHECKSUM_L_P]=0;

  72. ck.word=software_checksum(&rxtx_buffer[IP_P],sizeof(IP_HEADER),0);

  73. rxtx_buffer[IP_CHECKSUM_H_P]=ck.byte.high;

  74. rxtx_buffer[IP_CHECKSUM_L_P]=ck.byte.low;

  75. }



2.2 IP報(bào)文查詢

IP報(bào)文查詢功能對應(yīng)于ARP報(bào)文查詢功能,通過以太網(wǎng)首部中的最后2個(gè)字節(jié)判斷該報(bào)文是否為IP報(bào)文;如果是IP報(bào)文則繼續(xù)和本機(jī)IP地址相比較。如果兩步檢查均通過則認(rèn)為是合法的IP報(bào)文,當(dāng)然這其中舍棄了IP版本號和首部校驗(yàn)和的檢查,雖然存在某些隱患但并不妨礙實(shí)現(xiàn)基本功能。


  1. BYTEip_packet_is_ip(BYTE*rxtx_buffer)

  2. {

  3. unsignedchari;

  4. //檢查該報(bào)文是否為IP報(bào)文

  5. if(rxtx_buffer[ETH_TYPE_H_P]!=ETH_TYPE_IP_H_V||rxtx_buffer[ETH_TYPE_L_P]!=ETH_TYPE_IP_L_V)

  6. return0;

  7. //檢查該報(bào)文的IP地址是否為本機(jī)IP地址,逐個(gè)檢查

  8. for(i=0;i

  9. {

  10. if(rxtx_buffer[IP_DST_IP_P+i]!=avr_ip.byte[i])

  11. return0;

  12. }

  13. //若該報(bào)文為IP報(bào)文,且目標(biāo)IP地址為本機(jī)地址,返回1

  14. return1;

  15. }



3.ICMP部分實(shí)現(xiàn)

雖然ICMP具有很多的子協(xié)議,但是其中最著名的要數(shù)ping程序,即ICMP回顯請求和應(yīng)答報(bào)文。通過使用ping命令來判斷報(bào)文是否可以到達(dá)目標(biāo)地址。ICMP的實(shí)現(xiàn)是一個(gè)逐步遵守規(guī)則的過程,即向固定的字節(jié)填充數(shù)據(jù)。


  1. //回顯應(yīng)答

  2. #defineICMP_TYPE_ECHOREPLY_V0

  3. //回顯請求

  4. #defineICMP_TYPE_ECHOREQUEST_V8

  5. //ICMP首部長度

  6. #defineICMP_PACKET_LEN40

  7. //ICMP類型

  8. #defineICMP_TYPE_P0x22

  9. //ICMP代碼

  10. #defineICMP_CODE_P0x23

  11. //ICMP首部校驗(yàn)和

  12. #defineICMP_CHECKSUM_H_P0x24

  13. #defineICMP_CHECKSUM_L_P0x25

  14. //ICMP標(biāo)識符

  15. #defineICMP_IDENTIFIER_H_P0x26

  16. #defineICMP_IDENTIFIER_L_P0x27

  17. //ICMP序號

  18. #defineICMP_SEQUENCE_H_P0x28

  19. #defineICMP_SEQUENCE_L_P0x29

  20. #defineICMP_DATA_P0x2A



3.1 ICMP首部填充

ICMP首部填充需要根據(jù)協(xié)議類型填充不同的內(nèi)容,對于回顯請求而言只需在ICMP協(xié)議類型部分填充0即可,當(dāng)然ICMP部分也包括ICMP首部校驗(yàn)和。


  1. voidicmp_generate_packet(BYTE*rxtx_buffer,BYTEtype)

  2. {

  3. BYTEi;

  4. WORD_BYTESck;

  5. //ICMP回顯請求

  6. if(type==ICMP_TYPE_ECHOREQUEST_V)

  7. {

  8. rxtx_buffer[ICMP_TYPE_P]==ICMP_TYPE_ECHOREQUEST_V;

  9. rxtx_buffer[ICMP_CODE_P]=0;

  10. rxtx_buffer[ICMP_IDENTIFIER_H_P]=icmp_id;

  11. rxtx_buffer[ ICMP_IDENTIFIER_L_P ] = 0;

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

(全球TMT2022年4月19日訊)新思科技(Synopsys, Inc.)聯(lián)合Juniper Networks(簡稱“Juniper”)于近日宣布,雙方已完成交易成立一家獨(dú)立的新公司。該新公司將為業(yè)界提供開放式硅光子...

關(guān)鍵字: ip ni 新思科技

共同投資的新公司將為業(yè)界提供首個(gè)“片上激光”開放式硅光子平臺,用于電信、數(shù)據(jù)通信、激光雷達(dá)、醫(yī)療保健、HPC、AI及光學(xué)計(jì)算領(lǐng)域。 加利福尼亞山景城2022年4月19日 /美通社/ -- 新思科技(Synopsys,...

關(guān)鍵字: ip ni 新思科技

(全球TMT2022年3月24日訊)Parascript不想向用戶出售軟件。只對交付成果感興趣。Parascript認(rèn)為,現(xiàn)在是時(shí)候?qū)?qiáng)大的機(jī)器學(xué)習(xí)用于其真正需要的地方了:在沒有傳統(tǒng)復(fù)雜性驅(qū)動型成本和風(fēng)險(xiǎn)的情況下提供實(shí)...

關(guān)鍵字: ip

科羅拉多州朗蒙特2022年3月23日 /美通社/ -- 讓我們直接進(jìn)入正題:Parascript不想向用戶出售軟件。只對交付成果感興趣。 如今,大多數(shù)供應(yīng)商注重預(yù)訂銷售,而將實(shí)現(xiàn)成功的技術(shù)應(yīng)用項(xiàng)目方面相關(guān)的驚人成本和風(fēng)...

關(guān)鍵字: 加速器 ip

合并后的公司將助力客戶控制自身數(shù)據(jù),并在不使用第三方Cookie的情況下向受眾投放廣告 紐約2022年3月23日 /美通社/ -- Tripl...

關(guān)鍵字: ip

(全球TMT2022年3月23日訊)TripleLift是一家廣告技術(shù)公司,綜合創(chuàng)意、媒體和數(shù)據(jù),重塑廣告投放。該公司宣布收購第一方數(shù)據(jù)激活平臺1plusX。1plusX擁有獨(dú)特的技術(shù),可幫助出版商和廣告商通過以隱私為...

關(guān)鍵字: ip

(全球TMT2022年2月23日訊)Parascript公司宣布了新產(chǎn)品“SignatureXpert.AI”的發(fā)布,它可提供業(yè)內(nèi)最高的簽名驗(yàn)證準(zhǔn)確度。通過多個(gè)校驗(yàn)器的強(qiáng)大組合(這些校驗(yàn)器使用根本不同的算法)進(jìn)行自動的...

關(guān)鍵字: ip

(全球TMT2022年2月18日訊)25年來,Parascript一直在提供高性能自動化,處理的文件每年超1千億份,公司發(fā)布了CheckXpert.AI的新版本。通過新版本CheckXpert.AI,Parascrip...

關(guān)鍵字: ip

Parascript FormXtra.AI 8.3使用Smart Learning技術(shù),將高級捕獲所常見的復(fù)雜、耗時(shí)、昂貴和容易出錯(cuò)的活動轉(zhuǎn)化為簡單計(jì)算。...

關(guān)鍵字: ip

(全球TMT2022年2月17日訊)提供高性能自動化已超過25年、每年處理超過1000億份文件的Parascript發(fā)布新版本的FormXtra.AI,再次擴(kuò)展了對高性能IDP需求的支持,此次是面向合同等真正非結(jié)構(gòu)性數(shù)...

關(guān)鍵字: ip AI
關(guān)閉