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的一些认识 ,未完待续,有不对的希望指出

  • 相关阅读:
    Java JMX 监管
    Spring Boot REST(一)核心接口
    JSR 规范目录
    【平衡树】宠物收养所 HNOI 2004
    【树型DP】叶子的颜色 OUROJ 1698
    【匈牙利匹配】无题II HDU2236
    【贪心】Communication System POJ 1018
    【贪心】Moving Tables POJ 1083
    Calling Extraterrestrial Intelligence Again POJ 1411
    【贪心】Allowance POJ 3040
  • 原文地址:https://www.cnblogs.com/netUserAdd/p/11096768.html
Copyright © 2011-2022 走看看