我们写的解决我们实际问题的网络程序都是在应用层。
今天我们详细来了解一下应用层的HTTP协议。
协议就是一种约定,socket apide 接口,在读写数据时,都是按字符串的方式来发送接收的。如果我们要传输一些结构化的数据怎么办呢?
我们可以约定:
定义一个结构体来标识我们需要交互的信息,发送数据时将这个结构体按照一个规则转换成字符串,接收到数据的时候再按照相同的规则把字符串转化为结构体。
这个过程叫做“序列化”和“反序列化”。
当然了,我们也可以有其他的约定方案并且按照约定执行,只要能够保证,一端发送时构造的数据在另一端能够正确的进行解析,这就是可行的,这种约定就是应用层协议。
HTTP协议:超文本传输协议
首先我们需要认识一下URL:平时我们所说的网址就是URL
urlencode和urldecode
像 /?:等这样的字符,已经被url当做特殊意义理解了,因此这些字符不能随意出现。比如某个参数中需要带有这些特殊字符,就必须先对特殊字符进行转义。
转义规则:将需要转码的字符转为16进制,然后从右到左取4位(不足4为的直接处理),每两位做一次前面加上%,编码成%XY格式。
就比如我们搜索C++时,发现这里的+就被转义成%2B。
urldecode就是urlencode的逆过程。
HTTP协议格式
HTTP响应
http的请求方法:
方法 | 说明 | 支持的HTTP协议版本 |
---|---|---|
GET(最常用) | 获取资源 | 1.0、1.1 |
POST(最常用) | 传输实体文件 | 1.0、1.1 |
PUT | 传输文件 | 1.0、1.1 |
HEAD | 获得报文首部 | 1.0、1.1 |
DELETE | 删除文件 | 1.0、1.1 |
OPTIONS | 询问支持的方法 | 1.1 |
TRACE | 追踪路径 | 1.1 |
CONNECT | 要求用隧道协议连接代理 | 1.1 |
LINK | 建立和资源之间的联系 | 1.0 |
UNLINE | 断开连接关系 | 1.0 |
请求报头(Header):请求的属性,为一对冒号分割的键值对,属性与属性之间用\n分割;如果遇到空行表示Header部分结束。
请求正文(Body):空行后面的内容都是正文部分,允许为空字符串。一旦正文存在,则Header中的Content-Length实行用来表示Body的长度。
HTTP响应
响应行:版本号+空格+状态码+空格+状态码解释
响应报头(Header):请求的属性,冒号分割的键值对,每组属性之间使用\n分割;遇到空行表示Header部分结束
响应正文(Body):空行后面的内容都是Body,允许为空字符串,如果Body存在则在Header中会有一个Content-Length属性来标识Body的长度;如果服务器返回了一个HTML页面,那么页面内容就是在Body中。
http的状态码:
/ | 类别 | 原因短语 |
---|---|---|
1XX | informational(信息性状态码) | 接受的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
常见的状态码:200(OK),404(Not Found)403(Forbidden),302(Redirect重定向),504(Bad Gateway)。
HTTP的Header常见属性:
1、Content-Type:数据类型(text/HTML等)
2:、Content-Length:Body的长度
3、Host:客户端告知服务器,所请求的资源是在那个主机的那个端口上
4:、User-Agent:声明用户的操作系统和浏览器版本信息
5、referer:当前页面是从那个页面跳转过来的
6、location:搭配3XX状态码使用,告诉客户端接下来要去哪里访问
7、Connection属性:该属性有两种取值(close和keep-alive),keep-alive也就是长链接,所谓的长连接就是一次链接好了就长时间保持不断开,要知道http是基于tcp实现的,而tcp获得一个链接就要经过3次握手,而断开更是要经过4次挥手,如果我们获得一个链接完成了一件事情以后就断开链接想要再完成别的事情时就需要再次获得链接,试想如果需要完成的事情有很多很多,那么就会有很多的时间花费在链接的连接和断开上,这样的话性能就会大大的降低。因此使用长链接在很多情况下能够重用连接,减少资源消耗,缩短响应时间,从而提高性能。
8、Cokie:保存在用户浏览器端的一个本地文件,用来存储用户信息从而标识一个用户,例如保存用户的账号和密码,会话ID等信息。浏览器接收了cookie以后,这个cookie和对远端Web服务器的连续请求将一起被浏览器发送给服务器。