zoukankan      html  css  js  c++  java
  • Network | HTTP protocol

    版本

    HTTP/1.0
    这是第一个在通讯中指定版本号的HTTP协议版本,至今仍被广泛采用,特别是在代理服务器中。

    HTTP/1.1
    当前版本。持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式在同时发送多个请求,以便降低线路负载,提高传输速度。

    HTTP/1.1相较于HTTP/1.0协议的区别主要体现在:

    • 缓存处理
    • 带宽优化及网络连接的使用
    • 错误通知的管理
    • 消息在网络中的发送
    • 互联网地址的维护
    • 安全性及完整性

    现在在HTTP 1.1使用持续连接,不必为每个web对象创建一个新的连接,一个连接可以传送多个对象。HTTP管道允许客户在上一个回应被收到前发送多重请求从而进一步减少了延迟时间。另一项协议的改进是byte serving(字节服务),允许服务器根据客户的请求仅仅传输资源的一部分。

    在HTTP1.0,单一TCP连接内仅执行一个“客户端发送请求—服务器发送应答”周期,之后释放TCP连接。在HTTP1.1优化支持持续活跃连接:客户端连续多次发送请求、接收应答;批量多请求时,同一TCP连接在活跃(Keep-Live)间期内复用,避免重复TCP初始握手活动,减少网络负荷和响应周期。此外支持应答到达前继续发送请求(通常是两个),称为“流线化”(stream)。

    状态码

    • 1xx消息Information——请求已被服务器接收,继续处理
    • 2xx成功Success——请求已成功被服务器接收、理解、并接受
    • 3xx重定向Redirection——需要后续操作才能完成这一请求
    • 4xx请求错误Client error——请求含有词法错误或者无法被执行
    • 5xx服务器错误Server error——服务器在处理某个正确请求时发生错误

    请求信息

    发出的请求信息包括以下几个

    请求行A request line
    例如GET /images/logo.gif HTTP/1.1,表示从/images目录下请求logo.gif这个文件。
    请求头Request Headers
    例如Accept-Language: en
    空行
    其他消息体
    请求行和标题必须以<CR><LF>作为结尾。空行内必须只有<CR><LF>而无其他空格。在HTTP/1.1协议中,所有的请求头,除Host外,都是可选的。

    HTTPS

    与HTTP的URL由“http://”起始且默认使用端口80不同,HTTPS的URL由“https://”起始且默认使用端口443。

    HTTP是不安全的,且攻击者通过监听和中间人攻击等手段,可以获取网站帐户和敏感信息等。HTTPS被设计为可防止前述攻击,并(在没有使用旧版本的SSL时)被认为是安全的。

    TTP协议和安全协议同属于应用层(OSI模型的最高层),具体来讲,安全协议工作在HTTP之下,运输层之上:安全协议向运行HTTP的进程提供一个类似于TCP的套接字,供进程向其中注入报文,安全协议将报文加密并注入运输层套接字;或是从运输层获取加密报文,解密后交给对应的进程。严格地讲,HTTPS并不是一个单独的协议,而是对工作在一加密连接(TLS或SSL)上的常规HTTP协议的称呼。

    HTTPS报文中的任何东西都被加密,包括所有报头和荷载。除了可能的选择密文攻击之外,一个攻击者所能知道的只有在两者之间有一连接这一事实。

    关于安全

    HTTP 1.1 一共有 8 种方法(methods):OPTIONS、HEAD、GET、POST、PUT、DELETE、TRACE、CONNECT。其中我们常用的主要是 GET 和 POST。

    这里有两个概念:安全方法(safe methods)以及幂等方法(idempotent methods)。

    首先 GET 是「安全」的而 POST 不是。安全方法仅仅获取资源而不进行任何其他操作。然而有些服务生成的动态内容会因 GET 而变,比如在搜索引擎多次访问同一个搜索结果条目可能导致它在后续的搜索中排序提升。但这里的所谓安全是对于请求发起者而言,他并不主动期待这样的变化,而是单纯地获取资源。

    而幂等是说,这个方法执行多次和执行一次的效果是一样的。显然 GET 是幂等的,因为除了获取资源什么都不会做;POST 则是像服务器提交数据请求处理,可能导致修改或者创建资源,所以是非幂等的。

    所以你要在 GET 和 POST 之间做选择的话,一个简单的方法是,问问自己:这个操作的目的是使得服务器上的资源或数据发生变更吗?是的话,就用 POST 吧;否则就应该是 GET。

    好好看看Rest和Restful的概念就能知道get和post的应用场景有什么不同了。
    1.get表示请求不会对后台数据库进行任何变更,post则存在持久化操作。
    2.get具有幂等性,也就是说在你使用post改变同一数据前,无论用get请求多少次,说得的结果都一样。
    3.get“提醒”浏览器对你的http请求及服务器的响应进行缓存。
    4.get的数据放在http头中,所以有大小限制,参考stackoverflow,不过浏览器都不一样,没有明显规定。而post的数据放在http包体。
    5.至于安全性我觉得get和post仅仅只是是否能从URL看出来的区别而已。真正要安全最好上SSL。

    GET 的参数处于query string,而POST的参数处于body,这意味着更多的传输和处理开销(如果不设client_max_body_size,可能还有被DOS的风险)。对于淘宝这样海量请求的服务来说,这点优化是必须的。

    方法

    OPTIONS: 允许客户端查看服务器的性能。
    TRACE: 请求服务器在响应中的实体主体部分返回所得到的内容。
    GET: 请求指定的页面信息,并返回实体主体。
    HEAD: 只请求页面的首部。
    POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体。

    PATCH:请求修改局部数据

    像HEAD、GET、OPTIONS 和 TRACE这几种http方法是被认为是“安全的”, 这意味着它们只会进行获取数据而不会修改服务器的状态, 换句话说,它们不会产生负面影响, 当然除了常见的无害操作,比如记录日志、创建缓存或者创建其他统计信息。
    正相反, 像POST、PUT、DELETE 和 PATCH 等方法是有可能产生副作用。网络爬虫等一般不会使用这些方式(笔者注:搜索引擎的暗网抓取可能会使用这些方法)。
    尽管GET方法是一般被视为“安全的”,但如果在实际使用中没有做任何设置,比如可以无限制的抓取等情况, 也会导致一些不可预料的问题,比如web缓存或者搜索引擎问题。

  • 相关阅读:
    python xml dom
    python ::-1
    SigmoidCrossEntropyLoss
    pyplot
    注意mysql connector的版本
    caffe学习资料
    mysql中添加中文存储和显示功能
    centos7.3 安装cuda8.0的 坑
    Tree Widget -- 基本方法
    QLabel的使用
  • 原文地址:https://www.cnblogs.com/linyx/p/3746649.html
Copyright © 2011-2022 走看看