HTTP作为应用广泛的应用层协议,接下来就让我们来揭开她神秘的面纱。
一、URL结构
HTTP使用统一资源标识符(URI)来传送数据和建立连接,URL(统一资源定位符)是一种特殊种类的URI,包含了用于查找资源的足够信息,我们一般使用的就是URL,URL一般包含以下几个部分。
https://mp.csdn.net/console/editor/html/106968983
1、协议部分:
该URL协议部分采用的是HTTPS协议,后面的//为分隔符。
2、域名部分:
域名是mp.csdn.net,发送请求时需要向DNS服务器请求解析域名所对应的IP地址,可以直接使用IP地址,这样省去了解析这一步,更加块,其实URL也是为了人们便于记忆,
3、端口部分:
域名后面紧跟着:端口号,这些知名的协议用的是专有端口,HTTP是80端口,HTTPS使用443端口,也可以不显示写出。
4、虚拟目录部分:
从域名的第一个/到最后一个/为止,表示在服务器上的所要请求的资源路径(一般是虚拟的,为了保护服务器的信息,也不希望用户能够直接操作服务器的目录),可以省略。
5、文件名部分:
从域名最后一个/开始到?为止,是文件名部分;如果没有?
,则是从域名最后一个/
开始到#
为止,是文件名部分;如果没有?
和#
,那么就从域名的最后一个/
从开始到结束,都是文件名部分。文件名也不是一个URL
的必须部分,如果没有文件名,则使用默认文件名。
6、锚部分:
从#开始到最后都是锚部分,表示定位显示到某一个页面的特定部分。
7、参数部分:
从?到#之间的都是参数部分,又叫做查询、搜索部分,他们是一个个键值对,使用&隔开,如果是英文就原样写入,汉字需要编码。标准并没有定义一个URI应该以何种方式指定其编码,最新版的URI标准 定义了新的URI scheme将采用UTF-8。
二、Request & Response
HTTP的请求包含:请求首行、请求头、空一行、请求正文(叫法可能不是很统一)。
读者可以使用fiddler抓包看看,
response:
三、状态码:
在响应体中响应首行会写到。HTTP
协议的状态码由3
位数字组成,第一个数字定义了响应的类别,共有5
中类别:
1.1xx
: 指示信息--表示请求已接收,继续处理
2.2xx
: 成功--表示请求已被成功接收、理解、接受
3.3xx
: 重定向--要完成请求必须进行更进一步的操作
4.4xx
: 客户端错误--请求有语法错误或请求无法实现
5.5xx
: 服务器端错误--服务器未能实现合法的请求
常用的状态码:
100:服务器收到请求,继续,在post请求中常见
200:客户端请求成功
301:永久重定向,资源位置可能变动,请求的时候去新的位置请求
302:临时重定向,临时改变位置,请求的时候先去原来的位置
303:查看其它地址,比如登录成功,跳转到其它页面,
400:客户端请求语法错误,服务器无法理解
403:服务器收到请求,拒绝提供服务
404:服务器无法找到所请求资源
500:服务器内部错误
501:服务器不支持请求的功能,无法完成请求
502:代理反馈错误,从远程服务器得到一个无效的响应
503:服务器超载
504:充当网关或者代理的服务器,请求超时
四、请求方法
- 在HTTP1.0里面一共定义了三种请求方式:GET、POST、HEAD。
- 在HTTP1.1里新增了五种请求方式:OPTIONS、PUT、DELETE、TRACE、和CONNECT方法。
我们先来看看GET和POST的区别?
1、GET请求在URL中传送的参数的长度是有一定的限制的,而POST没有。
2、GET比POST更不安全,因为参数直接暴露在URL中,POST放在请求体中。
3、对参数的数据类型,GET只接受ASCII编码,而POST没有限制。
4、GET的请求参数会被完整的保留在浏览器的历史记录里,相反POST请求参数也不会被浏览器保留
上面太干了,接下来我们吃点瓜润一润。
1、GET请求有请求正文吗,如果有的话参数可以像POST请求一样放在里面吗?
其实,GET和POST请求并没有本质的区别,都是HTTP中发送请求的两种不同的方法,HTTP是基于TCP/IP的关于数据如何在万维网中通信的协议。其实要给GET加上请求正文,和给POST加上URL参数在技术上是完全行的通的,只不过分不同的业务需求定义不同的请求方法,是不是更加术业有专攻一样。
HTTP只是一个行为准则,GET和POST本质上是一个TCP链接,并没有差异。
2、URL的长度有限制吗?
从理论上说,长度没有限制,但是浏览器也不可能处理一个无限长的URL,业界不成文的规定是,大多数的浏览器限制在2K个字节,大多数服务器最多处理64K大小的URL。
3、GET的方法参数的写法固定吗?
在约定中我们的参数在URL中的?后面,用&分割,我们可以自己约定参数的写法,只要服务端能够解析出来就行。
4、GET和POST请求发送的数据包有什么不同吗?
GET请求时产生一个TCP数据包,POST请求时产生两个数据包,
- GET:会把Request Header 和Data一起发送出去,等待服务器响应
- POST:浏览器会先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 OK
- GET和POST有自己的语义,不能随便混用,
- 在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。并不是所有的浏览器都会发两次,火狐和Chrome就发送一次,从此来看,GET和POST的性能差可以忽略
5、cookie说明
cookie保存的是客户端的信息,服务器会为每个客户端创建会话,将一些重要的会话信息通过cookie返回给客户端,cookie的生命周期只在当前的会话中,关闭浏览器意味着这次会话的结束,此时cookie随之消失,是为了解决HTTP无状态的问题所做的努力。
最后讲一下一次HTTP请求的过程:
- 在浏览器中输入
URL
,并按下回车键 - 浏览器向
DNS
服务器请求解析该URL
中的域名对应的IP
地址(如果是IP
请求,则不需要该步骤) - 解析出
IP
后,根据IP
和端口号,和服务器建立TCP连接(TCP详解:https://blog.csdn.net/weixin_43447989/article/details/106874590) - 浏览器向服务器发送请求,该请求报文作为
TCP
三次握手的第三个报文发送给服务器 - 服务器做出响应,把数据发送给浏览器
- 通信完成,断开
TCP
连接 - 浏览器解析收到的数据并显示
EOF