zoukankan      html  css  js  c++  java
  • 网络基础-->http协议

    URL(Uniform Resource Locator)

     基本格式

    schema://host[:port]/path[;parameters][?query-string][#anchor]
    
    schema->指明使用哪种网络传输协议(http.https.ftp,file等)
    
    host->服务器域名或者具体的IP地址,就好比一个大局域网的主机名一样。
    可以在host名前加入登陆账号和密码(格式:username:password@host)
    
    port->传输端口号,当默认为80时,可以省略。
    
    
    path->要访问的主机目录或文件地址,就如同访问一个具体路径一样。(a/b/c.txt)
    
    parameters->可选的特殊参数
    
    query-string->传递给主机的参数,参数使用"a=1"格式,多个参数使用"&"分隔
    
    anchor->锚,就是一个子链接,指定到访问文件的固定位置。
    

    举个栗子:

    https://zh.wikipedia.org/wiki/超文本传输协议#0.9  

    schema->https

    host->zh.wikipedia.org

    path->/wiki/超文本传输协议

    anchor->0.9

    通信方式

    简单点说就是一个消息机制。

    1、客户端发送请求。

    2、服务器根据请求的类型而返回不同的数据。

    3、客户端解析服务器返回数据而做出相应的显示。

    注意:请求都是无状态的(服务器并不知道客户端当前处于什么状态),一次请求交互就意味着一次通信完成,客户端与服务器可以断开连接。

    所以一般形成一个完善的网页显示,需要发送多次请求。

    消息结构

    请求消息结构

    由4部分组成:

    1、请求行

    格式:method[空格]/path[空格]HTTP/version

    2、请求头

    用于表明请求的配置参数

    3、换行

    4、请求体

    请求具体的信息参数 

    响应消息结构

    1、响应行(状态行)

    格式:HTTP/version[空格]status code[空格]message

    2、响应头

    表明响应的配置参数

    3、换行

    4、响应体

    响应的具体信息

    关于请求消息结构

    请求行

    method

    请求的方法,有如下几种:(大写)

    OPTIONS:使服务器返回当前资源所支持的所有请求方法,可以用于测试服务器是否正常。

    GET:既”显示“请求,用于向服务器请求数据。

    HEAD:与GET方法一样,也是请求数据,但是服务器不会回传资源的文本部分。这个可以用于仅仅获取资源的元信息。

    POST:向服务器提交修改后的数据,数据包含在请求文本中,服务器将存储数据。

    PUT:向服务器上传其增加的内容

    DELETE:请求服务器删除Request-URI所标识的资源。

    TRACE:回显服务器所受到的请求,用于测试。

    CONNECT:将连接改为管道方式,通常用于SSL加密服务器连接

    path

    此path即为

    host[:port]/path[;parameters][?query-string][#anchor]

    HTTP/version

    其中”HTTP/“是固定字符,version即为http的协议版本,常用的有:HTTP/1.0,HTTP/1.1,HTTP/2

    请求头

    请求头由多个域组成,常见的有:

    cache

    If-Modified-Since:时间  (检查是否有更新的页面)

    将客户端缓存页面的最后修改时间发送到服务器,服务器与对应文件修改时间相比,若时间一致则会返回304,否则返回200和新文件内容。

    If-None-Match:ETag值   (检查资源是否更新)

    将上次从服务器获取的ETag值发送,服务器与当前的ETag值对比,若没有改变则返回304,否则返回200和新的资源以及ETag。

    说明:ETag与If-Modified-Since目的相同,都是为了检查本地缓存是否需要更新,但是ETag值更优于时间表示法。比如文件仅仅时间

    改变了,但是内容没有改变。等等...ETag是实体内容所生成的值,所以更加准确。

    Pragma:no-cache (防止页面被缓存)

    Cache-Control:缓存机制

    缓存机制有:

    1、Public 可以被任何缓存所缓存(多用户共享)

    2、Private 内容只缓存到私有缓存中(指定单用户使用)

    3、no-cache 所有内容都不会被缓存

    client

    Accept:类型  (表明客户端可以接受的媒体类型)

    比如:Accept:text/html

    Accept-Encoding:类型 (表明可以接收的压缩编码方法)

    比如:Accept-Encoding: gzip, deflate, br

    说明:通过压缩可以减少网络传输的数据量,常用解码:

    gzip   ---->GNU zip编码

    compress --->Unix的文件压缩程序

    deflate  --->zlib的格式压缩的

    identity -->没有对实体进行编码。当没有Content-Encoding header时, 就默认为这种情况

    gzip, compress, deflate  -->无损压缩算法,用于减少传输报文的大小,不会导致信息损失。

    Accept-Language:类型 (表明可接收的语言编码)

    比如:Accept-Language: zh-CN,zh;q=0.8

    User-Agent: 名称 (表明客户端使用的浏览器信息和系统信息)

    比如:User-Agent: Chrome WIN 51.0.2704.103 (aa7c8d23c098e96a388ffedf6698230bda650bb3-refs/branch-heads/2704@{#723}) channel(stable)

    entity

    Content-Length:数值 (请求体的长度,十进制表示)

    也就是实际发送内容长度,没有前3部分。

    Content-Type:类型  (数据类型)

    比如:Content-Type: text/plain;charset=UTF-8

    miscellaneous

    Referer:信息 (告知从哪个链接过来的)

    比如:Referer: https://www.google.com.hk/

    transport

    Connection:类型 (表明客户端和服务器的连接方式)

    比如:Connection: keep-alive

    表示客户端和服务器之间的TCP连接不会关闭。

    Host:主机和端口号 (指明服务器地址及端口号)

    关于响应消息结构

    响应行(状态行)

    HTTP/version

    与请求行意义一样,代表协议版本号。

    status code

    状态码,用于告知客户端此时服务器返回状态是否正常。有如下几类:

    1xx(提示信息):请求已被服务器接收,继续处理

    2xx(成功):请求已成功被服务器接收、理解、并接受。

    3xx(重定向):需要后续操作才能完成这一请求。

    4xx(客户端错误):请求含有词法错误或无法被执行

    5xx(服务器错误):服务器在处理某个正确请求时发生错误。

    message

    状态消息,是对状态码更加详细的解析。常见的状态码及消息:

    200 OK

    代表响应成功,请求的资源发送至客户端。

    302 Found

    重定向,代表新的url会在响应消息的Location中返回,然后客户端会使用这个新的url再次发送请求消息,最终得到正确的网页。

    比如输入"www.google.com",最终会定位到"www.google.com.hk"

    304 Not Modified

    代表上次的文档已经被缓存,可以继续使用。

    400 Bad Request

    客户端请求与语法错误,不能被服务器所理解

    403 Forbidden

    服务器收到请求,但是拒绝提供服务

    404 Not Found

    url指定资源不存在

    500 Internal Server Error

    服务器发生了不可预期的错误

    503 Server Unavailable

    服务器当前不能处理客户端的请求,一段时间后可能恢复正常

    响应头

    cache

    Date:时间 (生成消息的时间)

    比如:Date: Thu, 28 Jul 2016 03:34:31 GMT

    Expires:时间 (浏览器会过期时间内使用本地缓存)

    比如:Expires: Thu, 28 Jul 2016 03:34:58 GMT

    Vary:变化

    比如:Vary: Accept-Encoding

    cookie/login

    Set-Cookie:  (每写入一个cookie都会生成一个set-cookie)

    比如:Set-Cookie: SERVERID=9ffd301069c1081a14d128e0c97deda8|1469676872|1469672968;Path=/

    说明:cookie是一小段文本,用户保存一些用户信息(没有用户密码等重要信息,一般是使用习惯等),算是对用户状态的一种维持机制。

    就好比自动登陆网站一样,保存用户自动登陆设置,所以用ccleaner清除cookie后,很多网站需要设置重新登陆。

    entity

    ETag:数值 (与请求的If-None-Match 配合使用)

    Last-Modified:时间 (最后修改的时间,可与请求的If-Modified-Since配合使用)

    Content-Type:类型 (告诉客户端,对象的类型及字符集)

    Content-Length:数值 (正文的长度)

    不包括前3部分

    Content-Encoding:方法 (压缩方法)

    Content-Language:语言 (使用的语言)

    miscellaneous

    Server:信息 (指明服务器软件信息)

    比如:Server: Tengine

    transport

    Connection:类型 (表明客户端和服务器的连接方式)

    比如:Connection: keep-alive

    表示客户端和服务器之间的TCP连接不会关闭。

    代理服务器

    代理服务器位于web服务器和web客户端之间的服务器,请求和响应都会通过代理服务器。

    代理服务器可以对请求及响应数据进行处理,所以可以:

    1、科学上网

    2、匿名访问

    3、代理缓存,加快上网速度

    4、对某些内容指定屏蔽

  • 相关阅读:
    ReactNative 适合初学的第一个教程demo,找租房
    ReactNative 从环境和第一个demo说起,填坑教程
    WKWebView与JS交互,UIWebView+JavascriptCore和JS交互
    JS中匿名函数$(function(){ })和(function(){})()的区别
    对前端的一个H5项目的所思所想
    使用Swift打造动态库SDK和DemoAPP时所遇到的(Xcode7.3)
    Git 分支合并代码
    Flutter中fluro使用
    flutter_redux框架的使用
    解决React-native init 初始化时 info Installing required CocoaPods dependencies
  • 原文地址:https://www.cnblogs.com/KcMeterCEC/p/5713196.html
Copyright © 2011-2022 走看看