Http协议通俗详解版
一、何为HTTP协议
http协议: 超文本传输协议,是一个简单的请求-响应协议,它通常运行在TCP之上。
我们说, 应用层协议是我们程序猿自己定的.但实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用. HTTP(超文本传输协议)就是其中之一(也就是你自己可以写别的协议,只要你愿意)。
原来我们讲过了TCP传输的过程,就是两台主机之间的通讯。那我们仅仅只是发送一串数据过去吗?我们想想协议是什么?协议就是约定,约定双方怎么处理数据。
举个例子:
有一天,A要给B邮寄一个密码本,所以A找来了邮递员C【TCP/IP协议】,把B的信息告诉了邮递员C,邮递员C把密码本打包【封装】,C骑着电驴先找了一下本地的城市【局域网】,结果没找到。邮递员C想,这肯定是在别的城市了,骑着电驴肯定不靠谱。邮递员去了邮局【路由器】,把电驴换成了汽车,选择了城市的一条高速路口出去了【NAT+NAPT协议】,然后开始一个城市一个城市找【RIP协议】,最终在一个城市找到了【B的地址必须为公网,有疑问看上一篇文章】,把密码本给了B。B拿到密码本,怎么获取里面的内容呢?原来A和B提前就约定好了【http协议】,然后B根据这个约定,读取了数据,原来A是找B要个照片【request请求】。B根据约定,把这个图片发给了B【response响应】。
现在A就是浏览器,B就是服务器,http协议就是他俩直接约定的方式。http协议已经处于应用层了。
二、HTTP的请求方法
http请求方法有很多,但我们要讲的就两种:POST和GET
A把密码本寄给B的话,如果用GET方法,那么就会在地址栏【url】显示这里面是什么。如果选择POST方法的话,那么【url】就不会显示这里面是什么(但可以带一些别的参数)
三、认识URL
我们不是说A不是要把B的信息告诉C吗?那么B的地址信息就是URL(俗称网址)。
(1)浏览器输入url:具体访问url网站的协议,需要查看(网站是http还是https协议的服务,可以不输入,客户端浏览器+系统和服务端服务器自动也会设置)
(3)url编码(urlencode)和url解码(urldecode),就是把你发送的字符进行编码处理(即使url显示的是汉字)。
四、HTTP版本
主要是1.0和1.1的差别
1、HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理
HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。
HTTP 1.1则支持持久连接Persistent Connection, 并且默认使用persistent connection. 在同一个tcp的连接中可以传送多个HTTP请求和响应. 多个请求和响应可以重叠,多个请求和响应可以同时进行. 更加多的请求头和响应头(比如HTTP1.0没有host的字段).
2.HTTP 1.1增加host字段
在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。
HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。此外,服务器应该接受以绝对路径标记的资源请求。
3.带宽优化及网络连接的使用
HTTP1.0中, 存在-些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能
HTTP1. 1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206 (Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
4.错误通知的管理
在HTTP1.1中新增 了24个错误状态响应码,如409 (Conflict) 表示请求的资源与资源的当前状态发生冲突; 410 (Gone) 表示服务器上的某个资源被永久性的删除。
五、HTTP常见状态码
六、HTTP协议格式
抓个HTTP的包看看
HTTP请求:
- 首行: [方法] + [url] + [版本]
- Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
- Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个ContentLength属性来标识Body的长度;
HTTP响应:
- 首行: [版本号] + [状态码] + [状态码解释]
- Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
- Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个ContentLength属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在body中
HTTP常见Header
- Content-Type: 数据类型(text/html等)
- Content-Length: Body的长度
- Host:客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
- User-Agent: 声明用户的操作系统和浏览器版本信息;
- referer:当前页面是从哪个页面跳转过来的;
- location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
- Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能
七、Cookie和Session
我们还记得访问邮箱什么的,有个两周免登陆的功能吗?
我们连接服务器的时候,服务器怎么知道我们原来登录过呢?要知道我们的IP地址是动态的,开关机一次就更换一次,那服务器怎么还能认识到我们登陆过呢?这就要靠我们的Cookie了,当我们登录完成后,服务器就会在本地生成一个Cookie文件,用于保存我们的登录信息,当我们访问网站的时候,网站会先看看我们的cookie,看是否存在信息。当然cookie不仅仅只用于登录,也可以记录偏好什么的。【也就是说,cookie存在我们本地,浏览器关闭了,还能保存】
当我们登录完成后,像淘宝那样,右上角显示我们的用户名,在我们访问商品跳转到别的页面为什么登录信息还在呢?这就是靠Session了,服务器会为每个用户创建一个session来保存登陆的信息,【这个是存在于服务器的,它存在的时间是取决于服务器的,一般30分钟】