Web工作方式:
from:《Go Web 编程》
打开浏览器,输入网址后按下回车,然后显示出浏览内容,这个看似简单的用户行为背后,隐藏的流程一般是:浏览器本身是一个客户端,当你输入 URL 的 时候,首先浏览器会去请求 DNS 服务器,通过 DNS 获取相应的域名对应的 IP,然后通过IP 地址找到 IP 对应的服务器后,要求建立 TCP 连接,等浏览器发送完 HTTP Request(请求)包后,服务器接收到请求包之后才开始处理请求包,服务器调用自身服务,返回HTTP Response(响应)包;客户端收到来自服务器的响应后开始渲染这个 Response 包里的主体(body),等收到全部的内容随后断开与该服务器之间的 TCP 连接。
一个Web服务器也被称为HTTP服务器,它通过HTTP协议与客户端通信。这个客户端通常指的是web浏览器(手机端客户端内部也是浏览器实现的)。
Web 服务器的工作原理可以简单地归纳为:
- 客户机通过 TCP/IP 协议建立到服务器的 TCP 连接
- 客户端向服务器发送 HTTP 协议请求包,请求服务器里的资源文档
- 服务器向客户机发送 HTTP 协议应答包,如果请求的资源包含有动态语言的内容,那么服务器会调用动态语言的解释引擎负责处理“动态内容”,并将处理得到的数据返回给客户端
- 客户机与服务器断开。由客户端解释 HTML 文档,在客户端屏幕上渲染图形结果
一个简单的 HTTP 事务就是这样实现的,看起来很复杂,原理其实是挺简单的。需要注意的 是客户机与服务器之间的通信是非持久连接的,也就是当服务器发送了应答后就与客户机断开连接,等待下一次请求。
URL与DNS解析:
URL(Uniform Resource Locator)是“统一资源定位符”的英文缩写,用于描述一个网络上的资源, 基本格式如下:
1 | schema://host[:port#]/path/.../[?query-string][#anchor] |
DNS(Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于 TCP/IP 网络,它从事将主机名或域名转换为实际 IP 地址的 工作。
更详细的 DNS 解析的过程如下,这个过程有助于我们理解 DNS 的工作模式
- 在浏览器中输入 www.qq.com 域名,操作系统会先检查自己本地的 hosts 文件是否有这个网址映射关系,如果有,就先调用这个 IP 地址映射,完成域名解析。
- 如果 hosts 里没有这个域名的映射,则查找本地 DNS 解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
- 如果 hosts 与本地 DNS 解析器缓存都没有相应的网址映射关系,首先会找 TCP/IP参数中设置的首选 DNS 服务器,在此我们叫它本地 DNS 服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
- 如果要查询的域名,不由本地 DNS 服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个 IP 地址映射,完成域名解析,此解析不具有权威性。
- 如果本地 DNS 服务器本地区域文件与缓存解析都失效,则根据本地 DNS 服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地 DNS 就把请求发至 “根 DNS服务器”,“根 DNS 服务器”收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个 IP。本地 DNS 服务器收到 IP 信息后,将会联系负责.com域的这台服务器。这台负责.com 域的服务器收到请求后,如果自己无法解析,它就会找一 个管理.com 域的下一级 DNS 服务器址(qq.com)给本地 DNS 服务器。当本地 DNS 服务器收到这个地址后,就会找 qq.com 域服务器,重复上面的动作,进行查询,直至找到www.qq.com 主机。
- 如果用的是转发模式,此 DNS 服务器就会把请求转发至上一级 DNS 服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根 DNS 或把转请求转至上上级,以此循环。不管是本地 DNS 服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS 服务器,由此 DNS 服务器再返回给客户机。
通过上面的步骤,我们最后获取的是 IP 地址,也就是浏览器最后发起请求的时候是基于 IP来和服务器做信息交互的。
HTTP协议:
HTTP 是一种让 Web 服务器与浏览器(客户端)通过 Internet 发送与接收数据的协议,它建立在 TCP 协议之上,一般采用 TCP 的 80 端口。它是一个请求、响应协议–客户端发出一个请 求,服务器响应这个请求。在 HTTP 中,客户端总是通过建立一个连接与发送一个 HTTP 请 求来发起一个事务。服务器不能主动去与客户端联系,也不能给客户端发出一个回调连接。 客户端与服务器端都可以提前中断一个连接。例如,当浏览器下载一个文件时,你可以通过点击“停止”键来中断文件的下载,关闭与服务器的 HTTP 连接。HTTP 协议是无状态的,同一个客户端的这次请求和上次请求是没有对应关系,对 HTTP服务器来说,它并不知道这两个请求是否来自同一个客户端。为了解决这个问题, Web 程 序引入了 Cookie 机制来维护连接的可持续状态。
HTTP 协议是建立在 TCP 协议之上的,因此 TCP 攻击一样会影响 HTTP 的通讯,例如比较常见的一些攻击:SYN Flood 是当前最流行的 DoS(拒绝服务攻击)与 DdoS(分布式拒 绝服务攻击)的方式之一,这是一种利用 TCP 协议缺陷,发送大量伪造的 TCP 连接请求,从而使得被攻击方资源耗尽(CPU 满负荷或内存不足)的攻击方式。
HTTP交互方式:
最基本的是GET、POST、PUT、DELETE。一个URL地址用于描述一个网络上的资源,而HTTP中的GET、POST、PUT、DELETE就对应着这个资源的查、改、增、删四个操作。
GET一般用于获取/查询资源信息,POST一般用于更新资源信息。区别在于:
- GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连。POST方法是把提交数据放在HTTP包的Body中。
- GET提交的数据大小有限制(因为浏览器对URL长度有限制),而POST提交数据没有限制。
- GET方式提交数据,存在安全问题,比如登录页面,通过GET方式的话,用户名和密码都在URL上面,如果页面可以缓存或者其他人可以访问这台机器的,就可以从历史记录中获取账户和密码。
状态码:
状态码用来告诉HTTP客户端,HTTP服务器是否产生了预期的Response。HTTP/1.1协议中定义了5类状态码,由三位数字组成,第一个数字定义了响应的类别。
- 1XX:提示信息-表示请求已经被成功接收,继续处理。
- 2XX:成功-表示请求已经被成功接收。
- 3XX:重定向-要完成请求必须进行更进一步处理。
- 4XX:客户端错误-请求有语法错误或请求无法实现。
- 5XX:服务器端错误-服务器未能实现合法的请求。
状态码 | 状态 | 详情 |
---|---|---|
200 | 成功 | 服务器已经处理请求 |
301 | 永久重定向 | 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置 |
302 | 临时重定向 | 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求 |
303 | 请求资源路径改变 | 使用GET方法请求新url |
400 | 请求错误 | 请求的报文中存在语法错误,比如url含有非法字符 |
401 | 未授权 | 未授权,比如访问SpringSecurity限制了权限的资源 |
404 | 未找到 | 服务器找不到请求的网页 |
405 | 请求错误 | 请求的方式(get、post、delete)方法与后台规定的方式不符合 |
415 | 请求错误 | 后台程序不支持提交的content-type |
500 | 服务器内部错误 | 服务器遇到错误,无法完成请求 |