像我们电脑和手机使用的应用软件就是在应用层写的,当我们的数据需要传输的时候换将数据传递到传输层。 应用层专门给用户提供应用功能,比如HTTP,FTP…
我们程序员写的一个个解决我们实际的问题都在应用层,我们今天来聊一聊HTTP。
协议
协议是双方约定好的东西,在我们的客户端将数据(结构化的数据)传送给服务端的时候,要先将数据进行序列化(即将结构化的数据变成字节流),服务端得到字节流的数据,然后将字节流的数据反序列化(变成结构化的数据)进行处理。 这里我们传送过去的数据格式就是协议。 这是双方约定好的
我们先来看一看HTTP请求报文的图片
我们先来认识一下URL
URLENCODE和URLDECODE
像/ ? : 等这样的字符,已经被url当做特殊的字符特殊处理了。
转移的规则如下:
- 将需要转码的字符转为16进制,然后从有到左,取4位,每2位做一位,前面加上%,编码成为%XY的格式
这是我得到的HTTP请求的格式。
首行: [方法] + [url] + [版本]
Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个
Content-Length属性来标识Body的长度;
可以注意到请求行中,出现了 / ,其实这就是我们搜索的时候,我们向要从服务端那里拿到什么样的资源。
我先来聊一聊请求的方法
GET:是从服务器获取指定的资源。(如图片、音频、视频等等)
POST:是根据请求报文对指定的资源做出处理。
其中GET、POST方法是最常见的,我们要知道HTTP是以明文传输的,所以GET和POST方法的就在于,POST比GET更加私密。注意,私密!= 安全,其实GET和POST都是不安全的,当我们在一个网页输入信息的时候,我们输入的信息会出现在URL中,而POST不会出现,所以POST更加私密。
但是通过FIddler抓包,我们发现可以我们输入的信息出现在了正文中,其实也是可以被中间截获的。
协议版本: 我们现实中都在使用手机,即使使用的同一个手机,我们手机的版本也可能是不一样的,当我们需要去获取资源的时候,服务端会根据你版本的高低来判断你是否可以获取到这个资源。
如果出现了一个新的功能,你想使用,但是你版本不满足他们更新后才有的功能,这时你需要更新版本。
HTTP常见的Header
- Content-Type: 数据类型(text/html等)
- Content-Length: Body的长度
- Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
- User-Agent: 声明用户的操作系统和浏览器版本信息;
- referer: 当前页面是从哪个页面跳转过来的;
- location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;(一般用于重定向的时候)
- Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;
HTTP的响应报头
可以看到是一一对应的, 以下是我的解析
- 首行: [版本号] + [状态码] + [状态码解释]
- Header: 请求的属性,冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
- Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个
- Content-Length属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在body中.
HTTP的状态码:
- 「200 OK」是最常见的成功状态码,表示一切正常。
- 「302 Found」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。
- 「404 Not Found」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。
- 「304 Not Modified」不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,也就是告诉客户端可以继续使用缓存资源,用于缓存控制。
- …
如果想了解具体的状态码,可以去看看下面的这篇文章。
HTTP状态码和原因短语详情