TCP/IP 协议底层驱动原理 (含网卡芯片读写) 说明 [撸 swoole 和 workerman 的同学建议瞧瞧]

本文章简要的说明该协议的大概内容,具体请百度哦! 图片来源于德州仪器网卡芯片的 datasheet

修改过的 OSI 模型层图示【来源于德州仪器厂商的资料说明】

TCP/IP 协议族【TCP/IP 族或叫模型也行,我们用的是 OSI 模型的浓缩版本就是修改过的版本也就 4 层】分为四层【有的分七层】 1、数据链路层 【核心该层最重要,上层的协议都基于该层提供的驱动程序来工作的,所以废话会特别多】 2、网络层 3、传输层 4、应用层 数据链路层重要协议是 ARP 协议,其实 ARP 就是个 C 语言写的驱动程序,数据链路层重要的东西就是网卡芯片的驱动程序,网卡芯片内部含有大量的工作寄存器。图如下

该芯片图来自于台湾半导体厂商的资料!【具体芯片图可联系本人获取哦】 该芯片用于嵌入式系统的以太网控制器,编写驱动程序即可实现数据收发功能【tcp,udp 仅仅只是一种协议,低层还得依赖芯片的驱动程序,写过驱动程序的同学应该比较清楚,上层应用都是用下层提供的功能来做的】

内部结构有物理收发器即 PHY,Mac,处理器接口,内存管理,内存随机寄存器 SRAM,MII 管理寄存器,包括 EEPROM 可电擦除寄存器等。

网卡芯片的外部硬件连接图

寄存器是一种具有存储功能的逻辑电路,它的驱动靠时钟脉方波信号驱动其工作,其输出与输入及当时的状态有关,不像组合逻辑电路,寄存器是由大量的触发器构成的,一个触发器具有记忆一位二进制的功能,其输出与输入的信号有关,无非就是 0 或 1,触发器由门电路构成【常规的门如与门,或门,非门,与或门,与非门等门电路,就是实现与,或,非,与或,与非,异或等逻辑运算的电路】这些电路呢由半导体二极管或三极管或场效应管元件构成,总之呢记住寄存器具有数据记忆功能就行了。

芯片的功能

它支持了 1 个字节,2 个字节,4 个字节指令可访问内部数据,集成了 10、100 的收发器,支持 IEEE 协会的标准,支持唤醒,集成了 4k 大小的双字节寄存器,并且呢 EEPROM 内在出厂的时候内置了一些数据,用户可以读取其数据,兼容 3.3V 和 5V 的工作电压,芯片有 32 位的数据总线,支持 4 个字节进行访问。

芯片引脚说明 处理器接口说明:

部分引脚具有输出和输入功能即 IO,输入为 I, 输入为 O, 供电为 P 有读指令引脚,写指令引脚,数据总线引脚,数据总线都能输入电压或输出电压【数据】,包括芯片使能引脚,以及地址总线引脚用于选中芯片

时钟脉冲接口

芯片的读写操作 一般来说网卡芯片会连接相应的处理器芯片如单片机 S3C2440 或是 STM32 等这些处理器芯片,网卡芯片一般支持 32 位或是 16 位的数据总线,处理器的数据总线引脚会连接网卡芯片的数据引脚如 SD0~SD31,其中最重要的是处理器引脚如 CMD,IOR#,IOW#,AEN,CMD 输入不同的信号【高电平或低电平会选择数据总线传输过来的是寄存器地址或是寄存的数据】

写操作 一般是指定寄存器地址,再给寄存器数据,首先是指定 TXSRAM 寄存器,再往该寄存器写上数据,通过控制引脚 CMD 端口的电平信号,往数据总线上写入要发送的数据,再使能 TX 控制器寄存发送数据,数据的发送状态会记录到 TX 状态寄存器和网络状态寄存器。TXSRAM 一般由 MWCMD 关联。操作写时指定该寄存器。再发送的时候同时要把发送数据的长度大小也写入 TXPLH,TXPLL 的寄存器里。

读操作 同样是指定 RXSRAM 寄存器,地址是 MRCMD 指定,网卡芯片接受到数据时,数据会保存在 RXSRAM 寄存器里,通过指定该寄存器,数据会从数据总线 SD 输出到处理器【即单片机】 ,程序会不断的读取 RXSRAM 寄存是否有数据,有数据后直接从数据总线获取输出的数据即可。

【读写一般接的是数据总线,不接数据总线就得按读写时序来处理】 数据的发送和接受必须知道对方的 mac 地址,mac 地址一般在出厂的时候就写在相应的寄存器里了,所以数据在传输前会先得到另一块网卡芯片的 mac 地址,mac 地址一般是 6 个字节,而通常是传输对方的 ip 换回对方的 mac 地址返回,这一过程就是地址解析即 ARP。【arp 的请求和响应过程具体可自行查找资料】

由此得出数据链路层的驱动程序在发送和接受时,需要知道对方的 mac 地址和要发送的数据即可。

网卡芯片的驱动程序主要是为上层提供服务的,反正都是读数据和写数据,知道要哪个 mac【哪张网卡】读写就可以了。

