网络是由若干节点和连接这些节点的链路构成,然后网络与网络之间所串连成的庞大网络叫做互联网,而我们今天要讲的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&param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。
不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html? param1=value1&param2=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. 一文搞懂“网络协议”

    目录 一.各类协议介绍 1.计算机协议介绍 2.TCP/IP 协议群 3.TCP 协议传输特点 4.服务端口 5.数据包与处理流程 二.HTTP 协议 1.HTTP 协议介绍 2.HTTP 协议的请求 ...

  2. 一文搞懂CAN FD总线协议帧格式

    目录 1.为什么会出现CAN FD? 2.什么是CAN FD? 3.CAN FD和CAN总线协议帧异同 4.解析CAN FD帧结构 4.1.帧起始 4.2.仲裁段 4.3.控制段 4.4.数据段 4. ...

  3. 一文搞懂MySQL数据库分库分表

    如果数据量过大,大家一般会分库分表.分库需要注意的内容比较少,但分表需要注意的内容就多了. 工作这几年没遇过数据量特别大的业务,那些过亿的数据,因为索引设置合理,单表性能没有影响,所以实战中一直没用过 ...

  4. 一文搞懂 Raft 算法

    一文搞懂Raft算法 正文 raft是工程上使用较为广泛的强一致性.去中心化.高可用的分布式协议.在这里强调了是在工程上,因为在学术理论界,最耀眼的还是大名鼎鼎的Paxos.但Paxos是:少数真正理 ...

  5. 一文搞懂RNN(循环神经网络)

    基础篇|一文搞懂RNN(循环神经网络) https://mp.weixin.qq.com/s/va1gmavl2ZESgnM7biORQg 神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只 ...

  6. 一文搞懂如何使用Node.js进行TCP网络通信

    摘要: 网络是通信互联的基础,Node.js提供了net.http.dgram等模块,分别用来实现TCP.HTTP.UDP的通信,本文主要对使用Node.js的TCP通信部份进行实践记录. 本文分享自 ...

  7. 【UE·蓝图底层篇】一文搞懂NativeClass、GeneratedClass、BlueprintClass、ParentClass

    本文将对蓝图类UBlueprint的几个UClass成员变量NativeClass.GeneratedClass.BlueprintClass.ParentClass进行比较深入的讲解,看完之后对蓝图 ...

  8. 一文搞懂 Traefik2.1 的使用

    原文链接:一文搞懂 Traefik2.1 的使用 一文搞懂 Traefik2.1 的使用 核心概念 安装 ACME 中间件 灰度发布 流量复制 TCP 简单 TCP 服务 带 TLS 证书的 TCP ...

  9. 一文搞懂 Cocos Creator 3.0 坐标转换原理

    一文搞懂 Cocos Creator 3.0 坐标转换原理 屏幕坐标 UI 触点坐标 UI 多分辨率适配方案 UI 触点获取 不同坐标之间的转换 屏幕坐标与 3D 节点世界坐标互转 3D 节点之间的坐 ...

  10. 一文搞懂UART通信协议

    目录 1.UART简介 2.UART特性 3.UART协议帧 3.1.起始位 3.2.数据位 3.3.奇偶校验位 3.4.停止位 4.UART通信步骤 1.UART简介 UART(Universal ...

最新文章

  1. 年后跳槽季,如何在编程面试中大获成功?
  2. 专利实力论互联网巨头造车:中美格局初定,百度苹果跨洋辉映
  3. c++ 多线程 垃圾回收器_7种jvm垃圾回收器,这次全部搞懂
  4. 限时秒杀│中科院推荐!6个引自美国NASA盒子,玩转科学
  5. python elif可以单独使用_elif可以单独使用。( )_学小易找答案
  6. 机器学习(三)——决策树(decision tree)算法介绍
  7. python后端设计_Python后端设计模式
  8. 发动机冒黑烟_发动机冒黑烟的原因和解决方法
  9. 2022年电子商务概论(农)之形考作业二
  10. 各种学习资料链接 干货 啃啃啃
  11. html链接鼠标在悬停颜色,如何让HTML链接显示悬停样式?
  12. Android Unable to find source java class:<File>because it does not belong to any of the source dirs:
  13. for循环小技巧,遍历数组的时候要使用恰当
  14. 12306泄露数据分析(二)
  15. [Eclipse]GEF入门系列(三、应用实例)
  16. java二维码生成 使用SSM框架 搭建属于自己的APP二维码合成、解析、下载
  17. 恢复foxmail中丢失的地址簿
  18. buu-misc刷题
  19. android基本功
  20. C++信徒的摩西十戒

热门文章

  1. 解决Mysql计算时除数为0
  2. 利用Drawable生成圆形图片
  3. 自己动手编写CSDN博客备份工具-blogspider
  4. Hadoop研发工程师_岗位职责和技能要求
  5. html中设置背景图片为平铺,html背景图片怎么设置平铺方式
  6. 容斥原理在C语言中的应用,容斥原理在排列问题中的应用实例
  7. 1-selenium-安装及模拟谷歌邮箱登录
  8. python 面积计算器
  9. CS5211:EDP转LVDS转换器,可替代PS8622,PS8625,CH7511等芯片!
  10. ps计算机内存不足请保存文件并关闭,PS cc 2018保存文件提示内存不足,性能首选项无法设置的解决方法...