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

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

TCP 协议简单说明【PHP 码农的现身说法】

修改过的OSI模型层图示【来源于德州仪器厂商的资料说明】
TCP/IP 协议简单说明 [撸 swoole 和 workerman 的同学建议瞧瞧]

TCP/IP 协议简单说明 [撸 swoole 和 workerman 的同学建议瞧瞧]

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

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

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

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

TCP 协议简单说明【PHP 码农的现身说法】

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

芯片的功能

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

芯片引脚说明
处理器接口说明:
TCP 协议简单说明

TCP 协议简单说明

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

时钟脉冲接口

TCP 协议简单说明

芯片的读写操作
一般来说网卡芯片会连接相应的处理器芯片如单片机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等标志位。 具体图如下

TCP 协议简单说明

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

所以当你在调用【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协议的一个通信过程了,包括低层驱动也做了简单的说明。
具体大家可以自行查找资料补充

本文转载时请指明来源!谢谢各位

本帖由系统于 1个月前 自动加精
勺颠颠
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 7

对于软件工程师来说,可谓是非常底层的知识了。

2个月前 评论
勺颠颠 (楼主) 2个月前
L学习不停 1个月前
南城以南

TCP 协议分为四层【有的分七层】
1、数据链路层 【核心该层最重要,上层的协议都基于该层提供的驱动程序来工作的,所以废话会特别多】
2、网络层
3、传输层
4、应用层
第一行有误。 TCP/IP协议簇体系结构分四层, OSI模型为7层。
另外 对于软件工程师而言 硬件的没必要了解太多。

2个月前 评论
勺颠颠 (楼主) 2个月前
勺颠颠 (楼主) 2个月前

非常好的文章

1个月前 评论

太硬核了

5天前 评论
lmaster

感觉在后面有问题

硬件设备中与数据总线相关

16位设备

  • BYTE = 8 bits
  • WORD = 16 bits
  • DWORD= 32 bits

32位设备

  • BYTE = 8 bits
  • WORD = 32 bits
  • DWORD= 64 bits

这个 word 是 字 的意思, dword 是 双字

2天前 评论
勺颠颠

@lmaster 是的

2天前 评论

这个已经突破软件工程,进入了嵌入式开发了

1天前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!