这多是对小白最友好的HTTP协议讲解了

HTTP是什么

打开百度,度娘告诉我javascript

http是一个简单的请求-响应协议,它一般运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及获得什么样的响应。请求和响应消息的头以ASCII码形式给出;而消息内容则具备一个相似MIME的格式。这个简单模型是早期Web成功的有功之臣,由于它使得开发和部署是那么的直截了当

上面的描述可能过于专业术语了,简单的说,HTTP是一个约定协议规范,规范约定,客户端(Firefox、IE、 chrome)经过发起一个请求到服务端,服务端根据客户端的请求返回对应的响应结果css

在这里插入图片描述
打个比方,咱们去零售店买东西,1块能够买棒棒糖,2块能够买果冻,五块能够买冰淇淋,我至关于客户端,售卖员至关于服务端,我对售卖员说(发起一个请求),给我来一个棒棒糖,顺带递给了他一块钱,售卖员根据个人描述和金钱,递给了我一个棒棒糖(响应),整个过程就是一个请求-相应的过程。html

在这里插入图片描述

上面的过程映射到咱们平常用浏览器(Chrome)打开一个百度页面搜索http这个关键字,当咱们敲下回车键的同时java

chrome会向百度的服务器发起了一个请求,请求的资源路径为https://www.baidu.com/s?wd=ht... ,百度服务器根据咱们请求的关键字http返回给咱们对应的搜索结果。web

HTTP中的URL

说到HTTP就不得不说HTTP的产物URL,URL(Uniform Resource Locator,统一资源定位符) 其实就是咱们经常说的网址,好比www.baidu.com/s/a/v/s,对于URL的格式,HTTP协议有相对应的规范设计chrome

协议 主机 端口 路径
  • 协议,表示当前的传输协议,咱们经常使用的有http协议,ftp协议,tcp协议,file协议,https协议等等
  • 主机,主机指请求的服务器域名或IP地址,若是是域名,则须要先请求DNS服务器解析域名对应的ip,再对域名发起请求
  • 端口,请求服务器的对应端口,能够省略,省略时默认80端口
  • 路径,表示请求的资源路径

HTTP工做原理

上面简单的介绍了HTTP协议是什么,那么HTTP协议是如何工做的呢。首先你们须要知道的是,每个网址好比www.baidu.com 都是对外提供了一个端口来进行响应HTTP请求的,若是在请求的时候不声明端口,默认就是80端口,也就是说咱们常常请求的www.baidu.com其实默认请求的是百度服务器的80端口,你也能够这样访问www.baidu.com:80效果都是同样的。下面是具体的请求和响应的步骤json

  • 服务端开启一个端口监听的程序,好比80端口,当80端口有请求进来后,请求就被服务端捕获了
  • 咱们在客户端(浏览器)输入域名URL,回车请求数组

    • 浏览器会向DNS服务器请求解析咱们输入的域名对应的IP地址
    • 浏览器获取到ip后,和服务端的80端口创建TCP链接
    • 浏览器发送请求报文
    • 服务端根据请求报文,返回对应的响应报文
    • 释放TCP链接
    • 客户端(浏览器)根据返回的结果渲染页面

HTTP报文格式

报文格式涉及到了两方面,请求报文格式和响应报文格式浏览器

请求报文格式

请求报文也就是发起请求时的数据格式,当咱们用浏览器请求页面时,这个请求报文是由客户端帮咱们默认实现的tomcat

在这里插入图片描述

总体请求报文格式分为三大块,请求行,请求头部,请求数据

  • 请求行

    • 请求方法, 目前请求方法支持GET HEAD POST PUT DELETE CONNECT OPTIONS TRACE PATCH
    • URL ,咱们请求的地址
    • 协议版本, 当前请求使用的HTTP的协议版本
  • 请求头部,头部字段名:值 ,请求携带的头部信息,能够自定义,通常的头部信息包括,Host,User-Agent,Cookie,Accept等等

    • Host,当前请求的域名+端口
    • Accept,客户端可识别的类型,识别到对应的格式后,浏览器会对返回的数据作对应的处理,好比html就对数据作渲染,javascript就看成脚本语言来识别

      • text/html ,咱们常见的html页面
      • application/xml xml数据
      • image/webp 图片数据,格式为webp, 固然也有更多的格式,如 image/png为png格式等等
      • application/javascript ,咱们很熟悉的javascript脚本
      • application/json;charset=utf-8 ,json格式的数据
      • text/css ,css样式文件
      • **等等
    • User-Agent,当前请求的客户端版本及操做系统,能够经过这个头部来识别是不是移动端
    • Cookie,本质上cookie是多个key-value字符串的组合,cookie是存储在客户端本地的字段信息,是服务端用来标识用户信息的一种方式,后续会专门讲下cookie
    • 其余自定义Cookie,服务端能够经过设置响应报文格式的响应头部Set-Cookie来设置Cookie
  • 回车符 换行符,协议规范要求
  • 请求数据,当请求方法为Post请求时,才有请求数据
