应用层中的超文本传输协议----HTTP协议

在计算机网络中有osi网络七层模型,因为在实际中七层模型就可以转化成五层模型,如果有些模糊请戳网络基础

对于HTTP协议是在应用层上的一个协议,在应用层上协议可以是在实际开发中自己制定,但是像HTTP这些很高技术的大牛制定好的协议,非常好用,所以就可以提供我们参考使用。那么在认识HTTP协议之前我们先认识一下URL

URL

什么是URL?简单的说就是我们经常所说的“网址”。
为什么要说URL?因为URL就像地址,我们要访问某一个网站,就要通过URL,以那种协议,网址的IP、端口号、文件的路径、查询字等等
下面我们就来介绍:
URL
上面是我们在百度上搜索Linux后出现的URL,为了方便解释我把一些换行。

首先:
URL介绍
前面的是协议方案,是用什么协议进行访问,其次域名也就是ip,再就是文件的路径,这里文件的路径就是在服务器的某个磁盘上的某个文件,或者虚拟的某个文件。

下面的wd=LInux是查询字符串,也是一个键值对

后面的&的叫query_string 键值对。有些标志是字符集等等

URL的语法
URL与URI很像,两者的格式几乎差不多,但是我们接触的还是URL比较多,就以URL为例说明
URL提供了一种访问定位因特网上任意资源的手段,但是这些资源可以通过不同的方法(例如HTTP、FTP、SMTP)来访问,不管怎样,他都基本上由9个部分构成:

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<fragment>

scheme:获取资源使用的协议,例如http、ftp等,没有默认值
user:password:用户名与密码,这个是一个特殊的存在,一般访问ftp时会用到,他显示的表明了访问资源的用户名与密码。但是这个可以不写,不写的话可能会让你输入用户名密码
host:主机,访问那台主机,有时候可以是IP,有时候是主机名,例如www.baidu.com
port:端口,访问主机时的端口,如果http访问默认80,可以省略。
path:通过host:port我们能找到主机,但是主机上文件很多,通过path则可以定位具体文件。例如www.baidu.com/file/index.html。则path是/file/index.html,表示我们访问/file/index.html这个文件,他很像linux上的路径。
params:这个很少见,主要作用就是像服务器提供额外的参数,用来表示本次请求的一些特性。例如ftp传输模式有两种,二进制和文本,你肯定不希望使用文本形式传输二进制图片,这样你的图片下载下来后可能没法看了。为了向应用程序提供更丰富的信息,URL中有个专门的部分来表示这种参数。例如ftp://file.qiandu.com/pub/guid.pdf;type=d其中的type=d就是params
query:通过get方式请求的参数,例如:www.qiandu.com/index.html?username=dgh&passwd=123
fragment:例如www.qiandu.com/index.html#1。当html页面比较长时,我们通常会将其分为好几段,#1就可以 快速定位到某一段。

还用一点,在http协议中默认的端口号是80端口号,在上面的网址中没有写端口号就是默认端口号为80,如果要写就在域名后面加上 :端口号

urlencode

在上面网址中我们没有见到特殊字符,那么我们在来搜索一个C++
urlencode
我们发现++符RL中这些特殊符号,如:/、?、:、+等,都被当作特殊的意义去理解,所以这些就不能随便的出现。那么就需要我们对这些特殊符号进行转义

怎么转移?
我们用16进制来标识对应符号的ASCII码,然后在前面加上%。就像刚才的+号,+号的ASCII码为43 转换成16进制为2B所以就有了%2B

urldecode

这是与urlencode相对的,是把转义的特殊符号16进制ASCII转换成符号。

HTTP超文本传输协议格式

认识了URL我们来看HTTP协议

请求

我们先来抓个包来看看,一次的请求格式
抓包
字段我们将其粘出来


