主要内容:
- Web客户端与服务端是如何通信的
- HTTP报文格式
- 底层TCP网络传输
1.1 Web客户端和服务端
Web资源都是存储在Web服务器上的,因为Web服务器使用HTTP通信,以此也成为HTTP服务器。HTTP客户端发出HTTP请求,服务端会根据客户端传输的数据,作出HTTP响应发送请求的数据。如图 1-1 所示,HTTP客户端和HTTP服务端工作原理:
image.png
- Web服务器是Web资源的仓库,资源包含任意内容:文本文件、HTML文档、Word文件、图片、视频等。但是资源不一定非得是像前面提高的静态文件,也可以是根据Web应用程序生成的动态内容,比如数据库中里的数据。
- Web客户端,浏览器是一种我们经常使用到的Web客户端,其中还可以是手机原生应用、小程序等。也可以说能实现发送HTTP请求的程序都可以是Web客户端。
1.2 URI
每一个Web服务器资源都有一个名字,这样客户端才可以说明它想要的是什么资源。服务器资源名称被称为统一资源标识符(Uniform Resource Identifier, URI)。
- URI的一般格式:
<方案名称>:<分层部分>[? <查询参数>] [# <片段>]
统一资源定位符(URL)是资源标识符最常见的形式。如图 1-2 为URL实例:
1.3 HTTP报文
HTTP是一种请求-响应协议,HTTP报文是由一行一行的简单字符串组成的,都是纯文本,易读。HTTP报文格式:
- 起始行
报文的第一行,在请求报文中用来说明要做什么,在响应报文中说明出现了什么。 - 首部字段
起始行后面有零个或者多个首部字段。每个字段都包括一个名字和值。两者之间用冒号(:)分隔。首部以空行结束。 - 主体
空行之后就是可选的报文主体,其中包含了所有类型的数据。
HTTP报文实例:
- 请求报文
GET /index.html HTTP/1.0 起始行
Accept: text/* 首部
Accept-Language: en, fr
- 响应报文
HTTP/1.0 200 OK 起始行
Content-type: text/plain 首部
Content-length: 19
Hi, I am index 主体
1.4 事务
1.4.1 HTTP请求方法
请求方法是起始行中的第一个单词,指明了客户端要对资源进行的操作。
常见的HTTP方法:
- GET:命令服务器返回指定资源
- POST:命令服务器将报文主体中的数据传递给URI指定的资源。
- PUT:命令服务器将报文主体中的数据设置为URI指定的资源。
- DELETE:命令服务器删除URI指定资源
1.4.2 HTTP响应
HTTP响应报文是对HTTP请求报文的回复。跟HTTP请求报文一样,也是一些列的文本组成。
状态码:
- 1xx:情报状态码。
- 2xx: 成功状态码。
- 3xx:重定向状态码。
- 4xx:客户端错误状态码。
- 5xx:服务端错误状态码。
一个Telnet实例
GET /index.html HTTP/1.1
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Connection: Keep-Alive
Content-Length: 14615
Content-Type: text/html
Date: Mon, 19 Aug 2019 08:57:08 GMT
Etag: "5d54da0d-3917"
Last-Modified: Thu, 15 Aug 2019 04:05:33 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Pragma: no-cache
Server: BWS/1.1
Set-Cookie: BAIDUID=668FD107459E334256837E510A760274:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BIDUPSID=668FD107459E334256837E510A760274; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1566205028; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Vary: Accept-Encoding
X-Ua-Compatible: IE=Edge,chrome=1
<!DOCTYPE html><!--STATUS OK-->
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<link rel="dns-prefetch" href="//s1.bdstatic.com"/>
<link rel="dns-prefetch" href="//t1.baidu.com"/>
<link rel="dns-prefetch" href="//t2.baidu.com"/>
<link rel="dns-prefetch" href="//t3.baidu.com"/>
<link rel="dns-prefetch" href="//t10.baidu.com"/>
<link rel="dns-prefetch" href="//t11.baidu.com"/>
<link rel="dns-prefetch" href="//t12.baidu.com"/>
<link rel="dns-prefetch" href="//b1.bdstatic.com"/>
<title>百度一下,你就知道</title>
<link href="http://s1.bdstatic.com/r/www/cache/static/home/css/index.css" rel="stylesheet" type="text/css" />
<!--[if lte IE 8]><style index="index" >#content{height:480px\9}#m{top:260px\9}</style><![endif]-->
<!--[if IE 8]><style index="index" >#u1 a.mnav,#u1 a.mnav:visited{font-family:simsun}</style><![endif]-->
<script>var hashMatch = document.location.href.match(/#+(.*wd=[^&].+)/);if (hashMatch && hashMatch[0] && hashMatch[1]) {document.location.replace("http://"+location.host+"/s?"+hashMatch[1]);}var ns_c = function(){};</script>
<script>function h(obj){obj.style.behavior='url(#default#homepage)';var a = obj.setHomePage('//www.baidu.com/');}</script>
<noscript><meta http-equiv="refresh" content="0; url=/baidu.html?from=noscript"/></noscript>
<script>window._ASYNC_START=new Date().getTime();</script>
</head>
参考文献:
- 《HTTP权威指南》
网友评论