유일한 picoTCP 저장소에 오신 것을 환영합니다.
picoTCP는 임베디드 시스템과 사물 인터넷용으로 설계된 작은 공간의 모듈식 TCP/IP 스택입니다. Altran Intelligent Systems 에서 적극적으로 개발 중입니다.
이 코드는 GNU GPL v2 및 GNU GPL v3의 조건에 따라 공개됩니다. 일부 권리는 보유됩니다. 저작권 소유자의 단독 재량에 따라 다른 라이센스가 적용될 수 있습니다.
GitHub 위키의 시작하기 가이드를 통해 프로젝트에서 picoTCP를 사용하는 방법을 알아보세요.
자세한 내용은 이메일을 보내거나 Twitter, Facebook 또는 Reddit으로 문의하세요.
picoTCP의 코드 품질이 궁금하십니까? TiCS 점수를 확인하세요
기능 테스트: - 단위 테스트: - RFC 준수: - TICS 품질: Coverity Scan 빌드 상태:
인터페이스를 단순하게 유지함으로써 새로운 플랫폼과 OS로의 포팅 노력이 매우 적습니다. 참고로 새로운 플랫폼으로의 포팅은 3일 이내에 완료할 수 있고, 새로운 OS는 하루 만에 완료할 수 있으며, 정말 열광한다면 단 하루 저녁에 초기 포팅을 할 수 있습니다. 플랫폼이 다르면 컴파일러도 다르기 때문에 우리는 계속해서 여러 컴파일러로 스택을 컴파일합니다. 다음 목록은 현재 지원되는 플랫폼, 장치 드라이버 및 컴파일러 중 일부를 보여줍니다.
picoTCP가 실행되는 플랫폼 : ARM Cortex-M 시리즈(ST Micro STM, NXP LPC, TI Stellaris, Freescale K64F), ARM ARM9 시리즈(ST Micro STR9), Texas Instruments(MSP430), Microchip(PIC24, PIC32), Atmel( AVR 8bit), Linux(사용자 공간(TUN/TAP), 커널 공간), Windows(사용자 공간(TAP))
picoTCP가 작동하는 네트워크 장치 : BCM43362(IEEE 802.11), MRF24WG(IEEE 802.11), LPC 이더넷 ENET/EMAC(IEEE 802.3), Stellaris 이더넷(IEEE 802.3), STM32 이더넷(IEEE 802.3), Wiznet W5100(IEEE 802.3), USB CDC-ECM(CDC1.2), PPP, 가상 드라이버(TUN/TAP, VDE, Libpcap)
(RT)OS picoTCP가 통합되었습니다 : No OS / Bare metal, FreeRTOS, mbed-RTOS, Frosted, linux / POSIX, MS DOS, MS Windows
라이브러리 picoTCP는 다음과 통합되었습니다 : WolfSSL, mbedTLS, Mongoose RESTful 라이브러리, MicroPython
컴파일러 picoTCP는 GCC, Clang, TCC, ARM-RCVT, IAR, XC-16, XC-32, MSP-GCC, AVR-GCC에서 컴파일됩니다.
안타깝게도 모든 코드를 공개할 수는 없습니다. 일부 부분은 GPL과 호환되지 않는 코드나 바이너리에 의존하고, 일부 부분은 상용 계약에 따라 개발되었으며, 일부는 매우 대략적인 개념 증명 코드로 구성되어 있기 때문입니다. 상용 라이센스에 따른 가용성이나 포팅이나 드라이버 개발을 위한 당사의 전문 서비스 이용 가능성에 대해 자세히 알고 싶으시면 [email protected]으로 언제든지 문의해 주세요.
당신이 가장 좋아하는 것이 목록에 없나요? picoTCP를 새로운 플랫폼으로 포팅하는 방법에 대한 정보와 예제는 위키를 확인하세요!
기능은 picoTCP의 모듈로 개발되어 애플리케이션에서 원하는 기능을 선택할 수 있습니다. 그 결과 인터넷 표준을 준수하는 가능한 가장 작은 스택이 생성됩니다. 아래 회로도는 구현된 모든 프로토콜의 개요를 제공합니다.
이 예에서는 Ubuntu 14.04를 사용합니다. 일부 패키지 이름을 변경해야 할 수도 있지만 다른 Linux 배포판에서도 작동합니다. 자세한 내용은 환경 설정을 참조하세요.
sudo apt-get install git check vde2 libvdeplug2-dev libpcap0.8-dev openvpn wireshark
git clone https://github.com/tass-belgium/picotcp
cd picotcp
make TAP=1
cd ..
그런 다음 example
등의 새 디렉토리를 만들고 다음 내용이 포함된 파일을 만듭니다. //: # (아래 코드는 CI를 통해 가져옵니다. 코드 추출기 주석은 그대로 두세요!) //: # (코드 추출기 시작)
#include
#include
#include
#include
#include
#define NUM_PING 10
static int finished = 0 ;
/* gets called when the ping receives a reply, or encounters a problem */
void cb_ping ( struct pico_icmp4_stats * s )
{
char host [ 30 ];
pico_ipv4_to_string ( host , s -> dst . addr );
if ( s -> err == 0 ) {
/* if all is well, print some pretty info */
printf ( "%lu bytes from %s: icmp_req=%lu ttl=%lu time=%lu msn" , s -> size ,
host , s -> seq , s -> ttl , ( long unsigned int ) s -> time );
if ( s -> seq >= NUM_PING )
finished = 1 ;
} else {
/* if something went wrong, print it and signal we want to stop */
printf ( "PING %lu to %s: Error %dn" , s -> seq , host , s -> err );
finished = 1 ;
}
}
int main ( void ){
int id ;
struct pico_ip4 ipaddr , netmask ;
struct pico_device * dev ;
/* initialise the stack. Super important if you don't want ugly stuff like
* segfaults and such! */
pico_stack_init ();
/* create the tap device */
dev = pico_tap_create ( "tap0" );
if (! dev )
return -1 ;
/* assign the IP address to the tap interface */
pico_string_to_ipv4 ( "192.168.5.4" , & ipaddr . addr );
pico_string_to_ipv4 ( "255.255.255.0" , & netmask . addr );
pico_ipv4_link_add ( dev , ipaddr , netmask );
printf ( "starting pingn" );
id = pico_icmp4_ping ( "192.168.5.5" , NUM_PING , 1000 , 10000 , 64 , cb_ping );
if ( id == -1 )
return -1 ;
/* keep running stack ticks to have picoTCP do its network magic. Note that
* you can do other stuff here as well, or sleep a little. This will impact
* your network performance, but everything should keep working (provided
* you don't go overboard with the delays). */
while ( finished != 1 )
{
usleep ( 1000 );
pico_stack_tick ();
}
printf ( "finished !n" );
return 0 ;
}
이제 다음을 실행하여 이를 컴파일하고 링크할 수 있습니다.
gcc -c -o main.o -I../picotcp/build/include main.c
gcc -o main.elf main.o ../picotcp/build/lib/libpicotcp.a
다음으로 가상 네트워크 포트인 영구 탭 장치를 만듭니다. 매번 이것을 반복할 필요는 없습니다. 장치는 재부팅하거나 sudo tunctl -d tap0
실행할 때까지 존재합니다.
sudo tunctl -u < username >
sudo ifconfig tap0 192.168.5.5
이제 ./main.elf
실행하고 다음과 같은 출력을 볼 수 있습니다.
Protocol ethernet registered (layer: 2).
Protocol ipv4 registered (layer: 3).
Protocol ipv6 registered (layer: 3).
Protocol icmp4 registered (layer: 4).
Protocol icmp6 registered (layer: 4).
Protocol igmp registered (layer: 4).
Protocol udp registered (layer: 4).
Protocol tcp registered (layer: 4).
Device tap0 created.
Assigned ipv4 192.168.5.4 to device tap0
starting ping
64 bytes from 192.168.5.5: icmp_req=1 ttl=64 time=5 ms
64 bytes from 192.168.5.5: icmp_req=2 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=3 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=4 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=5 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=6 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=7 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=8 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=9 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=10 ttl=64 time=0 ms
finished !
응용 프로그램이 실행되는 동안 다음을 실행할 수도 있습니다.
ping 192.168.5.4
다른 방향으로 핑을 보냅니다.
Wireshark를 실행하고 tap0 인터페이스를 스니핑하세요. 그런 다음 ./main.elf
를 다시 실행하고 무슨 일이 일어나는지 확인하세요. picoTCP에서 Linux로의 ARP 요청과 응답이 표시되어야 합니다. 그 후에는 ping 요청과 응답이 앞뒤로 이동하는 것을 볼 수 있습니다.
때로는 IPv6 라우터 요청, 다양한 브로드캐스트, mDNS, DNS-SD 등 많은 다른 항목을 볼 수도 있습니다. 이는 Linux가 새 네트워크 인터페이스가 작동 중임을 인식하고 모든 종류의 검색을 시작하는 때입니다. 영구 TAP 장치를 사용하면 일반적으로 애플리케이션을 처음 시작할 때만 이런 일이 발생합니다. 새로운 Wireshark 캡처를 시작하고 애플리케이션을 다시 시작하면 이제 훨씬 더 깔끔해질 것입니다.
이제 main.c
파일을 일부 변경하고 약간 실험해 볼 수 있습니다! 핑에 대한 통계(최대, 최소, 평균 시간)를 유지하세요. UDP 소켓을 열고 Linux의 netcat 인스턴스로 일부 내용을 보냅니다. 또는 기본적인 포트 스캐너를 구축하여 시스템에 열려 있는 포트를 확인하세요.
이것은 매우 간략한 개요일 뿐이며, 더 많은 정보는 위키에서 찾을 수 있습니다.
기여자들을 매우 환영합니다. 버그를 보고하거나, 문서 개선 방법을 제안하거나, 새로운 코드를 작성해 보세요.
그러나 귀하의 코드를 수락하기 전에 기여자 라이센스 계약에 서명하도록 요청합니다. 귀하의 코드는 귀하의 저작권으로 유지되며 항상 GPLv2 및 GPLv3에 따라 사용할 수 있습니다. 그러나 이 CLA를 통해 당사는 상용 라이선스를 포함한 다른 라이선스에 따라 picoTCP(귀하와 같은 외부 기여자의 코드 포함)를 사용할 수 있습니다. 상용 프로젝트를 수행함으로써 우리는 picoTCP의 품질과 기능에 계속 투자할 수 있습니다.