GET http://123.207.58.25/images/icon.png HTTP/1.1
Host: 123.207.58.25
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
Accept: image/webp,image/apng,image/,/*;q=0.8
Referer: http://123.207.58.25/static/css/lrtk.css
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=98vs3d7p3l7uui8gjr8orl0627; loginStatus=yes


首先我们看第一行,首行:GET是http中的方法,后面说、URL、http协议的版本号
从第二行到空行,叫header,每个header中都是键值对,是用冒号加空格来进行分割,每组键值对之间用\n 换行来进行分割,header的结束为遇到一行空行。

对于上面个的请求我们再抓一个post方法的请求。
直接拿出信息


POST http://123.207.58.25/login/userLogin HTTP/1.1
Host: 123.207.58.25
Connection: keep-alive
Content-Length: 27
Origin: http://123.207.58.25
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept: /
Referer: http://123.207.58.25/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=u1d27s4lvoigdolidr1ai13es1

name=8888&passwd=99999999


这次我们抓到的是用户在登陆网站时候发出的请求,我们可以看到比GET多了一点,就是在空行后有一些信息,这就死post请求的body
body在空行后面,body允许是空字符串,在header中有一个属性就是Content-Length,就是用来记录body的长度的。

在请求的过程中,拉去页面,也就是只读用的是set方法,而修改或者是要传送数据用post方法,那么看完相应我们再看服务器的响应

响应

当客户端请求完成,这时候服务器就会响应一个来返回对请求的处理,我们来抓取服务器的响应包


HTTP/1.1 200 OK
Server: nginx
Date: Sun, 01 Jul 2018 16:51:21 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Vary: Accept-Encoding
X-Powered-By: PHP/5.4.45
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: PHPSESSID=u1d27s4lvoigdolidr1ai13es1; expires=Sun, 01-Jul-2018 22:51:21 GMT; path=/
Set-Cookie: loginStatus=yes; expires=Sun, 01-Jul-2018 22:51:21 GMT; path=/
Content-Encoding: gzip

1e
   ť ɩ ڊ 
0


首行:HTTP版本支持的版本号、状态码、状态码解释
header:和请求格式相容
body:带这响应的页面文件等等

header中的属性键值对的介绍

  • Content-Type: 数据类型(text/html)
  • Content-Lenght: Body的长度
  • Host: 客户端告诉服务器,所请求的资源在哪个主机的端口上
  • User-Agent: 声明用户的操作系统和浏览器的版本信息
  • referer: 当前页面是从哪个页面跳转过来的
  • location: 搭配3开头的状态码使用,告诉客户端接下来要去哪里访问
  • Cookie: 用于客户端存储少量的信息,比如:请求一个网站后,在本地的Cookie中会保存相关的身份信息,下次访问网站时候就会自动携带Cookie去访问网站。
  • SetCookie: 这个与Cookie相对,是服务器发送给客户端设置Cookie的

在服务器中HTTP中的状态码

在HTTP协议中的状态码,我们有时候去访问一个网站,就可能会得到404 No Found 这里的404 就是状态码。我们来介绍不同状态码有什么含义

状态码 类别 原因
1开头状态码(1XX) Informational(信息状态码) 接受的请求正在处理
2开头状态码(2XX) Success(成功状态码) 请求正常处理完毕
3开头状态码(3XX) Redirection(重定向状态码) 需要进行附加操作完成的请求
4开头状态码(4XX) Client Error(客户端状态码错误) 服务器无法处理请求
5开头状态码(5XX) Server Error(服务器错误状态码) 服务器处理请求错误

大体看过后,我们来介绍一些常见的状态码:

  • 200: OK 请求成功(其后是对GET和POST请求的应答文档)
  • 302: Found 所请求的页面已经临时转移至新的url。
  • 403: Forbidden 对被请求页面的访问被禁止。
  • 404: Not Found 服务器无法找到被请求的页面。
  • 502: Bad Gateway 请求未完成。服务器从上游服务器收到一个无效的响应。
  • 503: Service Unavailable 请求未完成。服务器临时过载或当机。

实现一个简单的HTTP服务器

基于http协议实现服务器代码

猜你喜欢

转载自blog.csdn.net/gangstudyit/article/details/80879348