首选要找到Http协议是基于Tcp/ip协议的,那么我们就需要一个到Tcp/ip层的API,就是socket。要建立socket连接(IP地址和端口号),就要对URL进行域名解析,我们本地主机配置网络会填写一个DNS,本机会把url发给这个DNS服务器,如果服务器找不到这个url对应的IP地址和端口号的话,就从上级发送,直到发送到根服务器得到结果。
现在请求连接建立成功了,给web服务器发送请求,操作方式有GET和POSE。
web服务器接受这个请求后,会在文档空间里面搜索,如果找到后,发送Http信息给web浏览器,格式如下:
常用的HTTP头信息有:
① HTTP 1.0 200 OK 这是Web服务器应答的第一行,列出服务器正在运行的HTTP版本号和应答代码。代码"200 OK"表示请求完成。
② MIME_Version:1.0 它指示MIME类型的版本。
③ content_type:类型 这个头信息非常重要,它指示HTTP体信息的MIME类型。如:content_type:text/html指示传送的数据是HTML文档。
④ content_length:长度值 它指示HTTP体信息的长度(字节)。
这里再贴一下常用的Http状态码:
- 200 OK:客户端请求成功。
- 304:请求资源没有被修改
- 400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
- 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
- 403 Forbidden:服务器收到请求,但是拒绝提供服务。
- 404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
- 500 Internal Server Error:服务器发生不可预期的错误。
- 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,举个例子:HTTP/1.1 200 OK(CRLF)。
1XXX:消息
2XXX:成功
3XXX:重定向
4XXX:请求错误
5XXX:服务器错误
应答完毕后,最后是服务器与浏览器断开连接,为了保证其他浏览器能与web服务器建立连接。
浏览器缓存,之前与web服务器建立连接时,浏览器接受到这些信息后会将信息保存在本地目录里面。如果有cookie信息的话也会保存下来。
第二次请求时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 与 If-None-Match 报头,
这两个报头实际上是第一次请求时服务器返回的Last-Modified,Etag.发送这两个报头目地是询问服务器,该资源在时间内有没有被修改过.
如果该资源未被修改,则服务器会直接返回HTTP 304 (Not Changed.)状态码,内容为空,此时不会下载资源,浏览器则自动从缓存目录中读取资源.
使用Last-Modified/Etag 可以减少传输成本,但不会减少http请求
如果给文件加上关于过期时间(Expires)的header报文,这样浏览器就会先检查缓存中的文件,如果没有过期,就直接使用缓存中的文件,从而不会发送http请求.