HTTP(超文本传输)协议是存在于应用层的协议
应用层:负责应用程序之间的数据沟通(常用的协议有:HHTP,FTP,SSH)
一.首先我们认识一下URL(统一资源定位符)
通俗的将URL就是我们日常生活中访问的网站。例如:www.baidu.com。
根据下图我们可以很清楚的认识到URL的组成。
(可以看博客:https://blog.youkuaiyun.com/ergouge/article/details/8185219)
1.为什么要进行url编码???
url中的特殊符号是有特殊含义,因此为了防止我们提交的数据中也包含特殊字符造成歧义,因此对我们提交的数据进行URL编码操作
2.怎样进行URL编码???
URL编码(针对的是提交的查询字符串):将特殊字符高四位转换为16进制数字。低四位转化为16进制数,为了告诉对方这是已经编码过的字符,因此在转译后的两个16进制字符之前加%
二.HTTP协议
1.HTTP是什么???
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
- HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。
HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。
HTTP请求和响应模型
三.HTTP格式
1.HTTP请求格式
- 首行
1.)请求方法
a)GET
b) POST
2.)URI
3.)版本号
- 请求报头(Header)
请求的属性, 冒号分割的键值对;每组属性之间使⽤用\n分隔;遇到空⾏行表示Header部分结束
注意:一定是冒号+空格!!!!!!冒号+空格!!!!!冒号+空格!!!!!
- 空行
- 正文(Body)
空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个 Content-Length属性来标识Body的长度; ( Content-Length很重要是在写HTTP项目时判断正文部分是否读完的重要指标)
2.HTTP响应格式
- 首行
1.)版本号
2.)状态码
3.)状态码解析
- 请求报头(Header)
请求的属性, 冒号分割的键值对;每组属性之间使⽤用\n分隔;遇到空⾏行表示Header部分结束
注意:一定是冒号+空格!!!!!!冒号+空格!!!!!冒号+空格!!!!!
- 空行
- 正文(Body)
空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个 Content-Length属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在 body中.
注意:HTTP格式的每一行都是按照行分隔符\r\n或者\r或者\n来分隔开的
例如:首行\r\n协议头1\r\n协议头2\r\n\r\n(空行)正文
1.请求方法POST和GET
- GET
GET更多的是获取资源但是也可以上传资源,不过他能够提交的URI的长度是有限的。当URI后边有?时则是传参的,这时候的参数储存在URI中,一般没有正文
例如:https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1
- POST
POST更多的是上传数据,但是也可以获取资源。其中POST传参的时候是放在正文中的
2.POST和GET的区别:
- POST和GET传参的地方不一样,GET是存放在URI中,POST是存放在正文中。(最大的区别)
- GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
- GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
- GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.
3.什么时候用POST什么时候用GET??
当你在百度上搜索东西不涉及个人隐私或者个人信息安全时用的就是GET,当你登陆网站需要验证身份你需要输入密码,这类涉及个人信息安全的时候就需要POST,因为他的传参在正文中,这样更加的安全。
3.请求报头
常见的报头:
- Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
- User-Agent: 声明用户的操作系统和浏览器版本信息;
- referer: 当前页面是从哪个页面跳转过来的;
- location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
- Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;
- accept:接收什么样文件
- Transfer-Encoding:每次(每段)发送的数据有多长
4.状态码
四.URI和URL,URN的对比
URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。
Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的
URI一般由三部组成:
①访问资源的命名机制
②存放资源的主机名
③资源自身的名称,由路径表示,着重强调于资源。
- URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。
URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。
采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL一般由三部组成:
①协议(或称为服务方式)
②存有该资源的主机IP地址(有时也包括端口号)
③主机资源的具体地址。如目录和文件名等
- URN,uniform resource name,统一资源命名,是通过名字来标识资源,比如mailto:java-net@java.sun.com。
URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。笼统地说,每个 URL 都是 URI,但不一定每个 URI 都是 URL。这是因为 URI 还包括一个子类,即统一资源名称 (URN),它命名资源但不指定如何定位资源。上面的 mailto、news 和 isbn URI 都是 URN 的示例。
在Java的URI中,一个URI实例可以代表绝对的,也可以是相对的,只要它符合URI的语法规则。而URL类则不仅符合语义,还包含了定位该资源的信息,因此它不能是相对的。
在Java类库中,URI类不包含任何访问资源的方法,它唯一的作用就是解析。
相反的是,URL类可以打开一个到达资源的流。
五.HTTP的工作的原理
HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
以下是 HTTP 请求/响应的步骤:
1、客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.oakcms.cn。
2、发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
3、服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
4、释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
5、客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:
1、浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
2、解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
3、浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
4、服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
5、释放 TCP连接;
6、浏览器将该 html 文本并显示内容;
六.简单的实现HTTP服务端
代码请看我的GitHub: https://github.com/Bit-W/http_server
七.有关HTTPS的理解
请看博客:https://blog.youkuaiyun.com/alidada_blog/article/details/84502545