實作的 source code
https://github.com/fwfly/tcpip
這篇是參考
https://www.saminiir.com/lets-code-tcp-ip-stack-1-ethernet-arp/
原作者的 source code:
https://github.com/saminiir/level-ip
這個實作會從 leyer 2 開始慢慢往上爬
ethernet -> ip -> tcp/ip
目標 : 實踐 arp
文中說使用 /dev/net/tap 但是因為系統裡面似乎已經用 /dev/net/tnu 取代了,所以改用 tnu
這是最原始的 tap 程式
https://github.com/saminiir/level-ip/commit/1b0b7499deb48bd879faeff347a837ae9adf5222
在 reference 有清楚的說明 tun 怎麼使用以及怎麼測試.
可以透過 tun 裝置去產生一個虛擬網路裝置,可以透過 ifup 跟 route 對這個虛擬網路裝置做啟動.
啟動之後就可以使用 ping 或者其他的方法來測試封包以及分析封包.
https://github.com/saminiir/level-ip/blob/e3d9fecf002aad6e8f3e754fae81de8b81156dd0/src/main.c
當使用 ip address add 的時候可以得到 ip,
ping 會直接得到回應,但是程式沒有辦法拿到封包
使用 route add 的時候會不會拿到 ip,
但是在做 ping 的時候是可以拿到封包.
ip link set dev tun0 up
ip address add dev tun0 local 10.0.0.5/24
ip route add 10.0.0.0/24 dev tun0
程式執行後會得到這樣的介面
如果 ping 10.0.0.5 會得到 response,但是程式本身抓不到封包
不過如果對 10.0.0.x 做 ping 程式會得到封包
如果單純用string 是沒有辦法 print 出任何東西
所以必須要用計算的方式去 print 出 hex
解析 print_hexdump
print 出來則會是下面的形式
用 wireshark 去比對可以發現這個封包包含兩個部分
IP 跟 ICMP
這個部分為 IP
這部分為 ICMP
如果單純用 telnet 做連線可以很簡單的得到 tcp 封包,或者說任何一個 tcp 以上的封包都必須先做 3way Handshake
下一步是用 tun 裝置進行 arp 實作
https://github.com/saminiir/level-ip/commit/c8d855507561c15c1074e0781ce6328d4495f9cd
看完文章還是不太清楚 arp 怎麼用到 tun 裝置
透過 tap 實作 icmp
https://blog.csdn.net/ixidof/article/details/10148899
簡單實作 tun 範例
https://my.oschina.net/u/174242/blog/70187
深入研究 tun 跟 ring buffer
https://blog.csdn.net/dog250/article/details/80414228
IP format
https://www.techrepublic.com/article/exploring-the-anatomy-of-a-data-packet/
Tun/Tap interface tutorial
https://backreference.org/2010/03/26/tuntap-interface-tutorial/