1.HTTP概述
场景:想象一下你是木叶村的火影,现在你想同砂忍村的风影建交。你必须指派一名忍者来传达建交文书,为确保文书的完好,你指派的忍者必须非常可靠,无论遇到多么危险的情况,都能准确完好地将文书传达到风影手里。这名忍者叫卡卡西,啊不,叫HTTP(数据传输协议)。
现在知道了吧,HTTP就是一个可靠的信使。即使你在北极,将数据传达到南极,HTTP也会完整地将数据传递过去。
在Web世界中,不是影和影的建交,而是客户端和服务器的交流。因此,HTTP就是这两只之间送信跑腿的。简单的流程就是:客户端指派一名HTTP,带着文书(报文)去服务器那提出请求,服务器处理请求后,又指派一名HTTP带着处理结果的文书(报文)回到客户端。
具象化就是:你在浏览器中(客户端)输入http://www.zhihu.com/index.html。翻译过来就是:你指派一个http,前去一个人称www.zhihu.com的影(服务器主机)那,要一个叫作index.html卷轴。如果成功了,这个影就会将这份卷轴的详细信息做出一个文书(报文),派一个HTTP送回到你的浏览器你中。
说一下资源,能产生内容的就是资源。资源可以是静态的文本,图片,视频,反正就是有用的东西。像上面的http://www.zhihu.com/index.html就是一个资源。
Web内容都是存储在Web服务器里的,而资源产生内容。因此Web服务器其实就是装各种资源的大金主啊。
对于每一个资源,当然应该要有名字来称呼它,否则怎么能精确地找出你想要的是哪个资源呢?所以,我们就有了URI(统一资源标识符),标识就是名字的意思。URI又有2这种格式,一种是根据位置定位来称呼的,比如小明家的地址是幸福街189-1号,你就可以用幸福街189-1号来定位小明家。第二种就直接了,直接用名字来命名。想找小明家就输入“小明家”。现在第一种比较普遍和常用,就是我们熟悉的网址(网络上的地址)来定位资源。格式就是
协议+主机名+端口+资源 #没设端口就用默认端口
http://www.zhihu.com/index.html #这里没设端口,就用默认端口
请求方法(客户端的命令)
身为客户端,当你派出一名HTTP去服务器那时,你不可能什么都不嘱咐的,你必须得告诉服务器你想要的是什么。你可以传达5种命令给服务器
- GET 获取数据
- POST 提交数据给服务器,用于表单
- PUT 创建或修改资源
- DELETE 删除资源
- HEAD 获取响应的首部
状态码(服务器的响应)
对于客户端的请求,服务器会做出处理结果,我们称为状态码。
状态码是一个三位数字的代码,告知客户端请求是否成功。
当然,每一个状态码后面会跟着一个原因短语,像:
200 ok
200 Success
报文
上面我们知道,HTTP只是个跑腿的信使,他传达的是他手里的文书,Web世界里叫报文。这些报文作为官方文书,当然要有一定的格式了。
MIME类型
MIME标记多媒体内容,什么图片啊,电影啊,视频啊,文字啊等等。
Web**服务器**会为所有的HTTP对象数据附加一个MIME类型。
意思是服务器的报文封面必须加上一个MIME类型。然后浏览器收到报文后,先看下封面的MIME类型,看看是否是自己需要的,是否是自己能处理的。
MIME印记格式
Content-type = 对象类型/子类型
如Content-type = image/jpeg
来学学各个印记的结印手法
- HTML文本: text/html
- ASCII纯文本: text/plain
- JPEG格式的图片: image/jpeg
- GIF格式的图片: image/gif
- Apple的QuickTime电影: video/quicktime
现在来看下报文的格式
对于客户端来讲
- 起始行:要做什么 (请求方法,资源名, HTTP版本)
- 首部:用户代理,主机,接受的格式,语言等
- 主体:可选的,主要是数据内容(GET不用)
对于服务器来讲
- 起始行:处理结果(HTTP版本, 状态码, 原因短语)
- 首部: MIME类型,长度等
- 主体:响应的数据内容
具体的实例可以自己去看
连接(TCP)
忘了一个很重要的事,上面提到我们有了可靠的信使HTTP能够准确地到达对方那,但是如何能让手中的报文准确地到达对方手里呢?就是说准确地让对方明白我的意思,不能误解我的含义。这时候聪明可靠的信使HTTP使用了一种叫作TCP的方式,他说一句,确认对方完全理解了,再说下一句。直到整个报文读完。这叫做面向连接,即TCP传输控制协议,重点在于“控制”。
我们上面举的例子是通过声音来连接交流的,即
我:你听到我说的话吗?
对方:听到了
我们就建立了连接。
下面是HTTP的方式,建立一个TCP/IP的连接
ADDR = (HOST, PORT) #获取对方的主机名和端口号
主机名端口号怎么获取?浏览器中的网址就包含了主机名和端口
http://www.zhihu.com/index.html
ww