文章目录
HTTP
概念
Hyper Text Transfer Protocol 超文本传输协议
传输协议:定义了,客户端和服务器端通信时,发送数据的格式。
特点:
-
基于TCP/ IP的高级协议
-
位于osi网络七层协议模型中的最上层:应用层,由请求和响应组成
-
默认端口号:80
-
基于请求/响应模型的:一次请求对应一次响应
-
无状态的:每次请求之间相互独立,不能交互数据
-
无连接:限制每次连接只处理一个请求
-
灵活:正在传输的类型由content——type加以标记。
HTTPS:HTTP承载在TLS和SSL之上,通过加密,认证的方式实现数据传输安全。称为HTTPS。默认端口号为443
一次请求过程
-
客户端与服务器建立TCP连接
-
客户端发出HTTP请求
-
服务端发出HTTP响应
-
客户端与服务器之间的TCP链接关闭
举例:浏览器输入www.baidu.com后,浏览器与服务端的通信过程:
浏览器与网络上域名为www.baidu.com的web服务器建立TCP连接
浏览器发出要求访问index.html(网站首页)的HTTP请求
web服务器接到HTTP请求后,解析HTTP请求,然后发回包含吧index.html文件数据的HTTP响应。
浏览器接收到HTTP的响应和后,解析HTTP响应,并在窗口展示index.html
浏览器与web服务器之前的TCP链接关闭。
浏览器具备的功能:
-
请求web服务器建立TCP连接
-
创建并发送HTTP请求
-
接收并解析HTTP响应
-
在浏览器窗口展示HTML文档
web服务器应具备的功能:
-
接收来自客户端浏览器的TCP链接请求。
-
接收并解析HTTP请求。
-
创建并发送HTTP响应。
问题:不同浏览器,不同服务器之前如何确保传送数据解析的一致性。
浏览器有很多种,服务器也有很多种,并且服务端开发的语言也是多种多样的,如何确保java语言编写的程序和其他语言编写的程序顺利通信呢?这就需要统一 的协议了,这就是HTTP协议。HTTP协议严格规定了HTTP请求和HTTP响应的数据格式。只要HTTP服务器与客户程序之间的交换数据都遵守HTTP协议。双方都能看懂对方发送的数据,从而顺利交流。
HTTP协议由请求部分和响应部分组成。
历史版本:
1.0:每一次请求响应都会建立新的连接
1.1:复用连接
数据格式
通过service()方法的参数我们可以得知,它的两个参数一个是请求,一个是响应。
通过基本介绍我们知道,HTTP是定义了客户端与服务器端数据交互时定义数据格式的。
数据格式分为:请求消息数据格式和响应消息数据格式
请求消息数据格式
1. 请求行
请求方式 请求url 请求协议/版本
GET /login.html HTTP/1.1 .
请求方式:
HTTP协议有7种请求方式,常用的有2种
GET :
-
在没指明请求方式下,默认为get请求
-
请求参数在请求行中,在ur1后。
-
请求的url 长度有限制的
-
不太安全
<form action="/servlet/sep" method="get">
<h1>发送get请求</h1>
用户名:<input name="username" type="text">
<br>
密码:<input name="password" type="text">
<br>
<input type="submit" value="提交">
</form>
请求参数:请求参数在请求行上面
POST :
1.请求参数在请求体中
2.请求的url长度没有限制的
3.相对安全
<form action="/servlet/sep" method="post">
<h1>发送post请求</h1>
用户名:<input name="username" type="text">
<br>
密码:<input name="password" type="text">
<br>
<input type="submit" value="提交">
</form>
请求参数:
此时我们的请求参数在请求体里面。
2. 请求头
客户端浏览器告诉服务器一些信息
格式:
请求头名称:请求头值
-
常见的请求头:
-
User-Agent(用户代理):浏览器告诉服务器,我访问你使用的浏览器版本(不同浏览器的兼容不同)
可以在服务器端获取该头的信息,解决浏览器的兼容问题
-
Referer:http://localhost/login.html 告诉服务器,当前请求从哪里来
-
防盗链:
假如我有一个电影网站,但是我没有战狼这部电影的版权,优酷有,我就可以在我的网站上建立一个超链接,连接到优酷战狼的这个页面,从而达到我网站的流量增加。这样就造成优酷的损失,优酷可以通过防盗链的方法,获取请求从哪里来,通过逻辑来进行响应处理(比如:如果这个请求从我的首页来,你就可以观看,如果不是,你就不能观看)
-
统计工作:
假如我花钱分别让百度,新浪,搜狐给我打广告,增加我网站的访问量,那么我该如何判断我的用户是通过谁的广告来的呢?就可以通过此头,根据请求来的位置,判断是谁的广告引来的用户。
-
3. 请求空行
用于分隔post请求的请求头和请求体的。用来告诉服务端已经没有请求头了。即使请求体没有内容,也必须有一个请求空行。
4. 请求体(正文)
- 封装请求参数的
-
post请求参数以键值对形式保存。
-
get请求没有请求体
响应消息数据格式
响应消息:服务器端发送给客户端的数据
1. 响应行
-
组成:协议/版本响应状态码状态码描述
-
响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。
-
状态码都是3位数字
-
分类:
-
1.1xx :服务器就收客户端消息,但没有接受完成,等待一段时间后, 发送1xx多状态码
2.2xx:成功。代表:200
-
3xx:重定向。代表: 302(重定向),304(访问缓存)
- 重定向
- 访问缓存
-
4xx :客户端错误。
代表:
404 (请求路径没有对应的资源)
405 :请求方式没有对应的doXxx方法(请求get,没有doGet()方法)
- 5xx :服务器端错误。代表: 500(服务器内部出现异常,代码出错)
状态码大全:
https://baike.baidu.com/item/HTTP%E7%8A%B6%E6%80%81%E7%A0%81/5053660?fr=aladdin
状态码 | 说明 |
---|---|
200 | 响应成功 |
301 | 永久重定向,搜索引擎将删除源地址,保留重定向地址 |
302 | 暂时重定向,重定向地址由响应头中的Location属性指定。由于搜索引擎的判定问题,较为复杂的URL容易被其他网站使用更为精简的URL以及302重定向劫持 |
400 | 客户端请求有语法错误,不能被服务器识别 |
404 | 请求资源不存在 |
500 | 服务器内部错误 |
2. 响应头
描述服务器的基本信息,以及对返回的数据进行描述,服务器通过这些数据的描述信息,通知客户端如何处理服务器端返回的数据。HTTP响应中常用以下响应头告诉浏览器的一些信息。
1.格式:头名称:值
2.常见的响应头:
-
Content- Type :服务器告诉客户端本次响应体数据格式以及编码格式
-
Content-disposition :服务器告诉客户端以什么格式打开响应体数据
值:
1. in- line:默认值,在当前页面内打开
- attachment ;filename=xxx :以附件形式打开响应体。文件下载
响应头 | 说明 | 实例 | 状态 |
---|---|---|---|
Age | 响应对象在代理缓存中存在的时间,以s为单位 | Age:12 | 固定 |
Allow | 对于特定资源的有效动作 | Allow:GET,HEAD | 固定 |
Connection | 针对该连接所预期的选项 | Connection:close | 固定 |
Date | 此条消息发送的日期与时间 | 固定 | |
Expires | 指定一个日期/时间,超过该事件则认为此回应已经过期 | Expires: Thu, 01 Dec 2020 08:08:00 GMT | 标准 |
Link | 用来表示与另一个资源之间的类型关系,此类型关系是在RFC 5988中定义 | Link:rel=“akternate” | 固定 |
Location | 用于在进行重定向,或者创建了某个新资源时使用 | Location:http://www.baidu.com | 固定 |
Server | 服务器名称 | Server:nginx/1.6.3 | 固定 |
Set-Cookie | 设置HTTPCookie | Set-Cookie:UserID=123;Max=Age=36000;Version=1 | 标准 |
Status | 通过网关接口的响应头字段 | Status:200 OK | |
Upgrade | 要求客户端升级到另一个高版本协议 | Upgrade:HTTP/2.0,SHTTP/1.3,IRC/6.9,RTA/x11 | 固定 |
Via | 告知代理服务器的客户端,当前响应是通过什么途径发送的 | Via:1.0 fred, 1.1 baidu.com(nginx/1.6.3) | 固定 |
Warning | 一般性警告 | Warning:199Miscellaneous warning | 固定 |
3.响应空行
与请求一样,响应头和响应体必须由空行连接
4.响应体
响应体主要是包含服务器对应于浏览器请求的响应消息,该响应消息可以是一个HTML文档。浏览器可以指接识别这个HTML文件。而如果访问的是一个JSP文件,但是响应回去的是一个HTML文件,就说明服务器将该JSP翻译为了HTML,然后再响应给浏览器。
优秀博文:
http:
https://blog.csdn.net/u010256388/article/details/68491509
三次握手,四次挥手:
面试必备HTTP之TCP三次握手及四次挥手详解 - 简书 (jianshu.com)
TCP链接过程: