Session
在client-server协议(如HTTP)中,会话由三个阶段组成:
- 客户端建立TCP连接(或者如果传输层不是TCP,则为适当的连接)。
- 客户端发送它的请求,并等待答案。
- 服务器处理请求,发送回答,提供状态代码和适当的数据。
从HTTP/1.1开始,连接在完成第三阶段后不再关闭,并且客户端现在被授予进一步的请求:这意味着第二和第三阶段现在可以执行任意次数。
建立连接
在client-server协议中,它是建立连接的客户端。在HTTP中打开连接意味着在底层传输层中启动连接,通常这是TCP。
使用TCP时,计算机上的HTTP服务器的默认端口是端口80.也可以使用其他端口,例如8000或8080.要提取的页的URL包含域名和端口号,但如果是80,则后者可以省略。有关更多详细信息,请参阅识别Web上的资源。
注意:客户端 - 服务器模型不允许服务器在没有明确请求的情况下向客户端发送数据。要解决此问题,网页开发人员使用多种技术:通过定期ping服务器XMLHTTPRequest
,Fetch
API的使用HTML 的WebSockets API,或类似的协议。
发送客户请求
建立连接后,用户代理可以发送请求(用户代理通常是Web浏览器,但可以是其他任何内容,例如爬行器)。客户端请求由文本指令组成,由CRLF(回车符,后跟换行符)分隔,分为三个块:
- 第一行包含一个请求方法及其参数:
- 文档的路径,即没有协议或域名的绝对URL
- HTTP协议版本
- 后续行代表一个HTTP头,向服务器提供关于什么类型的数据是合适的(例如,什么语言,什么MIME类型)或改变其行为的其他数据(例如,如果已经被高速缓存则不发送答案)的信息。这些HTTP标题形成以空行结束的块。
- 最后的块是一个可选的数据块,它可能包含主要由POST方法使用的更多数据。
示例请求
获取developer.mozilla.org的根页面(即http://developer.mozilla.org/),并在可能的情况下告诉服务器用户代理程序将偏好法语页面:
GET / HTTP/1.1Host: developer.mozilla.org Accept-Language: fr
观察最后的空行,这将数据块从标题块中分离出来。由于没有Content-Length provided in an
HTTP标头,此数据块显示为空白,表示标头结束,允许服务器在收到此空行时处理请求。
例如,发送表单的结果:
POST /contact_form.php HTTP/1.1Host: developer.mozilla.org Content-Length: 64Content-Type: application/x-www-form-urlencoded name=Joe%20User&request=Send%20me%20one%20of%20your%20catalogue
请求方法
HTTP定义了一组请求方法,指示对资源执行的所需操作。尽管它们也可以是名词,但这些请求方法有时也被称为HTTP动词。最常见的要求是GET
和POST
:
GET
方法请求指定资源的数据表示。请求使用GET
只应检索数据。POST
方法将数据发送到服务器,以便它可以更改其状态。这是经常用于HTML表单的方法。
服务器响应的结构
连接的代理发送请求后,Web服务器处理它,最终返回响应。与客户端请求类似,服务器响应由文本指令形成,由CRLF分隔,但分为三个块:
- 第一行是状态行,包含对所使用的HTTP版本的确认,其后是状态请求(以及其可读文本中的简短含义)。
- 后续行代表特定的HTTP标头,给客户端发送的数据信息(例如,类型,数据大小,使用的压缩算法,关于缓存的提示)。与用于客户端请求的HTTP标头块类似,这些HTTP标头形成以空行结尾的块。
- 最后的块是一个数据块,其中包含可选数据。
示例响应
成功的网页回应:
HTTP/1.1 200 OK Date: Sat, 09 Oct 2010 14:28:02 GMT Server: Apache Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT ETag: "51142bc1-7449-479b075b2891b"Accept-Ranges: bytes Content-Length: 29769Content-Type: text/html<!DOCTYPE html... (here comes the 29769 bytes of the requested web page)
通知所请求的资源已永久移动:
HTTP/1.1 301 Moved Permanently Server: Apache/2.2.3 (Red Hat)Content-Type: text/html; charset=iso-8859-1Date: Sat, 09 Oct 2010 14:30:24 GMT Location: https://developer.mozilla.org/ (this is the new link to the resource; it is expected that the user-agent will fetch it)Keep-Alive: timeout=15, max=98Accept-Ranges: bytes Via: Moz-Cache-zlb05 Connection: Keep-Alive X-Cache-Info: caching X-Cache-Info: caching Content-Length: 325 (the content contains a default page to display if the user-agent is not able to follow the link)<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><html><head><title>301 Moved Permanently</title></head><body><h1>Moved Permanently</h1><p>The document has moved <a href="https://developer.mozilla.org/">here</a>.</p><hr><address>Apache/2.2.3 (Red Hat) Server at developer.mozilla.org Port 80</address></body></html>
通知所请求的资源不存在:
HTTP/1.1 404 Not Found Date: Sat, 09 Oct 2010 14:33:02 GMT Server: Apache Last-Modified: Tue, 01 May 2007 14:24:39 GMT ETag: "499fd34e-29ec-42f695ca96761;48fe7523cfcc1"Accept-Ranges: bytes Content-Length: 10732Content-Type: text/html<!DOCTYPE html... (contains a site-customized page helping the user to find the missing resource)
响应状态码
HTTP响应状态代码指示特定的HTTP请求是否已成功完成。响应分为五类:信息响应,成功响应,重定向,客户端错误和服务器错误。
200
: 好, 该请求已成功。301
:永久移动。该响应码意味着请求资源的URI已被更改。404
: 未找到。服务器找不到请求的资源。
另请参阅
- 识别Web上的资源
- HTTP标头
- HTTP请求方法