64 lines
4.6 KiB
Markdown
64 lines
4.6 KiB
Markdown
#3.1 Web工作方式
|
||
|
||
我们平时浏览网页的时候,打开浏览器,输入网址,按下回车键,然后就出来了内容。在这个看似简单的行为背后,到底隐藏了些什么呢?
|
||
|
||
上面这个普通的浏览过程,底层其实是这样做的:浏览器是一个客户端,当你输入URL的时候,首先浏览器会去请求DNS服务器,通过DNS获取相应的域名对应的IP,然后通过IP和服务器建立socket连接,发送http请求信息,服务器接收到请求信息之后,定位请求的资源(如果是动态语言,例如php、python、ruby之类的),那么服务器执行相应的逻辑之后返回http信息,客户端接收到http信息,开始渲染,断开和服务器的socket链接。
|
||
|
||

|
||
|
||
一个Web服务器也被称为HTTP服务器,它通过HTTP协议与客户端通信。这个客户端通常指的是Web浏览器(手机端客户端其实内部也是浏览器实现)。
|
||
|
||
Web服务器的工作原理简单的可以归纳为:
|
||
|
||
- 客户机通过socket建立到服务器的连接
|
||
- 客户端向服务器发送请求,http协议包,请求转化成服务器对应的文档
|
||
- 服务器向客户机发送应答,http协议包,请求的如果包含有动态语言的部分,那么动态语言把相应的数据结果返回给客户端
|
||
- 客户机与服务器断开。客户端解释HTML文档,在客户端屏幕上显示结果。
|
||
|
||
一个简单的事务处理事件就是这样实现的,看起来很复杂,做起来其实是挺简单的,需要注意的是客户机与服务器之间的通信是非连接的,也就是当服务器发送了应答后就与客户机断开连接,等待下一次请求。
|
||
|
||
|
||
##HTTP协议
|
||
HTTP是一种让Web服务器与浏览器(客户端)通过Internet发送与接收数据的协议。它是一个请求、响应协议--客户端发出一个请求,服务器响应这个请求。HTTP运用可靠的TCP连接,通常用TCP的80端口。
|
||
|
||
在HTTP中,客户端总是通过建立一个连接与发送一个HTTP请求来发起一个事务。服务器不能主动去与客户端联系,也不能给客户端发出一个回调连接。客户端与服务器端都可以提前中断一个连接。例如,当用一个浏览器下载一个文件时,你可以通过点击“停止”键来中断文件的下载,关闭与服务器的HTTP连接。http协议使Web服务器和浏览器可以通过Web交换数据。它是一种请求/响应协议,即服务器等待并响应客户方请求。HTTP不维护与客户端的连接,它使用可靠的TCP连接,通常采用TCP的80端口。
|
||
|
||
因为HTTP协议是建立在TCP协议之上的,因此TCP攻击一样会影响HTTP的通讯,例如比较常见的一些攻击:SYN Flood是当前最流行的DoS(拒绝服务攻击)与DdoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式。
|
||
|
||
##HTTP请求信息(浏览器信息)
|
||
- 请求行:GET/POST(流的组织(请求)方式) URL(地址+目录) 版本号
|
||
- 请求头:
|
||
|
||
Host:客户端IP和端口
|
||
User-Agent:浏览器信息
|
||
Accept:客户端能接收的数据类型
|
||
Accept-encoding:是否支持压缩的流
|
||
Accept-charset:客户端字符编码集
|
||
- 空行:分割请求头和消息体
|
||
- 消息体:请求的参数
|
||
|
||
##HTTP响应信息(服务器信息)
|
||
- 状态行:HTTP版本 服务器状态(比如:404找不到...) 描述信息
|
||
- 响应头
|
||
|
||
Content-Type:服务器发送信息的类型
|
||
Date:发送时间
|
||
Server:服务器类型
|
||
- 消息体:服务器发送给客户端的页面内容
|
||
|
||

|
||
|
||
上面这张图我们可以了解到整个的通讯过程,同时细心的读者是否注意到了一点,一个URL请求但是左边栏里面为什么会有那么多的资源请求。
|
||
|
||
这个就是浏览器的功能,第一次请求url,服务器端返回的是html页面,然后浏览器开始渲染html,当解析到src里面的img资源、css资源、js资源,浏览器就会自动发起http请求,把需要的资源从服务器请求回来,然后浏览器就会宣布渲染出来,这样就是完整展现在我们面前的一个网页了。
|
||
|
||
>网页优化方面有一项是减少http请求次数,就是把尽量多的css和js合并在一起,尽量做到少的http请求。
|
||
|
||
## links
|
||
* [目录](<preface.md>)
|
||
* 上一节: [Web基础](<3.md>)
|
||
* 下一节: [GO搭建一个web服务器](<3.2.md>)
|
||
|
||
## LastModified
|
||
* $Id$
|