1、两台计算机的通信
每台计算机都可以收、发消息,如果没有规则,那么收、发自由,不限制时间,但这一般是没有意义的。
如果计算机设立了规则,那么就会按时发送,或者对收到的消息进行处理,对不满足条件的消息直接扔掉。
现实中的服务,是一个零售店、公司、政府等等有个办事处,一直等待有人来找他们办事,有人来就会做出相应的处理。
计算机服务也是一样,需要一台计算机等待消息,对不同的消息进行处理。
有服务,就应该有客户,不然服务的存在没意义,这样 server、client 就出现了。
2、客户端与服务端的连接,长连接,短连接
长连接,就是客户端与服务端建立连接之后,服务端一直保存着与客户端连接通信所需要的数据结构,除非有一方终止、关闭连接,但是这样如果有很多连接,就会一直占用内存。
短连接,就是客户端与服务端建立连接之后,然后立即发送消息,服务器收到消息处理完会立即返回消息,然后删除连接,这样不会占用内存,但是会有频繁建立连接的开销。
3、websocket、http与nodejs
websocket是长连接,建立连接之后,客户端与服务端都有各自的连接对象负责收、发,收到的内容格式需要自己定义,相当于自建协议。
http是短连接,本身就是一种协议,服务端收到客户端发送的内容,称为request,req,返回的内容称为response,res。
nodejs收到http请求后,会有两个参数,req对象,res对象,req对象包含了请求的内容,需要处理,res对象用于返回内容。
4、请求的处理理论
请求是必须要处理的,即使是不存在、无意义、垃圾的请求也需要处理,处理请求就对应处理函数,多个请求就有多个处理函数,一般通过请求url的虚拟路径部分来判断该请求对应哪个处理函数。
请求可以分两种,一种是不需要传给服务器参数,一种是需要传,不需要传的使用get就好,需要传的也可以使用get(带querystring),也可以使用post,querystring的好处就是可以直接使用浏览器的地址栏获得所需数据,但是这个需求并不常用。
post请求是必须的,不可能都使用get,但是应该都可以使用post,是不是可以忽略请求类型,统一当post处理,后来发现最好不要这样,如果都当post处理,虽然避免了对请求方式的判定,但是需要初始化用于接收data的buffer,
但是get是不需要这个buffer的。
请求还可以分另外两种,一种是开发者自己控制之内的,另一种是开发者不希望看到的请求,比如误操作的不存在处理函数请求、恶意攻击的请求。
开发者控制之内的请求还可以进一步分两种,一种是需要经常处理的请求格式,另一种是一般不会需要的请求,但是总有些特殊情况。
总结一下就是,有些请求是规则之内的,有些是规则之外的,illegal ,规则之外的都是错误的请求,如果是少量的错误请求,不需要处理,如果是大量的,那么可能遭受攻击,需要打印日志。
规则之内的请求分为频繁处理的,还有稀少处理的,频繁处理的需要最快的效率,稀少的需要特殊处理。
5、请求的处理实践
规则之外的请求,可以定义一个处理函数,所有规则之外的都走这个函数,只返回头部信息404,如果有攻击,再加日志打印
重点是规则之内的请求处理,然后把需不需要传参的请求综合在一起。
不需要传参的分为两种,一种是请求需要计算获得的数据,一种是请求静态文件,哪个请求多一点取决于网站的架构设计。
需要传参的有两种,一种是body传参,一种是querystring,这两者不应该同时使用。
(注意:使用GET请求也可以带body,并且nodejs也能收到body信息,使用浏览器发GET请求,浏览器不会发body信息,即使你的send里有数据)
按照请求频繁度大致排序,不传参调用接口,传参调用接口,静态文件,querystring。前面两个可以使用同一种格式的虚拟路径
如果不分get、post,那么请求可能带body,需要统一处理,这样对于不带body的请求会造成额外的开销。
如果区分get、post,那么需要先判断请求类型,也会造成开销,但是这个开销要小一点的样子,所以还是不忽略请求类型了。
get请求只有一个数据帧,收到之后就可以返回了,不需要再等data传输,顺序为:1、根路径 2、虚拟路径 3、静态文件 4、querystring
如果用post,都认为是带body数据的,要等待data收到完成才能返回,data不能超出限制,只需要判断一个虚拟路径
对于url的解析:
根路径、虚拟路径、querystring,这三个格式的url可以用正则限制,任何不匹配的都不是正确的url,直接记录日志
对于静态文件,url应该只限制在static目录下,特别注意,url可能跳出static目录,比如:http://127.0.0.1/static/../file.ext
所以对于访问静态文件的正则要以/static/开头,并且不能包含两个点符号,避免黑客访问其他目录下的文件