MicroTCP เป็นเครือข่าย TCP/IP ฉันเริ่มสร้างเป็นแบบฝึกหัดการเรียนรู้ในขณะที่เข้าร่วมหลักสูตรเครือข่ายคอมพิวเตอร์ที่Università degli Studi di Napoli Federico II มันเป็นเพียงโครงการงานอดิเรกและมีจุดประสงค์เพื่อให้มีการใช้งานน้อยที่สุด แต่สมบูรณ์
ในขณะนี้ MicroTCP ใช้ ARP (RFC 826, เสร็จสมบูรณ์), IPv4 (ไม่มีการกระจายตัว), ICMP (จำเป็นต้องตอบขั้นต่ำในการตอบกลับ Ping) และ TCP (เสร็จสมบูรณ์ แต่ไม่ได้ทดสอบความเครียด) โปรดทราบว่า "เสร็จสมบูรณ์" ไม่ควรมีจุดประสงค์เพื่อ "ปฏิบัติตามอย่างเต็มที่" แต่เป็นการวัดความคืบหน้าของคุณสมบัติที่สำคัญทั้งหมด ตัวอย่างเช่นมันสมบูรณ์เพียงพอที่จะจัดการกับการรับส่งข้อมูล HTTP บนเครือข่ายท้องถิ่น (ดูตัวอย่าง/microhttp เพื่อทราบข้อมูลเพิ่มเติม)
MicroTCP สามารถทำงานบน Windows และ Linux ควบคู่ไปกับสแต็กเครือข่ายของระบบปฏิบัติการ ในการกำหนดเส้นทางการรับส่งข้อมูลเครือข่ายไปยัง MicroTCP กระบวนการที่ทำงานจะทำงานเป็นโฮสต์เสมือนจริงที่มีที่อยู่ IP ของตัวเอง สิ่งนี้ทำได้โดยใช้อุปกรณ์แตะซึ่งมาใน Linux และจำเป็นต้องติดตั้งบน Windows มันควรจะง่ายมากที่จะปรับ microtcp ให้ทำงานบนไมโครคอนโทรลเลอร์ แต่ยังไม่ได้ลอง ความฝันคือการให้บริการบล็อกของฉันจากกระดาน STM32!
หากคุณอยู่ใน Windows คุณต้องติดตั้งไดรเวอร์แตะที่จัดทำโดย OpenVPN และ Instanciate NIC เสมือนจริงเพื่อให้ MicroTCP สามารถเชื่อมต่อกับมันได้เมื่อเริ่มต้น ในการสร้างโครงการจากแหล่งที่มาตรวจสอบให้แน่ใจว่าคุณโคลนที่เก็บด้วย submodules
git clone https://github.com/cozis/microtcp.git --recursiveแล้ววิ่ง
make คุณจะต้องใช้ทั้ง make and cmake เพื่อให้ได้ผล หากทุกอย่างเป็นไปด้วยดีคุณจะพบไฟล์ไลบรารี libtuntap.a , libmicrotcp.a และไฟล์ส่วนหัว tuntap.h , tuntap-export.h , microtcp.h ใน out/
MicroTCP ใช้อินเทอร์เฟซซ็อกเก็ตปกติโปรแกรมเมอร์เครือข่ายใด ๆ ที่คุ้นเคยความแตกต่างหลักคือคุณจำเป็นต้องใช้สแต็กเครือข่ายอย่างชัดเจนและส่งผ่านที่จับไปรอบ ๆ
นี่คือเซิร์ฟเวอร์ Echo แบบง่ายที่แสดงการใช้งานพื้นฐาน:
#include <microtcp.h>
int main ( void )
{
microtcp_t * mtcp = microtcp_create ( "10.0.0.5" , "10.0.0.4" , NULL , NULL );
if ( mtcp == NULL )
return -1 ; // Couldn't create MicroTCP instance
uint16_t port = 8081 ;
microtcp_socket_t * server = microtcp_open ( mtcp , port );
if ( server == NULL ) {
microtcp_destroy ( mtcp );
return -1 ;
}
while ( 1 ) {
microtcp_socket_t * client = microtcp_accept ( server );
if ( client == NULL )
break ;
char buffer [ 1024 ];
int num = microtcp_recv ( client , buffer , sizeof ( buffer ));
if ( num > 0 ) {
microtcp_send ( client , "echo: " , 6 );
microtcp_send ( client , buffer , num );
}
microtcp_close ( client );
}
microtcp_close ( server );
microtcp_destroy ( mtcp );
return 0 ;
} สิ่งนี้น่าจะค่อนข้างตรงไปตรงมาที่จะเข้าใจ สิ่งหนึ่งที่น่าสังเกตคือ microtcp_open ทำงานเป็น socket+bind+listen ทั้งหมดในครั้งเดียวเพื่อตั้งค่าเซิร์ฟเวอร์การฟัง TCP
มีมากกว่าหนึ่งวิธีในการตั้งค่าสแต็กวิธีหลักคือ microtcp_create ซึ่งสร้างเครือข่ายเสมือนที่อนุมานบนระบบปฏิบัติการโฮสต์ด้วย IP 10.0.0.5/24 และโฮสต์เสมือนสำหรับกระบวนการ MicroTCP ที่ 10.0.0.4/24 คุณสามารถเปิด Wireshark บน NIC เสมือนจริงเพื่อตรวจสอบการรับส่งข้อมูลระหว่างโฮสต์และกระบวนการ
นอกจากนี้ยังเป็นไปได้ที่จะกำหนดค่าสแต็กโดยใช้ microtcp_create_using_callbacks ซึ่งช่วยให้คุณให้เฟรม L2 อินพุตอย่างชัดเจนและรับเฟรมในบัฟเฟอร์ นี่คือวิธีที่จะกำหนดค่าสแต็กให้ทำงานบนไมโครคอนโทรลเลอร์
แต่ละอินสแตนซ์ของ microtcp (โดยไม่คำนึงถึงการเรียกกลับ) จะถูกแยกออกจากสิ่งอื่นอย่างสมบูรณ์ดังนั้นหากการใช้การโทรกลับโดยเฉพาะของคุณอนุญาตคุณสามารถมีอินสแตนซ์ได้มากเท่าที่คุณต้องการ!
ยังไม่มีการทดสอบโครงสร้าง infracture วิธีที่ฉันทดสอบมันคือการตั้งค่า HTTP หรือ Echo Server และเน้นจนกระทั่งมีบางอย่างหยุดพักในขณะที่จับสิ่งที่เกิดขึ้นโดยใช้ Wireshark