一、HTTP定义
HTTP是Hyper Text Transfer Protocol 超文本传输协议 的缩写。用于从WWW服务器传输超文本到本地浏览器的传送协议,是一个无状态的协议。
通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。
默认HTTP的端口号为80,HTTPS的端口号为443。
一般情况:
- HTTP协议永远都是客户端发起请求,服务器回送响应,客户端将内容拿到之后就和服务器断开来连接。这就决定了,如果客户端没有发起请求,服务器是没法推送数据给客户端的。
- 另外,因为是无状态的协议,所以上一次的连接和下一次的连接没有关系。
问题1:为什么说http协议是无状态的,影响?
Http协议本身就是一个 传输 协议,理解这个意思,更加广义一些就是支持资源的传输,那么在客户端浏览器向HTTP服务器发送请求,继而HTTP服务器将相应的资源发回给客户端这样一个过程中因为每一次请求和响应都是相对独立的。但是随着时间推移,HTML的语法在不断膨胀,其中最重要的是增加了表单,就有了很多带着数据的请求,有来有回的这么些动态交互的程序,HTTP无状态的特性严重阻碍了这些应用程序的实现,毕竟交互是需要承前启后的,简单的购物车程序也要知道用户到底在之前选择了什么商品。于是,两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,而另一个则是Session。
问题2:http和TCP的区别,如何基于tcp实现http呢?
区别:
从上面的图中不难看出区别,TCP协议对应于运输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性。但是可以看到,http是基于tcp实现的,那么既然tcp是可靠的长连接,为什么http还存在短连接这一说呢?答案是,Http就是在每次请求完成后就把TCP连接关了,所以是短连接。而如果直接通过Socket编程使用TCP协议的时候,通过代码区控制什么时候打开连接、什么时候关闭,只要我们不通过代码把连接关闭,这个连接就会在客户端和服务端的进程中一直存在。
如何实现:
可以看到,其实http就是在tcp的传输之上加了一些内容,我们模拟这些思路就可以。
设定一个规则之后,开始处理:
1、实现两个主机不同进程之间的TCP通信。
2、分析请求方法(比如GET和POST方法)。
3、方法确定后,应该拿到请求的URL,
4、判断资源是否存在,如果存在,GET方法:如果没有参数,就直接将请求的资源返回(即进入非cgi模式运行);否则,进行对应的处理。
二、http报文格式
浏览器输入baidu.com,可以检查看到发出的请求报文头部格式
2.1 客户端请求消息格式
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:
- 请求行(request line)
- 请求头部(header)
- 空行
- 请求数据
四个部分组成。
- 请求行 包括请求方法(常用的有GET和POST),请求的URL,和协议版本(例如HTTP1.1);
- 请求头部 的格式就是字段名+值组成,一般有:
- User-Agent(用户代理):产生请求的浏览器类型
- Accept:客户端希望接受的数据类型,比如text/xml;
- Content-Type:发送端发送的实体数据的类型,比如text/html;
- Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
- 空行;
- 请求体(数据):GET没有请求数据,POST有。
其中,User-Agent用户代理,User-Agent会告诉网站服务器,访问者是通过什么工具来请求的,如果是爬虫请求,一般会拒绝,如果是用户浏览器,就会应答,另外服务器可以通过判断User-Agent来给不同的操作系统、不同的浏览器发送不同的页面。
他格式一般是:Mozilla/5.0+(平台)+引擎版本+浏览器版本号。
更详细的字段解释可以看看这篇博客:https://www.cnblogs.com/xy51/p/12974945.html
比如上面我截图的部分:
- 向百度首页发送的请求,请求方法是get,协议版本是1.1,请求的URL没有写;
- 请求头部里面的User-Agent就说明了,平台是Windows、引擎版本就是从