HTTP协议全称超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,它详细规定了浏览器和WWW服务器之间通信的规则,通过Internet传送WWW文档的数据传送协议。
创新互联公司-专业网站定制、快速模板网站建设、高性价比碑林网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式碑林网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖碑林地区。费用合理售后完善,十余年实体公司更值得信赖。
Web服务是HTTP协议的一个服务,HTTP协议承载在TCP协议之上。Web服务工作流程
基于HTTP构建的服务标准模型包括客户端和服务端,HTTP请求从客户端发出,服务端接收到请求后进行处理,然后将响应返回给客户端。
HTTP服务端核心工作是如何接收来自客户端的请求,并向客户端返回响应。当HTTP服务器接收到客户端请求时,首先会进入路由模块,路由又称为服务复用器(Multiplexer),路由的工作在于请求找到对应的处理器(Handler),处理器对接收到的请求进行对应处理后,构建响应并返回给客户端。
Go语言通过引入 net/http 包来实现HTTP网络访问,并提供HTTP客户端和服务端的实现。
创建HTTP服务需经过2个阶段
例如:创建HTTP服务
理解HTTP服务关键点在于路由器和处理器
服务复用器
处理器
http.ServeMux 内部使用一个 map 映射来保存所有处理器, http.muxEntry 是一个多路复用器入口实体。
可以发现在 http.muxEntry 字段中存在着 http.Handler 接口类型的 h
虽然 http.ServeMux 也实现了 http.ServerHTTP() 算得上是一个 http.Handler ,但 http.ServeMux 的 http.ServeHTTP() 并非用来处理请求和响应,而是用来查找注册路由对应的处理器。
当 http.ServeMux 路由器设置路由规则后,会通过它实现的 ServeHTTP() 完成请求的分发。当路由器接收到请求后若请求的URI为 * 则会关闭连接,否则会调用自身的 Handler() 来获取对应路由的处理器,最终通过调用 h.ServeHTTP(w,r) 实现对应路由的实现逻辑。
路由器会根据用户请求的URL路径去匹配自身存储的在 map 中的 handler ,最终调用匹配到的 handler 的 ServeHTTP() 以实现执行对应路由的处理函数。
创建 http.ServeMux 实例的方式有两种
http.DefaultServeMux 是默认的 http.ServeMux ,会随着 net/http 包初始化而被自动初始化。
当 http.ListenAndServe() 在没有提供其他处理器的情况下,即它的入参 handler 为 nil 时内部会使用 http.DefaultServeMux 。
net/http 包提供了一组快捷的注册路由的函数 http.Handle() 、 http.HandleFunc() 来配置 http.DefaultServeMux ,快捷函数会将处理器注册到 http.DefaultServeMux 。
二者之间的区别在于 handler 参数上
http.Handle() 的 handler 是一个 http.Handler 接口实例,也就是说传入的 handler 必须要自己提前实现 http.Handler 接口的 ServerHTTP(ResponseWriter, *Request) 方法。
例如:将处理器放入闭包中,将参数传入处理器。
http.HandleFunc() 的 handler 直接是一个原型为 func(ResponseWriter, *Request) 的函数,深入追踪会 HandleFunc() 会发现一个自定义的函数类型。
因此任何具有 func(ResponseWriter, *Request) 签名的函数都能转换成为一个 http.HandlerFunc 类型的对象。同时自定义的函数类型中已经实现了 ServeHTTP() 方法,因此它也是一个 http.Handler 。
例如:返回时使用一个到 http.HandlerFunc 类型的隐式转换
net/http 包提供了 http.NewServeMux() 来创建一个自定义的 http.ServeMux 实例
例如:调用 http.NewServeMux() 会创建服务复用器
例如:创建静态服务
Go中没有继承、多态,可通过接口来实现。而接口则是定义声明的函数签名,任何结构体只要实现与接口函数签名相同的方法,即等同于实现了对应的接口。
例如: http.HandleFunc() 处理函数实现实际上调用默认 http.DefaultServeMux 的 HandleFunc() 方法
例如:调用 http.Handle() 方法则第二个参数 handle 必须实现 http.Handler 接口的 ServeHTTP() 方法,也就是说只要具有 ServeHTTP() 签名方法即可作为处理器。
例如:自定义处理器
http.HandlerFunc 自身已实现 http.Handler 接口的 ServeHTTP() 方法,因此它也是一个处理器。
http.HandlerFunc 的作用是将自定义函数转换为 http.Handler 处理器类型,当调用 http.HandlerFunc(fn) 后会强制将 fn 函数类型转换为 http.HandlerFunc 类型,这样 fn 函数就具有了 ServeHTTP() 方法,同时也就转换成为了一个 http.Handler 处理器。因此 http.HandlerFunc 又称为适配器。
80端口是为HTTP(HyperText Transport Protocol,超文本传输协议)开放的,主要用于在WWW(World Wide Web,万维网)服务上传输信息的协议,用IE访问一般的网站都是通过这个端口,所以如果要访问网站,必须开启这个端口!
如果想关闭,可以到本地连接-》“属性”-》“TCP/IP协议“-》“属性”-》“高级”-》“选项”-》“TCP/IP筛选”-》“属性”-》把TCP端口中选择为只允许一些端口,然后把常用的TCP端口填进去,不填80端口就关闭了,常用端口请查相关资料!
建议用防火墙或杀毒软件监听80端口,可以保护80端口安全!
这样就完成了http连接的3次握手操作。
我们可以通过wireShark抓包工具来获取http三次握手的整个过程
首先打开WireShark,选择 Loopback 过滤条件
我们看下http断开时的四次挥手的整个过程
我们关闭其中一个终端即可断开http连接,利用WireShark来抓取整个过程
个人理解,在进行http连接时,客户端首先向服务器端发送连接的通信,然后服务器立即同意了对方通信的要求,因为此时还没有连接,服务器端没有未处理完的事务,可以即刻向对方发出通信的请求,最后等待客户端的同意。在http断开时,客户端向服务器端发出close请求,然后,服务器端同意客户端发出的close请求,因为服务器端可能还没处理完 移动端上次请求的事务,不能立即发出close请求,需要等到处理完成后再向客户端发出close请求。再服务器器处理完之后,向移动端发出close请求,最后移动端同意服务器端发出的close请求。