HTTP基础知识

来源:互联网 发布:数据标准化 人民银行 编辑:程序博客网 时间:2024/05/20 05:46
HTTP协议的全名是超文本传输协议(HyperText Transfer Perocol),是为了计算机能通过网络进行通信的的协议。HTTP协议是应用层的协议,在传输层使用TCP协议。

在HTTP中,就算你同一时间用脚本请求了很多次服务器,服务器也照样会返回你请求的数据,服务器表现的就如同忘了这次请求之前的所有请求一样。服务器向客户发送被请求的文件,而不存储任何关于客户的状态信息,所以HTTP协议被称为无状态协议。

在实际中,浏览器实现了HTTP的客户端,服务器实现了HTTP的服务器端。
HTTP是请求(Request)和应答(Response)的模型。客户端向服务器端发送请求,服务器端处理这个请求并返回合适的响应内容。
HTTP一次完整的通信的步骤:
1、HTTP是应用层协议,它的运输层是TCP协议,所以HTTP的客户端和服务器端要通过TCP连接。
    HTTP客户端首先发起一个到服务器端的TCP连接,HTTP的端口号默认是80。.一旦连接建立,客户端和服务器端将通过各自的套接字接口来访问TCP。
2、HTTP客户端向服务器端发送请求。
    HTTP客户通过套接字向服务器端发送一个HTTP请求报文,请求报文包括请求方式和请求内容,头信息等内容。(报文格式随后再说)
3、HTTP服务器端响应并回复。
    HTTP服务器端通过套接字接收请求报文,从自身的存储器中找寻请求的内容并处理。然后服务器端会向客户端发送自己的响应报文。响应报文包括HTTP/1.1 200 OK这样的初始状态行,和客户端请求的内容。
4、HTTP服务器端通知TCP断开连接。
    在服务器端向客户端发送了内容之后,就会关闭TCP连接。但是TCP作为低层协议,要保证HTTP客户完整的接收到响应内容为止,才会关闭(这种是非持续连接方式,而另一种持续连接将会在继续等待一段时间,确认没有通信了,才会关闭)。


在通信第一个阶段,有一个好久之前就听过的概念,三次握手。第一次握手是客户向服务器发送一个TCP报文段,第二次是服务器用一个TCP报文段做出确认和响应,第三次握手是客户的确认,在这次确认中,客户把确认请求连同请求报文一并发送。


HTTP请求报文的格式:
    GET /some/index.html HTTP/1.1
    HOST:www.some.com
    Connection:close
    User-Agent:Mozilla/5.0
    Accept-Language:zh-cn
    Accept-Encoding:gzip

请求报文的每一行都是由一个回车换行符结束的,结尾更是再加一个回车换行符。
报文的第一行叫做请求行,后边的叫首部行。
请求行有三个部分,第一个是请求方式,例子中是GET,还有更多方式。使用GET方式时,第二个URL部分,就是GET请求的对象。第三个时HTTP协议的版本,例子中是1.1。
首部行的功能就多了,HOST是请求对象所在的主机。Connection表明所用连接方式,如果是close表明用的是非持续连接,如果是Keep-Alive就是持续连接。User-Agent是客户端浏览器的类型,这个浏览器类型可以方便服务器为不同类型的客户发送相同对象的不同版本。Accept-Language是客户希望响应内容语言版本,如果服务器端有这种语言版本的,就发送,没有的话,发送服务器的默认版本。Accept-Encoding是浏览器支持的编码类型。
在请求报文结束后一个空行后面是实体体,GET方法没有实体,如果是POST方法,在空行后还有实体主体,
例如大批量数据、标准输入的内容。

HTTP响应报文的格式:
    HTTP/1.1 200 OK
    Connection: close
    Date:Tue, 09 Aug 2012 12:34:56 GMT
    Server: Apche/2.4.2(Centos)
    Last-Modified: Tue, 09 Aug 12:12:12 GMT
    Content-Length: 1234
    Content-Type: text/html

<html>
....
</html>

HTTP响应报文的第一行叫初始状态行,随后是首部行,一个空行后的是实体体。
初始状态行第一部分是HTTP协议版本,例子中是1.1。第二部分是状态码,例子中是200(成功)。第三部分是应状态信息,OK表示一切正常,服务器已成功返回客户请求的内容。
Connection:close表示服务器将在发送完报文后,关闭TCP连接。Date表示发送报文的时间点。Server表示服务器是一台apache2.4.2版本的WEB服务器。Last-Modified表示请求对象在服务器端创建或者修改的最后日期。最下面两个表示请求对象的字节数,请求对象的类型是html文本。



持续连接和非持续连接指的是TCP连接方式。
关于状态码,以下是几个常见的:
    200 OK:表示一切正常,请求对象已返回。
    301 Moved Permanently:请求对象被永久转移(字面意义)。也叫跳转,客户将自动获取新的URL。
    400 Bad Request:客户端请求有错误,服务器不能理解。
    401 Unauthorized :请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
    403 Forbidden: 服务器收到请求,但是拒绝提供服务
    404 Not Found: 请求资源不在服务器上,eg:输入了错误的URL
    500 Internal Server Error:服务器发生不可预期的错误
    503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。
    505 HTTP Version Not Supported: 服务器不支持请求报文的HTTP版本。


关于常见的请求方式:
    GET: 该方法通过请求URL获得资源,现在有在GET方法中添加参数,例如www.some.com/xxx?page=1&key=2 这样的扩展URL。
    POST: 该方法用于向服务器提交内容,如表单。
    PUT:修改内容,如允许客户上传内容到服务器指定目录。
    HEAD: 与GET方法类似,但是服务器不返回请求内容,只返回一个HTTP响应报文。
    DELETE: 用于删除服务器上的对象。


参考书籍:《计算机网络自顶向下方法》。


0 0