GET /hello.txt HTTP/1.1
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi

响应报文格式

响应报文格式就是服务端响应时的数据格式,当咱们在请求咱们的Servlet时,响应报文是由tomcat帮咱们默认实现的

在这里插入图片描述

与请求报文相似,响应报文主要包含,状态行,响应头部,响应主体内容

  • 状态行

    • 协议版本 当前响应的协议版本
    • 状态码 表示当前请求的整体结果状态,下面会专门讲下状态码
  • 响应头部,响应头部主要是响应请求的描述信息,好比content_length表示响应内容的长度,content_type响应数据的格式,date响应时间等等

    • Content-Type,contentType是响应头部很重要的信息,浏览器经过contentType来识别当前服务端返沪ide响应内容的格式,

      • text/html,浏览器会去渲染响应内容,
      • text/css,浏览器会认为这是一个样式文件,解析css,而且渲染页面
      • application/json,浏览器会默认转化为json对象
      • image/png,浏览器会将相应内容看成图片来进行处理展现
      • 等等..
    • Set-Cookie,服务端在响应头部写入Set-Cookie,表示须要将当前Set-Cookie的值写入cookie,而且在下次请求的时候放入到请求头部带回服务端

      • Set-Cookie: userName=zhangsan; expires=Thu, 01-Jan-2020 00:00:01 GMT; path=/my
        上面的头信息表示,将userName=zhangsan写入cookie,
        cookie的到期时间为2020年一月一日
        path=/my,表示只有在请求/my,及/my的子目录的时带上这个cookie
    • Server,当前请求服务器的类型,常见有的Tengine,Nginx,Apache,PHP等等
    • Content-Length,当前响应内容的长度
    • 等等..
  • 响应主题,响应的主体内容信息
HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122

<html>
<head>
<title>Wrox Homepage</title>
</head>
<body>
<!-- body goes here -->
</body>
</html>

状态码的分类

在返回头的状态行的状态码表示当前请求结果的大体状态结果,状态码由三位数组成,常见的状态码有200,404,500,302等等,那么为何须要这么多状态码呢,主要是为了区分各类各样的状况,HTTP状态码的前第一位数表示表明了响应的五种状态之一

  • 1 消息 这一类型的状态码,表明请求已被接受,须要继续处理
  • 2 成功 这一类型的状态码,表明请求已成功被服务器接收、理解、并接受
  • 3 重定向 这类状态码表明须要客户端采起进一步的操做才能完成请求。一般,这些状态码用来重定向,后续的请求地址
  • 4 请求错误 这类的状态码表明了客户端看起来可能发生了错误,妨碍了服务器的处理
  • 5 服务器错误 这类状态码表明了服务器在处理请求的过程当中有错误或者异常状态发生,也有多是服务器意识到以当前的软硬件资源没法完成对请求的处理

更多状态码的详细含义,https://baike.baidu.com/item/HTTP%E7%8A%B6%E6%80%81%E7%A0%81/5053660

HTTP各个版本

  • 0.9 仅支持文本,不支持图片
  • 1.0 丰富了支持协议,可是不支持长链接,无状态,消耗资源和性能
  • 1.1 在1.0的基础上支持长链接指在一个tcp链接上发送多个http请求

HTTP与TCP的区别

知乎上有一个回答很形象,https://www.zhihu.com/questio...

HTTP是要基于TCP链接基础上的,简单的说,TCP就是单纯创建链接,不涉及任何咱们须要请求的实际数据,简单的传输。HTTP是用来收发数据,即实际应用上来的。

TCP是公路,HTTP是公路上跑的车。

因此,若是要把货物从a点运到b点,首先要在ab之间修路,这个工做由ip和tcp这俩伙伴完成(其实还有其它伙伴,但这俩出力最大,就由这俩代言了)。

路修好了之后,就能够“应用”了,公路应用于什么?固然是应用于车来车往了。跑啥车都行,好比跑http牌子的车,也能够跑mail牌的车

参考

https://www.runoob.com/http/h...

https://baike.baidu.com/item/...

我曾在银色平原漫步

也曾在青草之河垂钓

我便是平静的海面

又是汹涌的风暴

这片土地认识我

相关文章
相关标签/搜索