一文搞懂HTTP协议(带图文)
网络是由若干节点和连接这些节点的链路构成,然后网络与网络之间所串连成的庞大网络叫做互联网,而我们今天要讲的HTTP(HyperText Transfer Protocol 超文本传输协议)是互联网上应用最为广泛的一种网络协议,它是由万维网协会(World Wide Web Consortium)制定发布。
一、简介
HTTP 协议一共有五大特点:
1.支持客户/服务器模式。
2.简单快速:
客户向服务器请求服务时,只需传送请求方法和路径。
3.灵活:
HTTP允许传输任意类型的数据对象。
正在传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记。
4.无连接:
无连接的含义是限制每次连接只处理一个请求。
服务器处理完客户的请求,并收到客户的应答后,即断开连接。
采用这种方式可以节省传输时间。
5.无状态:
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。
即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息(Cookie和Session孕育而生)。
二、TCP/IP协议
HTTP是一个基于TCP/IP协议簇来传递数据,包含四层模型。
从上图我们可以清晰的看到HTTP使用的传输层协议为TCP协议,而网络层使用的是IP协议(当然还使用了很多其他协议),所以说HTTP是一个基于TCP/IP协议簇来传递数据。
那TCP/IP协议簇大致是如何工作的,我们再来看看下图:
我们可以看到在数据发送端是一层一层封装数据,数据接收端一层一层拆封,最后应用层获得数据。
三、建立TCP连接
我们知道了TCP/IP协议簇大致的工作原理之后,我们来看看HTTP是如何建立连接的。
1.TCP包头信息
前面咱们讲过HTTP是一个基于TCP/IP协议簇来传递数据,所以这HTTP建立连接也就是建立TCP连接,TCP如何建立连接,一起来看看TCP包信息结构吧。
TCP报文包=TCP头信息+TCP数据体,而在TCP头信息中包含了6种控制位(上图红色框中),这六种标志位就代表着TCP连接的状态:
1.URG:
紧急数据(urgent data)—-这是一条紧急信息
2.ACK:
确认已收到
3.PSH:
提示接收端应用程序应该立即从tcp接收缓冲区中读走数据
4.RST:
表示要求对方重新建立连接
5.SYN:
表示请求建立一个连接
6.FIN:
表示通知对方本端要关闭连接了
2.建立连接过程
了解了TCP包头信息之后,我们就可以正式看看TCP建立连接的三次握手了。
三次握手讲解:
1.客户端发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,服务器由SYN=1知道客户端要求建立联机(客户端:
我要连接你)
2.服务器收到请求后要确认联机信息,向A发送ack number=(客户端的seq+1),syn=1,ack=1,随机产生seq=7654321的包(服务器:
好的,你来连吧)
3.客户端收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,客户端会再发送ack number=(服务器的seq+1),ack=1,服务器收到后确认seq值与ack=1则连接建立成功。(客户端:好的,我来了)
面试官:为什么http建立连接需要三次握手,不是两次或四次
答:三次是最少的安全次数,两次不安全,四次浪费资源
四、客户端请求
客户端与服务器连接上了之后,客户端就可以开始向服务器请求资源,就可以开始发送HTTP请求了。
1.HTTP请求报文结构
我们之前说过TCP报文包=TCP头信息+TCP数据体,TCP头信息我们已经讲了,现在来讲TCP数据体,也就是我们的HTTP请求报文。
2.HTTP请求实例
来看看实际的HTTP请求例子:
1.①是请求方法,HTTP/1.1 定义的请求方法有8种:
GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE,最常的两种GET和POST,如果是RESTful接口的话一般会用到GET、POST、DELETE、PUT
2.②为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL
3.③是协议名称及版本号
4.④是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息
5.⑤是报文体,它将一个页面表单中的组件值通过param1=value1¶m2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。
不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html? param1=value1¶m2=value2”的方式传递请求参数。
请求头参数非常多,这里就不一一说明,只说明两个低级的反扒参数:
1.User-Agent:
客户端使用的操作系统和浏览器的名称和版本,有些网站会限制请求浏览器
2.Referer:
先前网页的地址,表示此请求来自哪里,有些网站会限制请求来源
五、服务端响应
服务器在收到客户端请求处理完需要响应并返回给客户端,而HTTP响应报文结构与请求结构体一致。
1.HTTP响应报文结构
2.HTTP响应实例
3.响应状态码
响应报文中我们重点关注下:服务器的响应状态码,面试也很容易问到,下面只列出分类,详细状态码请自行上网查找了解。
六、断开连接
在服务器响应完毕后,一次会话就结束了,请问这时候连接会断开吗?
1.长短连接
是否断开我们需要区分HTTP版本:
(1)在HTTP/1.0版本的时候,客户端与服务器完成一个请求/响应之后,会将之前建立的TCP连接断开,下次请求的时候又要重新建立TCP连接,这也被称为短连接
(2)在HTTP1.0发布仅半年后(1997年1月),HTTP/1.1版本发布并带来一个新的功能:
在客户端与服务器完成一次请求/响应之后,允许不断开TCP连接,这意味着下次请求就直接使用这个TCP连接而不再需要重新握手建立新连接,这也被称为长连接
注意:长连接是指一次TCP连接允许多次HTTP会话,HTTP永远都是一次请求/响应,会话结束,HTTP本身不存在长连接之说。
早在1999年HTTP1.1就推广普及,所以现在浏览器在请求时请求头中都会携带一个参数:Connection:keep-alive,这表示浏览器要求与服务器建立长连接,而服务器也可以设置是否愿意建立长连接,如果是close,表示已关闭。
2.长连接优缺点
对于服务器来说建立长连接有优点也有缺点:
优点:
当网站中有大量静态资源(图片、css、js等)就可以开启长连接,这也几张图片就可以通过一次TCP连接发送。
缺点:
当客户端请求一次时候不在请求,而服务器却开着长连接资源被占用着,这是严重浪费资源。
所以是否开启长连接,长连接时间都需要根据网站自身来合理设置。
ps:大家不要小看这一个TCP连接,在一次客户端HTTP完整的请求中(DNS寻址、建立TCP连接、请求、等待、解析网页、断开TCP连接)建立TCP连接占用的时间比还是很大的。
3.断开连接过程
在建立TCP连接时是三次握手,而断开TCP连接是四次挥手。
ps:http还有两个很大的缺点就是明文且不能保证完整性,所以目前会渐渐被HTTPS代替。
一文搞懂HTTP协议(带图文)相关推荐
- 一文搞懂“网络协议”
目录 一.各类协议介绍 1.计算机协议介绍 2.TCP/IP 协议群 3.TCP 协议传输特点 4.服务端口 5.数据包与处理流程 二.HTTP 协议 1.HTTP 协议介绍 2.HTTP 协议的请求 ...
- 一文搞懂CAN FD总线协议帧格式
目录 1.为什么会出现CAN FD? 2.什么是CAN FD? 3.CAN FD和CAN总线协议帧异同 4.解析CAN FD帧结构 4.1.帧起始 4.2.仲裁段 4.3.控制段 4.4.数据段 4. ...
- 一文搞懂MySQL数据库分库分表
如果数据量过大,大家一般会分库分表.分库需要注意的内容比较少,但分表需要注意的内容就多了. 工作这几年没遇过数据量特别大的业务,那些过亿的数据,因为索引设置合理,单表性能没有影响,所以实战中一直没用过 ...
- 一文搞懂 Raft 算法
一文搞懂Raft算法 正文 raft是工程上使用较为广泛的强一致性.去中心化.高可用的分布式协议.在这里强调了是在工程上,因为在学术理论界,最耀眼的还是大名鼎鼎的Paxos.但Paxos是:少数真正理 ...
- 一文搞懂RNN(循环神经网络)
基础篇|一文搞懂RNN(循环神经网络) https://mp.weixin.qq.com/s/va1gmavl2ZESgnM7biORQg 神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只 ...
- 一文搞懂如何使用Node.js进行TCP网络通信
摘要: 网络是通信互联的基础,Node.js提供了net.http.dgram等模块,分别用来实现TCP.HTTP.UDP的通信,本文主要对使用Node.js的TCP通信部份进行实践记录. 本文分享自 ...
- 【UE·蓝图底层篇】一文搞懂NativeClass、GeneratedClass、BlueprintClass、ParentClass
本文将对蓝图类UBlueprint的几个UClass成员变量NativeClass.GeneratedClass.BlueprintClass.ParentClass进行比较深入的讲解,看完之后对蓝图 ...
- 一文搞懂 Traefik2.1 的使用
原文链接:一文搞懂 Traefik2.1 的使用 一文搞懂 Traefik2.1 的使用 核心概念 安装 ACME 中间件 灰度发布 流量复制 TCP 简单 TCP 服务 带 TLS 证书的 TCP ...
- 一文搞懂 Cocos Creator 3.0 坐标转换原理
一文搞懂 Cocos Creator 3.0 坐标转换原理 屏幕坐标 UI 触点坐标 UI 多分辨率适配方案 UI 触点获取 不同坐标之间的转换 屏幕坐标与 3D 节点世界坐标互转 3D 节点之间的坐 ...
- 一文搞懂UART通信协议
目录 1.UART简介 2.UART特性 3.UART协议帧 3.1.起始位 3.2.数据位 3.3.奇偶校验位 3.4.停止位 4.UART通信步骤 1.UART简介 UART(Universal ...
最新文章
- 年后跳槽季,如何在编程面试中大获成功?
- 专利实力论互联网巨头造车:中美格局初定,百度苹果跨洋辉映
- c++ 多线程 垃圾回收器_7种jvm垃圾回收器,这次全部搞懂
- 限时秒杀│中科院推荐!6个引自美国NASA盒子,玩转科学
- python elif可以单独使用_elif可以单独使用。( )_学小易找答案
- 机器学习(三)——决策树(decision tree)算法介绍
- python后端设计_Python后端设计模式
- 发动机冒黑烟_发动机冒黑烟的原因和解决方法
- 2022年电子商务概论(农)之形考作业二
- 各种学习资料链接 干货 啃啃啃
- html链接鼠标在悬停颜色,如何让HTML链接显示悬停样式?
- Android Unable to find source java class:<File>because it does not belong to any of the source dirs:
- for循环小技巧,遍历数组的时候要使用恰当
- 12306泄露数据分析(二)
- [Eclipse]GEF入门系列(三、应用实例)
- java二维码生成 使用SSM框架 搭建属于自己的APP二维码合成、解析、下载
- 恢复foxmail中丢失的地址簿
- buu-misc刷题
- android基本功
- C++信徒的摩西十戒
热门文章
- 解决Mysql计算时除数为0
- 利用Drawable生成圆形图片
- 自己动手编写CSDN博客备份工具-blogspider
- Hadoop研发工程师_岗位职责和技能要求
- html中设置背景图片为平铺,html背景图片怎么设置平铺方式
- 容斥原理在C语言中的应用,容斥原理在排列问题中的应用实例
- 1-selenium-安装及模拟谷歌邮箱登录
- python 面积计算器
- CS5211:EDP转LVDS转换器,可替代PS8622,PS8625,CH7511等芯片!
- ps计算机内存不足请保存文件并关闭,PS cc 2018保存文件提示内存不足,性能首选项无法设置的解决方法...