TCP/IP 网络协议的简单介绍
文章简要的说明该协议的大概内容,具体请百度哦!
图片来源于德州仪器网卡芯片的datasheet
TCP协议分为四层【有的分七层】
1、数据链路层 【核心该层最重要,上层的协议都基于该层提供的驱动程序来工作的,所以废话会特别多】
2、网络层
3、传输层
4、应用层
数据链路层重要协议是ARP协议,其实ARP就是个C语言写的驱动程序,数据链路层重要的东西就是网卡芯片的驱动程序,网卡芯片内部含有大量的工作寄存器。图如下
该芯片图来自于台湾半导体厂商的资料!【具体芯片图可联系本人获取哦】 该芯片用于嵌入式系统的以太网控制器,编写驱动程序即可实现数据收发功能【tcp,udp仅仅只是一种协议,低层还得依赖芯片的驱动程序,写过驱动程序的同学应该比较清楚,上层应用都是用下层提供的功能来做的】
内部结构有物理收发器即PHY,Mac,处理器接口,内存管理,内存随机寄存器SRAM,MII管理寄存器,包括EEPROM可电擦除寄存器等。
风卡芯片的外部硬件连接图
寄存器是一种具有存储功能的逻辑电路,它的驱动靠时钟脉方波信号驱动其工作,其输出与输入及当时的状态有关,不像组合逻辑电路,寄存器是由大量的触发器构成的,一个触发器具有记忆一位二进制的功能,其输出与输入的信号有关,无非就是0或1,触发器由门电路构成【常规的门如与门,或门,非门,与或门,与非门等门电路,就是实现与,或,非,与或,与非,异或等逻辑运算的电路】这些电路呢由半导体二极管或三极管或场效应管元件构成,总之呢记住寄存器具有数据记忆功能就行了。
芯片的功能
它支持了字节,单字节,双字节指令可访问内部数据,集成了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协议等,它的传送靠网卡驱动程序来提供。
传输层:
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状态了,双方就可以互相发送消息,以上的过程就是典型的三次握手 【有的人搞四次握手】
通过测试【测试图片位于本人的github上】
所以当你在调用【如你撸的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_LOCK状态,客户端如果确认了服务器就处于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 Comment
还请跟新下图片哈。