手写一个简单的TCP/IP协议栈
文章平均质量分 60
带领你从0开始实现一个自己的TCP/IP协议栈
布の哥
天阶夜色凉如水,卧看牵牛织女星
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
手写TCP/IP协议——IP层输入处理
③IP包发送的时候,填写包头的字段时将checksum填0 ,然后对整个IP包头计算一遍之后再写到checksum中去,接收的时候同样的是先把checksum置零,然后在本地协议栈再计算一遍校验和,观察是否和发送时的计算结果一致,如果一致的话,就说明通过校验;④还有判断一下这个包是不是发给本地协议栈的,因为在网络中发给别人的包也有可能发到我这里,比如我们的ICMP的广播包,我们可以收到但是经检查不是发给我的,就直接丢弃掉就好了,这种处理机制本身也可以认作是一种无回报的处理方式。原创 2025-12-10 11:28:38 · 601 阅读 · 0 评论 -
手写TCP/IP协议栈——ARP超时重新请求
除此之外,还需要设置另外一个超时值,因为我们重新发送ARP请求之后,还需要判断一下在指定的时间内有没有收到响应,从而避免的等待时间过长的情况的出现。arp_entry记录的是网络当中主机IP地址与MAC地址的映射关系,但是由于网卡绑定的IP地址是动态的。如果对方的机器下线,此时DHCP服务器可能会回收这个IP地址进而分配给别的网卡,这时候我们本机保存的arp表项当中维护的映射关系就出错了,需要重新进行修正。由于网络是不可靠的,所以我们需要在自己的协议栈当中添加ARP的超时重传机制。原创 2025-12-07 23:15:59 · 899 阅读 · 0 评论 -
手写TCP/IP协议栈——ARP输入处理
对方ARP包过来之后,我们需要先检查包的合法性,然后在switch...case里面处理ARP包。在ethernet_in以太网输入部分,添加对XNET_PROTOCOL_ARP的处理。此时我们通过arp_make_response已经可以给对方回复并更新arp缓存表了。ARP输入主要处理两种情况:①别人的ARP请求处理 ②别人的ARP回复处理。在虚拟机当中ping一下我们的协议栈,发现可以进入arp请求处理。arp -d:清除本机arp缓存表(需要管理员权限)arp -a:查看本机arp缓存表。原创 2025-12-07 15:16:35 · 677 阅读 · 0 评论 -
手写TCP/IP协议栈——无回报ARP包生成
结合wireshark抓包软件/RFC文档可以看到arp包的具体结构字段,注意这部分内容需要夹在#pragma pack()中间,因为需要解析具体字段。不妨设定:主机启用网卡的时候,自动在网络上广播自己的IP地址&&MAC地址,表示我已经上线了,方便网络当中的其他主机能感知到你的存在。以太网的dst mac填写的是广播包,protocol为ARP,表示交给ARP协议处理。在ARP协议中,发送方和接收方的IP地址都填写的自己的。网卡上线的广播包设置为无回报的ARP包。这里通过一个比较巧妙的手法。原创 2025-12-05 18:59:35 · 536 阅读 · 0 评论 -
手写TCP/IP协议栈——ARP初始化
ok,今天的你就到此为止吧,明天还要接着🐺啊!至此我们就完成了ARP协议的初始化。重新生成解决方案,没有问题即可。原创 2025-12-05 09:51:37 · 116 阅读 · 0 评论 -
手写TCP/IP协议栈——以太网数据包处理
不包含前导码(最前面)和CRC(在payload的最后),这部分内容由驱动自动填充,使用硬件电路可以自动校验CRC。为了预防编译器自动内存对齐的优化,我们使用#pragma pack(1)和#pragma pack()把该格式夹住。则是按照0x22 0x11进入内存,所以大小端完全不同。并且hdr->protocol转换前是0x0608,转换后是0x0806就没问题了。在以太网输入处理部分下断,能正常断下。原创 2025-12-04 19:49:14 · 414 阅读 · 0 评论 -
手写TCP/IP协议栈——数据包结构定义
使用while(1)轮询网卡上有没有数据,一旦硬件(例如以太网网卡)检测到有数据到来,就会交给以太网协议并继续向上交付处理。以太网底层所有数据+包头最大1514B,可以再添加2B的CRC,一共1516B。ok,今天的你就到此为止吧,明天还要接着🐺啊!轮询处理数据包,并在协议栈中处理。原创 2025-12-03 11:31:13 · 236 阅读 · 0 评论 -
手写TCP/IP协议栈——环境配置
这样虚拟机(192.168.254.3)和真机(192.168.254.1)就都能ping通了。使用wireshark也可以正常抓取两张虚拟网卡的通信了。貌似是程序兼容性问题,修改成x86就好了(暂时)实现可能不一样但是遵循同样的协议就可以正常通信。ok,今天的你就到此为止吧,明天还要接着🐺啊!1)将虚拟机的网卡1设置为仅主机。原创 2025-12-03 11:30:18 · 175 阅读 · 0 评论
分享