当前位置: 首页 > Linux

TCP协议简述

时间:2023-04-06 06:56:10 Linux

本文简要说明协议的大致内容,详情请自行百度!TCP协议分为四层【有的分为七层】图片来自德州仪器网卡芯片datasheet1,数据链路层【核心层最重要,上层协议工作基于关于这一层提供的驱动,所以会废话很多]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地址party,mac地址一般在出厂时就写在了相应的寄存器中,所以数据在传输之前会先获取到另一个网卡芯片的mac地址。mac地址一般为6字节,通常用发送方的IP换取对方的mac地址返回。这个过程就是地址解析或ARP。【arp请求和响应过程可以自己查】可以得出数据链路层的驱动在发送和接收的时候需要知道对方的mac地址和要发送的数据。网卡芯片的驱动程序主要是为上层提供服务。反正就是读写数据。知道读写哪个mac【哪个网卡】就够了。网络层:负责数据报的传输功能,相关重要协议如ICMP、IP协议等,其传输由网卡驱动提供。传输层:TCP、UDP,一种基于字节流传输,一种基于数据报传输,字节流传输稳定,采用响应机制,具有超时重传等功能使数据能够完整到达接收端,以及UDP相反。对于TCP编程操作系统,提供了socket接口供上层使用。基于这个接口,开发了一堆应用层协议,比如比较常见的http、ftp等协议。TCP协议说明:TCP传输数据时,会被tcp打包封装【反正每一层都封装,对应的接收端就是分发层的解析】。这一层的两个重要参数是ip,port,也就是地址和端口号。端口号【由用户指定,一般最多65535,有的端口是系统用的,有的端口是那些著名的软件用的,比如80、6379、3306等】不用说了,ip,因为ARP的驱动程序在运行时需要知道对方的mac地址。这个ip就是对方的ip。端口号是用来区分哪个应用程序是http的,比如是web服务器还是其他服务器,所以在接收的时候可以根据端口端口号来区分。TCP在传输过程中会封装成目的ip、端口、源ip、源端口、32位序列号、32位确认号,以及一些标志位,如SYN、ACK、FIN、PUSH、RST等标志位。具体图片如下SYN:是连接标志,表示发送方发起连接请求,一般由客户端发起,比如通过socket接口的connect函数发送一个SYN【此时在SYN_SENT状态],如果此时服务器响应为确认,则发送确认标志,即ACK。确认序号会将32序号加1,表示此时服务器处于SYN_RVD状态。如果client也确认,此时会发送ACK响应标志。状态,双方可以互相发送消息。上面的过程是一个典型的三次握手[有人做四次握手]通过了测试[测试图片位于我的github]所以当你调用[比如你的PHP调用socket连接函数时,客户端会发送一个SYN连接请求报文,同时会发送SYN标志。当然,服务器一般会先启动,主要是调用listen函数时会进入LISTEN状态【可以使用talent命令查看服务器-tcp状态一目了然-查看workerman的socketAPI后,swoole还是c,应该说清楚了。此时低级驱动运行后,服务端收到后会发送一个SYN响应(ACK+1)【确认发送给自己】,当客户端也确认时,连接成功。如果端口不存在或端口被占用,连接将失败。当你的客户端调用close函数时,客户端会发送一个FIN结束消息。此时客户端处于FIN_WAIT1状态。服务器确认后,也发送ACK响应确认报文。此时server处于CLOSE_WAIT状态,client也确认处于FIN_WAIT2状态。目前client或者server在这个状态下是可以发送数据的,因为还没有真正关闭【有的叫半开状态?]如果服务器也发送FIN结束报文,则服务器处于LAST_LOCK状态[即服务器也调用了关闭函数],如果客户端确认了服务器,则客户端处于CLOSED状态,客户端是处于TIME_WAIT状态【有一定的生存时间。期,目的是确认安全关闭。万一服务器发FIN报文,断网客户端收不到,重新连上网络,又能收到这条报文了】通过分析【我可以自己测试测试图,不知道的可以百度或者联系我】我们得出结论,TCP确认采用的是响应机制,无论是连接、关闭还是发送数据,都必须得到对方的确认promisemessage然后进行下一步。地址说明:操作系统提供的地址包括通用地址,IPV4、IPV6、UNIX地址【具体请参考C语言相关函数说明】地址一般提供IP、PORT、FAMILY即,ip、端口号、地址族等相关信息。协议族和数据流类型主要有SOCK_STREAM等字节流和SOCK_DGRAM等数据报服务【UDP协议是】大家把TCP/IP协议理解清楚后,应用层协议HTTP、FTP、TELNET等协议就简单了【驱动工程师不关心这些协议,通过操作网卡芯片驱动就可以完成局域网传输】通过以上简单的分析,大家应该了解了一个TCP/IP协议的通信过程,其中对低层的简单解释级驱动程序。详情可自行查找资料补充本文,转载本文请注明出处!谢谢

猜你喜欢