《从0写TCP/IP协议栈》,根据bilibili《如何用10000行代码写TCP/IP协议栈?》实操
项目包含约10000+行代码,10余种协议、20余种socket接口、10个网络应用程序
平台支持
- 支持在Windows、Linux、Mac平台上开发学习
- 采用C99标准的C语言,不依赖特定的编译器
- 代码移植性强,可容易移植到x86和嵌入式平台,如ARM等
- 只需要操作系统提供基本的信号量、互斥锁和时间获取接口即可 硬件支持
- 不限定具体的网络接口类型,可支持以太网外的其它接口设备
- 支持添加多个网络接口(网卡),IP数据包会自动根据路由表发到正确的接口
- 支持回环接口,实现本机的数据包自发自收 功能特性
- 标准Socket接口:
- 接口:socket、bind、connnect、close
- 接口:sendto、recvfrom、send、recv、read、write、setsockopt
- 具体类型
- 基于SOCK_RAW:允许应用程序收发IP数据包
- 基于SOCK_DGRAM:允许应用程序收发UDP数据包
- 基于SOCK_STREAM(开发中):允许应用程序收发UDP数据包
- 多线程
- 支持多线程操作同一socket接口,即允许不同线程进行同时读写
- 支持同时创建任意多个应用,无论是客户端还是服务器
- 数据包
- 将数据包组织多块链接的方式,提升内存的利用效率 协议支持
- 以太网协议:支持以太网数据包的收发和数据包的处理
- 地址解析协议ARP
- 完整支持ARP的查询和响应过程
- 支持无回报(免费)ARP包的发送
- 使用可配置的大小的ARP缓存,可提升查询效率
- 使用定时期周期性地更新ARP缓存,自动清理无效的缓存项
- 可使用输入的ARP包和IP包进行缓存的更新,减少网络通信量
- IPv4协议
- 支持基本的IP数据包的收发、校验和的计算
- 支持IP数据包的分片与重组、重组超时处理
- 内置路由表,从而可以通过路由器上网
- ICMPv4协议
- 支持对输入的echo请求进行响应(即可以让别人ping自己)
- 提供发送目的端口不可达的信息,以便通知其它机器访问错误
- UDP协议
- 基本的UDP输入输出处理,将输入包正确传递给应用程序
- TCP协议
- 支持TCP状态机切换
- 基于计时器的数据发送超时重传
- 根据RTT情况自适应计算RTO,减少数据重发操作
- 基于重复ACK的快速重传
- 零窗口与TCP持续计时器
- 应用层协议:
- 网络时间服务NTP ■ 实现了客户端,可以查询NTP服务器获取当前时间
- 简单文件传输协议TFTP ■ 实现TFTP客户端:可以从服务器端上传和下载文件 ■ 实现TFTP服务器:允许客户端向服务器上传和下载文件 ■ 支持带选项的TFTP请求处理 ■ 数据包丢失时可自动重发
- 超文本传输协议HTTP: ■ 实现多线程版本的HTTP服务器,可以为客户端提供网页访问功能
- 域名解析协议DNS ■ 支持域名解析,转换成IP地址 ■ 支持添加多个DNS服务器 ■ 缓存DNS查询结果,超时自动删除 ■ 允许多个任务同时进行查询
- DHCP协议(开发中)