• HTTP协议(一)


    HTTP协议(一)

    1. 概述


    HTTP协议叫超文本传输协议(Hyper Text Transfer Protocol),定义了客户端与服务器之间的对话(数据传输)。

    特点

    • HTTP协议是计算机网络中的应用层协议,其传输通过TCP/IP进行的。
    • HTTP协议默认端口为80。
    • HTTP允许传输任意类型的数据对象,正在传输的类型由Content-Type加以标记。
    • HTTP协议为无状态协议。无状态是指协议对于事务处理没有记忆能力,也就是说每次传输都是独立的。

    HTTP一次工作流程
    客户端从服务器的每一个请求,都有4个步骤:

    1. 客户端通过URL与服务器建立一个TCP连接。
    2. 客户端向服务器发送一个请求(Request),请求指定路径上的资源。这个请求包括请求行、请求头部、空行、请求正文(可选)。
    3. 服务器接受请求后处理请求,给予一个响应(Response)。这个响应包括状态行、响应头部、空行、响应正文(或错误信息)。
    4. 服务器关闭该连接。

    上诉步骤在HTTP 1.1及其以后版本中,可通过Connection: keep-alive设置长连接(默认),也就是说通过一个TCP连接连续发送多个请求和响应(2、3步骤可以反复多次)。这要做有良好的扩展性,但也对服务器的性能有较大压力,所以一般服务器会有TCP连接时间限制。

    2. HTTP之请求Request


    每个响应基本形式:一个请求行、一个请求头部、一个空行、请求正文(可选)。

    自己使用Wireshark抓的访问学校官网首页的一个HTTP Request包,该包为GET请求不包括请求正文,所以请求以空行结束。(注: 代表回车符   代表换行符   一般表示另起一行的意思。)

    GET / HTTP/1.1
    
    Host: www.cuit.edu.cn
    
    Connection: keep-alive
    
    Cache-Control: max-age=
    
    Upgrade-Insecure-Requests: 1
    
    User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
    
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    
    Accept-Encoding: gzip, deflate, sdch
    
    Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.r
    

    自己使用Wireshark抓的登录学校教务处的一个HTTP Request包:

    POST /Login/xLogin/Login.asp HTTP/1.1
    
    Host: 210.41.224.117
    
    Connection: keep-alive
    
    Cache-Control: max-age=0
    
    Origin: http://210.41.224.117
    
    Upgrade-Insecure-Requests: 1
    
    User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
    
    Content-Type: application/x-www-form-urlencoded
    
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/web;p,*/*;q=0.8
    
    Referer: http://210.41.224.117/Login/xLogin/Login.asp
    
    Accept-Encoding: gzip, deflate
    
    Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4
    
    Cookie: ....
    
    
    WinW=1920&WinH=1040&txtId=2014081054&txtMM=MAza3010&verifycode=63fc&codeKey=537014&Login=Check&IbtnEnter.x=53&IbtnEnter.y=46

    第一部分(第一行):请求行

    包括请求方法,请求资源路径(URL)以及HTTP的版本。

    第二部分:请求头部
    除Host其他都非必须,具体看下面

    第三部分:空行

    第四部分:请求正文
    POST、PUT等请求方法时,一般有请求正文。GET一般没有请求正文,GET请求方法一般通过查询参数或路径变量获取数据。

    3. HTTP之响应Response


    每个请求基本形式:一个响应行、一个响应头部、一个空行、响应正文(可选)。

    上面学校官网的HTTP Response包

    HTTP/1.1 200 OK
    
    Cache-Control: private
    
    Content-Encoding: gzip
    
    Content-Length: 6584
    
    Content-Type: text/html; charset=utf-8
    
    Date: Wed, 12 Apr 2017 07:44:05 GMT
    
    Server: Microsoft-IIS/7.5
    
    Vary: Accept-Encoding
    
    X-AspNet-Version: 4.0.30319
    
    X-Powered-By: ASP.NET
    
    
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    ...
    </head>
    </html>

    第一部分(第一行):响应行
    包括HTTP协议版本,状态(结果)码,简单文本描述。

    第二部分:响应头部
    具体表述请看下面

    第三部分:空行

    第四部分:响应正文
    服务器会根据请求资源响应(回复)不同的数据。

    3. HTTP常见的请求头


    Host:(发送请求时,该头域是必需的)主要用于指定被请求资源的Internet主机和端口号(默认80),它通常从HTTP URL中提取出来的。上面Host: www.cuit.edu.cn,使用了默认的端口80。

    Connection:服务器与客户端TCP连接状态。keep-alive表示保持连接,close表示关闭连接。

    Cache-Control:指定请求和响应遵循的缓存机制。请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage。

    • Cache-Control:Public 可以被任何缓存所缓存
    • Cache-Control:Private 内容只缓存到私有缓存中
    • Cache-Control:no-cache 所有内容都不会被缓存
    • Cache-Control:no-store 用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
    • Cache-Control:max-age 指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
    • Cache-Control:min-fresh 指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
    • Cache-Control:max-stale 指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

    Accept:客户端可以接受的MIME类型。text/html表示html数据类型,application/xml表示xml数据类型,application/json表示JSON数据类型等等,其中text/*表示人可读文字、application/*表示二进制数据、image/*表示图片。具体可看:MIME

    Accept-Encoding:浏览器申明自己可接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate);Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。

    Accept-Language:浏览器申明自己接收的语言。

    Accept-Charset:浏览器可接受的字符集。如果在请求消息中没有设置这个域,缺省表示任何字符集都可以接受。

    User-Agent:告诉HTTP服务器,客户端使用的操作系统和浏览器的名称和版本。

    Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的,比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。

    Cookie:最重要的请求头之一, 将cookie的值发送给HTTP服务器。

    Content-Type:请求对象的类型和字符集。如:application/x-www-form-urlencoded; charset=UTF-8。具体可看:HTTP Content-Type对照表

    Content-Length:表示请求消息正文的长度。

    X-Request-With: XMLHttpRequest 表示异步Ajax请求。

    上面只是列出来一部分,具体可看:HTTP请求头

    4. HTTP常见的响应头


    Date:表示消息发送的时间,时间的描述格式由rfc822定义。例如,Date:Mon,31Dec200104:25:57GMT。

    Set-Cookie:非常重要的header, 用于把cookie发送到客户端浏览器,每一个写入cookie都会生成一个Set-Cookie。例如: Set-Cookie: sc=4c31523a; path=/; domain=.acookie.taobao.com

    Content-Type:服务器告诉客户端自己响应的对象的类型和字符集。与请求中Accept字段类似。

    Content-Length:指明响应正文的长度,以字节方式存储的十进制数字来表示。

    Content-Encoding:WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。

    Location:用于重定向一个新的位置,包含新的URL地址。表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。Location响应报头域常用在更换域名的时候。

    Server:指明HTTP服务器用来处理请求的软件信息。

    5.HTTP常见响应码


    1xx:指示信息--表示请求已接收,继续处理
    2xx:成功--表示请求已被成功接收、理解、接受
    3xx:重定向--要完成请求必须进行更进一步的操作
    4xx:客户端错误--请求有语法错误或请求无法实现
    5xx:服务器端错误--服务器未能实现合法的请求

    常见状态码

    状态码与简单描述具体描述
    200 OK 客户端请求成功
    302 FOUND

    临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI。

    不是好懂其说法,反正Servlet的HttpServletResponse.sendRediret()方法就是返回302 FOUND,重定向位置为Resonse Headers 中Location字段所对应的值。

    400 Bad Request 客户端请求有语法错误,不能被服务器所理解。如:服务端需要数据,但其没有传数据过去
    401 Unauthorized 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
    403 Forbidden 服务器收到请求,但是拒绝提供服务。如:用户权限不足时
    404 Not Found 请求资源不存在。如:输入了错误的URL
    405 Method Not Allowed 客户端请求中的方法被禁止。
    500 Internal Server Error 服务器发生不可预期的错误
    503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常

    跟多的状态码,详见 HTTP状态码

    6.References


    http://www.jianshu.com/p/80e25cb1d81a
    http://www.cnblogs.com/EricaMIN1987_IT/p/3837436.html

  • 相关阅读:
    Java搭建邮件服务器并发送Excel附件
    Java发送Http带HEADER参数
    MySql 技术内幕 (查询处理和子查询)
    《MySQL技术内幕:SQL编程》笔记
    MySql 技术内幕 (数据类型)
    替换Jar包里文件
    [Python数据分析]新股破板买入,赚钱几率如何?
    一些资料
    sqlval
    IBM CLI 和 ODBC
  • 原文地址:https://www.cnblogs.com/maying3010/p/6699861.html
Copyright © 2020-2023  润新知