对于esp32,其wifi功能还是十分强大的,为了能够良好的完成wifi的相关开发,这里需要计算机网络的结构体系进行大致的了解。
一、网络结构分层
对于计算机网络结构,大体上可以分为5层结构:
物理层:电子设备要组网,第一件事就是要让电子设备能通过电信号连接起来。这种连接可以通过实体的电线,网线,光纤进行也可以通过无线信号来实现。
数据链路层:完成了信号传输,还需要对0和1的定义进行规定(类似低电平为0,高电平为1),同时在传输0,1之后还需要对01进行分组如8bit为一个字节多少字节为一个包之类。这就是链接层的功能。wifi的搭建和ethenet的链接就属于这一层。
网络层:由于互联网是一个巨大的网络,如此多的设备,想同时进行互相连接是不可能的,所以需要一个专用的网络层来进行相互的设备识别来找到需要通讯的设备,在一个小网络中,以太网协议是通过MAC地址来寻址的,但在如此巨大的网络中不可能每次寻找设备还需要给每个设备发送信息来匹配MAC地址,此时就产生“网址”的概念。于是,每一个网络设备就有了2种地址,一个是MAC地址,一个IP网络地址。(对于IP协议,后面会讲到)。
运输层:有了MAC地址和IP地址,我们已经可以在互联网上任意两个设备上建立通信了。现在的问题是,当我使用不同设备时,应该选用什么样的通讯方式进行通讯才能使不同设备之间的通讯方式能够兼容呢?传输层的作用就是建立一条规范,使得两台设备上多个任务之间的相互通信能够正常进行,而不需要区分数据到底是来自于哪个设备和程序而能直接接收(这里就涉及到TCP协议和UDP协议了,同样在后面将会详细讲到)。数据接收到后,不同的应用程序需要的数据不通过,通过对数据的解析在分配相对来说就会导致系统进程变慢,需要想到一个方法来字节完成通讯,简化数据传输,实现的方法是新增一个参数(PORT),每个任务拥有自己单独的端口,通过对自己PORT的监控,就可以完成对数据的区分了。
应用层:前面四层搭建完成后,就是网络数据的应用了,举例来说,TCP协议可以为各种各样的程序传递数据,比如DNS、Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了"应用层"。
总结来说:计算机网络的结构可以大致用如下图来表示:
图片来源于:http://blog.csdn.net/zhoujn90/article/details/44955137
二、关于TCP/IP协议
TCP/IP协议(Transmission Control Protocol/Internet Protocol)叫做传输控制/网际协议,又叫网络通信协议。实际上,它包含上百个功能的协议,如ICMP(互联网控制信息协议)、FTP(文件传输协议)、UDP(用户数据包协议)、ARP(地址解析协议)等。TCP/IP负责发现传输的问题,一旦有问题就会发出重传信号,直到所有数据安全正确的传输到目的地。
1、TCP/UDP协议
包含端口号最简单的实现就是UDP协议,他的格式几乎就只是在数据前加上发送端口和接收端口而已。UDP协议的优点是比较简单,容易实现,但是缺点是可靠性较差,一旦数据包发出,无法知道对方是否收到。
为了解决这个问题,提高网络可靠性,TCP协议就诞生了。这个协议非常复杂,但可以近似认为,它就是有确认机制的UDP协议,每发出一个数据包都要求确认。如果有一个数据包遗失,就收不到确认,发出方就知道有必要重发这个数据包了。
因此,TCP协议能够确保数据不会遗失。它的缺点是过程复杂、实现困难、消耗较多的资源。
TCP数据包和UDP数据包一样,都是内嵌在IP数据包的"数据"部分。TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。
2、 IP协议和端口号
定义网址的协议,叫做IP协议。所定义的地址也称为IP地址。IP地址相对来说比较容易理解,指唯一标识了一台主机的某个网络接口。
目前广泛采用的是IPv4协议,这个协议规定,网址由32个bit组成,习惯上,我们用分成四段的十进制数表示IP地址,从0.0.0.0一直到255.255.255.255。互联网上的每个设备,都会分配到一个IP地址。这个地址分成两个部分,前一部分代表网络,后一部分代表设备。比如,IP地址172.16.254.1,这是一个
32位的地址,假定它的网络部分是前24位(172.16.254),那么主机部分就是后8位(最后的那个1)。处于同一个子网络的电脑,它们IP地址的网络部分必定是相同的,也就是说172.16.254.2应该与172.16.254.1处在同一个子网络。
但是,问题在于单单从IP地址,我们无法判断网络部分。还是以172.16.254.1为例,它的网络部分,到底是前24位,还是前16位,甚至前28位,从IP地址上是看不出来的。那么,怎样才能从IP地址,判断两台计算机是否属于同一个子网络呢?这就要用到另一个参数"子网掩码"(subnet mask)
"子网掩码",就是表示子网络特征的一个参数。它在形式上类似IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。比如,IP地址172.16.254.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。
知道"子网掩码",我们就能判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是。比如,已知IP地址192.168.1.1和192.168.1.5
的子网掩码都是255.255.255.0,请问它们是否在同一个子网络?两者与子网掩码分别进行AND运算,结果都是192.168.1.0,因此它们在同一个子网络。
最后总结一下,IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络。
端口的概念是将这个网络接口分成不同的接口,供给系统的不同软件来进行应用,在一台计算机中,通过端口来区分数据属于哪个进程或线程。端口号是一个16位的整数,因此决定了端口号只能是0~65535,当编写一个SOCKET的程序时,应该首先了解所运行的环境中哪些端口被占用了,这样才能确定自己的程序可以使用哪些接口。通常来说,用户的应用程序不应该使用0~1023的端口,因为这些端口已经被分配给一些其他的服务了,比如21是FTP服务器端口,80是WEB服务端口,尽管这些端口仅仅是实现了一种协议,不如FTP和WEB都是用TCP来实现的,从技术上讲,如果用户开发一个基于UDP协议的应用,也可以使用21、80这两个端口,但是不建议使用这种作法,另外,小于1024的端口,往往需要ROOT权限。
3、 计算机网络协议的报文封装
对于计算机网络协议的报文封装,这里就不进行详细讲解了,可以参考以下链接:http://blog.csdn.net/ljtyzhr/article/details/48208583?reload
同样,http://blog.csdn.net/zh458042230/article/details/8796616也对计算机网络相关知识进行了详细的讲解。
4、 关于Socket
套接字(socket):在网络中用来描述计算机中不同程序与其他计算机程序的通信方式。socket其实是一种特殊的IO借口,也是一种文件描述符。
套接字分为三类:
流式socket(SOCK_STREAM):流式套接字提供可靠、面向连接的通信流;它使用TCP协议,从而保证了数据传输的正确性和顺序性。
数据报socket(SOCK_DGRAM):数据报套接字定义了一种无连接的服务,数据通过相互独立的保温进行传输,是无序的,并且不保证是可靠、无差错的。它使用的数据报协议是UDP。
原始socket:原始套接字允许对底层协议如IP或ICMP进行直接访问,它功能强大但使用复杂,主要用于一些协议的开发。
套接字由三个参数构成:IP地址,端口号,传输层协议。
这三个参数用以区分不同应用程序进程间的网络通信与连接。
套接字的数据结构:C语言进行套接字编程时,常会使用到sockaddr数据类型和sockaddr_in数据类型,用于保存套接字信息。
使用socket进行TCP通信时,经常使用的函数有:
图片来自于:http://blog.csdn.net/lovekun1989/article/details/41042273
三、关于WIFI的参数
这里对wifi的一些基本术语进行说明,详细了解可以到以下链接去查看:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=27645048&id=5572925
(*)LAN:即局域网,是路由和主机组成的内部局域网,一般为有线网络。
(*)WAN:即广域网,是外部一个更大的局域网。
(*)WLAN(Wireless LAN,即无线局域网):前面我们说过LAN是局域网,其实大多数指的是有线网络中的局域网,无线网络中的局域网,一般用WLAN。
(*)AP(Access point的简称,即访问点,接入点):是一个无线网络中的特殊节点,通过这个节点,无线网络中的其它类型节点可以和无线网络外部以及内部进行通信。这里,AP和无线路由都在一台设备上(即Cisco E3000)。
(*)Station(工作站):表示连接到无线网络中的设备,这些设备通过AP,可以和内部其它设备或者无线网络外部通信。
(*)Assosiate:连接。如果一个Station想要加入到无线网络中,需要和这个无线网络中的AP关联(即Assosiate)。
(*)SSID:用来标识一个无线网络,后面会详细介绍,我们这里只需了解,每个无线网络都有它自己的SSID。
(*)BSSID:用来标识一个BSS,其格式和MAC地址一样,是48位的地址格式。一般来说,它就是所处的无线接入点的MAC地址。某种程度来说,它的作用和SSID类似,但是SSID是网络的名字,是给人看的,BSSID是给机器看的,BSSID类似MAC地址。
(*)BSS(Basic Service Set):由一组相互通信的工作站组成,是802.11无线网络的基本组件。主要有两种类型的IBSS和基础结构型网络。IBSS又叫ADHOC,组网是临时的,通信方式为Station<->Station,这里不关注这种组网方式;我们关注的基础结构形网络,其通信方式是Station<->AP<->Station,也就是所有无线网络中的设备要想通信,都得经过AP。在无线网络的基础形网络中,最重要的两类设备:AP和Station。
(*)DS(Distributed System):即分布式系统。分布式系统属于802.11逻辑组件,负责将帧转发至目的地址,802.11并未规定其技术细节,大多数商业产品以桥接引擎合分步式系统媒介共同构成分布式系统。分步式系统是接入点之间转发帧的骨干网络,一般是以太网。其实,骨干网络并不是分步系统的全部,而是其媒介。主要有三点:骨干网(例如以太网)、桥接器(具有有线无线两个网络接口的接入点包含它)、属于骨干网上的接入点所管辖的基础性网络的station通信(和外界或者BSS内部的station)必须经过DS、而外部路由只知道station的mac地址,所以也需要通过分布式系统才能知道station的具体位置并且正确送到。分步式系统中的接入点之间必须相互传递与之关联的工作站的信息,这样整个分步式系统才能知道哪个station和哪个ap关联,保证分步式系统正常工作(即转达给正确的station)。分步式系统也可以是使用无线媒介(WDS),不一定一定是以太网。总之,分步式系统骨干网络(例如以太网)做为媒介,连接各个接入点,每个接入点与其内的station可构成BSS,各个接入点中的桥接控制器有到达骨干网络和其内部BSS无线网的接口(类似两个MAC地址),station通信需要通过分布式系统。