http协议
http协议、即超文本传输协议(Hyper text transfer protocol)。是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。
超文本是包含有超链接和各种多媒体元素标记的文本。这些链接用URL表示。最常见的超文本格式是超文本标记语言HTML。
URL:统一资源定位符,用来唯一的标识万维网中的一个文档。由协议、主机和端口、以及文件名三部分构成。
http作用:将网页文件从服务器里传输到客户机里(浏览器)。
http版本
1、0.9版本 GET方法
2、1.0版本 POST HEAD 方法
3、1.1版本 PUT、OPTIONS、DELETE等方法,引用了持久连接,不会立即四次挥手,在1.1之前 ,每次请求都会新建一个tcp连接。
4、2.0版本 效率快,吞吐快 ==》 二进制分帧、多路复用(一个连接内可以处理多个请求,同时进行请求和响应)、头部压缩、优先级、服务器端推流 (html,js,css - index.html)
http协议特点:1、简单快速。2、灵活。3、无状态。
无状态 ==》 每次请求都是独立的,上一次请求和下一次请求互不相干。
例如登录了某个网站,下一次请求理论上来说就不需要再登录了。但是由于http是无状态的,它不能知道你上一次请求已经登录过了。所以需要借助其他东西(会话保持)来完成这个登录认证。
http工作原理
http的工作是请求/响应交互模式、因此我们详细了解一下请求包(request)和响应包(response)。
在浏览器任意网页,右键选择检查,选择网络,选中一条请求信息,即可看到请求包和响应包信息
request headers请求报文:客户端行web服务器发送请求报文。报文的所有字段都是ASCII码。
host : 表示访问哪个网址 ---> URL
user-agent: 使用的用户代理 ---> 浏览器/pc端或手机/
accept\accept-language\accept-encoding:浏览器支持哪些格式的文件,支持哪些语言,支持哪些编码
connection:活跃状态断开状态
cookie:通过cookie字段里的session_id 去session里找,找到了就登陆
If-Modified-Since: 上一次访问的时间、如Wed, 03 Aug 2022 08:43:03 GMT
If-None-Match: 上次得到的缓存的密文头、如"62ea3517-267"
服务器会比较If-Modified-Since、If-None-Match这两个字段,看这次访问和上次访问的内容是否相同,
相同的话则不再传送数据,直接让浏览器使用缓存的数据(状态码:304)、不相同则发送现在的数据(状态码:200)
response headers响应报文:
状态行:版本和状态码、如:HTTP/1.1 200 OK
Date:时间
Server:服务器的类型和版本、如:BWS/1.1,nginx/1.21.6
Content-Language\Content-encoding:响应内容的语言和编码
Content_Type:响应数据的类型
Content_Length:响应数据的大小
Last-Modified:上次访问的时间
http请求方法
方法 | 说明 |
---|---|
GET | 请求服务器给客户端资源 ==》会提交数据 ==》url 下载 |
POST | 请求服务器给客户端资源 ==》会提交数据 ==》表单 、常用于用户注册登录 |
PUT | 修改资源 |
DELETE | 请求服务器删除指定的资源 |
HEAD | 请求头 |
CONNECT | 连接 |
OPTIONS | 查看服务器端的参数,比如支持哪些方法 |
GET与POST请求的区别
GET和POST都是向服务器发起请求、只是携带数据的方式不一样。
1、URL形式。GET方法携带数据放在URL里、POST方法数据可以是json格式或者放在body部分。
2、传输数据的大小。GET方法携带的数据放在URL里,不能携带非常多的参数。POST方法可以携带的数据更加多
3、安全性。GET方法请求的参数会暴露在地址栏中,而POST请求则不会
http 常见状态码
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
301 Moved Permanently永久重定向、请求的URL已经永久更改,返回新的URL
302 Moved Temporarily 临时重定向
304 not Modified、未改变,说明无需再次传输请求的内容,即使用缓存的内容
307 临时重定向
4** 客户端错误,请求包含语法错误或无法完成请求
400 客户端语法错误
401 用户验证失败
403 Forbidden 用户禁止访问、客户端没有权限访问
404 url找不到
405 方法不被允许,not allowd
499 client has closed connection --nginx定义状态码不一定是客户端的问题,有可能是服务器处理不过来了
5** 服务器错误,服务器在处理请求的过程中发生了错误
500 Internal Server Error 服务器内部错误bug,无法完成请求
501 Not Implemented 服务器不支持请求的功能,无法完成请求
502 Bad Gateway 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应(负载均衡服务器是好的,但是后端服务器出错了)
503 Service Temporarily Unavailable 1、由于超载或系统维护,服务器暂时的无法处理客户端的请求。2、服务器限制了某个时间段只能访问多少次,超过限制则503。延时的长度可包含在服务器的Retry-After头信息中
504 Gateway Time-out 充当网关或代理的服务器,未及时从远端服务器获取请求。后端网络不稳定或防火墙问题
505 HTTP Version not supported
推荐详细资料 ==》 http://www.w3.org/Protocols/rfc2616/rfc2616.html
访问百度背后发生了什么
1、浏览器分析超链接里的url
2、浏览器向DNS请求解析域名的ip地址,DNS将ip返回浏览器
先看缓存 (浏览器www.baidu.com 112.233.223.223) – linux的缓存nscd
再看/etc/hosts 文件里面有没有记录
再看/etc/resolv.conf里的本地域名服务器有没有解析
本地域名服务器记录的解析如果有就会直接返回给浏览器,如果没有解析,就会去根域名服务器找全球13台,依次迭代查询得到最后的ip解析地址
3、浏览器与服务器进行tcp三次握手,建立连接
4、浏览器发起请求(get) ,http应用数据的发送,请求百度页面
5、服务器收到请求,给出响应,然后返回百度的html页面文档发送给浏览器
6、浏览器收到页面内容之后,运行展示在窗口上(渲染:将响应报文里的html文件+图片+视频等展示出来,看到效果)
7、没有其他请求的话,连接就会断开