Files
build-web-application-with-…/3.1.md
2012-09-04 18:10:34 +08:00

63 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#3.1 Web工作方式
我们平时浏览网页的时候,都是怎么样的一个过程呢?打开浏览器,输入网页,然后就出来了内容。那么这个底层到底做了一些什么东西?
这个过程技术上其实可以这样来描述浏览器是一个客户端然后URL定位服务器的位置(URL域名通过DNS解析回来服务器所在的IP)然后底层通过http协议与服务器之间进行通信。
![](images/3.1.web2.png?raw=true)
一个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-text服务器发送信息的类型
date发送时间
server服务器类型
- 消息体:服务器发送给客户端的页面内容
![](images/3.1.web.png?raw=true)
上面这张图我们可以了解到整个的通讯过程同时细心的读者是否注意到了一点一个URL请求但是左边栏里面为什么会有那么多的资源请求。
这个就是浏览器的功能第一次请求url服务器端返回的是html页面然后浏览器开始渲染html让解析到img里面的src资源、css资源、js资源浏览器就会自动发起http请求把需要的资源从服务器请求回来然后浏览器就会宣布渲染出来这样就是完整展现在我们面前的一个网页了。
所以我们做的网页在优化方面有一项是减少http请求次数就是把尽量多的css和js合并在一起尽量做到少的http请求。
## links
* [目录](<preface.md>)
* 上一节: [Web基础](<3.md>)
* 下一节: [GO搭建一个web服务器](<3.2.md>)
## LastModified
* $Id$