zoukankan      html  css  js  c++  java
  • Http 协议详解

    什么是http协议

    超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的RFC,其中著名的RFC 2616定义了HTTP 1.1。(百度百科)

    http 特性

    • HTTP 协议构建于 TCP/IP 协议之上,是一个应用层协议,默认端口号是 80
    • HTTP 是无连接无状态的

    既然http是基于tcp协议的那么简单说一下Tcp协议

    • TCP 提供一种面向连接的、字节流服务,也就是说长连接,具体可以参考一下聊天室
    • TCP 使用校验和,确认和重传机制来保证可靠传输
    同时tcp并不能百分百的保证数据一定会被接收,tcp会把对方能接收的数据发送给接收方,不能接收的数据会被放弃传输,并且通知发送方

    三次握手与四次挥手

    这个标题相比都不陌生,经常见到,but我之前并不太懂,写之前补了一下基础,如有解释不到位的,希望能指出来

    三次握手指的是在建立一个tcp连接的时候,客户端和服务端之间一共要发送三个包,其目的就是连接服务器指定的端口建立tcp连接,同步双方的序列号和确认号,交换tcp窗口大小信息。

    说的通俗一点,举个栗子

    你正在专心直至的打游戏,然后又朋友叫了你一声,并引起了你的注意,这说明你们建立了沟通,也就是第一次握手成功,如果说你没有听到朋友喊你,那么沟通失败,你朋友没有继续屌你

    在引起你的注意之后,你发现朋友给了你一个苹果,但是你并不想要这个苹果,继续打游戏,那么第二次沟通失败,如果你的朋友跟你说 他玩游戏技术很厉害,要和你一起打游戏,你欣然地接收了他,做出了回应,那么这就等于是第二次握手成功

    那么最后,你兴致勃勃的掏出手机要和朋友pk的时候发现手机没电了,朋友见状没有办法继续下去了就走了,那么第三次沟通失败,如果一切顺利,你可以和朋友一起打游戏,那么就是说第三次握手成功,
    那么接下来你们就可以愉快的玩耍了

    具体如图

    四次挥手指的是在关闭一个tcp连接的时候发送的四个包

    大概流程请继续上边这个故事,就是说你朋友有事不想和你玩了,然后她跟你说了他要撤了,这是第一次挥手

    然后你瞅了她一眼,表示你已经知道了,但是没打完游戏想等会,这是第二次挥手。

    然后等游戏打完了,你跟他说你可以撤了,这是第三次挥手。

    然后你朋友得到你的示意之后,她告诉你他走了,并且把门给你关上了,这是第四次挥手

    直观的看一下什么叫做长连接,放一个node的demo,具体代码如下

    const net = require('net');
    const server = net.createServer((c) => {
      // 'connection' 监听器。
      console.log('客户端已连接');
      c.on('end', () => {
        console.log('客户端已断开连接');
      });
      c.setEncoding('ascii')
      c.write('你好
    ');
      c.on('data', buf => console.log(buf.toString()))
      c.pipe(c);
    });
    server.on('error', (err) => {
      throw err;
    });
    server.listen(8124, () => {
      console.log('服务器已启动');
    });
    

    具体如图

    当然你朋友也是耐心有限的,假如超过了规定时间,两个最大段生命周期,你朋友也会自己走的

    那么这个生命周期又是什么呢, 那么咱们言归正传,说一说http的报文

    http 报文

    请求报文

    HTTP 协议是以 ASCII 码传输 , 常见的一些参数如下

    Remote Address:最终请求服务器地址

    Request URL:请求完整的路径

    Request Method:请求类型,常用的(get,post等)

    Status Code:请求状态码

    Referrer Policy: 通常是表示这个请求时从那个页面跳转页过来的,常被用于分析用户来源信息等

    具体如图

    HTTP 定义了与服务器交互的不同方法,一个URL地址,它用于描述一个网络上的资源,而 HTTP 中的GET,POST等方法就是对这个资源的操作。

         GET 请求报文示例:
        
         GET /books/?sex=man&name=Professional HTTP/1.1
         Host: www.example.com
         User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
         Gecko/20050225 Firefox/1.0.1
         Connection: Keep-Alive
         
    POST 表示可能修改变服务器上的资源的请求。
        
         POST / HTTP/1.1
         Host: www.example.com
         User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
         Gecko/20050225 Firefox/1.0.1
         Content-Type: application/x-www-form-urlencoded
         Content-Length: 40
         Connection: Keep-Alive
        
         sex=man&name=Professional  
    
    • GET 可提交的数据量受到URL长度的限制,HTTP 协议规范没有对 URL 长度进行限制。这个限制是特定的浏览器及服务器对它的限制
    • 理论上讲,POST 是没有大小限制的,HTTP 协议规范也没有进行大小限制,出于安全考虑,服务器软件在实现时会做一定限制
    • 参考上面的报文示例,可以发现 GET 和 POST 数据内容是一模一样的,只是位置不同,一个在 URL 里,一个在 HTTP 包的包体里

    一般来说get请求时比较安全的,他仅仅只是获取资源信息,不会修改资源的状态,
    就请求报文来讲

    在http协议里边规定了post提交的数据必须在body里边,post 请求头里边的Content-Type 用来获知请求中的消息的编码是怎么样的,相应的服务端要正确的对请求头做出回应才可以

    响应报文

    响应报文,顾名思义,就是发出一个请求之后,服务端对这个请求做出的回应,和请求报文差不多,大概就是

    • 状态行

    • 响应头

    • 响应正文

    具体如图

    状态码在平日里是用到的比较多的,常见状态码如下

    • 200 OK 客户端请求成功
    • 301 Moved Permanently 请求永久重定向
    • 302 Moved Temporarily 请求临时重定向
    • 304 Not Modified 文件未修改,可以直接使用缓存的文件。
    • 400 Bad Request 由于客户端请求有语法错误,不能被服务器所理解。
    • 401 Unauthorized 请求未经授权。这个状态代码必须和WWW-Authenticate报头域一起使用
    • 403 Forbidden 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因
    • 404 Not Found 请求的资源不存在,例如,输入了错误的URL
    • 500 Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求。
    • 503 Service Unavailable 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。

    持久连接

    在刚开始的时候我们已经说过了 http请求是一个无状态的无连接的协议,但是他是基于tcp协议的,那么同样的http请求也能够实现长连接,避免一些资源浪费

    在HTTP请求头中添加一个字段 Connection: Keep-Alive,当服务器收到附带有 Connection: Keep-Alive 的请求时,它也会在响应头中添加一个同样的字段来使用 Keep-Alive 。这样一来,客户端和服务器之间的HTTP连接就会被保持,不会断开,在客户端发送另一个请求的时候,就会使用这条已经建立的连接。

    HTTP Keep-Alive 简单说就是保持当前的TCP连接,避免了重新建立连接。
    而且keep-alive也不可能一直保持连接,可以通过一些参数来设置,比如说Keep-Alive: timeout=5, max=100

    这就表示这个tcp的连接可以保持五秒,最多请求100次 就会断开

    Keep-Alive 并没有改变http请求的状态,HTTP始终都是一个无状态的协议,并且是独立的,在Keep-Alive里边,并不能保证http的规定数量,唯一能够保证的就是在断开连接的时候会得到一个断开的通知

    以上是我对http的一些认识 ,未完待续,有不对的希望指出

  • 相关阅读:
    The Collections Module内建collections集合模块
    生成器接受和返还功能在执行过程中的详解以及生成器实现协同
    写python中的装饰器
    windows下载Mysql-python
    分别用单线程和多线程运行斐波那契、阶乘和累加和
    TCP客户端和服务器间传输数据遇到的TypeError: a bytes-like object is required, not 'str'问题
    python的property属性
    python的伪私有属性
    使用栈实现中缀表达式转为后缀表达式和后缀表达式的求解
    公众帐号如何向用户发送emoji表情(php版,附emoji编码表)
  • 原文地址:https://www.cnblogs.com/netUserAdd/p/11096768.html
Copyright © 2011-2022 走看看