- Notifications
You must be signed in to change notification settings - Fork407
An implementation of a small TCP/IP protocol stack for learning.
License
NotificationsYou must be signed in to change notification settings
pandax381/microps
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
microps is an implementation of a small TCP/IP protocol stack for learning.
- If you love the Go language:https://github.com/pandax381/lectcp
- Porting to xv6:https://github.com/pandax381/xv6-net
- Porting to MikanOS:https://github.com/pandax381/mikanos-net
Documents
- Step by Step Development Guides (Japanese)
Abstraction Layer
- Physical device abstraction
- Define structure for physical device abstraction (
struct net_device
) - Support multiple link protocols and physical devices
- Define structure for physical device abstraction (
- Logical interface abstraction
- Define structure for logical interface abstraction (
struct net_iface
) - Support multiple address family and logical interfaces
- Define structure for logical interface abstraction (
Devices
- Null
- Loopback
- Ethernet
- TUN/TAP (Linux)
- PF_PACKET (Linux)
Protocols
- Ethernet
- ARP
- IP
- ICMP
- UDP
- TCP
API
- Socket like API
Logs
18:43:46.153 [I] net_protocol_register: registerd, type=ARP(0x0806) (net.c:223)18:43:46.153 [I] net_timer_register: registerd: ARP Timer interval={1, 0} (net.c:257)18:43:46.153 [I] net_protocol_register: registerd, type=IP(0x0800) (net.c:223)18:43:46.153 [I] ip_protocol_register: registerd, type=ICMP(0x01) (ip.c:440)18:43:46.153 [I] ip_protocol_register: registerd, type=UDP(0x11) (ip.c:440)18:43:46.153 [I] ip_protocol_register: registerd, type=TCP(0x06) (ip.c:440)18:43:46.153 [I] net_timer_register: registerd: TCP Timer interval={0, 100000} (net.c:257)18:43:46.153 [I] net_device_register: registerd, dev=net0, type=0x0000 (net.c:74)18:43:46.153 [D] null_init: initialized, dev=net0 (driver/null.c:46)18:43:46.153 [I] net_device_register: registerd, dev=net1, type=0x0001 (net.c:74)18:43:46.153 [D] loopback_init: initialized, dev=net1 (driver/loopback.c:49)18:43:46.153 [I] ip_route_add: network=127.0.0.0, netmask=255.0.0.0, nexthop=0.0.0.0, iface=127.0.0.1 dev=net1 (ip.c:136)18:43:46.153 [I] ip_iface_register: registerd: dev=net1, unicast=127.0.0.1, netmask=127.0.0.1, broadcast=255.0.0.0 (ip.c:233)18:43:46.153 [I] net_device_register: registerd, dev=net2, type=0x0002 (net.c:74)18:43:46.153 [D] ether_tap_init: ethernet device initialized, dev=net2 (driver/ether_tap_linux.c:174)18:43:46.153 [I] ip_route_add: network=192.0.2.0, netmask=255.255.255.0, nexthop=0.0.0.0, iface=192.0.2.2 dev=net2 (ip.c:136)18:43:46.153 [I] ip_iface_register: registerd: dev=net2, unicast=192.0.2.2, netmask=192.0.2.2, broadcast=255.255.255.0 (ip.c:233)18:43:46.153 [I] ip_route_add: network=0.0.0.0, netmask=0.0.0.0, nexthop=192.0.2.1, iface=192.0.2.2 dev=net2 (ip.c:136)18:43:46.153 [D] net_run: open all devices... (net.c:314)18:43:46.153 [I] net_device_open: dev=net2, state=up (net.c:92)18:43:46.153 [I] net_device_open: dev=net1, state=up (net.c:92)18:43:46.153 [I] net_device_open: dev=net0, state=up (net.c:92)18:43:46.153 [D] net_run: create background thread... (net.c:318)18:43:46.154 [D] net_run: running... (net.c:324)18:43:57.931 [D] ether_poll_helper: dev=net2, type=ARP(0x0806), len=42 (ether.c:127) src: 0e:4e:af:bc:64:c6 dst: ff:ff:ff:ff:ff:ff type: 0x0806 (ARP)18:43:57.931 [D] net_input_handler: queue pushed (num:1), dev=net2, type=ARP(0x0806), len=28 (net.c:191)18:43:57.931 [D] net_thread: queue poped (num:0), dev=net2, type=ARP(0x0806), len=28 (net.c:286)18:43:57.931 [D] arp_input: dev=net2, opcode=Request(0x0001), len=28 (arp.c:239) hrd: 0x0001 pro: 0x0800 hln: 6 pln: 4 op: 0x0001 (Request) sha: 0e:4e:af:bc:64:c6 spa: 192.0.2.1 tha: 00:00:00:00:00:00 tpa: 192.0.2.218:43:57.931 [D] arp_cache_insert: INSERT: pa=192.0.2.1, ha=0e:4e:af:bc:64:c6 (arp.c:163)18:43:57.931 [D] arp_reply: dev=net2, opcode=Reply(0x0002), len=28 (arp.c:213) hrd: 0x0001 pro: 0x0800 hln: 6 pln: 4 op: 0x0002 (Reply) sha: 00:00:5e:00:53:01 spa: 192.0.2.2 tha: 0e:4e:af:bc:64:c6 tpa: 192.0.2.118:43:57.931 [D] net_device_output: dev=net2, type=ARP(0x0806), len=28 (net.c:156)18:43:57.931 [D] ether_transmit_helper: dev=net2, type=ARP(0x0806), len=60 (ether.c:101) src: 00:00:5e:00:53:01 dst: 0e:4e:af:bc:64:c6 type: 0x0806 (ARP)18:43:57.931 [D] ether_poll_helper: dev=net2, type=IP(0x0800), len=98 (ether.c:127) src: 0e:4e:af:bc:64:c6 dst: 00:00:5e:00:53:01 type: 0x0800 (IP)18:43:57.931 [D] net_input_handler: queue pushed (num:1), dev=net2, type=IP(0x0800), len=84 (net.c:191)18:43:57.932 [D] net_thread: queue poped (num:0), dev=net2, type=IP(0x0800), len=84 (net.c:286)18:43:57.932 [D] ip_input: dev=net2, iface=192.0.2.2, protocol=ICMP(0x01), len=84 (ip.c:303) vhl: 0x45 [v: 4, hl: 5 (20)] tos: 0x00 total: 84 (payload: 64) id: 41026 offset: 0x4000 [flags=2, offset=0] ttl: 64 protocol: 1 (ICMP) sum: 0x1663 (0x1663) src: 192.0.2.1 dst: 192.0.2.218:43:57.932 [D] icmp_input: 192.0.2.1 => 192.0.2.2, type=Echo(8), len=64, iface=192.0.2.2 (icmp.c:100) type: 8 (Echo) code: 0 sum: 0xb692 (0xb692) id: 55 seq: 118:43:57.932 [D] icmp_output: 192.0.2.2 => 192.0.2.1, type=EchoReply(0), len=64 (icmp.c:138) type: 0 (EchoReply) code: 0 sum: 0xbe92 (0xbe92) id: 55 seq: 118:43:57.932 [D] ip_output_core: dev=net2, iface=192.0.2.1, protocol=ICMP(0x01), len=84 (ip.c:357) vhl: 0x45 [v: 4, hl: 5 (20)] tos: 0x00 total: 84 (payload: 64) id: 128 offset: 0x0000 [flags=0, offset=0] ttl: 255 protocol: 1 (ICMP) sum: 0x3725 (0x3725) src: 192.0.2.2 dst: 192.0.2.118:43:57.932 [D] arp_resolve: resolved, pa=192.0.2.1, ha=0e:4e:af:bc:64:c6 (arp.c:301)18:43:57.932 [D] net_device_output: dev=net2, type=IP(0x0800), len=84 (net.c:156)18:43:57.932 [D] ether_transmit_helper: dev=net2, type=IP(0x0800), len=98 (ether.c:101) src: 00:00:5e:00:53:01 dst: 0e:4e:af:bc:64:c6 type: 0x0800 (IP)^C18:44:01.605 [D] net_shutdown: terminate background thread... (net.c:334)18:44:01.606 [D] net_shutdown: close all devices... (net.c:341)18:44:01.606 [I] net_device_close: dev=net2, state=down (net.c:110)18:44:01.606 [I] net_device_close: dev=net1, state=down (net.c:110)18:44:01.606 [I] net_device_close: dev=net0, state=down (net.c:110)18:44:01.606 [D] net_shutdown: shutdown (net.c:345)
$ git clone git@github.com:pandax381/microps.git$ cd microps$ make
$ sudo ip tuntap add mode tap user $USER name tap0$ sudo ip addr add 192.0.2.1/24 dev tap0$ sudo ip link set tap0 up
It is temporary and will disappear after reboot.
$ ./app/tcps.exe 711:48:55.884 [I] net_protocol_register: registerd, type=ARP(0x0806) (net.c:223)11:48:55.884 [I] net_timer_register: registerd: ARP Timer interval={1, 0} (net.c:257)11:48:55.884 [I] net_protocol_register: registerd, type=IP(0x0800) (net.c:223)...11:48:55.884 [D] net_run: running... (net.c:324)11:48:55.884 [D] tcp_bind: success: addr=0.0.0.0, port=7 (tcp.c:1156)
TCP Echo Server start on port 7. (default address is 192.0.2.2/24)
- Ping
$ ping 192.0.2.2PING 192.0.2.2 (192.0.2.2) 56(84) bytes of data.64 bytes from 192.0.2.2: icmp_seq=1 ttl=255 time=0.660 ms64 bytes from 192.0.2.2: icmp_seq=2 ttl=255 time=0.688 ms64 bytes from 192.0.2.2: icmp_seq=3 ttl=255 time=0.574 ms...
- TCP communication
$ nc 192.0.2.2 7foofoobarbar
Sending text will be sent back by the Echo Server.
microps is under the MIT License: SeeLICENSE file.
About
An implementation of a small TCP/IP protocol stack for learning.
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
No packages published
Uh oh!
There was an error while loading.Please reload this page.