网络层: 负责数据报的转发传输功能,相关的重要协议如 ICMP,IP 协议等,它的传送靠网卡驱动程序来提供,该模块主要的协议是 IP,负责 IP 数据报的处理如转发,下一级路由跳转,主要根据 IP 头部选项决定数据是发送给本机处理的还是要进和地转发,会有相由的转发子模块处理,转发子模块也会根据选项决定是否转发,反之则丢弃。

传输层: TCP,UDP 一个是基于字节流的传输,一个是基于数据报的传输,字节流的传输稳定,采用应答机制,具有超时重传等功能让数据能完全到达接收端,而 UDP 则相反。 针对 TCP 编程操作系统提供了 socket 接口给上层使用,基于此接口开发了一堆应用层协议,如比较常见的 http,ftp 等协议。 TCP 协议说明: TCP 在传输数据时会经过 tcp 打包封装【反正每一层都封装,对应的接收端就是分发层层解析】,此层 2 个重要的参数就是 ip,port 即地址和端口号,端口号【由用户指定,一般最多是 65535 个,有部分端口是系统用的,有部分端口是那些著名的软件用的端口如 80,6379,3306 这些玩意用了】 ip 嘛不用说,因为 ARP 驱动在运行时需要知道对方的 mac 地址,这个 ip 呢是对方的 ip,端口号用于区分是哪个应用程序了,到底是 http 如 web 服务器还是其它服务器,所以接收时根据 port 端口号以便区分。

TCP 在传输的时候会封装成目的 ip,端口,源 ip, 源端口,32 位的序列号,32 位的确认号,以及一些标志位如 SYN,ACK,FIN,PUSH,RST 等标志位。 具体图如下

SYN:是一个连接标志位,表示发送端发起了一次连接请求,一般是客户端发起,如通过 socket 接口的 connect 函数发送一个 SYN【此时它时 SYN_SENT 状态】,这个时间如果服务器响应了就会发送一个确认标志位 即 ACK 确认序列号呢会在 32 序列号的基础上加 1 表示确认此时服务器处于 SYN_RVD 状态,如果客户也确认了也会发送 ACK 应答标志位此时都处于 ESTABLISHED 状态了,双方就可以互相发送消息,以上的过程就是典型的三次握手 【FIN 有时搞四次握手】 通过测试【测试图片位于本人的 github 上】 三次握手图:【SYN,SYN ACK,ACK】【自己用 tcpdump 工具测试】

所以当你在调用【TCP 连接过程】【如你撸的 PHP (PHP 例子) 调用 socket 连接函数时客户端会发送一次 SYN 连接请求报文,SYN 标志位会发送过去,当然服务器端一般会先启动,主要是调用 listen 函数时入 LISTEN 状态【你用 talent 命令就能看到服务器 - tcp 的状态了 - 撸过 workerman,swoole 或是 c 的 socket API 应该清楚了】,此时低层驱动运行后,服务器接受到后【确认是发送给自己的】会发送一个 SYN 的应答即 ACK+1,当客户端也确认后就连接成功,如果说端口不存在或是端口被占用了就会连接失败。

当你客户端调用 close 函数时,客户端会发送一个 FIN 结束报文,此时客户端处于 FIN_WAIT1 状态,服务器端确认后即也发送了 ACK 应答确认报文,此时服务器处于 CLOSE_WAIT 状态,客户端也确认了处于 FIN_WAIT2 状态,目前这状态客户端或是服务器都能发送数据,因为还没有真正的关掉【有的叫半打开状态?】如果服务器也发送 FIN 结束报文,此时服务器端处于【就是服务器也调用了 close 函数】LAST_ACK 状态,客户端如果确认了服务器就处于 CLOSED 状态了,客户端处于 TIME_WAIT 状态【它有一定的生存周期,目的是能确认安全的关闭了,万一服务器发送了 FIN 报文时,网断了客户端没有收到,然后呢又通网了,它能再次接受到这个报文】

通过分析【我发的测试图片,你们可以自己去测试不知道的可以百度或是联系我】我们得出了 TCP 确认是采用应答机制,不管是连接,关闭,发送数据,都要得到对方的答应报文进行确认后再进行下一步的操作。

地址说明: 操作系统提供的地址有通用地址,以及 IPV4,IPV6,UNIX 地址【具体可以看 C 语言的相关函数说明】 地址一般提供了 IP,PORT,FAMILY 即 ip, 端口号和地址族以及相关的协议族和数据流类型主要有字节流如 SOCK_STREAM 和数据报服务如 SOCK_DGRAM【UDP 协议就是】

当大家对 TCP/IP 协议了解清楚以后,应用层的协议 HTTP,FTP,TELNET 等协议就简单了 【驱动工程师才不管这些协议,操作网卡芯片驱动就能完成局域网的传输了】

通过以上简单的分析大家应该了解 TCP/IP 协议的一个通信过程了,包括低层驱动也做了简单的说明。 具体大家可以自行查找资料补充 ​

本文原文链接骚颠颠博客 [骚颠颠]

北溟有鱼QAQ博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论